Индикатор использует историю нескольких инструментов. Как предварительно загрузить историю? - страница 3

 
TheXpert:
prev_calculated запоминается, массивы генерятся в обработке таймера. Все. prev_calculated стопудов будет правильным, если нет, перед событием будет системный вызов OnCalculate. Ну и с нулем порешать.
Ну, то есть в первом вызове лучше в любом случае делать  prev_calculated  = rates_total. Я правильно понял?
 
TheXpert:
Это нарушает потокобезопасность индикаторов и вообще всего. Разве что асинхронными событиями что вы и сами можете сделать.
Не знаю, чем это нарушает  потокобезопасность. Зависит от реализации. Спорить не буду. 
 
pronych:
Ну, то есть в первом вызове лучше в любом случае делать  prev_calculated  = rates_total. Я правильно понял?
Да не в первом, вообще всегда при системном вызове
 
TheXpert:
Да не в первом, вообще всегда при системном вызове

Ну так и сделано у меня. prev_calculated=rates_total запоминается. по нему пишется из массива, который заполняется по OnCalculate или таймеру, если OnCalculate давно не было. Мерцает тока... 

Ладно, надо еще раз всё перебрать. ChartRedraw() вне OnCalculate надо? Хотя и без него мерцает, но меньше.

Вот есть ощущение, что  при системном вызове  OnCalculate(), вся отрисовка происходит как-то правильно, а по таймеру что-то не то  )) 

 
pronych:

Мерцает тока... 

А Вы случайно не весь индикаторный массив пересчитываете? Похоже на многократный пересчет всего массива вместо последнего бара.
А лучше видео в студию.
 
pronych:

А на некоторых инструментах их может не быть в течении часов или дней... 

И в итоге на таких получается: 

1. ОнКалкулейт происходит только при старте, 

2. т.к. история не подготовилась, пропускаем расчет, прев_калкулейтед=0

3. при использовании ОнТаймер повлиять на прев_калкулейтед мы не можем (документированными способами) 

4. при  прев_калкулейтед=0 график не отрисовывается... 

5. при изначальной установке прев_калкулейтед>0 и не готовых данных получаем не инициализированные значения в рядах и/или мерцание

Поправьте, если я ошибаюсь

Вот по этой схеме примеры из документации и не работают, если нет тиков. (Проблема выходного дня).

По штатному prev_calculated есть такое мнение тут + тут

С таймером схема немного другая. Проверяю не значение prev_calculated, а что вернули Copy*, в зависимости от результата устанавливаю флаги, по которым рисую или перезапускаю Copy*.

Пример.

Извиняюсь, поскромничал в первом посте выкладывать.

 
barabashkakvn:

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

Вот с этим я долго бодался. Фактически при каждом ресайзе массивы надо проверять на мусор.
 
pronych:
Вообще, введение подписки в конкретном советнике/индикаторе  на события OnTick(), OnCalculate() по любому инструменту полностью решило бы все эти проблемы. и позволит оптимизировано обрабатывать эти события, без лишних проверок по таймеру.
У Lizar'a посмотрите публикации про шпионов, может пригодиться.
 
Silent:

Вот по этой схеме примеры из документации и не работают, если нет тиков. (Проблема выходного дня).

По штатному prev_calculated есть такое мнение тут + тут

С таймером схема немного другая. Проверяю не значение prev_calculated, а что вернули Copy*, в зависимости от результата устанавливаю флаги, по которым рисую или перезапускаю Copy*.

Пример.

Извиняюсь, поскромничал в первом посте выкладывать.

Спасибо за пример.

 
Спасибо, как прошерстю еще, отпишусь.
Причина обращения: