Функция OrderClose - Error 4051

 

Добрый День. 

 Решил начать программировать на mql. Написал советник, проверяя как открываются и закрываются ордера. Открывается ордер при соответствующих условиях нормально, а при закррытии появляется Error 4051 - Invalid ticket to OrderClose Function. Помогите пожалуйста разобраться, что я делаю не так. Код советника ниже.

 

 


double MA;
MA=iMA(NULL,0,MA_Period,0,MODE_SMA,0,0);
int T;
T=OrdersTotal();
int ticket;
bool a;

if(Ask>MA+2*Point && T==0)
{ticket=OrderSend(Symbol(),0,0.01,Ask,3,0,0);
}

if (Bid<MA && T>0)
{OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
RefreshRates();
a=OrderClose(ticket,0.01,Bid,5);
}

 

После открытия позиции тикет у Вас не сохраняется. И при следующем запуске start переменная ticket инициализируется нулём. Нужно объявить ею как статическую или глобальную чтобы её значение сохранялось. Также полезно контролировать выполнение функции OrderSelect, например:

if {OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {
      RefreshRates();
      a=OrderClose(ticket,0.01,Bid,5);
   }
else Print("Ticket=", ticket);
} 
 

Что я не так зделал, подскажите плиз

выбираю ордер, узнаю тип, узнаю тиккет, пытаюсь удалить отложенный ордер - выдаёт ошибка 4051

Недопустимое значение параметра функции


OrderSelect(1,SELECT_BY_POS);

a2=OrderType();
ticket2=OrderTicket() ;

if (a2>1)
OrderDelete(ticket2);
Alert (GetLastError()); // Сообщение об ошибке 4051

 
P.S. это второй ордер по счёту, параметр: OrderSelect(1,SELECT_BY_POS); верный
 
приведите пример как правильно удалить отложенный ордер )))
 

Всем привет.

Помощь нужна.

Ордера на продажу переводит в без убыток нормально, а тралить начинает с ошибки 4051. Выдает 130. Но если условие соответствует, модифицирует.

void OrdersModifiStopLoss(int type){
   for(int omsl = OrdersTotal() - 1; omsl >= 0; omsl--){
      if(OrderSelect(omsl, SELECT_BY_POS, MODE_TRADES)){
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type){
            if(type == OP_SELL){
               if(OrderStopLoss() <= 0){
                  if(OrderOpenPrice() - Bid >= SL){
                     stop = OrderOpenPrice();
                     if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite))
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток");
                     else{
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError());
                     }
                  }
               }
               if(OrderStopLoss() <= OrderOpenPrice()){
                  if(OrderOpenPrice() - Bid >= SL){
                     stop = OrderStopLoss() - step;
                     if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite))
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс");
                     else{
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError());
                     }
                  }
               }
            }
            if(type == OP_BUY){
               if(OrderStopLoss() <= 0){
                  if(Bid - OrderOpenPrice() >= SL){
                     stop = OrderOpenPrice();
                     if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite))
                        Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток");
                     else{
                        Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс в безубыток не удалось. Ошибка №", GetLastError());
                     }
                  }
               }
               if(OrderStopLoss() >= OrderOpenPrice()){
                  if(Bid - OrderStopLoss() >= SL){
                     stop = OrderStopLoss() + step;
                     if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite))
                        Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс");
                     else{
                        Print("Ордер OP_BUY за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError());
                     }
                  }
               }
            }
         }
      }
   }
}

2021.04.15 21:18:45.263    2019.01.24 18:51:05  %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263    2019.01.24 18:51:05  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263    2019.01.24 18:51:05  %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263    2019.01.24 18:51:05  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263    2019.01.24 18:51:05  %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13398 tp: 0.00000 ok
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №130
2021.04.15 21:18:45.263    2019.01.24 18:51:04  %WR EURUSD,M15: OrderModify error 130
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13418 tp: 0.00000 ok
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс не удалось. Ошибка №4051
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: OrderModify error 4051
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: invalid stoploss for OrderModify function
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: Ордер OP_SELL за №33: модифицирован стоп лосс в безубыток
2021.04.15 21:18:45.263    2019.01.24 18:51:03  %WR EURUSD,M15: modify #33 sell 0.10 EURUSD at 1.13438 sl: 1.13438 tp: 0.00000 ok
2021.04.15 21:18:45.233    2019.01.24 18:15:00  %WR EURUSD,M15: Ордер OP_SELL открыт!


