Мультивалютный EA на примерах

 

Всем привет!

С советниками, торгующими на одной валютной паре более-менее разобрался. Теперь вот дошло дело до мультивалютных советников. Решил узнать, как они работают. Только вот, примеров с комментариями практически нет. В Code Base нашел несколько мультивалютников, но они слишком сложные для понимания. Один из самых простых «MACD multi» https://www.mql5.com/ru/code/8879, что-то не совсем понятный. Для разбора принципа работы, вместо индикатора MACD, решил подставить самое простое решение для проверки хода работы. Если цена закрытия текущего бара выше цены закрытия предыдущего бара — покупаем, если меньше — продаем. Прикрепил к EURUSD, M5... посидел минут 20 и ничего не случилось! Может, у кого-нибудь есть в запасниках какой-нибудь «cheat sheet» по мультивалютникам или пример простейшего кода, как реализовать мультисоветник?

Ну, или хотя бы прокомментировать, что за алгоритм действий такой у «MACD multi» почему он не мультиработает? (вместо MACD... условия торговли по двум последним барам)

//+------------------------------------------------------------------+
//|                                                  MACD multi .mq4 |
//|                                            Oleg Krinichny © 2009 |
//|                                                                  |
//+------------------------------------------------------------------+
extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 500;
extern int    TrailingStop = 0;
extern int    StopLoss = 500;
//+------------------------------------------------------------------+
int start()
{
   int counter;
   static datetime prevtime = 0;
   int shift;
   int shift1;
   int shift2;
   double C, C1;  
//----
   if(prevtime == Time[0]) 
     {
       return(0);
     }
   prevtime = Time[0];   
//----
   for(shift = 0; shift < Bars; shift++) 
      {
         counter = shift;
         for(counter = shift; counter <= shift + 9; counter++) 
         shift1 = shift + 1;
         shift2 = shift + 2;    
         C = Close[shift1];
         C1 = Close[shift2];

   int   total, p1=0, p2=0, p3=0, p4=0, p5=0, p6=0, p7=0, p8=0, p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderSymbol()=="EURUSD") {p1=1;}
      if(OrderSymbol()=="GBPUSD") {p2=1;}
      if(OrderSymbol()=="USDCHF") {p3=1;}
      if(OrderSymbol()=="USDJPY") {p4=1;}
      if(OrderSymbol()=="EURCHF") {p5=1;}
      if(OrderSymbol()=="EURGBP") {p6=1;}
      if(OrderSymbol()=="AUDUSD") {p7=1;}
      if(OrderSymbol()=="USDCAD") {p8=1;}
      if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderSymbol()=="EURUSD") {p1=1;}
      if(OrderSymbol()=="GBPUSD") {p2=1;}
      if(OrderSymbol()=="USDCHF") {p3=1;}
      if(OrderSymbol()=="USDJPY") {p4=1;}
      if(OrderSymbol()=="EURCHF") {p5=1;}
      if(OrderSymbol()=="EURGBP") {p6=1;}
      if(OrderSymbol()=="AUDUSD") {p7=1;}
      if(OrderSymbol()=="USDCAD") {p8=1;}
      if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderSymbol()=="EURUSD") {p1=1;}
      if(OrderSymbol()=="GBPUSD") {p2=1;}
      if(OrderSymbol()=="USDCHF") {p3=1;}
      if(OrderSymbol()=="USDJPY") {p4=1;}
      if(OrderSymbol()=="EURCHF") {p5=1;}
      if(OrderSymbol()=="EURGBP") {p6=1;}
      if(OrderSymbol()=="AUDUSD") {p7=1;}
      if(OrderSymbol()=="USDCAD") {p8=1;}
      if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderSymbol()=="EURUSD") {p1=1;}
      if(OrderSymbol()=="GBPUSD") {p2=1;}
      if(OrderSymbol()=="USDCHF") {p3=1;}
      if(OrderSymbol()=="USDJPY") {p4=1;}
      if(OrderSymbol()=="EURCHF") {p5=1;}
      if(OrderSymbol()=="EURGBP") {p6=1;}
      if(OrderSymbol()=="AUDUSD") {p7=1;}
      if(OrderSymbol()=="USDCAD") {p8=1;}
      if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderSymbol()=="EURUSD") {p1=1;}
      if(OrderSymbol()=="GBPUSD") {p2=1;}
      if(OrderSymbol()=="USDCHF") {p3=1;}
      if(OrderSymbol()=="USDJPY") {p4=1;}
      if(OrderSymbol()=="EURCHF") {p5=1;}
      if(OrderSymbol()=="EURGBP") {p6=1;}
      if(OrderSymbol()=="AUDUSD") {p7=1;}
      if(OrderSymbol()=="USDCAD") {p8=1;}
      if(OrderSymbol()=="EURJPY") {p9=1;}
   
   
      total=OrdersTotal();  
      if(total<5)
         {
            if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
               (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
               (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
               (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
               (Instrument=="EURJPY" && p9<1)) 
               {
                  if(C>C1)
                     {
                        OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
                        return(0); 
                     }   
      
                  if(C<C1)
                     {
                        OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
                        return(0); 
                     }
               }
         }
      }
}
 
160777:

Всем привет!

