Чтение буферов индикатора, установленного на чарт

 

На чарте установлен индикатор. При этом он перерисовывается по событиям Timer, ChartEvent и Calculate.

Нужно скриптом считать текущие показатели его индикаторных буферов (INDICATOR_DATA), что видны по CTRL+D. Возможно ли это сделать в MT4?

 

Решение через DLL дано в статье "Передача данных между индикаторами - простое решение наболевшей проблемы". Но там обязательно нужно добавлять вызов внешней GetPtr в исходник индикатора, что не всегда представляется возможным.

Без DLL возможно осуществить только чтение (без записи, которую тоже делают в статье) буферов? Изменилось что-нибудь по этой теме с момента написания статьи (2010 год)?

 
iCustom() поможет.
iCustom - Технические индикаторы - Справочник MQL4
iCustom - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iCustom - Технические индикаторы - Справочник MQL4
 
Alexey Viktorov:
iCustom() поможет.

К сожалению, в этом случае

перерисовывается по событиям Timer, ChartEvent и Calculate.

не поможет. 

 
Сколько значений вам нужно? Пусть индикатор сам сохраняет дубликаты этих значений в глобальных переменных терминала, в свойствах объектов на графике, в файлах
 
Alexander Puzanov:
Сколько значений вам нужно? Пусть индикатор сам сохраняет дубликаты этих значений в глобальных переменных терминала, в свойствах объектов на графике, в файлах

Мне нужно скриптом получить значения буферов (хотя бы одного) индикатора на чарте. Скидывать из индикатора буферы в файл - это не считывание скриптом буферов.

В статье выше красивое решение через указатели, позволяющее не только считывать, но даже перезаписывать буферы других индикаторов на чартах. Вот это и называется считывание буфера. Но это DLL.

Понимаете, можно реализовать такую схему

  • индикатор ждет глобальную переменную, чтобы записать свои буферы в файл.
  • скрипт при выполнении создает такую переменную и получает соответствующие файлы.
Но это даже не костыль. Это ни есть считывание буферов.

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

По какой-то причине до сих пор нельзя по-человечески сделать считывание данных индикатора с чарта! Звучит бредово, но это так.

 
comp:

К сожалению, в этом случае

не поможет. 

Почему нет? iCustom() читает индикаторный буфер не зависимо от того как этот буфер заполняется. Ведь объявлен буфер на уровне глобальных переменных в любом случае.
 
Alexey Viktorov:
Почему нет? iCustom() читает индикаторный буфер не зависимо от того как этот буфер заполняется. Ведь объявлен буфер на уровне глобальных переменных в любом случае.

Потому что iCustom ничего не знает про Timer и ChartEvent события.

Например, индикатор на чарте каждую секунду (Timer-событие) заполняет единственный свой буфер случайными числами (или применяет EMA к предыдущим значениям буфера). Это совсем немного строчек кода. iCustom в таком случае никогда не вернет то, что Вы будете видеть на чарте.

 
comp:

Потому что iCustom ничего не знает про Timer и ChartEvent события.

Например, индикатор на чарте каждую секунду (Timer-событие) заполняет единственный свой буфер случайными числами (или применяет EMA к предыдущим значениям буфера). Это совсем немного строчек кода. iCustom в таком случае никогда не вернет то, что Вы будете видеть на чарте.

Я понял своё заблуждение, спасибо.
 
Alexey Viktorov:
Почему нет? iCustom() читает индикаторный буфер не зависимо от того как этот буфер заполняется. Ведь объявлен буфер на уровне глобальных переменных в любом случае.

iCustom не читает буфера с индикатора на чарте, он создает свою копию индикатора в памяти и читает из нее, просто буфера копии не отображаются на чарте.  Но если индикатор что-то рисует на чарте самостоятельно, то это будет рисоваться и при вызове через iCustom, что кстати создает проблемы

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

ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст");
ChartRedraw();
 
Alexey Volchanskiy:

iCustom не читает буфера с индикатора на чарте, он создает свою копию индикатора в памяти и читает из нее, просто буфера копии не отображаются на чарте.  Но если индикатор что-то рисует на чарте самостоятельно, то это будет рисоваться и при вызове через iCustom, что кстати создает проблемы

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

Странно. Где-то в хелпе читал, что если индикатор уже запущен, то копия не создается. М.б. чего не понял.
Причина обращения: