- www.mql5.com
- Новая версия платформы MetaTrader 5 build 2530: Сортировка в Обзоре рынка и удобная работа с результатами оптимизации
- Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6.
- Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Привет! в индикаторе использую функцию iBarShift(NULL,0,time[i]). При переключени по таймфрейма эта функция возвращает -1, причем хаотично! и если сделать проверку, то бар на указанное время в истории cуществует, но тем не менее функция возвращает ошибку, но повторюсь - хаотично! подскажите, как это исправить?
Возможно, в момент переключения таймфрейма, этих исторических баров еще нет и они подкачиваются позднее.
Проверьте количество баров на переключаемом ТФ в функции OnInit().
А по хорошему нужен воспроизводимый код и пример результата с ошибкой.
Иначе играть в догадки никто не будет.
Возможно, в момент переключения таймфрейма, этих исторических баров еще нет и они подкачиваются позднее.
Проверьте количество баров на переключаемом ТФ в функции OnInit().
А по хорошему нужен воспроизводимый код и пример результата с ошибкой.
Иначе играть в догадки никто не будет.
Спасибо! вроде так и есть. Сделал проверку на количество бар в OnInit = вернуло 0
Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже
//+------------------------------------------------------------------+ //| test.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { int bars=Bars(_Symbol,_Period); if(bars>0) { Print("---Количество баров в истории терминала по символу-периоду на данный момент = ",bars); } else { //нет доступных баров //--- видимо, данные по символу не синхронизированы с данными на сервере bool synchronized=false; //--- счетчик цикла int attempts=0; // сделаем 5 попыток дождаться синхронизации while(attempts<5) { if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED)) { //--- есть синхронизация, выходим synchronized=true; break; } //--- увеличим счетчик attempts++; //--- подождем 10 миллисекунд до следующей итерации Sleep(10); } //--- вышли из цикла по факту синхронизации if(synchronized) { Print("Количество баров в истории терминала по символу-периоду на данный момент = ",Bars(_Symbol,_Period)); Print("Самая первая в истории терминала дата по символу-периоду на данный момент = ", (datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE)); Print("Самая первая дата в истории по символу на сервере = ", (datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE)); } //--- синхронизация данных так и не была достигнута else { Print("Не удалось получить количество баров на ",_Symbol); return(false); } } //+------------------------------------------------------------------+ //--- 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[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже
История не подгружается мгновенно по всем ТФ. Хотите актуальную историю по нескольким ТФ, нужно ее запрашивать раз в 60-90 секунд через Copy...() функции.
Да, и OnInit() не та функция для подгрузки истории. Она только для инициализации эксперта/индикатора. Делайте подгрузку в OnCalculate().
Тогла вопрос уже в другом! Почему история не подгружается? Я взял код со справки и привожу его ниже. Тут все равно при переключении между таймфреймами иногда возвращает 0 баров. Как же все таки это исправить? я ставил больше количество повторении, увеличивал паузу - но безрезультатно. Пишет что синхронизация пройдена с сервером, но количество баров 0. собственно код ниже
При ошибке получения данных, выходите из OnCalculate() с возвратом 0. Тогда на следующем тике опять будет полный перерасчёт индикатора как при первом запуске (если это не на выходных).
На выходных - при отсутствии тиков, их нужно эмулировать. Почитайте основные принципы здесь: https://www.mql5.com/ru/articles/13578
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования