Тестер MT4 считает закрывшийся ордер все еще открытым.

 

Есть советник, обрабатывающий одновременно два открытых ордера BUY и SELL. Необходимо отслеживать в OnTick() факт закрытия одного или обоих ордеров по лимитам. В целом все работает, но время от времени проявляется баг - если один ордер закрылся, а другой еще открыт, закрывшийся ордер возвращается функцией OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) как будто он открыт, причем до тех пор, пока не закроется второй ордер. После этого нормальная работа восстанавливается до следующего сбоя. Как мне гарантировано отследить, что ордер все-таки закрыт? Все функции (OrderType, OrderCloseTime) возвращают значения, характерные для открытого ордера!

MT4 build 950.

Код отслеживания стандартный:


active_orders_state_SELL=false;active_orders_state_BUY=false;
for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
         if( !OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )return ;
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {         
         
         if( OrderStopLoss() > OrderTakeProfit() ){active_orders_state_SELL = true;}// Попытка заменить функцию OrderType(), результат также отрицательный
         if( OrderStopLoss() < OrderTakeProfit() ){active_orders_state_BUY = true;}
     }
    }
 
ouch:

Есть советник, обрабатывающий одновременно два открытых ордера BUY и SELL. Необходимо отслеживать в OnTick() факт закрытия одного или обоих ордеров по лимитам. В целом все работает, но время от времени проявляется баг - если один ордер закрылся, а другой еще открыт, закрывшийся ордер возвращается функцией OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) как будто он открыт, причем до тех пор, пока не закроется второй ордер. После этого нормальная работа восстанавливается до следующего сбоя. Как мне гарантировано отследить, что ордер все-таки закрыт? Все функции (OrderType, OrderCloseTime) возвращают значения, характерные для открытого ордера!

MT4 build 950.

Код отслеживания стандартный:


А что стандартного в Вашем коде?
 
Vinin:
А что стандартного в Вашем коде?

Перебор открытых ордеров и выборка тех, что принадлежат советнику. Что странно, и вот такой "костыль" не помогает:

 if( OrderStopLoss()>OrderTakeProfit() )if(OrderStopLoss()>Bid && OrderTakeProfit()<Bid){active_orders_state_SELL=true;}
 if( OrderStopLoss()<OrderTakeProfit() )if(OrderStopLoss()<Bid && OrderTakeProfit()>Bid){active_orders_state_BUY=true;} 

Единственное, что пока придумал, проверять, попадает ли текущая цена в диапазон SL и TP проверяемого ордера. (Ордер не может быть открытым, если текущая цена уже вне лимитов. )

Возможно, еще какая-то проблема с событием OnTick.

 

Стандартного пока ничего не увидел.

Хотелось бы еще увидеть еще код открытия новых позиций

Причина обращения: