Помогите разобраться с удалением отложек

 

Уважаемые программеры, помогите решить задачку. В советник нужно прописать удаление отложек по заданному условию. Пример выставлена отложка sellstop в которой есть сл но цена идет в противоположном направлении, не цепляет отложку и касается уровня сл этого ордера, и в этот момент отложка удаляется.

Условие что то типа если(ордер байстоп и аск>=ордерстоплосс) то удалить отложку. И селлстоп соответственно (ордер селлстоп и бид<=ордерстоплосс) удалить отложку.

Голову уже сломал как правильно это сделать в коде :( и единственное чего смог добиться так это того что ордера начали удаляться но игнорируя условие, то есть на новом тике и селлстопы и байстопы... Может кто уж занимался подобным и сможет направить на путь истинный...

 
В цикле перебираешь ордера, выбираешь очередной для работы, проверяешь тип, проверяешь условие для удаления и ...
 
AlexeyVik:
В цикле перебираешь ордера, выбираешь очередной для работы, проверяешь тип, проверяешь условие для удаления и ...

Типа такого?

for (int i=0; i < OrdersTotal(); i++)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if ( (OrderSymbol() == Symbol()) )
      {
       if ( (OrderType()  == OP_BUYSTOP) &&
            (Bid <= OrderStopLoss()))
          {
           OrderDelete(OrderTicket());
           continue;
          }             
       if ( (OrderType()  == OP_SELLSTOP) &&
            (Ask >= OrderStopLoss()))
          {
           OrderDelete(OrderTicket());
           continue;
          }             
      } 
   }
 
Memento:

Типа такого?


Почти. Осталось лишь развернуть цикл, проверить успешность выбора ордера и проверить результат удаления:

for (int i = OrdersTotal() - 1; i >= 0; i--)
{ 
    if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
       continue;

    if (OrderSymbol() != Symbol())
       continue;

    if ((OrderType() == OP_BUYSTOP && Bid <= OrderStopLoss())
        ||
        (OrderType() == OP_SELLSTOP && Ask >= OrderStopLoss()))
    {
       if (!OrderDelete(OrderTicket()))
       {
         // здесь продумать реакцию на ошибку удаления
       }
       
       RefreshRates();
    }               
}
 
Благодарю, буду пробовать.
Причина обращения: