Скачать MetaTrader 5

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

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

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

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

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

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

pavlick_
393
pavlick_ 2016.08.27 19:45  
Дело в том, что mql программа будет работать с разными символам. Не хочется кидать десяток индикаторов на графики, следить за ними, усложняется коммуникация между процессами. хлопотно в общем.
Vladimir Karputov
Модератор
45551
Vladimir Karputov 2016.08.27 21:13  
pavlick_:
Дело в том, что mql программа будет работать с разными символам. Не хочется кидать десяток индикаторов на графики, следить за ними, усложняется коммуникация между процессами. хлопотно в общем.
В чём сложность-то? Можно индикаторы заставить отсылать пользовательские события - то есть индикаторы будут работать как агенты.
elibrarius
1759
elibrarius 2016.08.27 22:00  

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

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

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

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

Dmitry Fedoseev
42882
Dmitry Fedoseev 2016.08.28 09:59  
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. 

Dmitry Fedoseev
42882
Dmitry Fedoseev 2016.08.28 10:01  
pavlick_:
...


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

Это точно есть. По крайней мере в МТ4 точно. Если через архив истории изменить недавний бар, он будет исправлен. На какую глубину делается проверка не знаю.
pavlick_
393
pavlick_ 2016.08.28 10:24  
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...() может брать любые точки из истории и давать запросившему, главное соблюсти порядок.

12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий