Блок определяющий самый старый открытый ордер.

 

Добрый день, знатоки!

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

То есть если есть несколько 10-20 открытых ордеров,  нужно вычислить из них самый старый и закрыть, результат сделки не важен.

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

Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?

Спасибо!

 
Pavel Luzin:

Добрый день, знатоки!

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

То есть если есть несколько 10-20 открытых ордеров,  нужно вычислить из них самый старый и закрыть, результат сделки не важен.

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

Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?

Спасибо!


Алгоритм достаточно простой:

  1. Завести переменную, в которую будет сохранено время открытия ордера (например, dtOldestOrderTime), а также переменную, в которой сохраняется тикет этого ордера (например, nOldestOrderTicket).
  2. Пройтись по списку рыночных ордеров (цикл).
  3. На каждой итерации цикла сравнивается время открытия обрабатываемого ордера и значение переменной dtOldestOrderTime. Если время открытия этого ордера меньше, чем dtOldestOrderTime, то его данные сохраняются в dtOldestOrderTime и nOldestOrderTicket. Также нужно учесть, что инициализировать dtOldestOrderTime стоит каким-то большим значением (например, текущее время + 1 сек), чтобы данные первого найденного ордера гарантированно сохранялись в dtOldestOrderTime.
  4. По окончанию цикла в переменной nOldestOrderTicket находится тикет самого старшего ордера, а в переменной dtOldestOrderTime - время его открытия. Далее остается решить, пора закрывать такой ордер или нет.
 
Ihor Herasko:

Алгоритм достаточно простой:

  1. Завести переменную, в которую будет сохранено время открытия ордера (например, dtOldestOrderTime), а также переменную, в которой сохраняется тикет этого ордера (например, nOldestOrderTicket).
  2. Пройтись по списку рыночных ордеров (цикл).
  3. На каждой итерации цикла сравнивается время открытия обрабатываемого ордера и значение переменной dtOldestOrderTime. Если время открытия этого ордера меньше, чем dtOldestOrderTime, то его данные сохраняются в dtOldestOrderTime и nOldestOrderTicket. Также нужно учесть, что инициализировать dtOldestOrderTime стоит каким-то большим значением (например, текущее время + 1 сек), чтобы данные первого найденного ордера гарантированно сохранялись в dtOldestOrderTime.
  4. По окончанию цикла в переменной nOldestOrderTicket находится тикет самого старшего ордера, а в переменной dtOldestOrderTime - время его открытия. Далее остается решить, пора закрывать такой ордер или нет.

 ++Спасибо, буду пробовать, логика понятна.

На словах оно конечно попроще :), попытаюсь в код ее

 
Pavel Luzin:

Добрый день, знатоки!

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

То есть если есть несколько 10-20 открытых ордеров,  нужно вычислить из них самый старый и закрыть, результат сделки не важен.

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

Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?

Спасибо!


extern int MaxTrades = 50;
...
   if (CountTrades() > MaxTrades) {
      for (int pos = 0; pos < OrdersTotal(); pos++) {
         OrderSelect(pos, SELECT_BY_POS);
         if (OrderSymbol() == Symbol() && OrderType() == OP_BUY) {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Bid, In, White);
            pos = OrdersTotal();
         }
         if (OrderSymbol() == Symbol() && OrderType() == OP_SELL) {
            RefreshRates();
            OrderClose(OrderTicket(), OrderLots(), Ask, In, White);
            pos = OrdersTotal();
         }                      
      }
   }      
...
int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) count++;
   }
   return (count);
}

mql4. старый будет первый они сортируются по времени открытия(или номеру)

 
Aleksey Altukhov:

mql4. старый будет первый они сортируются по времени открытия(или номеру)


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

P. S. Приведенный код, к сожалению, вообще никак не относится к обговариваемой проблеме. 

 
Pavel Luzin:

Добрый день, знатоки!

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

То есть если есть несколько 10-20 открытых ордеров,  нужно вычислить из них самый старый и закрыть, результат сделки не важен.

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

Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?

Спасибо!

