Удаление ордеров в MQL
В ходе изучения языка MQL4 наткнулся на такую проблему, как правильное удаление ордеров. Составив программу, работа эксперта выполнялась, но не совсем правильно. Ордера удалялись через один.
Давайте посмотрим, что же я накалякал.
for(i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
tic=OrderTicket();
if(OrderClose(tic,Lot,Bid,2)==true) Print("ok,"+i);
}
Описание кода:
Цикл начинается с нуля и продолжается до того момента пока условие i<OrdersTotal() соблюдается. OrdersTotal() возвращает общее количество открытых и отложенных ордеров.
Что же в этом коде не так?
А то, что когда удаляется первый ордер (на этом моменте i=1), все ордера смещаются на один влево. Тот, который был вторым становится первым, третий вторым и т.д. Далее (на этом моменте i=2) удаляется ордер №3, который находится во второй ячейке из-за удаления первого и сдвига всех ордеров влево и т.д.
Как должно быть?
А правильно реализовать код нужно так. Запустить цикл с конца. Тогда ордера не будут сдвигаться влево и порядок не нарушится.
Правильный код:
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
tic=OrderTicket();
if(OrderClose(tic,Lot,Bid,2)==true) Print("ok, "+i);
}