Счётчик частичных закрытий ордера - страница 3

 
Yevhenii Levchenko #:

В mt4 же нет частичного закрытия...

Всё там есть. Нет только бирживых функций, которые там и ненадо.

 
forex2030 #:

Глобальные переменные это больше мусора чем требуемого итога.

Рассчитывал применить в стиле обработки ордеров в цикле,
например как работает счётчик открытых ордеров по типу.

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

 
Ihor Herasko #:

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

У меня на самом деле стоит задача как не закрывать ордер частями серией в одном месте при выполнении условия

Есть 3 вида закрытий частями лота:

1. Если выполнено условие и время открытия больше времени закрытия, то можно закрыть часть лота (работает 1 раз)
2. Если выполнено условие и нет СЛ в БУ, то можно закрыть ещё часть лота и установить СЛ в БУ (работает 1 раз)
3. Надо закрыть ещё часть лота, но не знаю какое событие придумать чтобы закрытие было 1 раз а не серией

Поэтому и пытаюсь посчитать сколько было закрытий частями у ордера, чтобы ограничить п.3 количеством, т.е. если закрытий было 2, то можно закрыть ещё 1 раз.

 
forex2030 #:

У меня на самом деле стоит задача как не закрывать ордер частями серией в одном месте при выполнении условия

Есть 3 вида закрытий частями лота:

1. Если выполнено условие и время открытия больше времени закрытия, то можно закрыть часть лота (работает 1 раз)
2. Если выполнено условие и нет СЛ в БУ, то можно закрыть ещё часть лота и установить СЛ в БУ (работает 1 раз)
3. Надо закрыть ещё часть лота, но не знаю какое событие придумать чтобы закрытие было 1 раз а не серией

Поэтому и пытаюсь посчитать сколько было закрытий частями у ордера, чтобы ограничить п.3 количеством, т.е. если закрытий было 2, то можно закрыть ещё 1 раз.

Конкретно в этом случае можно придумать что-то типа установки ТП или перемещения СЛ еще на один пункт (в +1 от безубытка).

 
Andrey Khatimlianskii #:

Конкретно в этом случае можно придумать что-то типа перемещения СЛ еще на один пункт (в +1 от безубытка).

Действительно хорошая мысль!

 
Andrey Khatimlianskii #:

Конкретно в этом случае можно придумать что-то типа установки ТП или перемещения СЛ еще на один пункт (в +1 от безубытка).

не оптимальный способ. Вообще нехороший - DC (точнее ММ) этот пункт-два съест и не подавится. Спред он же дёргается. Вы закроете (вам закроют) сделку по худшей цене и с максимальным спредом. 

А ночью так вообще. 

и он может вообще несработать. Стопы могут не срабатывать. Лимитки могут несрабатывать, но лимитку можно отбить по телефону

 
Maxim Kuznetsov #:

не оптимальный способ. Вообще нехороший - DC (точнее ММ) этот пункт-два съест и не подавится. Спред он же дёргается. Вы закроете (вам закроют) сделку по худшей цене и с максимальным спредом. 

А ночью так вообще. 

и он может вообще несработать. Стопы могут не срабатывать. Лимитки могут несрабатывать, но лимитку можно отбить по телефону

Тема не об этом. А спред здесь вообще не при чем.

 
Andrey Khatimlianskii #:

Тема не об этом. А спред здесь вообще не при чем.

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

 
forex2030 #:

У меня на самом деле стоит задача как не закрывать ордер частями серией в одном месте при выполнении условия

Есть 3 вида закрытий частями лота:

1. Если выполнено условие и время открытия больше времени закрытия, то можно закрыть часть лота (работает 1 раз)
2. Если выполнено условие и нет СЛ в БУ, то можно закрыть ещё часть лота и установить СЛ в БУ (работает 1 раз)
3. Надо закрыть ещё часть лота, но не знаю какое событие придумать чтобы закрытие было 1 раз а не серией

Поэтому и пытаюсь посчитать сколько было закрытий частями у ордера, чтобы ограничить п.3 количеством, т.е. если закрытий было 2, то можно закрыть ещё 1 раз.

Задача решается подсчетом количеств частичных закрытий. Алгоритм такого подсчета я описал. Но, видимо, этого недостаточно. Тогда вот готовый код:

void OnStart()
{
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
         
      int nTicket = OrderTicket();
      double fClosedVolume = 0;
      int nCnt = GetCountOfPartiallyClosure(fClosedVolume);
      if (nCnt > 0)
         Print("Order #", nTicket, ", count of partially closure: ", nCnt, ", closed volume: ", DoubleToString(fClosedVolume, 2));         
   }
}

int GetCountOfPartiallyClosure(double &fClosedVolume)
{
   string sComment = OrderComment();
   int nTicketPos = StringFind(sComment, "from #");
   if (nTicketPos < 0)
      return 0;
      
   datetime dtOpenTime = OrderOpenTime();
   int nFirstTicket = int(StringToInteger(StringSubstr(sComment, nTicketPos + 6)));
   if (!OrderSelect(nFirstTicket, SELECT_BY_TICKET, MODE_HISTORY))
      return 1;

   fClosedVolume = OrderLots();
   int nCnt = 1;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
         continue;

      if (OrderTicket() == nFirstTicket)
         continue;

      if (OrderCloseTime() < dtOpenTime)
         return nCnt;
      
      sComment = OrderComment();
      nTicketPos = StringFind(sComment, "to #");
      if (nTicketPos < 0)
         continue;

      int nTicket = int(StringToInteger(StringSubstr(sComment, nTicketPos + 4)));
      if (nTicket == nFirstTicket)
      {
         ++nCnt;
         nFirstTicket = OrderTicket();
         fClosedVolume += OrderLots();
      }
   }
   
   return nCnt;
}
 
Ihor Herasko #:

Задача решается подсчетом количеств частичных закрытий. Алгоритм такого подсчета я описал. Но, видимо, этого недостаточно. Тогда вот готовый код:

Считает хорошо, но на втором ордере всё зависло в тестере.