Перепробовал кучу вариантов, стабильного не обнаружил.
Какие варианты пробовали? Чтобы зря не советовать.
вот этот лучший из опробованных. но тоже иногда не спасает.
вот этот лучший из опробованных. но тоже иногда не спасает.
Этот код проверяет только появление одного нового бара, но не проверяет факт окончания загрузки истории. Пробовали вариант с проверкой окончания загрузки?
Этот код проверяет только появление одного нового бара, но не проверяет факт окончания загрузки истории. Пробовали вариант с проверкой окончания загрузки?
так вопрос то и заключается как проверить окончание загрузки :)
так вопрос то и заключается как проверить окончание загрузки :)
Вот так:
bool IsTFDataReady(ENUM_TIMEFRAMES eTF) { ResetLastError(); iTime(NULL, eTF, 1); return GetLastError() == ERR_NO_ERROR; }
вот этот лучший из опробованных. но тоже иногда не спасает.
if (rates_total < num) return(0);
num - это что?
хитро... а в
iTime(NULL, eTF, 1);
shift = 1 |
именно сдвиг 1, или подставлять значение Bars пример?
Без разницы. Обращение к таймсерии приводит к запросу истории с сервера, если последний запрос был "давно" (что подразумевается под давно точно сказать не могу). При этом генерируется ошибка 4066. Следующие обращения к таймсерии будут генерировать уже другие ошибки (не помню уже, какие) до тех пор, пока вся доступная история не будет закачана. Как только загрузка окончена, обращение к таймсерии не будет вызывать ошибку, обращения к серверу прекратятся.
Без разницы. Обращение к таймсерии приводит к запросу истории с сервера, если последний запрос был "давно" (что подразумевается под давно точно сказать не могу). При этом генерируется ошибка 4066. Следующие обращения к таймсерии будут генерировать уже другие ошибки (не помню уже, какие) до тех пор, пока вся доступная история не будет закачана. Как только загрузка окончена, обращение к таймсерии не будет вызывать ошибку, обращения к серверу прекратятся.
Либо что-то не так делаю, либо это не работает:
bool IsTFDataReady(ENUM_TIMEFRAMES eTF)
{
bool res = false;
ResetLastError();
datetime dt1 = iTime(Symbol(), eTF, Bars-1);
datetime dt2 = iTime(Symbol(), eTF, 1);
if (GetLastError() == ERR_NO_ERROR)
{
Print("Initialization is complete. Time index bar (", Bars, ") = ", TimeToStr(dt1), " / ", TimeToStr(dt2));
res = true;
}
else
Print("Initialization error: ", GetLastError()) ;
return(res);
}
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[])
{
if (FirstRUN)
{
Print("History initialization...");
if (!IsTFDataReady(PERIOD_CURRENT))
{
return(0);
}
}
FirstRUN = false;
}
получаю результат
2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: Initialization is complete. Time index bar (2048) = 2018.02.06 11:00 / 2018.06.05 19:00
2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: History initialization...
2019.03.21 11:46:53.504 ptr_Area GBPCHF.I,H1: initialized
при повторной компиляции - история догружается
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Поделитесь как решить данную проблему.
Т.е. перед началом выполнения кода индикатора, нужно убедиться, что доступная история графика (допустим количество баров функции Bars ) загрузилась.
В следствии недозагрузки истории некорректно отрабатывает код. Проявляется при старте терминала или переключения таймфрейма.
Перепробовал кучу вариантов, стабильного не обнаружил.