OnCalculate - переиндексация на каждом тике

 

Здесь задавался вопрос, но на него так и не ответили. Тоже интересует, поэтому продублирую.

В разделе "Справочник MQL5 Операции с массивами / ArraySetAsSeries" есть пример, когда функция ArraySetAsSeries() применяется к массиву const datetime &time[] на каждом тике: 

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[])
  {
//---  будем хранить время открытия текущего нулевого бара
   static datetime currentBarTimeOpen=0;
//--- перевернем доступ к массиву time[] - сделаем как в таймсерии
   ArraySetAsSeries(time,true);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 Это что, так все делают (переворачивают массив(ы) на каждом тике), чтобы работать с массивом, как с таймсерией? Как-то громоздко выходит, если их почти все нужно перевернуть.

Ещё вопрос: могут ли массивы, используемые функцией OnCalculate(), произвольно менять направление своей индексации? Или же достаточно один раз проверить это направление? 

 
pu6ka:

Здесь задавался вопрос, но на него так и не ответили. Тоже интересует, поэтому продублирую.

В разделе "Справочник MQL5 Операции с массивами / ArraySetAsSeries" есть пример, когда функция ArraySetAsSeries() применяется к массиву const datetime &time[] на каждом тике: 

 Это что, так все делают (переворачивают массив(ы) на каждом тике), чтобы работать с массивом, как с таймсерией? Как-то громоздко выходит, если их почти все нужно перевернуть.

Ещё вопрос: могут ли массивы, используемые функцией OnCalculate(), произвольно менять направление своей индексации? Или же достаточно один раз проверить это направление? 

В том-то и проблема - после запуска коллайдера массивы в OnCalculate стали нестабильными. 
 
pu6ka:
 

 Это что, так все делают (переворачивают массив(ы) на каждом тике), чтобы работать с массивом, как с таймсерией? Как-то громоздко выходит, если их почти все нужно перевернуть.

Ещё вопрос: могут ли массивы, используемые функцией OnCalculate(), произвольно менять направление своей индексации? Или же достаточно один раз проверить это направление? 

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

Я выставляю направление индексации на каждом тике.

Оно, конечно, лишний код, но, зато с ним ты полностью уверен в направлении индексации.

 
Laryx:

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

Я выставляю направление индексации на каждом тике.

Оно, конечно, лишний код, но, зато с ним ты полностью уверен в направлении индексации.

Если у меня 200 тыс. баров в окне, на каждом тике нужно поменять индексацию для восьми буферов, а за секунду может быть несколько тиков.

Экономен ли такой расчет?

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

 
pu6ka:

Если у меня 200 тыс. баров в окне...

Ух ты! А чё за окно такое крутое? Где брали?
 
denkir:
Ух ты! А чё за окно такое крутое? Где брали?

5-минутки, например, с 2012 года. В настройках терминала можно-то и неограниченное количество выставить.

С индикаторными буферами в OnInit() прописал раз через ArraySetAsSeries() - вроде как, попроще получается.

Или потом у этих буферов внутренне тоже переиндексация происходит на каждом тике?

Файлы:
Bars.PNG  158 kb
 

От размера массива не зависит, это только флаг. Для индикаторных хватает установки в ините.

Для таймсерий функции хз, не экспериментировал. Да и они обычно в нормальном порядке...

 
TheXpert:

От размера массива не зависит, это только флаг. Для индикаторных хватает установки в ините.

Для таймсерий функции хз, не экспериментировал. Да и они обычно в нормальном порядке...

 Ясно, спасибо. Значит будем надеяться, что и в OnCalculate() также, от размера не зависит. 
 
pu6ka:
Ясно, спасибо. Значит будем надеяться, что и в OnCalculate() также, от размера не зависит. 
Не зависит ) . Вопрос в том нужно ли выставлять флаг на каждом тике.
 
pu6ka:

Если у меня 200 тыс. баров в окне, на каждом тике нужно поменять индексацию для восьми буферов, а за секунду может быть несколько тиков.

Экономен ли такой расчет?

Замена индикатора - это установка флага. Даже для сотни буферов - это будет сделано быстро. Физические данные при этом, как я понимаю, остаются на своих местах. 

 
TheXpert:
Не зависит ) . Вопрос в том нужно ли выставлять флаг на каждом тике.

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

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