int ReturnOldestTicket()
{ datetime OldestTime=TimeCurrent();
  int TicketOldest=-1;
  int j=0;
  while ( j<OrdersTotal() )
  { if ( OrderSelect(j, SELECT_BY_POS, MODE_TRADES) )
      if ( OrderSymbol()==Symbol() )
        if ( OrderType()==OP_BUY || OrderType()==OP_SELL )
          if ( OrderOpenTime()<OldestTime )
          { OldestTime=OrderOpenTime();
            TicketOldest=OrderTicket();
          }
    j++;
  }
  return(TicketOldest);
}
Закрытие Позиции (ReturnOldestTicket()) оставляю Вам !
 
Ivan Ivanov:
Закрытие Позиции (ReturnOldestTicket()) оставляю Вам !

Спасибо! Как вычислить ордер понял :).

Проблема у меня в другом.

Например, в экстерны вынести переменную, спустя какое время в минутах или часах нужно закрыть ордер... указал например 7 дней или 168 часов или еще как.

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


С блоком закрытия проблем нет ).

P.S.

Понимаю, что где то просто туплю, но пока в голову ни чего не приходит.

 
Pavel Luzin:

Спасибо! Как вычислить ордер понял :).

Проблема у меня в другом.

Например, в экстерны вынести переменную, спустя какое время в минутах или часах нужно закрыть ордер... указал например 7 дней или 168 часов или еще как.

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


С блоком закрытия проблем нет ).

P.S.

Понимаю, что где то просто туплю, но пока в голову ни чего не приходит.

Не сочти за грубость, но как можно над таким пустяком не один день голову напрягать??? Ведь эта проблема стоит не больше бульона из-под яиц...

Время всегда считается в СЕКУНДАХ, следовательно переводишь дни и\или часы в секунды (1день = 24часа, 1час = 60мин*60сек) и сравниваешь разницу текущего времени и времени открытия ордера с этим количеством секунд. Если равно или больше, значит этот ордер надо закрывать...

 
Alexey Viktorov:

Не сочти за грубость, но как можно над таким пустяком не один день голову напрягать??? Ведь эта проблема стоит не больше бульона из-под яиц...

Время всегда считается в СЕКУНДАХ, следовательно переводишь дни и\или часы в секунды (1день = 24часа, 1час = 60мин*60сек) и сравниваешь разницу текущего времени и времени открытия ордера с этим количеством секунд. Если равно или больше, значит этот ордер надо закрывать...

Вот про то и говорю что туплю )))  Спасибо! Теперь все стало на свои места. Проблема решена!

 
Обратитесь во фриланс, там напишут без проблем
 
Ihor Herasko:  Нет, не сортируются. Сортировка ордеров производится пользователем по своему усмотрению. Поэтому нельзя полагаться на порядок следования ордеров в списке. Нужно только вычислять.

Как ни странно, но ордера действительно отсортированы по времени (или по номеру тикета, что одно и то же). Вот доказательства

   На экране ордера по типу

   Результат работы скрипта снизу вверх

//+-------------------------------------------------------+
//| Проверка упорядоченности ордеров             PROBA.mq4|
//+-------------------------------------------------------+
#property strict
void OnStart()
{
   bool x;
   Alert("- - - - - Ордеров:  ", OrdersTotal());
   x=OrderSelect(0, SELECT_BY_POS);
   datetime T1=OrderOpenTime();
   Alert(OrderTicket(),"   ",T1);   
   for(int n=1; n<OrdersTotal(); n++)
   {
      x=OrderSelect(n, SELECT_BY_POS);
      datetime T2=OrderOpenTime();
      Alert(OrderTicket(),"   ",T2);
      if(T2<T1)
      {
         Alert("--- Упорядоченность ордеров по времени открытия отсутствует");
         return;
      }
      T1=T2;
   }
   Alert("+++ Ордера упорядочены по времени открытия");
}

Старожилы говорят, что было время, когда так и было. Потом вдруг сделали, что ордера стали при программном выборе сортироваться так, как на экране. Потом опять они стали сортироваться по времени. Можно ли этим пользоваться? Опасно, а вдруг опять... Ведь уже было! Хотя мое мнение: что было, то сплыло. Ордера отсортированы по времени. Для фрилансеров и маркетников опасно, а свои всегда смогу исправить. На всякий случай писал в СервисДеск 2 месяца назад 2017.05.15 Заявка принята к рассмотрению и тишина...