На 87 странице я уже выкладывал пример получения информации о спреде.
Рашид здравствуйте!
Если не сложно скажите какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.
Хочется самому поправить алгоритм. мультивалютного говоруна.
При компиляции Вашего кода тоже выдаются ошибки "conversion possible loss of data test.mq5"
Если не сложно скажи какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.
Хочется самому поправить алгоритм. мультивалютного говоруна.
Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "
//+------------------------------------------------------------------+//| TestLoadHistory.mq5 |//| Copyright 2009, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "2009, MetaQuotes Software Corp."#property link "https://www.mql5.com"#property version "1.00"#property script_show_inputs//--- input parameters
input string InpLoadedSymbol="NZDUSD";// Symbol to be load
input ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1;// Period to be load
input datetime InpStartDate=D'2009.01.01';// Start date//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+void OnStart(){Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);//---int res=LoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);switch(res){case-1:Print("Unknown symbol",InpLoadedSymbol);break;case-2:Print("Requested bars more than max bars in chart");break;case-3:Print("Program was stopped");break;case0:Print("Loaded OK");break;case1:Print("Loaded previously");break;case2:Print("Loaded previously and built");break;default:Print("Unknown result");}//---datetime first_date;
SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date);int bars=Bars(InpLoadedSymbol,InpLoadedPeriod);Print("First date",first_date,"-",bars,"bars");//---}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int LoadHistory(conststring symbol,ENUM_TIMEFRAMES period,datetime start_date){datetime first_date=0;//--- check if symbol is selected in the MarketWatchif(!SymbolInfoInteger(symbol,SYMBOL_SELECT)){if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)return(-1);
SymbolSelect(symbol,true);}//--- check if data is present
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);if(first_date>0&& first_date<=start_date)return(1);//--- second attemptif(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date)){if(first_date>0){//--- force timeseries builddatetime times[2];
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);//--- check dateif(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))if(first_date>0&& first_date<=start_date)return(2);}}//--- wait for load symbol history infowhile(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_date))Sleep(5);//--- fix start date for loadingif(first_date>start_date) start_date=first_date;int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);//--- load data step by stepwhile(!IsStopped()){//--- wait for timeseries buildwhile(!SeriesInfoInteger(symbol,period,SERIES_SYNCRONIZED)&&!IsStopped())Sleep(5);//--- ask for built barsint start=Bars(symbol,period);if(start>0){if(start>=max_bars)return(-2);//--- ask for first dateif(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))if(first_date>0&& first_date<=start_date)return(0);}//--- copying of next part forces data loadingdatetime times[100];int copied=CopyTime(symbol,period,start,100,times);if(copied>0){//--- check for dataif(times[0]<=start_date)return(0);if(start+copied>=max_bars)return(-2);}}//--- stoppedreturn(-3);}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+string GetPeriodName(ENUM_TIMEFRAMES period){string res;//---if(period==PERIOD_CURRENT) period=Period();switch(period){casePERIOD_M1: res="M1";break;case PERIOD_M2: res="M2";break;case PERIOD_M3: res="M3";break;case PERIOD_M4: res="M4";break;casePERIOD_M5: res="M5";break;case PERIOD_M6: res="M6";break;case PERIOD_M10: res="M10";break;case PERIOD_M12: res="M12";break;casePERIOD_M15: res="M15";break;case PERIOD_M20: res="M20";break;casePERIOD_M30: res="M30";break;casePERIOD_H1: res="H1";break;case PERIOD_H2: res="H2";break;case PERIOD_H3: res="H3";break;casePERIOD_H4: res="H4";break;case PERIOD_H6: res="H6";break;case PERIOD_H8: res="H8";break;case PERIOD_H12: res="H12";break;casePERIOD_D1: res="Daily";break;casePERIOD_W1: res="Weekly";break;casePERIOD_MN1: res="Monthly";break;default: res="unknown period";}//---return(res);}//+------------------------------------------------------------------+
Только тут возникла небольшая неувязочка, заключающаяся в том, что вначале числовые значения соответствуют количеству секунд в тайфрейме (как это было в MQL4), а начиная с PERIOD_H1 такой порядок меняется и логика возвращаемого значения не ясна.
Хотелось бы привести возвращаемые числовые значения в соответствии со стандартом MQL4, т.е. возвращается именно количество секунд входящих в тот или иной ТФ.
Используйте функцию PeriodSeconds() в разделе "Справочник MQL5 / Общие функции / PeriodSeconds ":
PeriodSeconds
Возвращает количество секунд в
периоде.
int PeriodSeconds( ENUM_TIMEFRAMESperiod=PERIOD_CURRENT// период графика );
Параметры
period=PERIOD_CURRENT
[in]
Значение периода графика из перечисления ENUM_TIMEFRAMES. Если параметр не указан, то
возвращается количество секунд текущего периода графика, на котором запущена
программа.
Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "
Скажите пожалуйста какой оператор выдает состояние расчета индикатора.
Внутри самого индикатора есть такие переменные как rates_total, и prev_calculated, но во время вызова индикатора к примеру
Если Вы встанете курсором на функцию OnCalculate() в редакторе и нажмете кнопку F1, то попадете на справку по этой функции, где явно написано:
Первый параметр rates_total содержит
количество баров, доступных индикатору для расчета, и не превышает максимальное
количество баров, доступных на графике. Это значение устанавливается в
клиентском терминале в меню "Options" на закладке "Charts" - "Max bars in
chart".
Необходимо отметить связь между значением,
возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated.
Параметр prev_calculated при вызове функции содержит значение, которое
вернула функция OnCalculate() на предыдущем вызове. Это
позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с
тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с
предыдущего запуска этой функции.
Для этого обычно достаточно вернуть значение
параметра rates_total, которое содержит количество баров при текущем вызове
функции. Если с момента последнего вызова функции OnCalculate() ценовые данные
были изменены (подкачана более глубокая история или были заполнены пропуски
истории), то значение входного параметра prev_calculated будет установлено в
нулевое значение самим терминалом.
Примечание: если функция
OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского
терминала значения индикатора не показываются.
А где нынче 5 справку раздают?
Рашид для этого специальную тему создал.
Я знаю что по логике вещей и в справке это int. Речь как раз и идет о том что некорректно работает команда...
В пятой версии справки тоже на этот счет ничего не менялось
На 87 странице я уже выкладывал пример получения информации о спреде.
На 87 странице я уже выкладывал пример получения информации о спреде.
Рашид здравствуйте!
Если не сложно скажите какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.
Хочется самому поправить алгоритм. мультивалютного говоруна.
При компиляции Вашего кода тоже выдаются ошибки "conversion possible loss of data test.mq5"
на строки
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
Spread=(Ask-Bid)/Point();
Рашид здравствуй!
Если не сложно скажи какими средствами можно запросить историю по инструменту, проконтролировать её получение и чем анализировать окончание расчета индикатора на инструменте.
Хочется самому поправить алгоритм. мультивалютного говоруна.
Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "
При компиляции Вашего кода тоже выдаются ошибки "conversion possible loss of data test.mq5"
на строки
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
Spread=(Ask-Bid)/Point();
Вы можете избавиться от этих предупреждений компилятора, если сделаете приведение типов (цветом выделены измененные места)
Только тут возникла небольшая неувязочка, заключающаяся в том, что вначале числовые значения соответствуют количеству секунд в тайфрейме (как это было в MQL4), а начиная с PERIOD_H1 такой порядок меняется и логика возвращаемого значения не ясна.
Хотелось бы привести возвращаемые числовые значения в соответствии со стандартом MQL4, т.е. возвращается именно количество секунд входящих в тот или иной ТФ.
Используйте функцию PeriodSeconds() в разделе "Справочник MQL5 / Общие функции / PeriodSeconds ":
PeriodSeconds
Возвращает количество секунд в периоде.
int PeriodSeconds(
ENUM_TIMEFRAMES period=PERIOD_CURRENT // период графика
);
Параметры
period=PERIOD_CURRENT
[in] Значение периода графика из перечисления ENUM_TIMEFRAMES. Если параметр не указан, то возвращается количество секунд текущего периода графика, на котором запущена программа.
Возвращаемое значение
Количество секунд в указанном периоде.
Пока можете воспользоваться этим примером для подкачки истории по инструменту, скоро добавим в справку более разевернутый вариант в раздел "Справочник MQL5 / Доступ к таймсериям и индикаторам "
Спасибо!
Вы можете избавиться от этих предупреждений компилятора, если сделаете приведение типов (цветом выделены измененные места)
тогда нужно в справке поправить
SYMBOL_DIGITS
Количество знаков после запятой
int
SYMBOL_SPREAD
Размер спреда в пунктах
int
int->long
Все равно Спасибо!
:-)
Скажите пожалуйста какой оператор выдает состояние расчета индикатора.
Внутри самого индикатора есть такие переменные как rates_total, и prev_calculated, но во время вызова индикатора к примеру
int iMA(
string symbol, // имя символа
ENUM_TIMEFRAMES period, // период
int ma_period, // период усреднения
int ma_shift, // смещение индикатора по горизонтали
ENUM_MA_METHOD ma_method, // тип сглаживания
ENUM_APPLIED_PRICE applied_price // тип цены или handle
);
нет доступа к этим переменным.
тогда нужно в справке поправить
SYMBOL_DIGITS
Количество знаков после запятой
int
SYMBOL_SPREAD
Размер спреда в пунктах
int
int->long
Все равно Спасибо!
:-)
Скажите пожалуйста какой оператор выдает состояние расчета индикатора.
Внутри самого индикатора есть такие переменные как rates_total, и prev_calculated, но во время вызова индикатора к примеру
Если Вы встанете курсором на функцию OnCalculate() в редакторе и нажмете кнопку F1, то попадете на справку по этой функции, где явно написано:
Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и не превышает максимальное количество баров, доступных на графике. Это значение устанавливается в клиентском терминале в меню "Options" на закладке "Charts" - "Max bars in chart".
Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.
Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.
Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского терминала значения индикатора не показываются.
Эти параметры просто передаются внутрь функции.
Проблема возникает для "пятизнака". Благо эта дурь не так сильно распространена.
И это одно из первых с чем столкнулся при знакомстве с мт5...
Путь решения ещё не окончательный, но видимо крайний:
Поразительно, но мне пришла в голову точно такая же мысль и код я использую в точности такой же)))