С советниками, торгующими на одной валютной паре более-менее разобрался. Теперь вот дошло дело до мультивалютных советников. Решил узнать, как они работают. Только вот, примеров с комментариями практически нет. В Code Base нашел несколько мультивалютников, но они слишком сложные для понимания. Один из самых простых «MACD multi» https://www.mql5.com/ru/code/8879, что-то не совсем понятный. Для разбора принципа работы, вместо индикатора MACD, решил подставить самое простое решение для проверки хода работы. Если цена закрытия текущего бара выше цены закрытия предыдущего бара — покупаем, если меньше — продаем. Прикрепил к EURUSD, M5... посидел минут 20 и ничего не случилось! Может, у кого-нибудь есть в запасниках какой-нибудь «cheat sheet» по мультивалютникам или пример простейшего кода, как реализовать мультисоветник?

Ну, или хотя бы прокомментировать, что за алгоритм действий такой у «MACD multi» почему он не мультиработает? (вместо MACD... условия торговли по двум последним барам)


А что за код такой?
 
Vinin:

А что за код такой?

Взял код мультисоветника из «MACD multi» https://www.mql5.com/ru/code/8879

Там были условия на покупку и продажу по индикатору MACD

я заменил условия продажи на более простые для понимания и для тестирования... но, что-то, ни оригинальный, ни измененный код не работает.

Хотя, я пытаюсь понять, с чего начинать строить мультисоветники?!

 
Оригинал покажите
 
Vinin:
Оригинал покажите

оригинал:

//+------------------------------------------------------------------+
//|                                                  MACD multi .mq4 |
//|                                            Oleg Krinichny © 2009 |
//|                                                                  |
//+------------------------------------------------------------------+
 
extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 50;
extern int    TrailingStop = 0;
extern int    StopLoss = 50;
extern int    FirstOpenLevel = 5;
extern int    LastOpenLevel = 20;
extern int    Slope = 2;
extern int    CloseLevel = 20;
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
{
   double MacdCurrent, MacdPrevious, SignalCurrent, SignalPrevious;
   int    i, total, p1, p2, p3, p4, p5, p6, p7, p8, p9;
  
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
      
   p1=0; p2=0; p3=0; p4=0; p5=0; p6=0; p7=0; p8=0; p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
   
   total=OrdersTotal();
   for(i=0;i<total;i++)
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
     if(OrderSymbol()==Instrument)
      {
         if(OrderType()==OP_BUY) 
          {
            if(MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent>CloseLevel*0.1*Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
            if(TrailingStop>0)  
              {      
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
          if(OrderType()==OP_SELL)
           {
            if(SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent>CloseLevel*0.1*Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
            if(TrailingStop>0)  
              {         
               if(OrderOpenPrice()-Ask>Point*TrailingStop)
                 {
                  if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   
   total=OrdersTotal();  
   if(total<5)
   {
     if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
        (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
        (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
        (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
        (Instrument=="EURJPY" && p9<1)) 
      {
        if(MacdCurrent<0 && MacdCurrent-SignalCurrent>SignalCurrent*FirstOpenLevel*(-0.01)
           && MacdCurrent-SignalCurrent<SignalCurrent*LastOpenLevel*(-0.01)
           && MacdCurrent-MacdPrevious>MacdPrevious*Slope*(-0.01)
           && MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent<(CloseLevel-10)*0.1*Point)  
          {
           OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
           return(0); 
          }   
      
         if(MacdCurrent>0 && SignalCurrent-MacdCurrent>SignalCurrent*FirstOpenLevel*0.01
            && SignalCurrent-MacdCurrent<SignalCurrent*LastOpenLevel*0.01
            && MacdPrevious-MacdCurrent>MacdPrevious*Slope*0.01
            && SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent<(CloseLevel-10)*0.1*Point)
          {
           OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
           return(0); 
          }
       }
    }
}

 
160777:

оригинал:


И где такой код откопали?
 
Vinin:

И где такой код откопали?

https://www.mql5.com/ru/code
 
Не очень удачный пример, точнее совсем не удачный
 

.... опять целый день потерян! %(

Ну, а хотя бы в двух словах, базовая конструкция мультисоветника как выглядит?

В книге примеров нету... на форуме в поиске одни отрывки непонятно чего...

 
160777:

.... опять целый день потерян! %(

Ну, а хотя бы в двух словах, базовая конструкция мультисоветника как выглядит?

В книге примеров нету... на форуме в поиске одни отрывки непонятно чего...


Как и любой советник

1. анализ

2. принятие решения

 
160777:

.... опять целый день потерян! %(

Ну, а хотя бы в двух словах, базовая конструкция мультисоветника как выглядит?

В книге примеров нету... на форуме в поиске одни отрывки непонятно чего...


А что вообще вы называете "мультивалютным" советником? Советник использующий анализ нескольких валютных пар или/и советник торгующий по нескольким валютным парам? Если второе, то:

- советник не должен использовать "Symbol()" при отсылке торговых приказов;

- никаких Ask и Bid, а их запросы через MARKETINFO с помощью MODE_ASK и MODE_BID и указанием конкретной пары;

- в индикаторах тоже должна указываться конкретная пара, а не NULL;

- обращение к таймсериям должно быть тоже с указанием конкретного инструмента;

- и прочие очевидные вещи для того кто "С советниками, торгующими на одной валютной паре более-менее разобрался"

И еще, использование мультивалютного советника должно быть оправдано мультивалютным модулем приниятия торговых решений, в противном случае его (советник) заменить несколькими обычными советниками разбросаными на разные чарты.

Объясните толком и конкретно, что Вы хотите реализовать, и возможно кто-нибудь сможет помочь. Ваш код только усугубляет процесс пониманиея ваших устремлений)

З.Ы. Работающие мультивалютники есть в базе, и просто успешно гуглятся с просторов интернета.

Причина обращения: