Задачка на новый бар

 

коллеги, наведите, пожалуйста, на идею.

На текущем таймфрейме на истории в цикле перебираются бары. Как в этом цикле можно определить наступление нового бара на ТФ старше?

Допустим, перебираем на н1, и нужно определить, что на ТФ д1 новый бар в этом переборе.


 
Nikita Chernyshov:

коллеги, наведите, пожалуйста, на идею.

На текущем таймфрейме на истории в цикле перебираются бары. Как в этом цикле можно определить наступление нового бара на ТФ старше?

Допустим, перебираем на н1, и нужно определить, что на ТФ д1 новый бар в этом переборе.


Время бара iTime
 
Valeriy Yastremskiy #:
Время бара iTime

Чутка поконкретнее можно?)

У меня в функцию прилетает индекс бара текущего тф (в момент перебора на истории), а также ТФ, для которого нужно узнать "новая ли свеча". 

В iTime мне что получить?

Особый акцент делаю, что это не текущий поток котировок, а перебор истории от самого старого бара к самому новому.
 

По неравенству IBarSHift() на текущем баре и предыдущем.

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

 
Dmitry Fedoseev #:

По неравенству IBarSHift() на текущем баре и предыдущем.

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

хм, идея с iBarShift в теории выглядит довольно хорошо

спасибо, сейчас попробую
 
Nikita Chernyshov:

коллеги, наведите, пожалуйста, на идею.

На текущем таймфрейме на истории в цикле перебираются бары. Как в этом цикле можно определить наступление нового бара на ТФ старше?

Допустим, перебираем на н1, и нужно определить, что на ТФ д1 новый бар в этом переборе.


input ENUM_TIMEFRAMES period = PERIOD_H1;
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   for(int i = rates_total - 1000; i < rates_total; i++)
      if((int)time[i] % PeriodSeconds(period) == 0)
         Print(time[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+


Не оно?

ЗЫ. Хотя нет. фуфло.

 

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

 

Что-ж тут сложного-то???

  if(IsNewBar(PERIOD_D1))
   {
      Print(Наступил новый день);
   }

Это может быть в OnTick() или OnCalculate()

Это пользовательская функция

/*****************************IsNewBar*******************************/
bool IsNewBar(ENUM_TIMEFRAMES tf)
 {
  datetime tm = iTime(_Symbol, tf, 0);
  static datetime time = 0;
  if(tm != time)
   {
    time = tm;
    return true;
   }
  return false;
 }/*******************************************************************/

Чтобы перебрать историю можно вместо нуля поставить переменную во входящие функции…

 
Alexey Viktorov #:

Что-ж тут сложного-то???

Это может быть в OnTick() или OnCalculate()

Это пользовательская функция

Чтобы перебрать историю можно вместо нуля поставить переменную во входящие функции…

Вы не могли привести боевой пример вашего кода? Допустим, в онинит.

Запустить робот, к примеру, на н1, и в журнал печатать каждый раз, когда появляется новый тф на d1, перебирая последние 100 баров?

 

Для определения баров на более старших ТФмах:

- на текущем ТФме найти время бара (iTime)

- на интересующем ТФме перевести время в номер бара и сравнить его с предыдущим (iBarShift)

 
Nikita Chernyshov #:

Вы не могли привести боевой пример вашего кода? Допустим, в онинит.

Запустить робот, к примеру, на н1, и в журнал печатать каждый раз, когда появляется новый тф на d1, перебирая последние 100 баров?

Я много чего могу. Но ведь выжпрограммисты тоже должны чуток напрягать мозги…

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