как добиться? - начало расчётов и отображения индикатора только после обновления данных на графике

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Pavel Verveyko
4363
Pavel Verveyko  
прошу прощения, может уже где то обсуждалось. не нашёл решения(
очень волнует вопрос. который указана в названии темы.
так как получается индикатор срабатывает по старым данным, делает действия.
а когда данные обновляются получается он должен был поступить совершенно иначе.

такая проблема актуальна если индикатор добавлен в шаблон (у меня в шаблон по умолчанию).

в итоге крайне важно работать только с обновлёнными данными..
Alexey Volchanskiy
27267
Alexey Volchanskiy  
Pavel Verveyko:
прошу прощения, может уже где то обсуждалось. не нашёл решения(
очень волнует вопрос. который указана в названии темы.
так как получается индикатор срабатывает по старым данным, делает действия.
а когда данные обновляются получается он должен был поступить совершенно иначе.

такая проблема актуальна если индикатор добавлен в шаблон (у меня в шаблон по умолчанию).

в итоге крайне важно работать только с обновлёнными данными..

Это потому, что функция OnCalculate, в которой и происходят все действия по вычислениям и отрисовке, вызывается по новому тику. Нет тиков - индикатор спит. 

Pavel Verveyko
4363
Pavel Verveyko  
Alexey Volchanskiy:

Это потому, что функция OnCalculate, в которой и происходят все действия по вычислениям и отрисовке, вызывается по новому тику. Нет тиков - индикатор спит. 

это нормально и правильно) проблема в том что если вставить индикатор в шаблон то он начинает срабатывать сразу.

и если последний раз открывали график 3 дня назад вот по этим данным он и сработает(

я понимаю что можно намудрить с паузами и в онтаймер вызвать принудительно перерасчёт индикатора.

так же можно организовать сначала открытие графика потом (через паузу) применить нужный шаблон с индикатором.

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

если так принципиально, что бы индикатор не висел без дела, если вдруг нет инета... дать выбор в OnCalculate. срабатывать с учётом обновления или без.
(выбирать это можно например при создании индикатора).

Alexey Volchanskiy
27267
Alexey Volchanskiy  
Pavel Verveyko:

это нормально и правильно) проблема в том что если вставить индикатор в шаблон то он начинает срабатывать сразу.

и если последний раз открывали график 3 дня назад вот по этим данным он и сработает(

я понимаю что можно намудрить с паузами и в онтаймер вызвать принудительно перерасчёт индикатора.

так же можно организовать сначала открытие графика потом (через паузу) применить нужный шаблон с индикатором.

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

если так принципиально, что бы индикатор не висел без дела, если вдруг нет инета... дать выбор в OnCalculate. срабатывать с учётом обновления или без.
(выбирать это можно например при создании индикатора).

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

А разработчики наверное считают, что в выходные все отдыхают ))

Pavel Verveyko
4363
Pavel Verveyko  
Alexey Volchanskiy:

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

с выходными не связано. в любой день есть такие нюансы.
проблему можно понять если например представить что индикатор делает больше чем отрисовку данных.

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

ps именно с шаблоном по умолчанию и происходят все действия

Alexey Volchanskiy
27267
Alexey Volchanskiy  
Pavel Verveyko:

с выходными не связано. в любой день есть такие нюансы.
проблему можно понять если например представить что индикатор делает больше чем отрисовку данных.

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

ps именно с шаблоном по умолчанию и происходят все действия

Если это ваш индикатор или есть исходники, нетрудно решить эту проблему. Например из OnInit вызывать расчеты, которые делать на прямо в OnCalculate, а в отдельной функции. А разработчики тут исправлять не будут, в MQ достаточно консервативные люди в некоторых вещах.

Pavel Verveyko
4363
Pavel Verveyko  
Alexey Volchanskiy:

Если это ваш индикатор или есть исходники, нетрудно решить эту проблему. Например из OnInit вызывать расчеты, которые делать на прямо в OnCalculate, а в отдельной функции. А разработчики тут исправлять не будут, в MQ достаточно консервативные люди в некоторых вещах.

знаю что есть такие пути решения.
просто казалось бы всё просто дайте флаг обновился график или нет..и не надо будет  костыли лепить..
спасибо за диалог

Igor Makanu
9539
Igor Makanu  

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

rates_total и prev_calculated

и чтобы решить Вашу задачу нужно искать оптимальную комбинацию условий:

if(prev_calculated==0)              // первый запуск индикатора, подгрузка или синхронизация, переключение ТФ
if(rates_total - prev_calculated=0) // не было ни синхронизации и не появился новый бар
if(rates_total-prev_calculated=1)   // возможно появился новый бар или закончилась синхронизация ТФ - прилетел последний бар, но с какой стороны графика этот бар добавлен ?
if(rates_total-prev_calculated>1)   // что произошло? это закончилась синхронизация? это был обрыв связи? ... мы не знаем, нужно выполнить полный пересчет всего индикатора

