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

 

Нужно написать такую производительную функцию.

// Возвращает ближайшее к заданному время, где не было открытых позиций.
datetime GetNoPositionsTime( datetime time )


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

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

typedef datetime (*FUNC)( datetime ); 

ulong Bench( const FUNC Func, const datetime From, const datetime To, const datetime Step = 3600 )
{
  ulong Sum = 0;
  
  for (datetime time = From; !IsStopped() && (time < To); time += 3600)
    Sum += Func(time) - time;

  return(Sum);
}

void OnStart()
{  
  const ulong FirstTicket = HistorySelect(0, INT_MAX) ? HistoryDealGetTicket(0) : 0;
  const datetime To = TimeCurrent();
  const datetime From = FirstTicket ? (datetime)HistoryDealGetInteger(FirstTicket, DEAL_TIME) : To;
  
  Print("DealsTotal = " + (string)HistoryDealsTotal());
            
  Print(_B(Bench(GetNoPositionsTime, From, To), 1)); // Сюда подставляем свою функцию.
        
  return;
}
 
Вариант для сравнения.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Время жизни снепшота для обновления. В MT5 требует подключенной MT4Orders.mqh
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

// Возвращает ближайшее к заданному время, где не было открытых позиций.
datetime GetNoPositionsTime_fxsaber1( datetime time )
{
  VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, -1, false, ""); // https://www.mql5.com/ru/forum/282062/page39#comment_25774587
  
  datetime PrevTime = 0;
  const int Total = OrdersHistoryTotal();  

  while (!IsStopped() && (PrevTime < time))
  {  
    PrevTime = time;
    
    for (int i = 0; i < Total; i++)
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) &&
          (OrderOpenTime() <= time) && (OrderCloseTime() >= time))
        time = OrderCloseTime() + 1;
  }
    
  return(time);
}


DealsTotal = 26382
Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 547 in OnStart: Bench(GetNoPositionsTime_fxsaber1,From,To)] = 9385466 mcs.
 

Не было позиций вообще,

не было по данному символу,

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

не было у данного робота по всем его торгуемым символам?

 
JRandomTrader #:

Не было позиций вообще

Этот вариант. При этом текущие открытые позиции не учитываем, чтобы не усложнять.
 
fxsaber:

Нужно написать такую производительную функцию.


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

Какой-то странный вопрос. Конкретное время или временной диапазон? Если диапазон, то какой?

Открытых позиций(сделок) или ордеров, не важно активированных или удалённых?
 
Alexey Viktorov #:

Какой-то странный вопрос. Конкретное время или временной диапазон? Если диапазон, то какой?

Открытых позиций(сделок) или ордеров, не важно активированных или удалённых?

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

В истории торговли были закрыты две позиции:

  1. 2021.10.01 16:00:00 -  2021.10.01 19:00:00
  2. 2021.10.01 20:00:00 -  2021.10.01 21:00:00

Результаты работы функции.

GetNoPositionsTime(D'2021.10.01 15:00:00') = D'2021.10.01 15:00:00';
GetNoPositionsTime(D'2021.10.01 17:00:00') = D'2021.10.01 19:00:01';
GetNoPositionsTime(D'2021.10.01 19:30:00') = D'2021.10.01 19:30:00';
GetNoPositionsTime(D'2021.10.01 20:00:00') = D'2021.10.01 21:00:01';
GetNoPositionsTime(D'2021.10.01 22:00:00') = D'2021.10.01 22:00:00';
 
fxsaber #:

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

В истории торговли были закрыты две позиции:

  1. 2021.10.01 16:00:00 -  2021.10.01 19:00:00
  2. 2021.10.01 20:00:00 -  2021.10.01 21:00:00

Результаты работы функции.

Не однозначно. Не указано в какую сторону ближайшее нужно.

 
Dmitry Fedoseev #:

Не однозначно. Не указано в какую сторону ближайшее нужно.

Вперед.

 
fxsaber #:

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

В истории торговли были закрыты две позиции:

  1. 2021.10.01 16:00:00 -  2021.10.01 19:00:00
  2. 2021.10.01 20:00:00 -  2021.10.01 21:00:00

Результаты работы функции.

Понятно. Мне не только ваши коды невозможно понять, но и ваши слова трудно понимаемы.

 
Alexey Viktorov #:

Понятно. Мне не только ваши коды невозможно понять, но и ваши слова трудно понимаемы.

Видимо, у многих так, поэтому данная тема не нашла продолжения.

 
fxsaber #:

Видимо, у многих так, поэтому данная тема не нашла продолжения.

Дело не в понимании вашего кода, а в неправильном ТЗ

Возвращает ближайшее к заданному время, где не было открытых позиций

Нет конкретики совершенно.

Каков диапазон этого "ближайшего"? Минута - это ближайшее? А минута + 1.5 секунды - не ближайшее? Может 1 час - это ближайшее? А может пару дней?

В какую сторону смотреть сиё "ближайшее"? Или в обе?

Нет открытых - нет фактов открытия в определённом ранее диапазоне, ближайшем к указанному времени? Или нет вообще никаких открытых, т.е. - все ранее открытые позиции должны быть уже закрытыми до наступления того самого диапазона и больше ничего не открывалось?

Отложенные ордера, ожидающие срабатывания, можно? Или тоже не должно быть?

Это только на вскидку. А далее ещё могут быть вопросы - уже по ходу осмысления с кодом.

Но самое конечно жёсткое - это отсутствие определения что такое "ближайшее". На него всё завязывается, и ему-то в первую очередь и нужно было дать чёткое определение.

Может тогда что-то и было

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