1. Внешняя программа делает запрос на историю от даты дд.мм.гггг до дд.мм.гггг
2. Эксперт копирует М1 в указанном интервале, пробегается по скопированным данным, и если находит пропуск хотя бы одного бара (выходные, "дыра", что угодно), то засыпает секунды на три.
3. После пробуждения убеждается в том, что во время сна пришёл хотя бы один тик от сервера. Если да, то снова копирует запрошенные данные, если расхождений не обнаружено, то отправляет внешнему приложению.
Работайте из индикатора.
В индикаторе, в OnCalculate следите когда переменная "prev_calculated" получает значение "0". Такое может быть в двух случаях:
- первый запуск индикатора
- была подкачана/изменена история.
Дело в том, что mql программа будет работать с разными символам. Не хочется кидать десяток индикаторов на графики, следить за ними, усложняется коммуникация между процессами. хлопотно в общем.
Подкачка валютных пар https://www.mql5.com/ru/docs/series/timeseries_access - может пригодится
Пользуюсь этой функцией при запуске эксперта-мультивалютника, для принудительной закачки истории по всем нужным парам.
- www.mql5.com
Если кто-то из команды разработчиков читает тему (или тот, кто точно знает), то у меня к Вам вопрос: возможно ли скопировать таймсерию с "дыркой" (функцией CopyTime(), например), которая со временем заполнится при подкачки истории? В старом MT4 такое точно было возможно, но учитывая объединение платформ, я не уверен. Выходной день, тики не идут, проверить сейчас самому невозможно.
Затёр загруженную историю с сервера таким образом, чтобы в ней осталось 100 самых старых свечей. Разоравал соединение с сетью. Набросал скрипт:
void OnStart()
{
string symbol = "EURUSD";
datetime t_ar[];
int cnt = CopyTime(symbol, PERIOD_M1, D'1970.01.01 00:00', D'2020.01.01 00:00', t_ar);
Alert( cnt );
Alert( t_ar[0] );
Alert( t_ar[cnt - 1] );
}
100
2016.06.24 09:22
2016.06.24 07:43
Запуск скрипта при только что подключённой сети (история в процессе загрузки):
7628
2016.08.26 23:59
2016.06.24 07:43
Запуск скрипта, когда история полностью загружена:
32867
2016.08.26 23:59
2016.06.24 07:43
Во втором случае получили дыру в тысяч 25 свечей. Интересно ещё и то, что после полной остановки загрузки истории образовался разрыв в месяц между старой историй и свежезагруженной 2016.06.24 09:22 - 2016.07.27 01:44. Лимитов вроде не достиг: макс баров в истории = 512000, макс баров в окне = 65000.
ЗЫ: ну должны же разработчики давать гарантию целостности хоть какой-то части истории (самой новой)? Иначе, эта ваша недоработка. Например, 300 самых новых свечей не могут содержать "дыры".
В общем, я всё проверил. Результат - можно запросто скопировать историю с "дыркой" (в МТ4 точно, МТ5 не проверял).
Затёр загруженную историю с сервера таким образом, чтобы в ней осталось 100 самых старых свечей. Разоравал соединение с сетью. Набросал скрипт:
void OnStart()
{
string symbol = "EURUSD";
datetime t_ar[];
int cnt = CopyTime(symbol, PERIOD_M1, D'1970.01.01 00:00', D'2020.01.01 00:00', t_ar);
Alert( cnt );
Alert( t_ar[0] );
Alert( t_ar[cnt - 1] );
}
100
2016.06.24 09:22
2016.06.24 07:43
Запуск скрипта при только что подключённой сети (история в процессе загрузки):
7628
2016.08.26 23:59
2016.06.24 07:43
Запуск скрипта, когда история полностью загружена:
32867
2016.08.26 23:59
2016.06.24 07:43
Во втором случае получили дыру в тысяч 25 свечей. Интересно ещё и то, что после полной остановки загрузки истории образовался разрыв в месяц между старой историй и свежезагруженной 2016.06.24 09:22 - 2016.07.27 01:44. Лимитов вроде не достиг: макс баров в истории = 512000, макс баров в окне = 65000.
ЗЫ: ну должны же разработчики давать гарантию целостности хоть какой-то части истории (самой новой)? Иначе, эта ваша недоработка. Например, 300 самых новых свечей не могут содержать "дыры".
Более удивительный результата можно получить если утопить комп в ванне.
Выше Барабашка дал хороший ответ. Еще в МТ4 можно проверять ошибку 4066, а в МТ5 есть функция Bars.
Более удивительный результата можно получить если утопить комп в ванне.
Выше Барабашка дал хороший ответ. Еще в МТ4 можно проверять ошибку 4066, а в МТ5 есть функция Bars.
Ошибку можно проверить лишь после возврата ошибки какой-нибудь функцией, ошибок я не получал. Проверил Bars(), вернёт ли она ошибку в момент, когда история подгружается, результат - нет не возвращает.
void OnStart() { string symbol = "EURUSD"; datetime t_ar[]; int cnt = CopyTime(symbol, PERIOD_M1, D'1970.01.01 00:00', D'2020.01.01 00:00', t_ar); Alert( Bars(symbol, PERIOD_M1) ); Alert( cnt ); Alert( t_ar[0] ); Alert( t_ar[cnt - 1] ); }
7268
7268
2016.08.26 23:59:00
2016.06.24 07:43:00
Получается, что сейчас дают возможность работать с историей, но её валидность никто не обещает, нет никаких заметок в документации о том, что столько то баров не содержат пропуск. Copy...() может брать любые точки из истории и давать запросившему, главное соблюсти порядок.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
1. Как я помню, данные графиков загружаются справа-налево. Следовательно, возможно ситуация, при которой будет образована "дырка" в историии (которая будет заполнена в процессе подкачки истории). Вопрос - можно ли программными средставми узнать, что история синхронизирована (вроде был способ для МТ5, что типа функции is_synchronized(). Может после слияния функционала возможность перекочевала и в МТ4?)? Например узнать, что m1 XXXYYY синхронизирован с сервером.
2. Если первый ответ отрицательный, то как работающему эксперту понять, что подключения с сервером не было достаточно долго для того, чтобы образовалась "дырка", и надо немного подождать перед запросом данных?
3. Можно ли программными средствами (штатными) подкачать историю по символы (необязательно историю текущего символа, а любого, даже при закрытом графике этого символа)?
4. Семейство функций Copy{Buffer, Rates, Time, ...}() работают в МТ4? Прилично? Да, могу и сам проверить, но раз уж создал тему, воспользуюсь моментом.
ЗЫ:
По поводу желания не увидеть "дыру в истории" - я не параноик, данные идут во внешнее приложение, оно их кэширует и больше не запрашивает, не хочу чтобы оно получило непотребное барахло вместо ценовой истории.