доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"
подскажите как исправить этй проблему
ERR_INVALID_FUNCTION_PARAMVALUE | 4051 | Недопустимое значение параметра функции |
доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"
подскажите как исправить этй проблему
Очень просто. Перед тем, как отдавать приказ на закрытие ордера, нужно прверить, а существует ли такой ордер в списке рыночных одеров. Если не ордер селект, то континьюэ. В результате цикл просто проскочит мимо несуществующего ордера.
hasayama дал(дала) верное решение. Я лишь развернул его.
// Учёт ордеров Symb=Symbol(); // Название фин.инстр. Total=0; // Количество ордеров for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм if (OrderType()>1) // Попался отложенный { Alert("Обнаружен отложенный ордер. Эксперт не работает."); return; // Выход из start() } Total++; // Счётчик рыночн. орд if (Total>1) // Не более одного орд { Alert("Несколько рыночных ордеров. Эксперт не работает."); return; // Выход из start() } if (Total==0) // если открытых ордеров нет (закрылся по стопу) { Working=false; // эксперт не работает с ордерами } Ticket=OrderTicket(); // Номер выбранн. орд. Tip =OrderType(); // Тип выбранного орд. Lot =OrderLots(); // Количество лотов } }вот такой у меня учёт ордеров. на тесте советник открывает позицию, потом закрывает её согласно условий, а потом зацыкливается на попытке закрыть ордер Buy 0
Думаю уместнее будет привести пример кода открытия и закрытия сделок. Из этого куска не понять почему он циклится.
Кстати, а зачем такие жесткие условия на выход? Не проще ли просто использовать break или тот же continue?
вот они изучатели языка машин =)))
сории за офф топ
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"
подскажите как исправить этй проблему