Закрытие всех ордеров

 

Доброго времени суток!

Появилась одна идейка, но как реализовать не знаю.

У нас есть один обычный ордер и несколько отложников (некоторые из них уже открыты). По основной сделке выставлен стоп лосс. Как реализовать закрытие всех позиций(и удаление отложных ордеров) при достижении основной сделкой уровня стоп лосса и вообще возможно ли это?

 

Заранее спасибо! 

 
Filya1212:

Доброго времени суток!

Появилась одна идейка, но как реализовать не знаю.

У нас есть один обычный ордер и несколько отложников (некоторые из них уже открыты). По основной сделке выставлен стоп лосс. Как реализовать закрытие всех позиций(и удаление отложных ордеров) при достижении основной сделкой уровня стоп лосса и вообще возможно ли это?

 

Заранее спасибо! 

Конечно возможно. Есть два варианта - учить MQL или заказать у тех, кто умеет ;)

 По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".

 

Вы сеткой ордеров торговать собираетесь? Не совсем понятно просто.

Например, в случае сетки:

1) открыть первый ордер: iFirstTicket = OrderSend(...)

2) открыть последующие ордера примерно так:  iTicket = OrderSend(...)

В функции OnTick() или в функциях, вызываемых из нее, отслеживать, что iFirstTicket не оказался в истории:

bool bFirstTicketFind=false;
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
    CloseAndDeleteAllOrders();
    iFirstTicket=0;
}

Это импровизация, по смыслу разберетесь, как доделать. Функцию CloseAndDeleteAllOrders() надо сделать самому ;-) И, конечно, это упрощенный и не единственный из возможных вариантов реализации.

 
Vitalie Postolache:

Конечно возможно. Есть два варианта - учить MQL и заказать у тех, кто умеет ;)

 По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".

Вот тут то и вопрос, как определить что ордер закрыт по стопу) Дальше как, что в общем понятно
 
Filya1212:
Вот тут то и вопрос, как определить что ордер закрыт по стопу) Дальше как, что в общем понятно
С запросом OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_HISTORY) профит узнать, ну, и комментарий тоже можно, каждый по своему делает.
 
Filya1212:
Вот тут то и вопрос, как определить что ордер закрыт по стопу) Дальше как, что в общем понятно

Так внимательней перечитайте что я выше писал: 

 после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".

Можно ещё цену закрытия с ценой стоплосса сравнивать, но никогда не знаешь, с каким проскальзыванием закроется тот или иной ордер, нужно это учитывать.
 
Alexander Belozerov:

Вы сеткой ордеров торговать собираетесь? Не совсем понятно просто.

Например, в случае сетки:

1) открыть первый ордер: iFirstTicket = OrderSend(...)

2) открыть последующие ордера примерно так:  iTicket = OrderSend(...)

В функции OnTick() или в функциях, вызываемых из нее, отслеживать, что iFirstTicket не оказался в истории:

bool bFirstTicketFind=false;
bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
if(!bFirstTicketFind)
{
    CloseAndDeleteAllOrders();
    iFirstTicket=0;
}

Это импровизация, по смыслу разберетесь, как доделать. Функцию CloseAndDeleteAllOrders() надо сделать самому ;-) И, конечно, это упрощенный и не единственный из возможных вариантов реализации.

Я тут правильно понимаю, что переменной bFirstTicketFind мы возвращаем значение об открытом ордере по тикету и если значение ложно, то происходит закрытие? Просто хочу понять правильно ли я понял)))
 
Filya1212:
Я тут правильно понимаю, что переменной bFirstTicketFind мы возвращаем значение об открытом ордере по тикету и если значение ложно, то происходит закрытие? Просто хочу понять правильно ли я понял)))

Я же не знаю, сколько в Вашем программном коде функций и т. д., т. е. про возвращение, под которым я понимаю return я ничего не имел в виду, реализовать все можно разными способами.

Значение false в моем примере говорит о том, что ордер с номером iFirstTicket (переменная типа int, объявленная в др. месте) был закрыт.

В принципе, наверное, так лучше:

void OnTick()
{
//...
   bool bFirstTicketFind=false;
   bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
   if(!bFirstTicketFind)
   {
           OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_HISTORY)    
           if(OrderProfit()<0.0)
                   CloseAndDeleteAllOrders();
           iFirstTicket=0;
   }
}
И в этой строке "if(OrderProfit()<0.0)" 0.0 можно заменить на что-то другое, если допускать проскальзывание.
 
Vitalie Postolache:

Конечно возможно. Есть два варианта - учить MQL или заказать у тех, кто умеет ;)

 По первому варианту - удаление отложек и закрытие рыночных в цикле, после того, как в истории сделок появился новый ордер, в комментарии которого есть слово "[sl]".

Вы так уверены, что в истории сделок всегда в комментарии будет "[sl]"? Во всяком случае, если смотреть историю счета вручную, то что-то я наблюдаю разную картину в зависимости от брокера.
 
Alexander Belozerov:
Вы так уверены, что в истории сделок всегда в комментарии будет "[sl]"? Во всяком случае, если смотреть историю счета вручную, то что-то я наблюдаю разную картину в зависимости от брокера.

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

Но уж точно не по вашему варианту с  if(OrderProfit()<0.0), ордер может быть закрыт при перевороте с убытком, а не только при стоплоссе, да и мало ли какие ещё причины были для закрытия в убыток, например, скрытый стоп, когда серверу уровень стопа не отсылается, а за всем следит советник. Тогда сравнивать нужно цену закрытия и уровень стопа в настройках советника, или ещё как-то.

 
Alexander Belozerov:

Я же не знаю, сколько в Вашем программном коде функций и т. д., т. е. про возвращение, под которым я понимаю return я ничего не имел в виду, реализовать все можно разными способами.

Значение false в моем примере говорит о том, что ордер с номером iFirstTicket (переменная типа int, объявленная в др. месте) был закрыт.

В принципе, наверное, так лучше:

void OnTick()
{
//...
   bool bFirstTicketFind=false;
   bFirstTicketFind=OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_TRADES);
   if(!bFirstTicketFind)
   {
           OrderSelect(iFirstTicket,SELECT_BY_TICKET,MODE_HISTORY)    
           if(OrderProfit()<0.0)
                   CloseAndDeleteAllOrders();
           iFirstTicket=0;
   }
}
И в этой строке "if(OrderProfit()<0.0)" 0.0 можно заменить на что-то другое, если допускать проскальзывание.
bool bFirstTicketFind=false;
     bFirstTicketFind=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
      
      if(!bFirstTicketFind)
      {
          OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);
          OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
            OrderDelete(OrderTicket(),Violet);  
               ticket=0;
            }
Решил попробовать так, ticket - это первый ордер, вроде как прошла проверка, по логике, на то, открыт ли ордер, и последовало закрытие и удаление отложников, но по факту этого не происходит, при закрытии основной сделки другие не закрываются