Эмуляция нового тика в MetaTrader5

 

Нужно ускорить работу эсперта на чарте из dll, сненерировав новый тик.

В MetaTrader4 работал такой код:

  int MTInternalMsg = RegisterWindowMessageW("MetaTrader4_Internal_Message");
  PostMessageW(hChart, MTInternalMsg, 2, 1);

В MetaTrader5 попробовал по аналогии. Не работает.

  int MTInternalMsg = RegisterWindowMessageW("MetaTrader5_Internal_Message");
  PostMessageW(hChart, MTInternalMsg, 2, 1);

Может кто сумел найти способ?

 
С появлением таймера проброс тиков потерял актуальность.
 
fxsaber:
С появлением таймера проброс тиков потерял актуальность.

С таймерами есть проблема. Если я вызываю индикатор из эксперта через iCustom, то внутренний таймер индикатора глушится.

Если-бы это можно было как-то обойти.

 
. ... Rick D. ... .:

С таймерами есть проблема. Если я вызываю индикатор из эксперта через iCustom, то внутренний таймер индикатора глушится.

Если идет проброска искусственного тика, то, как правило, индикатор не меняет своих значений, т.к. цена не изменилась. А значит таймер индикатору не нужен, если есть таймер для проброски тиков в советнике.

 
fxsaber:

Если идет проброска искусственного тика, то, как правило, индикатор не меняет своих значений, т.к. цена не изменилась. А значит таймер индикатору не нужен, если есть таймер для проброски тиков в советнике.

А как пробросить искусственный тик из экспера в индикатор?

 
. ... Rick D. ... .:

А как пробросить искусственный тик из экспера в индикатор?

Для чего нужно пробрасывать в индикатор тик, если наперед известно, что его буферы не поменяются?

 
fxsaber:

Для чего нужно пробрасывать в индикатор тик, если наперед известно, что его буферы не поменяются?

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

 
. ... Rick D. ... .:

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

Вы пробрасываете тот самый тик, который бал десятки минут назад, так почему индикатор после этого должен поменять свои значения?

 
fxsaber:

Вы пробрасываете тот самый тик, который бал десятки минут назад, так почему индикатор после этого должен поменять свои значения?

Да все просто. Например трейдер изменил параметры индикатора. Индикатор дал dll команду начать вычисления. Пусть из Oninit. По завершении вычислений dll эмулирует тик, индикатор попадает в OnCalculate и начинает отрисовку.

Параллельно вопрос. Есть ли способ узнать из MQL, индикатор запущен через iCustom или наброшен на чарт автономно?

 
. ... Rick D. ... .:
Да все прпосто. Например трейдер изменил параметры индикатора. Индикатор дал dll команду начать вычисления. Пусть из Oninit. По завершении вычислений dll эмулирует тик, индикатор попадает в OnCalculate и начинает отрисовку.

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

 

https://www.mql5.com/ru/docs/chart_operations/chartsetsymbolperiod

Примечание

Смена символа/периода влечет за собой переинициализацию эксперта, прикрепленного к соответствующему графику.

Вызов ChartSetSymbolPeriod с тем же символом и таймфреймом можно использовать для обновления графика (аналогично команде Refresh в терминале). Обновление графика в свою очередь запускает перерасчет индикаторов, прикрепленных к нему. Таким образом, вы можете рассчитать индикатор на графике даже при отсутствии тиков (например, в выходные дни).

Может оно?
Причина обращения: