Array out of range для Low [ i ] и прочих функций
Какое количество поставлено тут?
После изменения обязательно перезапустить МТ.
Макс баров в окне 65000
По факту на 3000 уже дает ошибку

- docs.mql4.com
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
То результат получается
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Самая первая дата в истории по символу на сервере = 2021.05.28 09:50:00
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Самая первая дата по символу-периоду на данный момент = 2022.04.13 20:20:00
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Количество баров по символу-периоду на данный момент = 5563 5563 5563
Т.е. количество баров должно быть явно больше, но их почему-то только на две недели для пятиминутного таймфрейма
Номер крайнего левого бара выдает не очень большим. На разных символах по разному, но в среднем 3000-5000. При этом если запустить вот такое...
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
То результат получается
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Самая первая дата в истории по символу на сервере = 2021.05.28 09:50:00
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Самая первая дата по символу-периоду на данный момент = 2022.04.13 20:20:00
2022.05.13 11:07:53.292 instatfin_digit DowJones30,M5: Количество баров по символу-периоду на данный момент = 5563 5563 5563
Т.е. количество баров должно быть явно больше, но их почему-то только на две недели для пятиминутного таймфрейма
Возможно на сервере брокера это максимальное количество баров по инструменту.
Чем плох вариант с проверкой доступного количества баров? Тогда можно обращаться только к тем барам, которые будут реально доступны.
Также еще стоит уйти от прямого доступа к котировкам (как раз вот эти Low, Open и т. д.) к вызову соответствующих функций: iLow, iOpen. Во-первых, сразу уйдет ошибка выхода за пределы массива. Во-вторых, получится кроссплатформенный код. В-третьих, код получит универсальность в плане доступа к любому ТФ, а не только к текущему.
// если терминал не найдет у себя требуемых баров // то автоматический будет сделан запрос на сервер int rcode = ERR_SUCCESS; // код ошибки int numBars = -1; // кол-во скопированных баров int numRequest = 3; // макс.кол-во запросов for (int j = 0; j < numRequest && numBars < 0; j++) { ResetLastError(); numBars = CopyRates(symbol, period, time0Bar, count, rates); if (numBars == -1) Sleep(1000); // ждем 1 сек для подкачки баров rcode = GetLastError(); }
Для скрипта может и подойдёт, а для индикатора - точно нет.
Дело в том, что главным требованием к индикатору является скорость его исполнения. Индикатор не умеет ничего ждать, от слова совсем. Получив команду на выполнение, он немедленно начинает ее исполнять на тех данных, которые уже есть в терминале строго на этот момент времени и ни миллисекундой позже. Новые, более свежие данные могут быть получены индикатором только из его окружения (терминала) и только в момент начала очередного цикла его выполнения (Start, OnCalculate). Никаких других данных индикатор не видит и не способен их получить нативными способами.
Думаю, со скриптами ситуация похожая, только они умеют ждать и использовать внешние данные. В остальном - слепок данных на момент подачи команды и все немедленно бегут эту команду исполнять.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Забыл упомянуть, что работаю в МТ4