Принудительное обновление индикатора в mql5?

 

Как принудительно обновить индикатор с новыми входными данными? Новые входные данные для индикатора берутся с графика.

Если указан тот же период, индикатор не будет принудительно обновляться.

ChartSetSymbolPeriod(ChartID(),Symbol(),PERIOD_CURRENT);

Если указать другой период, индикатор обновится.

 ChartSetSymbolPeriod(ChartID(),Symbol(),PERIOD_MN1);


Временное решение — запомнить период графика и вернуться к этому периоду после открытия графика на MN1.

// ...
if(Period()==PERIOD_MN1)
  {
    int enumPeriodsIndex=(int)GlobalVariableGet(programmName+" "+Symbol()+" per: ");
    ChartSetSymbolPeriod(ChartID(),Symbol(),enumPeriods[enumPeriodsIndex]);
  }
// ...
GlobalVariableSet(programmName+" "+Symbol()+" per: ",ArrayBsearch(enumPeriods,Period()));
ChartSetSymbolPeriod(ChartID(),Symbol(),PERIOD_MN1);

Это какое-то костыльное решение, должно быть другое решение.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Slava, 2019.12.16 12:30

Кнопка F5 на графике, выбор "Обновить" из контекстного меню графика делают то же самое, что и ChartSetSymbolPeriod(NULL,0,0). А именно обновление ценовых данных.

После того, как с сервера придёт ответ, все кеши периодов этого самого инструмента насильно перестраиваются. Чем больше кешей, тем дольше перестройка (интерфейс, кстати, при этом не замораживается)

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

onCalculate, EventSetTimer не работают

Slava, 2015.10.22 06:30

При вызове функции ChartSetSymbolPeriod для соответствующего графика пересчёт (OnCalculate) всех индикаторов на этом графике вызовется по-любому, даже если вы зададите те же самые символ и период
 
fxsaber #:

При принудительном обновлении индикатора нужно вызвать OnInit() для  получения хэндла индикатора с новыми входными данными. 

 
Lilita Bogachkova #:

При принудительном обновлении индикатора нужно вызвать OnInit() для  получения хэндла индикатора с новыми входными данными. 

Может попробовать получение хендла спрятать под условие if(prev_calculated == 0)

Сначала IndicatorRelease() и потом получить новый хендл…

 
Alexey Viktorov #:

Может попробовать получение хендла спрятать под условие if(prev_calculated == 0)

Сначала IndicatorRelease() и потом получить новый хендл…

Что обнаружил:

Если хендл получать в ОнИнит(), то проблем нет

Если получать в любом другом месте, то иногда при первом копировании данных в буфер, вылазит "Ошибка копирования"

Разницы казалось никакой, но по результату почему-то разница

Возможно, сначала идёт создание хендла, а на следующем тике подготовка данных, не проверял.
 
Lilita Bogachkova #:

При принудительном обновлении индикатора нужно вызвать OnInit() для  получения хэндла индикатора с новыми входными данными. 

К сожалению, почти ничего не знаю про индикаторы.

 
Спасибо всем за ваш ответ. 
 
Alexey Viktorov #:

Может попробовать получение хендла спрятать под условие if(prev_calculated == 0)

Сначала IndicatorRelease() и потом получить новый хендл…

Ваш совет сработал. 

Нажмите на изображение, чтобы воспроизвести.
screen video gif


Я никогда не получала хэндл индикатора вне OnInit(). Как видите, это сработало. Однако остается вопрос, правильное ли это решение?

 
Lilita Bogachkova #:

Ваш совет сработал. 

Нажмите на изображение, чтобы воспроизвести.


Я никогда не получала хэндл индикатора вне OnInit(). Как видите, это сработало. Однако остается вопрос, правильное ли это решение?

Наверное не очень правильное. Вот ведь Виталий что говорит

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Принудительное обновление индикатора в mql5?

Vitaly Muzichenko, 2022.01.25 18:55

Что обнаружил:

Если хендл получать в ОнИнит(), то проблем нет

Если получать в любом другом месте, то иногда при первом копировании данных в буфер, вылазит "Ошибка копирования"

Разницы казалось никакой, но по результату почему-то разница

Возможно, сначала идёт создание хендла, а на следующем тике подготовка данных, не проверял.

Но, если работает, то можно оставить пока не будет более стабильного решения.
 
Lilita Bogachkova #:

Ваш совет сработал. 

Нажмите на изображение, чтобы воспроизвести.


Я никогда не получала хэндл индикатора вне OnInit(). Как видите, это сработало. Однако остается вопрос, правильное ли это решение?

Не понятно, а что Вам мешает при событии перемещения графического объекта на графике индикатора пересчитать весь индикатор?

У вас при этом изменяются его входные параметры? Тогда сделайте входные параметры "по умолчанию" (они всё равно у вас выходит, что не константные), а вот значения, которые зависят от расположения графических объектов, сделайте не входными, а глобальными. На первом запуске присваивайте им значения от расположения вертикальных линий. Первый запуск сделает полный перерасчёт индикатора. Затем изменяйте значения, отвечающие за расчёт индикатора, в зависимости от расположения линий на графике, и заново пересчитывайте весь индикатор.

Образно (так как нет исходника, и приходится телепатить):

double graphObjParam1=0;
double graphObjParam2=0;
bool needRedraw=false;

  1. В OnInit():
    Присваиваем переменным значения от расположения линий (не знаю какие)
    graphObjParam1 = GetParamFromVLine(1);
    graphObjParam2 = GetParamFromVLine(2);
    needRedraw = false;

  2. В OnCalculate():
    Первый запуск (или взведён флаг needRedraw) с полным расчётом всего индикатора с учётом значений graphObjParam1 и graphObjParam2
    После полного расчёта индикатора --> needRedraw = false;
    и далее просчёт текущего бара - всё стандартно...

  3. В OnChartEvent():
    Если есть событие перемещения одной из линий, то присваиваем переменным новые значения:
    graphObjParam1 = GetParamFromVLine(1);
    graphObjParam2 = GetParamFromVLine(2);
    needRedraw = true;
Примерная схема. И не нужно никакого поликостылизма.
 
Artyom Trishkin #:

Не понятно, а что Вам мешает при событии перемещения графического объекта на графике индикатора пересчитать весь индикатор?

Как я понял, там в коде индикатора по iCustom() надо получить хендл другого индикатора и от него плясать…
Причина обращения: