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

 
Этого вообще делать не надо. В МТ5 в индикаторах индексация слева направо, самое то, что надо. 
 
Integer:
Этого вообще делать не надо. В МТ5 в индикаторах индексация слева направо, самое то, что надо. 
Пока я для себя делал, и не задумывался, вижу идет как таймсерия, и ладно, все устраивает.

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

"Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать."

Т.е. направление может быть все-таки в разные стороны, возможно могут умолчания меняться в зависимости от версии компилятора.

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

Т.е. направление может быть все-таки в разные стороны, возможно могут умолчания меняться в зависимости от версии компилятора.

...
И подумать о таком не мог. Но отличная идея для МК, зачинить очередной движнячёк?
 
Integer:
И подумать от таком не мог. Но отличная идея для МК, зачинить очередной движнячёк?
Думаю, движки у них уже готовы. И не один. И все с разными умолчаниями в OnCalculate ))
 

Кто мешает на каждом OnCalculate выставлять нужный ArraySetAsSeries? Тут уже было правильно сказано (и в документации это написано), что данные хранятся всегда одинаково, слева направо, и это не зависит от флага направления индексации.

Флаг направления индексации позволяет правильно преобразовывать индекс доступа к элементу массива. И всё.

 
stringo:

Кто мешает на каждом OnCalculate выставлять нужный ArraySetAsSeries?

Вообще, это немного избыточно.

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

Я сам оставил вызовы в OnCalculate, но встречал их перенос в OnInit. И это как бы логично.

 

глобальные массивы можно один раз обработать в OnInit, а вот массивы  time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[] придется устанавливать

индексацию при каждом вызове  OnCalculate, если нужна индексация отличная от индексации установленной по умолчанию

 
komposter:

Вообще, это немного избыточно.

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

Я сам оставил вызовы в OnCalculate, но встречал их перенос в OnInit. И это как бы логично.

На самом деле выставление нужного флага хоть 100 буферам не приводит к задержкам. Лишний один такт (а это реально 1 такт, так как флаг выставляется напрямую без никаких функций-посредников), на фоне миллиона тактов функции OnCalculate роли никакой не играет.

Анализ предыдущего флага нужен только в сервисных функциях, чтобы вдруг не нарушить логику основной работы. Как это у нас сделано в MovingAverages.mqh

 
stringo:

На самом деле выставление нужного флага хоть 100 буферам не приводит к задержкам. Лишний один такт (а это реально 1 такт, так как флаг выставляется напрямую без никаких функций-посредников), на фоне миллиона тактов функции OnCalculate роли никакой не играет.

Анализ предыдущего флага нужен только в сервисных функциях, чтобы вдруг не нарушить логику основной работы. Как это у нас сделано в MovingAverages.mqh

за один такт чего, процессора
Причина обращения: