1.Где полный код, который можно запустить и проверить?
2. Не нужно пытаться скрывать Окно Данных
3. Вставляйте код правильно - на первый раз я исправил Ваше сообщение.
скорее всего - Вы получаете визуально один индикатор - а эксперт берёт расчёт с другого индикатора
\\\\\\\\\\\\\\\\\\\\\
я имею ввиду вот эту функцию - по умолчанию там 14 а другой у вас на 10
ChartIndicatorAdd(0,0,handleMa);
Пример получения данных с индикатора iMA:
//+------------------------------------------------------------------+ //| iMA Values on a Chart.mq5 | //| Copyright © 2019, Vladimir Karputov | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property version "1.001" //--- input parameters input int Inp_MA_ma_period = 12; // MA: averaging period input int Inp_MA_ma_shift = 5; // MA: horizontal shift input ENUM_MA_METHOD Inp_MA_ma_method = MODE_SMA; // MA: smoothing type input ENUM_APPLIED_PRICE Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price //--- int handle_iMA; // variable for storing the handle of the iMA indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create handle of the indicator iMA handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift, Inp_MA_ma_method,Inp_MA_applied_price); //--- if the handle is not created if(handle_iMA==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double array_ma[]; ArraySetAsSeries(array_ma,true); int start_pos=0,count=3; if(!iGetArray(handle_iMA,0,start_pos,count,array_ma)) return; string text=""; for(int i=0; i<count; i++) text=text+IntegerToString(i)+": "+DoubleToString(array_ma[i],Digits()+1)+"\n"; //--- Comment(text); } //+------------------------------------------------------------------+ //| Get value of buffers | //+------------------------------------------------------------------+ bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code //if(InpPrintLog) PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d", __FILE__,__FUNCTION__,count,copied,GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); } //+------------------------------------------------------------------+
Результат:
Pic. 1. Get value on bar #0, #1, #2
скорее всего - Вы получаете визуально один индикатор - а эксперт берёт расчёт с другого индикатора
\\\\\\\\\\\\\\\\\\\\\
я имею ввиду вот эту функцию - по умолчанию там 14 а другой у вас на 10
Да. Здесь, видимо, тоже есть ошибка. Но даже с периодом 14 значение индикатора должно как-то отличаться от цены. Мне тоже кажется, что рисуется одно, а значения я беру другого. Но что-то не догадаюсь, почему
Пост #3 - учить как отче наш. После этого добавить в код (из поста #3) ChartIndicatorAdd и проверить полученный результат. Ещё очень Важно - следите, чтобы на графике не было лишних индикаторов.
- 2021.08.12
- www.mql5.com
Ведь действительно, по факту у меня индикатор на график не добавляется. хз, почему. И что бы было на что ориентироваться я отредактировал шаблон tester.tpl и добавил на него нужный мне индикатор. И дальше предполагаю, что рассчитываемый индикатор совпадает. Однако на этом же шаблоне ваш пример кода показывает валидные значения средней. Где-то у меня там ошибка. Но имея рабочий пример, дальше уже разберусь. Спасибо!
Прочтите внимательнее справку по ChartIndicatorAdd - особенно обратите внимание на это:
Возвращаемое значение
Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Ошибка 4114 означает, что график и добавляемый индикатор отличаются по символу или таймфрейму.
- www.mql5.com
Прочтите внимательнее справку по ChartIndicatorAdd - особенно обратите внимание на это:
Возвращаемое значение
Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Ошибка 4114 означает, что график и добавляемый индикатор отличаются по символу или таймфрейму.
В моем случае ChartIndicatorAdd говорит, что все норм:
handleMa = iMA(Symbol(), Period(), 10, 0, MODE_SMA, PRICE_CLOSE); bool error = ChartIndicatorAdd(0,0,handleMa); Print("ERROR=", error, " / ", GetLastError());
Возвращает true, кода ошибки, соответственно, нет. Но проблема была именно в этой команде. Если ее не использовать, то iMa возвращает корректные значения.
Но если добавляю эту команду в ваш пример:
int OnInit() { //--- create handle of the indicator iMA handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift, Inp_MA_ma_method,Inp_MA_applied_price); //--- if the handle is not created if(handle_iMA==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } ChartIndicatorAdd(0,0,handle_iMA);// <---- ВОТ ТУТ ДОБАВЛЯЮ //--- return(INIT_SUCCEEDED); }
то все хорошо.
А правильно ли я задаю внешние параметры таймфрейма и валютной пары?
Вот так объявляю:
input string symbol = "EURUSD"; input ENUM_TIMEFRAMES period = PERIOD_M15;
И потом в onInit()
ChartSetSymbolPeriod(0, symbol, period);
Может быть так делать не надо? Все равно же эти параметры задаются на уровне тестера:
В моем случае ChartIndicatorAdd говорит, что все норм:
Возвращает true, кода ошибки, соответственно, нет. Но проблема была именно в этой команде. Если ее не использовать, то iMa возвращает корректные значения.
Но если добавляю эту команду в ваш пример:
то все хорошо.
А правильно ли я задаю внешние параметры таймфрейма и валютной пары?
Вот так объявляю:
И потом в onInit()
Может быть так делать не надо? Все равно же эти параметры задаются на уровне тестера:
Чтобы ответить, сначала точно опишите что, куда Вы нажимаете. По шагам, по пунктам...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Пишу советник на MQL5, внутри которого нужно сравнить значение iMa и текущей цены. Точнее нужно понять, что iMa проходит через текущий бар.
На вид все просто: значение iMa должно быть больше low и меньше high текущий свечи.
Мне нужно получить значение той линии, которая представляет индикатор на графике.
Создаю индикатор в onInut()
И добавляю на график:
Далее в onTick() получаю значения:
Проблема:
В значениях буфера индикатора я получаю не реальные значения, которые используются для построения линии графика, а некоторые значения из самого бара. Поэтому никак не сравнить значение отрисованной линии индикатора.