Синхронизация истории с сервером

 
Здравствуйте. Пара вопросов (МТ4):
1. Как я помню, данные графиков загружаются справа-налево. Следовательно, возможно ситуация, при которой будет образована "дырка" в историии (которая будет заполнена в процессе подкачки истории). Вопрос - можно ли программными средставми узнать, что история синхронизирована (вроде был способ для МТ5, что типа функции is_synchronized(). Может после слияния функционала возможность перекочевала и в МТ4?)? Например узнать, что m1 XXXYYY синхронизирован с сервером.
2. Если первый ответ отрицательный, то как работающему эксперту понять, что подключения с сервером не было достаточно долго для того, чтобы образовалась "дырка", и надо немного подождать перед запросом данных?
3. Можно ли программными средствами (штатными) подкачать историю по символы (необязательно историю текущего символа, а любого, даже при закрытом графике этого символа)?
4. Семейство функций Copy{Buffer, Rates, Time, ...}() работают в МТ4? Прилично? Да, могу и сам проверить, но раз уж создал тему, воспользуюсь моментом.

ЗЫ:
По поводу желания не увидеть "дыру в истории" - я не параноик, данные идут во внешнее приложение, оно их кэширует и больше не запрашивает, не хочу чтобы оно получило непотребное барахло вместо ценовой истории.
 
Сейчас у меня пока в голове такой алгоритм проверки целостности запрошенной истории:
1. Внешняя программа делает запрос на историю от даты дд.мм.гггг до дд.мм.гггг
2. Эксперт копирует М1 в указанном интервале, пробегается по скопированным данным, и если находит пропуск хотя бы одного бара (выходные, "дыра", что угодно), то засыпает секунды на три.
3. После пробуждения убеждается в том, что во время сна пришёл хотя бы один тик от сервера. Если да, то снова копирует запрошенные данные, если расхождений не обнаружено, то отправляет внешнему приложению.
 

Работайте из индикатора.

В индикаторе, в OnCalculate следите когда переменная "prev_calculated" получает значение "0". Такое может быть в двух случаях:

  • первый запуск индикатора
  • была подкачана/изменена история.

 
Дело в том, что mql программа будет работать с разными символам. Не хочется кидать десяток индикаторов на графики, следить за ними, усложняется коммуникация между процессами. хлопотно в общем.
 
pavlick_:
Дело в том, что mql программа будет работать с разными символам. Не хочется кидать десяток индикаторов на графики, следить за ними, усложняется коммуникация между процессами. хлопотно в общем.
В чём сложность-то? Можно индикаторы заставить отсылать пользовательские события - то есть индикаторы будут работать как агенты.
 

Подкачка валютных пар https://www.mql5.com/ru/docs/series/timeseries_access - может пригодится

Пользуюсь этой функцией при запуске эксперта-мультивалютника, для принудительной закачки истории по всем нужным парам.

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Доступ к таймсериям и индикаторам / Организация доступа к данным - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
elibrarius спасибо, полезная статья.

Если кто-то из команды разработчиков читает тему (или тот, кто точно знает), то у меня к Вам вопрос: возможно ли скопировать таймсерию с "дыркой" (функцией CopyTime(), например), которая со временем заполнится при подкачки истории? В старом MT4 такое точно было возможно, но учитывая объединение платформ, я не уверен. Выходной день, тики не идут, проверить сейчас самому невозможно.
 
В общем, я всё проверил. Результат - можно запросто скопировать историю с "дыркой" (в МТ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 самых новых свечей не могут содержать "дыры".

 
pavlick_:
В общем, я всё проверил. Результат - можно запросто скопировать историю с "дыркой" (в МТ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. 

 
pavlick_:
...


Например, 300 самых новых свечей не могут содержать "дыры".

Это точно есть. По крайней мере в МТ4 точно. Если через архив истории изменить недавний бар, он будет исправлен. На какую глубину делается проверка не знаю.
 
Dmitry Fedoseev:

Более удивительный результата можно получить если утопить комп в ванне.

Выше Барабашка дал хороший ответ.  Еще в МТ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...() может брать любые точки из истории и давать запросившему, главное соблюсти порядок.