Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
comp
538
comp 2016.03.11 07:57 

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

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

comp
538
comp 2016.03.11 08:46  

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

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

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

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

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

не поможет. 

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

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

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

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

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

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

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

Alexey Viktorov
7769
Alexey Viktorov 2016.03.11 12:30  
comp:

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

не поможет. 

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

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

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

Alexey Viktorov
7769
Alexey Viktorov 2016.03.11 13:34  
comp:

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

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

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

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

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

ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст");
ChartRedraw();
Yuriy Asaulenko
3476
Yuriy Asaulenko 2016.03.11 16:10  
Alexey Volchanskiy:

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

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

Странно. Где-то в хелпе читал, что если индикатор уже запущен, то копия не создается. М.б. чего не понял.
123456789
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий