0

//+------------------------------------------------------------------+
//|                                                       ProBoy.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 2;        // умножение лота
extern double MaxLot     = 5;        // лот для вирта

extern int StopLoss      = 0;      // лось
extern int TakeProfit    = 0;     // язь

extern int Candles       = 20;       // свечей в коробке
extern int CandleTrail   = 10;       // свечей для трала

extern int Delta         = 100;      // расстояние от цены
extern int Slip          = 30;        // реквот
extern int Magic         = 123;        // магик

extern bool BuyStop      = true;        // BuyStop
extern bool SellStop     = true;        // SellStop

datetime t
=0;
double hi=0,lo=0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 
{
//---
   
Comment("");
//---
   
return(INIT_SUCCEEDED);
 
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 
{
   
Comment("");
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
 
{
   
int r=0;
   color clr
=Green;
   
double sl=0,tp=0;

   
if(type==1 || type==3 || type==5)
     
{
      clr
=Red;

     
if(StopLoss>0)
       
{
         sl
=NormalizeDouble(price+StopLoss*_Point,_Digits);
       
}
     
if(TakeProfit>0)
       
{
         tp
=NormalizeDouble(price-TakeProfit*_Point,_Digits);
       
}
     
}

   
if(type==0 || type==2 || type==4)
     
{
      clr
=Blue;
     
if(StopLoss>0)
       
{
         sl
=NormalizeDouble(price-StopLoss*_Point,_Digits);
       
}
     
if(TakeProfit>0)
       
{
         tp
=NormalizeDouble(price+TakeProfit*_Point,_Digits);
       
}
     
}

   r
=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   
return;
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
 
{
   
double lot=Lots;
   
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
       
{
         
if(OrderProfit()>0)
           
break;
         
if(OrderProfit()<0)
           
{
            lot
=OrderLots()*KLot;
           
break;
           
}
       
}
     
}
   
if(lot>MaxLot)
      lot
=Lots;
   
return(lot);
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
 
{
   
int count=0;
   
for(int i=OrdersTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       
{
         
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           
{
           
if(OrderType()<2)
               count
++;
           
}
       
}
     
}
   
return(count);
 
}
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
 
{
   
int count=0;
   
for(int i=OrdersTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       
{
         
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           
{
           
if(OrderType()==type)
               count
++;
           
}
       
}
     
}
   
return(count);
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
 
{
   
bool m=1;
   
double sl=0,tp=0;
   lo
=Low[iLowest(NULL,0,1,Candles,0)];
   hi
=High[iHighest(NULL,0,2,Candles,0)];
   
double opb=NormalizeDouble(hi+Delta*_Point,_Digits);
   
double slb=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)],Digits);
   
double ops=NormalizeDouble(lo-Delta*_Point,_Digits);
   
double sls=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)],_Digits);
   

   
for(int i=OrdersTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       
{
         
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           
{
           
if(OrderType()==OP_BUYSTOP)//4
             
{
               
if(OrderOpenPrice()!=opb)
                 
{
                 
if(TakeProfit>0)
                   
{
                    tp
=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                   
}
                 
if(StopLoss>0)
                   
{
                    slb
=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                   
}
                  m
=OrderModify(OrderTicket(),opb,slb,tp,0,Blue);
                 
return;
                 
}
             
}

           
if(OrderType()==OP_SELLSTOP)//5
             
{
               
if(OrderOpenPrice()!=ops)
                 
{
                 
if(TakeProfit>0)
                   
{
                    tp
=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits);
                   
}
                 
if(StopLoss>0)
                   
{
                    sls
=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits);
                   
}
                  m
=OrderModify(OrderTicket(),ops,sls,tp,0,Blue);
                 
return;
                 
}
             
}
           
}
       
}
     
}
 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CandleTrailing()
 
{
   
bool mod=1;
   
double sl=0;

   
for(int i=OrdersTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       
{
         
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           
{
           
if(OrderType()==OP_BUY)
             
{
               sl
=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)],Digits);

               
if(Bid>sl)
                 
{
                 
if(OrderStopLoss()<sl || OrderStopLoss()==0)
                   
{
                     
if(OrderStopLoss()!=sl)
                        mod
=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     
return;
                   
}
                 
}
             
}

           
if(OrderType()==OP_SELL)
             
{
               sl
=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)],Digits);

               
if(Ask<sl)
                 
{
                 
if(OrderStopLoss()>sl || OrderStopLoss()==0)
                   
{
                     
if(OrderStopLoss()!=sl)
                        mod
=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                     
return;
                   
}
                 
}
             
}
           
}
       
}
     
}
 
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 
{
   
if(t!=Time[0])
     
{
      lo
=Low[iLowest(NULL,0,1,Candles,0)];
      hi
=High[iHighest(NULL,0,2,Candles,0)];

     
ModeOOP();

     
if(CandleTrail>0)
         
CandleTrailing();

     
if(CountTrades()<1)
       
{
         
if(BuyStop && CountOrders(4)<1)
           
{
           
PutOrder(4,hi+Delta*_Point);
           
}
         
if(SellStop && CountOrders(5)<1)
           
{
           
PutOrder(5,lo-Delta*_Point);
           
}
       
}
      t
=Time[0];
     
}

   
Comment("\n Lot: ",Lot());
 
}
//+------------------------------------------------------------------+

