Рассинхронизация времени? - страница 2

 
stringo:

RefreshRates обновляет не только переменные Bid, Ask, Bars, Time, Open etc, но и закешированные экспертом исторические данные других символов-периодов.

Например, если вы работая на часовке, обратились к днёвкам, то у эксперта будет создана локальная копия существующих на момент запроса днёвок. На следующем тике все данные, включая днёвки, автоматически обновятся. Но если вы в большом цикле будете обращаться к днёвкам, то вы получите возможно неактуальные данные, если не было вызова RefreshRates


Ok. Т.е. простыми словами, если в начале OnTick() вызывается RefreshRates() и возвращает true, то все бары других таймфреймов по текущему символу автоматически подкачались и синхронизировались?

 
RickD:


Ok. Т.е. простыми словами, если в начале OnTick() вызывается RefreshRates() и возвращает true, то все бары других таймфреймов по текущему символу автоматически подкачались и синхронизировались?

В начале OnTick не надо вызывать RefreshRates. "Всё уже украдено до нас" - RefreshRates вызывается автоматически перед каждым OnTick

RefreshRates нужно явно вызывать только если у Вас большой цикл обработки. Или была торговая операция

 
stringo:

В начале OnTick не надо вызывать RefreshRates. "Всё уже украдено до нас" - вызывается автоматически перед каждым OnTick

Нужно использовать только если у Вас большой цикл обработки. Или была торговая операция

Ok. Как вы объясните тот факт, что на первом тике нового дня TimeCurrent() вернул 2015.09.14 00:00:00, а iTime(NULL, PERIOD_D1, 0) вернул 2015.09.13 00:00:00 и как с этим бороться?
 

Например так.

Пришло 2 тика один за другим. Один - конец дня, другой - начало следующего дня.

На первый тик запустился эксперт. При этом поступление и обработка тиков и эксперт работают в разных потоках. Пока эксперт поднимался (инициализировал своё окружение), обработался второй тик. При этом второй тик соершенно необязательно по той же паре, что и первый.

Тем не менее второй тик поменял время обзора рынка, которое Вы получаете функцией TimeCurrent

 

Как с этим бороться?

Вам уже тут подсказали, что не надо ориентироваться на время TimeCurrent.

Лучше ориентируйтесь на время, полученное функцией SymbolInfoTick

 

Ясно. Спасибо. Похоже - это верное решение не использовать TimeCurrent().

Интересно - до билда 600, когда не было функций SymbolInfoTick и SymbolInfoInteger, но была только TimeCurrent(), эта проблема была актуальна ?

 
stringo:
Не инициирует. Мы пока думаем, как это сделать, не нарушив архитектуру четвёрки.

Странно. Обычно после первого программного обращения к данным таймфрейма, к которому до сих пор не было обращений, через некоторое время данные появляются.

Провел следующий опыт:

1. Нашел в папке history такой символ и период, которого нет. В данном случае это был CADCHF, M5.

2. На символе EURCAD запустил следующий скрипт:

   int cnt = 0;
   
   datetime time = 0;
   
   while (!IsStopped())
   {
      time = iTime("CADCHF", PERIOD_M5, 0);
      if (GetLastError() == ERR_NO_ERROR)
         break;

      cnt++;
      Sleep(1);
   }
   
   Alert("Количество итераций: ", cnt, ", время открытия свечи: ", time);

Итоги:

1. Запись в журнале:

2015.09.18 16:43:38.134 Test EURCAD,M5: Alert: Количество итераций: 1145, время открытия свечи: 2015.09.18 16:40:00

2. В папке history появился файл CADCHF5.hst.

 

Вывод: история была загружена программно, пользователь не прибегал к ручному открытию графика

Возможно, я в чем-то неправ? Укажите, пожалуйста, где я ошибся. 

 

После первого обращения - да, инициирует. Либо закачается последние 2048 баров, если никогда не закачивали. Либо закачается необходимое количество баров, чтобы заткнуть дыру.

Докачки более ранних данных нет

 
stringo:

После первого обращения - да, инициирует. Либо закачается последние 2048 баров, если никогда не закачивали. Либо закачается необходимое количество баров, чтобы заткнуть дыру.

Докачки более ранних данных нет

Спасибо за уточнения. Про ограничение в 2048 баров не знал.