удаление ордеров

 

Составил пользовательскую ф-ю для удаления отложенных ордеров по прошествии определенного кол-ва баров.

Почему-то не работает. Подскажите, пожалуйста где ошибся.

void Orders_Delete()
{
int Bar_B=0;
int Bar_S=0;
static datetime New_Time=0;

for (int i=0; i<=OrdersTotal(); i++)
   {
   if (OrderSelect(OrderTicket(),SELECT_BY_TICKET))
      {
      if(OrderType()==OP_BUYSTOP)
         {
         if (New_Time!=Time[0])
            {
            New_Time=Time[0];
            Bar_B++;
               if(Bar_B>=15)
               OrderDelete(OrderTicket());
            }         
         }
      if(OrderType()==OP_SELLSTOP) 
         {
         if (New_Time!=Time[0])
            {
            New_Time=Time[0];
            Bar_S++;
               if(Bar_S>=15)
               OrderDelete(OrderTicket());
            }         
         } 
      
      }
   }
return(0);  
   
}
 

А экспирация чем не подходит?

 
sanyooooook:

А экспирация чем не подходит?



если речь идет о том, чтобы проставить срок истечения при открытии ордера, то, на сколько я понимаю, там можно только время проставить, а я хочу исходить из количества баров.
 
цель через определенное количество баров удалить все отложники?
 
Techno:
цель через определенное количество баров удалить все отложники?

может быть только одна отложка на покупку и одна на продажу. к примеру, если через 15 баров после открытия отложка не сработала - удаляем ее
 

Попробуйте так

void Orders_Delete(int BarsExp = 15)
{
   int Bar_B;
   datetime op_time;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect( i,SELECT_BY_POS))
      {
         if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {
            op_time = OrderOpenTime();
            op_time = op_time - MathMod( op_time, Period()*60);
            Bar_B = iBarShift( Symbol(), NULL, op_time, false);
            if(Bar_B>=BarsExp)
            OrderDelete(OrderTicket());
         }
      }
   }
   return(0);  
}
 
Maks:

может быть только одна отложка на покупку и одна на продажу. к примеру, если через 15 баров после открытия отложка не сработала - удаляем ее

в таком случае выдумывать ничего не надо, ставь время удаления при открытии

OrderSend(Symbol(),OP_BUYLIMIT,0.01,Ask-150*Point,0,0,0,0,0,TimeCurrent()+Period()*15*60,Green);
Цифра 15 выделенная красным это количество баров, через которые будет удален ордер если не сработает.
 
Techno:

в таком случае выдумывать ничего не надо, ставь время удаления при открытии

Цифра 15 выделенная красным это количество баров, через которые будет удален ордер если не сработает.
Time[0]+(Period()*(15+1)*60)
ему же по количеству баров нужно )
 

ок, всем спасибо. буду пробовать

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