avatar

verta81

  • 12 ноября 2021, 02:49
0
самое точное креативное Техническое задание))
youtu.be/UoKlKx-3FcA
avatar

verta81

  • 31 октября 2021, 16:59
0
Ultimate Arrows перерисовывает, из-за чего будет много лосей.
avatar

verta81

  • 19 октября 2021, 16:11
0
EA Skynet.ex 4 (0 Kb)
0 kb -??????
avatar

verta81

  • 18 октября 2021, 11:38
0
Огромный масштаб, чтобы было видно точки натяжки фибы.
Вебинар смотрел и написал Вам, что при входе в каждый сигнал SAR будет слив.
Поэтому нужно учитывать еще несколько факторов, например: направление тренда; время открытия, закрытия и пребывание в сделке и пр.
На видео демонстрация работы входа в сделку по сигналу от SAR, как у Сэнсэя Т.
но без определения глобального тренда.
avatar

verta81

  • 17 октября 2021, 20:12
0
На автомате входя во все сигналы SAR, никак не изменится результат.
Вот Вам одноцвет по хаям/лоям:
youtu.be/1Wqlq9e87DQ
avatar

verta81

  • 17 октября 2021, 19:01
0
Обратите внимание, то товарищ Тулеген натягивает сетку от лоя/хая при смене SAR, до предыдущего хая/лоя текущего дня.
Также можно натягивать фибу по одной последней сече, по двум свечам и от лоя/хая до фрактала.
Результат будет примерно одинаковый:

youtu.be/kw3JOekNSfg
В стратегии нужно учитывать еще несколько факторов, например: направление тренда; время открытия, закрытия и пребывание в сделке.
avatar

verta81

  • 17 октября 2021, 15:02
0
там одну строку закомментировать надо, или удалить.
Выше пример.
//PutFibo("Fibo",Time[0],Close[0],Time[13],Close[13]);

27-я строка
avatar

verta81

  • 16 октября 2021, 15:42
+1
Должно быть так:
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 
{
//---
   
Comment("");
   
//PutFibo("Fibo",Time[0],Close[0],Time[13],Close[13]);
//---
   
return(INIT_SUCCEEDED);
 
}
avatar

verta81

  • 16 октября 2021, 15:25
0
youtu.be/hreIzUgzelE
все работает.
Или что-то не так не видео?
avatar

verta81

  • 16 октября 2021, 15:15
0
Огромное всем спасибо за помощь.
Нашел решение своей проблемы по примеру кода Андрея.
Благодарочка!!!
avatar

verta81

  • 5 октября 2021, 14:35
0
как на данный момент советник устанавливает размер лота:
sell 0.1
sell 0.1
sell 0.2
sell 0.4
buy 0.8
sell 0.16
сбой пошел же на buy, лот которого должен быть начальный 0.1
Вот ищу где ощибка
avatar

verta81

  • 4 октября 2021, 18:49
0
Спасибо, но это не то.
В вашем примере функция находит тикет последнего ордера, последнего закрытого и тип последней открытой.
Мне нужно найти лот последнего Buy или Sell
//+------------------------------------------------------------------+
//|                послекдний ордер по типу                          |
//+------------------------------------------------------------------+
double FindLastOrderLot(int type)
 
{
   
double OLot=0;
   
for(int i=OrdersTotal()-1; i>=0; i--)
     
{
     
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       
{
         
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           
{
           
if(OrderType()==type)
             
{
               
if(OLot<OrderLots())
                 
OLot=OrderLots();
             
}
           
}
       
}
     
}
   
return(OLot);
 
}

и потом же умножить его на кеф для следующего ордера Buy или Sell
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
 
{
   
double lot=Lots;
   
if(Risk>0)
      lot
=AccountBalance()/(Risk*100);
//-----------------------------------
   
if(CountOrders(1)>=2 && CountOrders(1)<6)
     lot
=NormalizeDouble(KLot*FindLastOrderLot(1),2);
   
if(CountOrders(1)>=6)  
     lot
=NormalizeDouble((KLot*0.75)*FindLastOrderLot(1),2);
   
if(CountOrders(0)>=2 && CountOrders(0)<6)
     lot
=NormalizeDouble(KLot*FindLastOrderLot(0),2);
   
if(CountOrders(0)>=6)  
     lot
=NormalizeDouble((KLot*0.75)*FindLastOrderLot(0),2);    
//--------------------------------
 
   
if (lot>MAXLOT) lot = MAXLOT;
   
if (lot<MINLOT) lot = MINLOT;
   
return(lot);
 
}
avatar

verta81

  • 4 октября 2021, 18:45
0
Так же буду благодарен за любую рекомендацию по оптимизации кода советника.
avatar

verta81

  • 4 октября 2021, 18:09
0
Ваш советник торгует сразу 24-ю парами?
Или стоит на 24-х парах?
avatar

verta81

  • 28 сентября 2021, 20:52
0
В вашем коде функция CloseAll() закрывает ордера именно по магику
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
avatar

verta81

  • 28 сентября 2021, 20:46
0
Спасибо большое.
avatar

verta81

  • 21 сентября 2021, 21:55
0
Спасибо.
avatar

verta81

  • 21 сентября 2021, 18:49
Загрузка...