N-ый открытый бар на определённом таймфрейме - страница 4

 
Maxim Kuznetsov #:
например упомянутые выше доп.секунды года (не помню правил коррекций и как они учитываются в UNIXTIME. Но они есть.)

Честно говоря, впервые слышу о доп секундах.

Проверил на MetaQoutes demo, состоянием на 18е октября дополнительных секунд не обнаружено:


#define _secsInDay 86400
#define _calculDayStartDt(a) ((a / _secsInDay) * _secsInDay)
#define _tfToStr(a) StringSubstr(EnumToString(a == PERIOD_CURRENT ? (ENUM_TIMEFRAMES)Period() : a), 7)
#define _boolToStr(a) (a ? "true" : "false")

void OnStart()
  {
   MqlRates arr[];
   if(!copy(arr))
      return;
   int idxOfFirstBar = findIdxOfFirstBarOfDay(arr, 0);
   PrintFormat("%s %s: (time[idxOfTodayStart] %% 86400 == 0) --> %s", Symbol(), _tfToStr(PERIOD_CURRENT),
               _boolToStr((arr[idxOfFirstBar].time % _secsInDay) == 0));
   PrintFormat("idxOfFirstBar %i, time %s", idxOfFirstBar, TimeToString(arr[idxOfFirstBar].time));
  }

#define _numOfBars 1000
bool copy(MqlRates &arr[])
  {
   ArraySetAsSeries(arr, true);
   if(CopyRates(Symbol(), PERIOD_CURRENT, 0, _numOfBars, arr) == _numOfBars)
      return(true);
   Print("CopyRates() failed");
   return(false);
  }
#undef _numOfBars

int findIdxOfFirstBarOfDay(const MqlRates &rates[], int idxFrom)
  {
   int limit = ArraySize(rates);
   datetime dayStartDt = _calculDayStartDt(rates[idxFrom].time);
   for(int i = idxFrom + 1; i < limit; i++)
      if(rates[i].time < dayStartDt)
         return(i - 1);
   Print(__FUNCTION__" Could not find the nearest bar of the previous day for ", TimeToString(rates[idxFrom].time));
   return(limit - 1);
  }
 
Vladislav Boyko #:
Никаких iXXX (терпеть их не могу)

К стати, вот это во встроенном в МТ4 зигзаге заставляет мои брови подниматься:

//--- main loop      
   for(i=limit; i>=0; i--)
     {
      //--- find lowest low in depth of bars
      extremum=low[iLowest(NULL,0,MODE_LOW,InpDepth,i)];

В версии для МТ5 уже по-людски сделали. Слава Богу😄

int OnCalculate() // [Длинный список параметров не цитирую]
  {
//--- searching for high and low extremes
   for(shift=start; shift<rates_total && !IsStopped(); shift++)
     {
      //--- low
      val=low[Lowest(low,InpDepth,shift)];
  }

int Lowest(const double &array[],const int depth,const int start)
  {
   if(start<0)
      return(0);
   double min=array[start];
   int    index=start;
   for(int i=start-1; i>start-depth && i>=0; i--)
     {
      if(array[i]<min)
        {
         index=i;
         min=array[i];
        }
     }
   return(index);
  }
 
Vladislav Boyko #:

К стати, вот это во встроенном в МТ4 зигзаге заставляет мои брови подниматься:

В версии для МТ5 уже по-людски сделали. Слава Богу😄

Остался 1 момент. Если использовать вышеперечисленные варианты для нахождения цены нужного бара нужно знать когда бар закроется, иначе пока N-ый бар не закрылся все цены, кроме цены открытия будут плясят целый час (для часовика). Получается нужно наглую забивать время закрытия бара + несколько секунд, как я понимаю. Верно? Или контролировать, что баров на графике уже больше, чем искомый бар..

 
Vladislav Boyko #:
_calculDayStartDt(a) ((a / _secsInDay) * _secsInDay)

В принципе, здесь понятно. Умножая и деля на тоже значение, мы выделяем целую часть. Только вопрос возникает. datetime - это, грубо говорят, тот же ulong, которое для удобства выглядит как строка, если это значение принтовать, верно?

 
Виктор Демихов #:

В принципе, здесь понятно. Умножая и деля на тоже значение, мы выделяем целую часть. Только вопрос возникает. datetime - это, грубо говорят, тот же ulong, которое для удобства выглядит как строка, если это значение принтовать, верно?

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

N-ый открытый бар на определённом таймфрейме
N-ый открытый бар на определённом таймфрейме
  • 2024.10.20
  • Vladislav Boyko
  • www.mql5.com
Добрый день. В принципе, банальный вопрос, но я что-то призадумался. Как узнать данные бара, который открыт в сегодняшний день N-ым...