А  с ордерами на покупку все ОКей.


ПС. Нормализация не помогает. Да к тому же все нормализовано в OnInit...

 

Если переменная SL - это величина Stop Level, то, по большому счету верно, в большинстве случае будет правильно проходить проверку.

Ошибка же заключается в том, что базовая цена ордеров Sell - Ask, а не Bid.

Поэтому полностью правильная проверка на близость к рынку будет такой:

if (OrderOpenPrice() - Ask - StopLevel > Point() / 10.0)
 
Ihor Herasko:

Если переменная SL - это величина Stop Level, то, по большому счету верно, в большинстве случае будет правильно проходить проверку.

Ошибка же заключается в том, что базовая цена ордеров Sell - Ask, а не Bid.

Поэтому полностью правильная проверка на близость к рынку будет такой:

Спасибо за подсказку.

Только сделал другую проверку:

               if(OrderStopLoss() <= OrderOpenPrice()){
                  if(OrderStopLoss() - Ask >= step){
                     stop = OrderStopLoss() - step;
                     if(OrderModify(OrderTicket(), OrderOpenPrice(), stop, OrderTakeProfit(), 0, clrWhite))
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс");
                     else{
                        Print("Ордер OP_SELL за №", IntegerToString(OrderTicket()), ": модифицирован стоп лосс не удалось. Ошибка №", GetLastError());
                     }
                  }
               }

и все прошло. Ошибка вылечилась.

2021.04.16 22:12:03.273    2019.01.18 17:00:04  Tester: stop loss #24 at 1.13792 (1.13775 / 1.13792)
2021.04.16 22:12:03.263    2019.01.18 16:59:27  %WR EURUSD,M15: Ордер OP_SELL за №24: модифицирован стоп лосс в безубыток
2021.04.16 22:12:03.263    2019.01.18 16:59:27  %WR EURUSD,M15: modify #24 sell 0.10 EURUSD at 1.13792 sl: 1.13792 tp: 0.00000 ok
2021.04.16 22:12:03.193    2019.01.18 16:45:00  %WR EURUSD,M15: Ордер OP_SELL открыт!
2021.04.16 22:12:03.193    2019.01.18 16:45:00  %WR EURUSD,M15: open #24 sell 0.10 EURUSD at 1.13792 ok
2021.04.16 22:12:01.291    2019.01.18 07:42:45  Tester: stop loss #22 at 1.13886 (1.13869 / 1.13886)
2021.04.16 22:12:01.291    2019.01.18 07:42:38  %WR EURUSD,M15: Ордер OP_SELL за №22: модифицирован стоп лосс
2021.04.16 22:12:01.291    2019.01.18 07:42:38  %WR EURUSD,M15: modify #22 sell 0.10 EURUSD at 1.13936 sl: 1.13886 tp: 0.00000 ok
2021.04.16 22:12:01.271    2019.01.18 07:36:30  %WR EURUSD,M15: Ордер OP_SELL за №22: модифицирован стоп лосс в безубыток
2021.04.16 22:12:01.271    2019.01.18 07:36:30  %WR EURUSD,M15: modify #22 sell 0.10 EURUSD at 1.13936 sl: 1.13936 tp: 0.00000 ok
2021.04.16 22:12:00.889    2019.01.18 03:45:00  %WR EURUSD,M15: Ордер OP_SELL открыт!
2021.04.16 22:12:00.889    2019.01.18 03:45:00  %WR EURUSD,M15: open #22 sell 0.10 EURUSD at 1.13936 ok

Еще раз спасибо.