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

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

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

#1 Сообщение Mike » Чт апр 05, 2007 5:25 pm

Ситуация такая:
По некоторому условию выставляем ордера, все работает, т.е. они выставляются со всеми тейками и лоссами.
После этого нужно:
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;
 
За особую неграмотность кода не ругаться, написал настолько-насколько мозгов хватило.

Спасибо.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

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

#2 Сообщение Terranin » Вт апр 10, 2007 9:47 pm

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;

Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#3 Сообщение Mike » Ср апр 18, 2007 11:10 pm

Тупо загоняю:

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

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;
а удаляется только один ордер, причем именно второй в коде, в данном случае селл удалился а бай остался. Тут то что не так??

Спасибо

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#4 Сообщение Terranin » Ср апр 18, 2007 11:28 pm

Ясное дело не так. 2 ордера подряд открывались и их тикет заносился в одну и туже переменную, второй раз затер предыдущее значение.
Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#5 Сообщение Mike » Ср апр 18, 2007 11:48 pm

Но мне и надо их подряд открывать в 9 утра!

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#6 Сообщение Terranin » Чт апр 19, 2007 12:40 am

Mike писал(а):Но мне и надо их подряд открывать в 9 утра!
Но тикеты то надо заносить в разные переменные! Например в OrderHandle1 и OrderHandle2 и потом соответственно закрывать.
Asta la vista
Mike

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#7 Сообщение Mike » Чт апр 19, 2007 10:06 am

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); 

Mike
Сообщения: 38
Зарегистрирован: Пт мар 16, 2007 2:03 pm

#8 Сообщение Mike » Чт апр 19, 2007 11:01 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); 
Вообщем додумал так пока:

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

 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);
 
Все работает, удаляет как и надо. Правда теперь трейлинг стоп отвалился и еще одна фича. Будем разбираться дальше....

Ответить