Решение через DLL дано в статье "Передача данных между индикаторами - простое решение наболевшей проблемы". Но там обязательно нужно добавлять вызов внешней GetPtr в исходник индикатора, что не всегда представляется возможным.
Без DLL возможно осуществить только чтение (без записи, которую тоже делают в статье) буферов? Изменилось что-нибудь по этой теме с момента написания статьи (2010 год)?
- docs.mql4.com
Сколько значений вам нужно? Пусть индикатор сам сохраняет дубликаты этих значений в глобальных переменных терминала, в свойствах объектов на графике, в файлах
Мне нужно скриптом получить значения буферов (хотя бы одного) индикатора на чарте. Скидывать из индикатора буферы в файл - это не считывание скриптом буферов.
В статье выше красивое решение через указатели, позволяющее не только считывать, но даже перезаписывать буферы других индикаторов на чартах. Вот это и называется считывание буфера. Но это DLL.
Понимаете, можно реализовать такую схему
- индикатор ждет глобальную переменную, чтобы записать свои буферы в файл.
- скрипт при выполнении создает такую переменную и получает соответствующие файлы.
По какой-то причине до сих пор нельзя по-человечески сделать считывание данных индикатора с чарта! Звучит бредово, но это так.
К сожалению, в этом случае
не поможет.
Почему нет? iCustom() читает индикаторный буфер не зависимо от того как этот буфер заполняется. Ведь объявлен буфер на уровне глобальных переменных в любом случае.
Потому что iCustom ничего не знает про Timer и ChartEvent события.
Например, индикатор на чарте каждую секунду (Timer-событие) заполняет единственный свой буфер случайными числами (или применяет EMA к предыдущим значениям буфера). Это совсем немного строчек кода. iCustom в таком случае никогда не вернет то, что Вы будете видеть на чарте.
Потому что iCustom ничего не знает про Timer и ChartEvent события.
Например, индикатор на чарте каждую секунду (Timer-событие) заполняет единственный свой буфер случайными числами (или применяет EMA к предыдущим значениям буфера). Это совсем немного строчек кода. iCustom в таком случае никогда не вернет то, что Вы будете видеть на чарте.
Почему нет? iCustom() читает индикаторный буфер не зависимо от того как этот буфер заполняется. Ведь объявлен буфер на уровне глобальных переменных в любом случае.
iCustom не читает буфера с индикатора на чарте, он создает свою копию индикатора в памяти и читает из нее, просто буфера копии не отображаются на чарте. Но если индикатор что-то рисует на чарте самостоятельно, то это будет рисоваться и при вызове через iCustom, что кстати создает проблемы
Например, если в индикаторе есть вот такой код, он будет рисоваться при вызове iCustom и текст будет накладываться на текст от индикатора на чарте
ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст"); ChartRedraw();
iCustom не читает буфера с индикатора на чарте, он создает свою копию индикатора в памяти и читает из нее, просто буфера копии не отображаются на чарте. Но если индикатор что-то рисует на чарте самостоятельно, то это будет рисоваться и при вызове через iCustom, что кстати создает проблемы
Например, если в индикаторе есть вот такой код, он будет рисоваться при вызове iCustom и текст будет накладываться на текст от индикатора на чарте
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На чарте установлен индикатор. При этом он перерисовывается по событиям Timer, ChartEvent и Calculate.
Нужно скриптом считать текущие показатели его индикаторных буферов (INDICATOR_DATA), что видны по CTRL+D. Возможно ли это сделать в MT4?