Как избавиться от "хвоста"?
Правильно отсчитывать ВСЕ бары. Ничего не пропускать.
И вопрос второй. Почему этот индикатор отрисовывается в тестере, а если бросить его на график - не рисуется?
Исправить работу в онлайн. Смотреть в сторону анализа prev_calculated.
Правильно отсчитывать ВСЕ бары. Ничего не пропускать.
Исправить работу в онлайн. Смотреть в сторону анализа prev_calculated.
Не поможете разобраться?
Для начала, в OnInit() есть такие строки:
ArrayResize(symbols_name,1); symbols_name[nV++] = Symbol(); bars_calc = Bars(Symbol(),PERIOD_CURRENT); ArrayPrint(symbols_name); Print("bars_calc = ",bars_calc); for(int i = 1; i < ArraySize(symbols_name); i++) { int bc = Bars(symbols_name[i],PERIOD_CURRENT); if(bars_calc > bc) bars_calc = bc; Print(symbols_name[i]," ",i," ~~~ bars_calc = ",bars_calc); }
При запуске в тестере получаю
"GBPUSD" "GBPNZD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP" bars_calc = 646 GBPNZD 1 ~~~ bars_calc = 646 GBPJPY 2 ~~~ bars_calc = 646 GBPCHF 3 ~~~ bars_calc = 646 GBPCAD 4 ~~~ bars_calc = 646 GBPAUD 5 ~~~ bars_calc = 646 EURGBP 6 ~~~ bars_calc = 646
А при подключении к графику
"GBPUSD" "GBPNZD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP" bars_calc = 9317 GBPNZD 1 ~~~ bars_calc = 0 GBPJPY 2 ~~~ bars_calc = 0 GBPCHF 3 ~~~ bars_calc = 0 GBPCAD 4 ~~~ bars_calc = 0 GBPAUD 5 ~~~ bars_calc = 0 EURGBP 6 ~~~ bars_calc = 0
Что здесь не так?
Не поможете разобраться?
Для начала, в OnInit() есть такие строки:
При запуске в тестере получаю
А при подключении к графику
Что здесь не так?
Примечание
Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.
- www.mql5.com
Примечание
Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.
Спасибо.
Добавил код из примера, несколько попыток получить количество доступных баров. Работает. Но не с первого раза. Другими словами, при добавлении индикатора на график, он может запуститься только при его повторном добавлении (после удаления его же с графика), а то и двух раз бывает мало...
Отсюда вопрос: как можно "насильно" синхронизировать данные по символу (не текущему)?
С "хвостами" разобрался (хотя и не понял как ))).
А вот с синхронизацией беда. По идее, если уж данные по символу уже скачаны, то при последующем обращении к этому символу уже проблем быть не должно? А выходит так что после перезагрузки терминала, обращение к символу всегда заканчивается неудачей. Приходится по 2-4 раза перезапускать индикатор.
Кто-нибудь знает как это побороть?
Синхронизация данных терминала и данных сервера #
- www.mql5.com
Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)
Создаётся пользовательский индикатор:
//+------------------------------------------------------------------+ //| OHLC Indicator.mq5 | //| Copyright © 2020, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 0 //--- indicator buffers double OpenBuffer[]; double HighBuffer[]; double LowBuffer[]; double CloseBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA); SetIndexBuffer(1,HighBuffer,INDICATOR_DATA); SetIndexBuffer(2,LowBuffer,INDICATOR_DATA); SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=0; i<rates_total; i++) { OpenBuffer[i]=open[i]; HighBuffer[i]=high[i]; LowBuffer[i]=low[i]; CloseBuffer[i]=close[i]; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
который в своих индикаторных буферах хранит OHLC.
Остаётся в мультивалютном индикаторе создать несколько этих индикаторов:
//+------------------------------------------------------------------+ //| MultiSymbols Indicator.mq5 | //| Copyright © 2020, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot Result #property indicator_label1 "Result" #property indicator_type1 DRAW_LINE #property indicator_color1 clrLimeGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input int Input1=9; //--- indicator buffers double ResultBuffer[]; //--- handle storage array int array_handles[]; //--- symbols array string array_symbols[7]= {"GBPUSD","GBPNZD","GBPJPY","GBPCHF","GBPCAD","GBPAUD","EURGBP"}; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ResultBuffer,INDICATOR_DATA); //--- int size_array_symbols=ArraySize(array_symbols); MqlRates rates[]; for(int i=0; i<size_array_symbols; i++) { //--- create handle of the indicator iCustom int handle_iCustom=iCustom(array_symbols[i],Period(),"MyInd\\OHLC Indicator"); //--- if the handle is not created if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", array_symbols[i], EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } int size_array_handles=ArraySize(array_handles); ArrayResize(array_handles,size_array_handles+1); array_handles[size_array_handles]=handle_iCustom; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int size_array_symbols=ArraySize(array_symbols); for(int i=0; i<size_array_symbols; i++) Print(array_symbols[i]," Bars: ",Bars(array_symbols[i],Period())," BarsCalculated: ",BarsCalculated(array_handles[i])); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
(так как сегодня выходной - то нужно мультивалютный индикатор прицепить к графику и несколько раз правый лик по графику и выбрать "Обновить)
Результат:
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPUSD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPNZD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPJPY Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPCHF Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPCAD Bars: 100000 BarsCalculated: 0 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) GBPAUD Bars: 100000 BarsCalculated: 0 2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12) EURGBP Bars: 100000 BarsCalculated: -1 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPUSD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPNZD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPJPY Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPCHF Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPCAD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) GBPAUD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12) EURGBP Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPUSD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPNZD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPJPY Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPCHF Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPCAD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) GBPAUD Bars: 100000 BarsCalculated: 100000 2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12) EURGBP Bars: 100000 BarsCalculated: 100000
- www.mql5.com
Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)
Создаётся пользовательский индикатор:
который в своих индикаторных буферах хранит OHLC.
Остаётся в мультивалютном индикаторе создать несколько этих индикаторов:
(так как сегодня выходной - то нужно мультивалютный индикатор прицепить к графику и несколько раз правый лик по графику и выбрать "Обновить)
Результат:
Спасибо, Владимир.
Пока только пробежался глазами, нету времени разбираться сегодня.
Но сразу два вопроса )))
1. Вы создаёте хендлы индикаторов. Это необходимый шаг для получения данных с соответствующих символов?
2. Обязательно ли добавлять символ в обзор рынка?
У меня используются цены закрытия. Буду посвободнее, выложу шаблон своего индикатора, чтобы на указаниях на ошибки предметно говорить по существу. )))
1. Вы создаёте хендлы индикаторов. Это необходимый шаг для получения данных с соответствующих символов?
Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)
2. Обязательно ли добавлять символ в обзор рынка?
У меня используются цены закрытия. Буду посвободнее, выложу шаблон своего индикатора, чтобы на указаниях на ошибки предметно говорить по существу. )))
Да, нужно добавить.
Обновил на версию 1.001
//+------------------------------------------------------------------+ //| MultiSymbols Indicator.mq5 | //| Copyright © 2020, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.001" #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot Result #property indicator_label1 "Result" #property indicator_type1 DRAW_LINE #property indicator_color1 clrLimeGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input int Input1=9; //--- indicator buffers double ResultBuffer[]; //--- handle storage array int array_handles[]; //--- symbols array string array_symbols[7]= {"GBPUSD","GBPNZD","GBPJPY","GBPCHF","GBPCAD","GBPAUD","EURGBP"}; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ResultBuffer,INDICATOR_DATA); //--- int size_array_symbols=ArraySize(array_symbols); MqlRates rates[]; for(int i=0; i<size_array_symbols; i++) { SymbolSelect(array_symbols[i],true); //--- create handle of the indicator iCustom int handle_iCustom=iCustom(array_symbols[i],Period(),"MyInd\\OHLC Indicator"); //--- if the handle is not created if(handle_iCustom==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d", array_symbols[i], EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } int size_array_handles=ArraySize(array_handles); ArrayResize(array_handles,size_array_handles+1); array_handles[size_array_handles]=handle_iCustom; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int size_array_symbols=ArraySize(array_symbols); for(int i=0; i<size_array_symbols; i++) Print(array_symbols[i]," Bars: ",Bars(array_symbols[i],Period())," BarsCalculated: ",BarsCalculated(array_handles[i])); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Первый вопрос.
Как избавиться от "хвоста"?
И вопрос второй. Почему этот индикатор отрисовывается в тестере, а если бросить его на график - не рисуется?