Доступ к значениям индикатора из эксперта

 
Предположим написан прекрасный индикатор, такой что "точно отвечает положению вещей" (с) "Аукцыон". Мы этот индикатор присоединяем к графику, чтобы смотреть-радоваться и делаем эксперт, который использует показания этого индикатора. Если индикатор опускается меньше 20, то сразу покупаем :) Но как эксперту узнать показания этого индикатора? Дублировать в эксперте вычисления индикатора и таким образом делать их два раза, нагружая процессор и перерасходуя память?

Хотелось бы иметь функицию вида:
double getIndicatorValue(string id, int line, int offset)



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

double current = getIndicatorValue("My Secret Indicator", 0, 0);
double previous = getIndicatorValue("My Secret Indicator", 0, 1);



Насколько я могу предположить в реализации эта достаточно простая функция: достаточно найти по id индикатор и взять из его буфера по указанному offset значение?

 
Это из академического интереса что-ли? Если есть конкретный индикатор - то обращайся к нему конкретно через iCustom(......). Еще есть кнопка "Поиск" на форуме
 
Если есть конкретный индикатор - то обращайся к нему конкретно через iCustom(......). Еще есть кнопка "Поиск" на форуме


iCustom() не совсем то, что надо, хотя конечно лучше чем ничего. Если в MT4 появились явные буфера для каждого индикатора, логично предоставить доступ к этим буферам, чтобы можно было гарантировать, что эксперт использует именно те данные, что видны на графике индикатора.

При использовании iCustom насколько я понял, значения будут вычиcляться повторно, и в теории они все равно могут отличаться от значений графика в окне индикатора. Или быть может, если при вызове iCustom уже будет запущен этот индикатор на таком же периоде и символе, будут использованы данные уже работающего индикатора?

И еще вопрос по поводу iCustom
double iCustom( string symbol, int timeframe, string name, ... , int mode, int shift) 

symbol   -   Symbol on that data need to calculate indicator. NULL means current symbol. 
timeframe   -   Time frame, by default used current chart period. It can be any one of Time frame enumeration values. 
name   -   Custom indicator compiled program name. 
...   -   Parameters set (if needed). 



что это за параметры, которые подразумеваются под многоточием? Это параметры индикатора у которых тип "extern"? И в каком порядке их надо передавать, в том же, в котором они перечислены в исходном коде индикатора?

 

iCustom() не совсем то, что надо, хотя конечно лучше чем ничего. Если в MT4 появились явные буфера для каждого индикатора, логично предоставить доступ к этим буферам, чтобы можно было гарантировать, что эксперт использует именно те данные, что видны на графике индикатора.

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

При использовании iCustom насколько я понял, значения будут вычиcляться повторно, и в теории они все равно могут отличаться от значений графика в окне индикатора. Или быть может, если при вызове iCustom уже будет запущен этот индикатор на таком же периоде и символе, будут использованы данные уже работающего индикатора?

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

И еще вопрос по поводу iCustom
что это за параметры, которые подразумеваются под многоточием? Это параметры индикатора у которых тип "extern"? И в каком порядке их надо передавать, в том же, в котором они перечислены в исходном коде индикатора?

именно так
 

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


Я плохо знаю С++, но знаю, что в программировании лучше беспокоиться, чем не беспокоиться :)

В общем случае, результат будет наверное одинаковым, но если результат функции зависит от состояния в котором находится система, то это уже частный случай :) Например при обращении через ArrayCopyRates или вызове любой функции технического индикатора на отличном от графика периоде и при условии отстутствия исторических данных по этому периоду, первый вызов функции может вернуть ошибку, а второй (когда данные уже будут подгружены), вернет реальное значение и может возникнуть расхождение в результатах. Но это, наверное, достаточно редкая ситуация, которую, как говориться в известном анекдоте, "не помешает" иметь ввиду при использовании исторических данных других периодов в индикаторе, и которая не проявляется в обычных индикаторах, оперирующих только данными родительского графика.
Причина обращения: