После открытия позиции тикет у Вас не сохраняется. И при следующем запуске 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
Всем привет.
Помощь нужна.
Ордера на продажу переводит в без убыток нормально, а тралить начинает с ошибки 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)
Если переменная 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
Еще раз спасибо.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый День.
Решил начать программировать на 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);
}