// prev_calculated==0 и по моему это нужно сравнивать всегда, он может сброситься в любой момент 

комбинации сравнения rates_total с переменными окружения терминала не эффективны, вернее они всегда будут выдавать одинаковые значения равные rates_total  (кроме TERMINAL_MAXBARS )  https://www.mql5.com/ru/forum/304239/page57#comment_11519307


подгрузка истории (в МТ4 точно, в МТ5 скорее всего не подгрузка а формирование ТФ терминалом из минуток) происходит "пачками" (в прошлом году кто то из админов написал, что максимум за один раз в МТ4 2048 баров) и проблема, что остаток данных при синхронизации может быть и 1 бар и 2 бара..  , опять же в МТ4 может синхронизировать бары в середине чарта, может в конце чарта, а может в начале чарта - в МТ5 не знаю, визуально только самые старые или самые новые бара подгружает

----------------------------

по моему и такое условие должно срабатывать

if(rates_total - prev_calculated < 0)  // в какое то время терминал удалит бары из истории, чтобы кол-во баров стало около значения TERMINAL_MAXBARS , но думаю, что if(prev_calculated==0) сработает


я тоже искал ответ на вопрос как оптимально пересчитывать данные индикатора, но по моему идеальная лишь классическая схема, для МТ5 по моему так:

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[])
  {
   int i,limit;
   if(prev_calculated==0)
     {
      limit=0;
      // тут нужно обнулить индикаторные буфера
     }
   else limit=prev_calculated-1;
   for(i=limit;i<rates_total;i++)
     {
      // основной цикл расчета
     }
   return(rates_total);
  }
Alexey Viktorov
25885
Alexey Viktorov  
Pavel Verveyko:

это нормально и правильно) проблема в том что если вставить индикатор в шаблон то он начинает срабатывать сразу.

и если последний раз открывали график 3 дня назад вот по этим данным он и сработает(

я понимаю что можно намудрить с паузами и в онтаймер вызвать принудительно перерасчёт индикатора.

так же можно организовать сначала открытие графика потом (через паузу) применить нужный шаблон с индикатором.

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

если так принципиально, что бы индикатор не висел без дела, если вдруг нет инета... дать выбор в OnCalculate. срабатывать с учётом обновления или без.
(выбирать это можно например при создании индикатора).

Вы хотите сказать, что индикатор после перезапуска\загрузки с шаблоном пересчитает только не посчитанные 3 дня?

Vladimir Karputov
Модератор
182190
Vladimir Karputov  
Pavel Verveyko:
прошу прощения, может уже где то обсуждалось. не нашёл решения(
очень волнует вопрос. который указана в названии темы.
так как получается индикатор срабатывает по старым данным, делает действия.
а когда данные обновляются получается он должен был поступить совершенно иначе.

такая проблема актуальна если индикатор добавлен в шаблон (у меня в шаблон по умолчанию).

в итоге крайне важно работать только с обновлёнными данными..

Пожалуйста, укажите на каком оборудовании такое происходит:

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

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

Vladimir Karputov, 2019.07.31 12:12

Укажите такие данные:

скопируйте из вкладки "Журнал" три строчки (выделить три строки -> правый клик мышки -> Копировать)


и вставьте в сообщение. Должно получится вроде этого:

2019.07.31 11:53:10.681 MetaTrader 5 x64 build 2093 started (MetaQuotes Software Corp.)
2019.07.31 11:53:10.685 Windows 10 (build 18362) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 3188 / 8077 Mb, Disk: 99 / 415 Gb, GMT+2
2019.07.31 11:53:10.685 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Pavel Verveyko
4363
Pavel Verveyko  
Igor Makanu:

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

rates_total и prev_calculated

и чтобы решить Вашу задачу нужно искать оптимальную комбинацию условий:

комбинации сравнения rates_total с переменными окружения терминала не эффективны, вернее они всегда будут выдавать одинаковые значения равные rates_total  (кроме TERMINAL_MAXBARS )  https://www.mql5.com/ru/forum/304239/page57#comment_11519307


подгрузка истории (в МТ4 точно, в МТ5 скорее всего не подгрузка а формирование ТФ терминалом из минуток) происходит "пачками" (в прошлом году кто то из админов написал, что максимум за один раз в МТ4 2048 баров) и проблема, что остаток данных при синхронизации может быть и 1 бар и 2 бара..  , опять же в МТ4 может синхронизировать бары в середине чарта, может в конце чарта, а может в начале чарта - в МТ5 не знаю, визуально только самые старые или самые новые бара подгружает

----------------------------

по моему и такое условие должно срабатывать


я тоже искал ответ на вопрос как оптимально пересчитывать данные индикатора, но по моему идеальная лишь классическая схема, для МТ5 по моему так:

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий