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

 
fxsaber #:

datetime - секундная дискретность. На входе у функции datetime, на выходе - datetime. Отрезки не нужны.

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

Согласен с Федосеевым, по истории дольше искать. А так (в своем массиве) реализация задачи поиска ближайших по значению элементов массива.

 
Artyom Trishkin #:

А если текущее время = красный интервал, то что возвращать?

Т.е. всегда получим результат не превышающий TimeCurrent.

 
Valeriy Yastremskiy #:

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

fxsaber, 2021.11.11 10:01

Если time попадает в красный, то функция возвращает время начала белого интервала справа от красного. Если time попадает в белый - возвращает time.


Согласен с Федосеевым, по истории дольше искать. А так (в своем массиве) реализация задачи поиска ближайших по значению элементов массива.

Для меня оптимальным решением видится формирование красно-белого массива. Дальше, конечно, бинарный поиск.

 
fxsaber #:

Для меня оптимальным решением видится формирование красно-белого массива. Дальше, конечно, бинарный поиск.

Смотря для какой длины массивы. Для одномерного массива нужна будет проверка, в какой зоне, а красно-белый массив будет иметь больший вес. И если двумерный массив будет критично большой, то не факт, что одномерный с проверкой не будет лучше/быстрее. 

 
Valeriy Yastremskiy #:

Смотря для какой длины массивы. Для одномерного массива нужна будет проверка, в какой зоне, а красно-белый массив будет иметь больший вес. И если двумерный массив будет критично большой, то не факт, что одномерный с проверкой не будет лучше/быстрее. 

Предлагаю выкладывать и сравнивать готовые реализации.

 

в массив/таблицу/базу/вектор складываются записи {время открытия позиции, +1} { время закрытия позиции, -1 }

если не гарантируется сортировка по времени - сортируется по времени.

для поисков диапазонов (где не было позиций или где позиций больше N или где ближайшая или где столько-же) считается скользящая сумма. Скользящая сумма=кол-во открытых позиций

по идее можно упихнуть весь алгортим в один SELECT SQLite

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

#define TIME 0
#define TYPE 1

int GetOpenCloseTime( datetime &OpenCloseTime[][2] )
{
  static TRADESID TradesID;        
  ulong PositionsID[];
  
  const int TotalPositions = TradesID.GetPositionsID(PositionsID);

  ArrayResize(OpenCloseTime, TotalPositions << 1);
                         
  int Amount = 0;
  
  for (int i = 0; i < TotalPositions; i++)
  {
    ulong Deals[];
    
    const int Size = TradesID.GetDealsByID(PositionsID[i], Deals);
    
    if ((Size > 1) && (HistoryDealGetInteger(Deals[Size - 1], DEAL_ENTRY) != DEAL_ENTRY_IN) &&
                      !PositionSelectByTicket(PositionsID[i]))
    {
      OpenCloseTime[Amount++][TIME] = (datetime)HistoryDealGetInteger(Deals[0], DEAL_TIME);    
      OpenCloseTime[Amount++][TIME] = (datetime)HistoryDealGetInteger(Deals[Size - 1], DEAL_TIME);
    }
  }
  
  const int Size = ArrayResize(OpenCloseTime, Amount);
  
  for (int i = Size - 1; i >= 0; i--)
    OpenCloseTime[i][TYPE] = 1 - ((i & 1) << 1);

  ArraySort(OpenCloseTime);

  return(Size);
}

int GetNoPositions( datetime &NoPositionsOpen[], datetime &NoPositionsClose[] )
{
  int CountOpen = 0;
  int CountClose = 0;
  datetime OpenCloseTime[][2];
  const int Size = GetOpenCloseTime(OpenCloseTime);
  
  if (Size)
  {
    ArrayResize(NoPositionsOpen, ArrayResize(NoPositionsClose, 1 + (Size >> 1))) ;
    
    int Amount = 0;
    
    NoPositionsOpen[CountOpen++] = 0;
    
    for (int i = 0; i < Size; i++)
    {  
      Amount += (int)OpenCloseTime[i][TYPE];

      if (!Amount && ((i ==Size - 1) || ((OpenCloseTime[i][TIME] != OpenCloseTime[i + 1][TIME]) &&
                                         (OpenCloseTime[i][TIME] + 1 != OpenCloseTime[i + 1][TIME]))))
        NoPositionsOpen[CountOpen++] = OpenCloseTime[i][TIME] + 1;
      else if (Amount && (CountOpen > CountClose))
        NoPositionsClose[CountClose++] = OpenCloseTime[i][TIME] - 1;
    }        
  }
  
  if (CountOpen > CountClose)
    NoPositionsClose[CountClose++] = INT_MAX;
  
  return(ArrayResize(NoPositionsOpen, ArrayResize(NoPositionsClose, CountClose)));
}

// Возвращает ближайшее к заданному время, где не было открытых позиций.
datetime GetNoPositionsTime_fxsaber2( datetime time )
{
  static int PrevDealsTotal = 0;
  static datetime NoPositionsOpen[];
  static datetime NoPositionsClose[];
  
  const int DealsTotal = HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0;
  
  if (DealsTotal != PrevDealsTotal)
  {
    GetNoPositions(NoPositionsOpen, NoPositionsClose);
        
    PrevDealsTotal = DealsTotal;
  }
  
  const int Size = ArraySize(NoPositionsOpen);
  int Pos = ArrayBsearch(NoPositionsOpen, time);
  
  if (Size && Pos && (NoPositionsOpen[Pos]) > time)
    Pos--;
  
  return((!Size || ((time >= NoPositionsOpen[Pos]) && (time <= NoPositionsClose[Pos]))) ? time : NoPositionsOpen[Pos + 1]);
}


DealsTotal = 117097
Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 645 in OnStart: Bench(GetNoPositionsTime_fxsaber1,From,To)] = 120376740 mcs.
868058354
Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 646 in OnStart: Bench(GetNoPositionsTime_fxsaber2,From,To)] = 120948 mcs.
868058354


Думаю, быстрее не решить.

 
fxsaber #:



Думаю, быстрее не решить.

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

Это понятно. Что Вы хотите получить? Траекторию полета спутника по эксцентрической орбите!

С определенной центробежной скоростью? 

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

Наверное какое то время, после какого то события?

 О чем думала Анна Ахматова. Глядя на себя в зеркало, поздним вечером?

Учитель! Хотя мне больше нравится Мастер.