Скачать MetaTrader 5

Не пойму, в чем ошибка в советнике.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community и оставляй комментарии!
Ivan Morozov
1899
Ivan Morozov 2015.05.17 19:43 

Доброе время суток, уважаемые трейдеры. Я пишу советник, который торгует по индикатору MACD. Столкнулся с проблемой, которая приводит к убыткам. 

Советник должен отследить пересечение медленной и быстрой линий MACD и открыть сделку на покупку, если быстрая линия пересекает медленную снизу вверх, и на продажу, если быстрая пересекает медленную сверху вниз. Определение пересечения я делаю в отдельной функции: 

int trade_conditions()
   {
      //output:10 - buy
      //       21 - sell
      //       11 - close buy
      //       22 - close sell
      //       2  - keeping   
      
      //Массивы для определения "прокола"
      double FastLine[2], SlowLine[2];
      for (int i = 0; i<3; i++)
         {
            FastLine[i] = iCustom(NULL, 0, "MACD+", p1, p2, p3, 1, i);
            SlowLine[i] = iCustom(NULL, 0, "MACD+", p1, p2, p3, 2, 0);
         }
          
      //Переменные для определения направления линий MACD
      int n = 3;
      double SlowLine_Direction_array[];
      ArrayResize(SlowLine_Direction_array, n, n);
      double SlowLine_Direction = 0;
      
      //Наполню массив
      for (i = 0; i < n; i++)
         {
            SlowLine_Direction_array[i] = iCustom(NULL, 0, "MACD+", p1, p2, p3, 2, i);
         }
      
      //Определю направление медленной линии MACD и приведу его к количеству знаков после запятой,
      //равному Digits
      SlowLine_Direction = NormalizeDouble(Direction_Of_Line(SlowLine_Direction_array), MarketInfo(NULL, MODE_DIGITS));
      
      int output = 2;
      
      if (Orders[0][0] == 0)//Тут ищу условия для входа в рынок
         {
            //Проверю условия на Buy
            if (FastLine[0] > SlowLine[0] && FastLine[1] < SlowLine[1] && SlowLine_Direction > 0) output = 10;  //Прокол на покупку
            
            //Проверю условия на Sell
            if (FastLine[0] < SlowLine[0] && FastLine[1] > SlowLine[1] && SlowLine_Direction < 0) output = 21;  //Прокол на продажу    
         }
      else//Тут ищу условия для выхода из позиции
         {
            if (Orders[1][6] == 0) //close buy
               {
                  if(FastLine[0] < SlowLine[0] && FastLine[1] > SlowLine[1] && SlowLine_Direction <= 0) output = 11;  //Быстрая проколола медленную сверху вниз
               }
            if (Orders[1][6] == 1) //close sell
               {
                  if(FastLine[0] > SlowLine[0] && FastLine[1] < SlowLine[1] && SlowLine_Direction >= 0) output = 22;//Быстрая линия проколола медленную снизу вверх
               }
         }
      return output;
   }

 Ордера хранятся в таком виде:

Orders[0][0] - количество ордеров
Orders[n][1] = OrderOpenPrice();   
Orders[n][2] = OrderStopLoss();     
Orders[n][3] = OrderTakeProfit();   
Orders[n][4] = OrderTicket();     
Orders[n][5] = OrderLots();        
Orders[n][6] = OrderType();                       
Orders[n][7] = OrderMagicNumber();
Orders[n][8] = OrderComment();

Проблема заключается в том, что почти всегда рядом друг с другом открываются два ордера: один на покупку и другой на продужу. Это мешает работать всей программе. Я не могу найти ошибку.

Если можете, помогите мне в этом.

Спасибо. 

Файлы:
XAUUSDvH1.png 65 kb
Vitalie Postolache
12135
Vitalie Postolache 2015.05.17 20:02  
Иван Морозов:

Доброе время суток, уважаемые трейдеры. Я пишу советник, который торгует по индикатору MACD. Столкнулся с проблемой, которая приводит к убыткам. 

Советник должен отследить пересечение медленной и быстрой линий MACD и открыть сделку на покупку, если быстрая линия пересекает медленную снизу вверх, и на продажу, если быстрая пересекает медленную сверху вниз. Определение пересечения я делаю в отдельной функции: 

 Ордера хранятся в таком виде:

Проблема заключается в том, что почти всегда рядом друг с другом открываются два ордера: один на покупку и другой на продужу. Это мешает работать всей программе. Я не могу найти ошибку.

Если можете, помогите мне в этом.

Спасибо. 

Дребезг на нулевом баре, бывает часто.

Ivan Morozov
1899
Ivan Morozov 2015.05.17 20:12  
Vitalie Postolache:

Дребезг на нулевом баре, бывает часто. А ещё вы там специально ищете несколько пересечений в ближайшем прошлом и находите, а потом жалуетесь.

Проверку условий для входа я начинаю с проверки количества ордеров. И ищу точку входа только если сейчас нет открытых ордеров.

 	if (Orders[0][0] == 0)//Тут ищу условия для входа в рынок, если нет еще открытых ордеров
         {
            //Проверю условия на Buy
            if (FastLine[0] > SlowLine[0] && FastLine[1] < SlowLine[1] && SlowLine_Direction > 0) output = 10;  //Прокол на покупку
            
            //Проверю условия на Sell
            if (FastLine[0] < SlowLine[0] && FastLine[1] > SlowLine[1] && SlowLine_Direction < 0) output = 21;  //Прокол на продажу    
         }
 Так что советник должен открыть один ордер по первому пересечению линий, пропуская мимо все следующие.
Vitalie Postolache
12135
Vitalie Postolache 2015.05.17 20:18  
Иван Морозов:

Проверку условий для входа я начинаю с проверки количества ордеров. И ищу точку входа только если сейчас нет открытых ордеров.

 Так что советник должен открыть один ордер по первому пересечению линий, пропуская мимо все следующие.
Значит ищите в той части кода, которую здесь не видно.
Ivan Morozov
1899
Ivan Morozov 2015.05.17 20:25  
Vitalie Postolache:
Значит ищите в той части кода, которую здесь не видно.

Вот часть кода, которая открывает ордера:

      switch(con)
         {
            case 10://buy
               {
                  if (!OrderSend(NULL, 0, lot, Ask, slippage, 0, 0, "MACD+")) Print(GetLastError());
               }
            case 21://sell
               {
                  if (!OrderSend(NULL, 1, lot, Bid, slippage, 0, 0, "MACD+")) Print(GetLastError());
               }               
            case 11://close buy
               {
                  if (!OrderClose(Orders[1][4], Orders[n][5], Bid, slippage)) Print(GetLastError());
               }  
            case 22://close sell
               {
                  if (!OrderClose(Orders[1][4], Orders[n][5], Ask, slippage)) Print(GetLastError());
               }   
            case 2:;     
         }

 И все. 

Viktor Mossekhin
14275
Viktor Mossekhin 2015.05.17 20:58  
Иван Морозов:

Вот часть кода, которая открывает ордера:

 И все. 

А где break?
Vladimir Pastushak
68855
Vladimir Pastushak 2015.05.17 23:03  
Иван Морозов:

Вот часть кода, которая открывает ордера:

 И все. 

Вы не испльзуете оператор break
Ivan Morozov
1899
Ivan Morozov 2015.05.18 06:53  
Vladimir Pastushak:
Вы не испльзуете оператор break
Viktor Mossekhin:
А где break?
Точно. Проблема решена. Большое спасибо. Как я раньше не понял этого!
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий