Страница 1 из 1

Отложенные ордера

Добавлено: Чт апр 05, 2007 5:25 pm
Mike
Ситуация такая:
По некоторому условию выставляем ордера, все работает, т.е. они выставляются со всеми тейками и лоссами.
После этого нужно:
1.Удалить ордер, если он не открылся на момент заданного времени.

2.Закрыть ордер, если он не закрылся на момент заданного времени.

В данном коде, у меня все работает, кроме удаления второго ордера. Т.е. ордер селл удаляется как надо, а бай не удаляется плюсом переносится на следующий день. Как сделать так чтобы оба ордера удалялись если не сработали на конкретный момент времени?

Код: Выделить всё

begin
SendPendingOrder(Symbol, op_BuyStop, 0.1, h - StopLoss * point, h + TakeProfit * point,
h + 5*point, OrderHandle);

SendPendingOrder(Symbol, op_SellStop, 0.1, l + StopLoss * point, l - TakeProfit * point,
l - 5*point, OrderHandle);
end;

 if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) then
  if (HourOf(Time(0)) = 15) and (MinuteOf(CurrTime) = 55) then

   DeleteOrder(OrderHandle);
  
   if OrderClosed(OrderHandle) and (HourOf(Time(0)) = 15) and 
  (MinuteOf(CurrTime) = 55) then
   CloseOrder(OrderHandle);
    end;
    end;
 
За особую неграмотность кода не ругаться, написал настолько-насколько мозгов хватило.

Спасибо.

Re: Отложенные ордера

Добавлено: Вт апр 10, 2007 9:47 pm
Terranin
Mike писал(а):Ситуация такая:
По некоторому условию выставляем ордера, все работает, т.е. они выставляются со всеми тейками и лоссами.
После этого нужно:
1.Удалить ордер, если он не открылся на момент заданного времени.

2.Закрыть ордер, если он не закрылся на момент заданного времени.

В данном коде, у меня все работает, кроме удаления второго ордера. Т.е. ордер селл удаляется как надо, а бай не удаляется плюсом переносится на следующий день. Как сделать так чтобы оба ордера удалялись если не сработали на конкретный момент времени?

Код: Выделить всё

// для каждого ордера
if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) then
  begin
    // проверка на тип ордера
    if (OrderType = tp_Sell) or (OrderType = tp_Buy) then 
      begin
         // сработавший
         if (время больше заданного) then
           CloseOrder(OrderHandle);
      end
    else
      begin
         // отложенный
         if (время больше заданного) then
           DeleteOrder(OrderHandle);
      end;
  end;


Добавлено: Ср апр 18, 2007 11:10 pm
Mike
Тупо загоняю:

Код: Выделить всё

begin
    SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle);
    
    SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle);

    end;

//  end;

    if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) then 
  begin 
    // проверка на тип ордера 
    if (OrderType = tp_Sell) or (OrderType = tp_Buy) then
      begin
         // сработавший
         if (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then
           CloseOrder(OrderHandle);
      end
    else
      begin
         // отложенный
         if    (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then
           DeleteOrder(OrderHandle);
      end;
  end;
а удаляется только один ордер, причем именно второй в коде, в данном случае селл удалился а бай остался. Тут то что не так??

Спасибо

Добавлено: Ср апр 18, 2007 11:28 pm
Terranin
Ясное дело не так. 2 ордера подряд открывались и их тикет заносился в одну и туже переменную, второй раз затер предыдущее значение.

Добавлено: Ср апр 18, 2007 11:48 pm
Mike
Но мне и надо их подряд открывать в 9 утра!

Добавлено: Чт апр 19, 2007 12:40 am
Terranin
Mike писал(а):Но мне и надо их подряд открывать в 9 утра!
Но тикеты то надо заносить в разные переменные! Например в OrderHandle1 и OrderHandle2 и потом соответственно закрывать.

Добавлено: Чт апр 19, 2007 10:06 am
Mike
Terranin писал(а):
Mike писал(а):Но мне и надо их подряд открывать в 9 утра!
Но тикеты то надо заносить в разные переменные! Например в OrderHandle1 и OrderHandle2 и потом соответственно закрывать.
Тогда так??

Код: Выделить всё

begin 
    SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle1); 
    
    SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle2); 

Добавлено: Чт апр 19, 2007 11:01 am
Mike
Mike писал(а):
Terranin писал(а):
Mike писал(а):Но мне и надо их подряд открывать в 9 утра!
Но тикеты то надо заносить в разные переменные! Например в OrderHandle1 и OrderHandle2 и потом соответственно закрывать.
Тогда так??

Код: Выделить всё

begin 
    SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle1); 
    
    SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle2); 
Вообщем додумал так пока:

Код: Выделить всё

 SendPendingOrder(Symbol, op_BuyStop, 0.1, h - ((StopLoss-5) * point), 0, h + 5*point, OrderHandle1); 
    
    SendPendingOrder(Symbol, op_SellStop, 0.1, l + ((StopLoss-5) * point), 0, l - 5*point, OrderHandle2); 

 if (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then

   DeleteOrder(OrderHandle1);

  if (OrderTicket <> SavedHandle) or (OrderTicket <> Handle)
   and (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then
   CloseOrder(OrderHandle1);

    if (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then

   DeleteOrder(OrderHandle2);

  if (OrderTicket <> SavedHandle) or (OrderTicket <> Handle)
   and (HourOf(Time(0)) >= 15) and (MinuteOf(CurrTime) >= 55) then
 CloseOrder(OrderHandle2);
 
Все работает, удаляет как и надо. Правда теперь трейлинг стоп отвалился и еще одна фича. Будем разбираться дальше....