Закрытие позиций

 

 Сделок много на разных инструментах,  советник не закрывал все сделки когда нужно.

Сделал закрытие с проверкой, но гложет смутное сомнение, что я, что то упустил. 

Просьба, если кто видит, что в моём коде могут вылезти какие нибудь траблы или  знает как записать, чтоб   все сделки закрылись   наверняка!!!  Напишите.


int res = 0;
//--------------------------------------------------------------------
void OnTick()
 {
  if(res)
    ClosePos();
//---
  БЛА, БЛа, Бла.
//---
  ClosePos();
 }
//+------------------------------------------------------------------+
void ClosePos()
 {
  res = -1;
  while(IsPositionExists() != 0 || res != 3)
   {
    for(int i = PositionsTotal() - 1; i >= 0; i--)
      if(m_position.SelectByIndex(i) && m_position.Magic() == Magic)
        m_trade.PositionClose(m_position.Ticket());
    res++;
   }
 }
//+------------------------------------------------------------------+
int IsPositionExists()
 {
  int re = 0;
  for(int i = PositionsTotal() - 1; i >= 0; i--)
    if(m_position.SelectByIndex(i) && m_position.Magic() == Magic)
      re++;
  return(re);
 }
//+------------------------------------------------------------------+


 

Я никогда не делаю зацикленных циклов - всегда есть вероятность напороться на вечный цикл: например оборвалась связь (ну здесь ладно - торговые приказы не идут на сервер), а вот если торговля остановлена (клиринг, вечер пятницы) - Вы будете продолжать бомбить торговый сервер и добром это не кончится.

Поэтому применяю такой алгоритм: в OnTick выдаётся задание на закрытие всех позиций и проверяется результат выполнения.

Примерно так:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(m_close_all)
     {
      if(IsPositionExists())
         CloseAllPositions();
      else
         m_close_all=false;
     }

Плюс, по хорошему, при закрытии позиций нужно проверять: не сильно ли близко находятся Тейк профит и Стоп лосс к цене закрытия.


Самый простой пример - без проверки близости Тейк профита и Стоп лосс дан в  Close all positions:

Close all positions
Close all positions
  • www.mql5.com
Закрытие позиций при достижении уровня прибыли  Close all if Profit . При этом суммируется общая прибыль по всем позициям: вне зависимости от символа и magic number. Подсчёт прибыли происходит только в момент рождения нового бара.
 
Vladimir Karputov:

а вот если торговля остановлена (клиринг, вечер пятницы) - Вы будете продолжать бомбить торговый сервер и добром это не кончится.

Плюс, по хорошему, при закрытии позиций нужно проверять: не сильно ли близко находятся Тейк профит и Стоп лосс к цене закрытия.

Спасибо, я так и знал, что что то не учёл. Учту.

У меня нет там ни тейка ни стопа, проверка не нужна. Нужно наверняка закрыть все позиции. В вашем примере, если остались не закрытые позиции, они так и не будут удалены в дальнейшем.

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

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

Опа, а есть ещё праздничные дни. Есть повод задуматься.

 
Aleksandr Slavskii:

*** В вашем примере, если остались не закрытые позиции, они так и не будут удалены в дальнейшем.

***

В моём примере если останутся незакрытые позиции, то на следующем тике снова будет предпринята попытка закрыть все.

 
Vladimir Karputov:

В моём примере если останутся незакрытые позиции, то на следующем тике снова будет предпринята попытка закрыть все.

Понял, там где даём задание на удаление позиции , там присваиваем  m_close_all = true.

Хороший вариант, просто и надёжно. 

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

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

 
Aleksandr Slavskii:

Понял, там где даём задание на удаление позиции , там присваиваем  m_close_all = true.

Хороший вариант, просто и надёжно. 

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

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

Про зацикленные циклы я образно говорил - чтобы было более понятно.

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