Коллеги, пожалуйста, помогите. Своих мозгов не хватает.
Нужно, чтобы робот, который выставил лимитные ордера, при закрытии открытой позиции (не важно, по стопу или профиту) удалил бы оставшуюся отложку, но не всякую, а ту, магический номер которой равен тикету закрытой позиции.
У меня получается, что отложку робот удаляет, но не после того, как позиция закрылась, а сразу, как она была выставлена. И начинает бороться сам с собой, постоянно выставляя и удаляя отложенные ордера. Посмотрите, пожалуйста, что неправильно.
как то хитрО у Вас)))))))
позволю се предложить вариант покороче
for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT)) //перебираем активные лимитные ордера { int magic = OrderMagicNumber(); if (OrderSelect(magic, SELECT_BY_TICKET) && OrderCloseTime()!=0) //ордер с тикетом равным маджику закрыт { OrderDelete(i); } } }не проверил правда, но примерно это оно;)
как то хитрО у Вас)))))))
позволю се предложить вариант покороче
не проверил правда, но примерно это оно;)Андрей, спасибо. Только я не совсем понимаю (опыта и знаний не хватает пока). В Вашем коде получается, что робот ищет именно лимитный ордер, определяет его маджик и сразу удаляет. А маджик не важно какой. А мне надо, чтобы удалялся ордер обязательно с маджиком, который равен тикету только что закрытой позиции. Т.о. надо, чтобы триггером для удаления было именно событие закрытия позиции. Для меня не важно в данном случае, как эта позиция закрылась (просто по условию получится, что если закрытие по СЛ, то лимитов не остается, которые надо удалять. Но если детализировать и делать все правильно, то триггер - это ТП.
Но реально это я могу чего- то не понимать (только 2 месяца назад начал учить язык, а до этого никак не программист). Поэтому поясните, пожалуйста, если чего-то не понимаю.
Андрей, спасибо. Только я не совсем понимаю (опыта и знаний не хватает пока). В Вашем коде получается, что робот ищет именно лимитный ордер, определяет его маджик и сразу удаляет. А маджик не важно какой.
Мэджик важно, какой. Условие:
if (OrderSelect(magic, SELECT_BY_TICKET) && OrderCloseTime()!=0)
как раз следит за тем, чтобы был удален именно тот ордер, который соответствует тикету ранее открытого рыночного ордера.
Единственный неверный момент в приведенном коде - в OrderDelete нужно передать тикет ордера, а не его порядковый номер в списке. Поэтому правильнее будет так:
for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT)) //перебираем активные лимитные ордера { int magic = OrderMagicNumber(); int ticket = OrderTicket(); if (OrderSelect(magic, SELECT_BY_TICKET) && OrderCloseTime()!=0) //ордер с тикетом равным маджику закрыт { OrderDelete(ticket); } } }
При таком подходе не нужно никаких массивов, которые отслеживают имеющиеся рыночные ордера.
как то хитрО у Вас)))))))
позволю се предложить вариант покороче
не проверил правда, но примерно это оно;)Поправочка небольшая:
for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && (OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT)) //перебираем активные лимитные ордера { int del=OrderTicket(); int magic = OrderMagicNumber(); if (OrderSelect(magic, SELECT_BY_TICKET) && OrderCloseTime()!=0) //ордер с тикетом равным маджику закрыт { OrderDelete(del); } } }
Мэджик важно, какой. Условие:
как раз следит за тем, чтобы был удален именно тот ордер, который соответствует тикету ранее открытого рыночного ордера.
Единственный неверный момент в приведенном коде - в OrderDelete нужно передать тикет ордера, а не его порядковый номер в списке. Поэтому правильнее будет так:
При таком подходе не нужно никаких массивов, которые отслеживают имеющиеся рыночные ордера.
Спасибо. Как я понимаю OrderCloseTime()!=0 - ключевое правило, которое исключает пока еще существующие ордера.
Ордера, у которых время закрытия равно нулю, это ордера из рабочего списка. Те, которые имеют время закрытия более нуля, это ордера из истории счета, т. е. закрытые или удаленные.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Коллеги, пожалуйста, помогите. Своих мозгов не хватает.
Нужно, чтобы робот, который выставил лимитные ордера, при закрытии открытой позиции (не важно, по стопу или профиту) удалил бы оставшуюся отложку, но не всякую, а ту, магический номер которой равен тикету закрытой позиции.
У меня получается, что отложку робот удаляет, но не после того, как позиция закрылась, а сразу, как она была выставлена. И начинает бороться сам с собой, постоянно выставляя и удаляя отложенные ордера. Посмотрите, пожалуйста, что неправильно.