Задержка в появлении баров.

 

Здравствуйте, участники форума.

Пишу индикатор, который отслеживает появление нового бара по времени. Натолкнулся на то, что время реального появления бара запаздывает по сравнению с серверным временем. Пример в скриншоте:

1. Последний тик предыдущего бара 12:16:59 (TimeCurrent()). Количество баров 42276.

2. Поступил следующий тик в 12:17:02. Но количество баров почему-то не поменялось 42276.

3. И только на следующем тике в 12:17:02 количество баров увеличивается и составляет 42277.

Почему так происходит, есть ли смысл писать в сервисдеск или багом это не считается? Есть ли возможность по ВРЕМЕНИ тика определить поступление нового бара на график?


Задержка обновления баров

 
savinkins:

Здравствуйте, участники форума.

Пишу индикатор, который отслеживает появление нового бара по времени. Натолкнулся на то, что время реального появления бара запаздывает по сравнению с серверным временем. Пример в скриншоте:

1. Последний тик предыдущего бара 12:16:59 (TimeCurrent()). Количество баров 42276.

2. Поступил следующий тик в 12:17:02. Но количество баров почему-то не поменялось 42276.

3. И только на следующем тике в 12:17:02 количество баров увеличивается и составляет 42277.

Почему так происходит, есть ли смысл писать в сервисдеск или багом это не считается? Есть ли возможность по ВРЕМЕНИ тика определить поступление нового бара на график?


Пожалуйста покажите Ваш код:

- как Вы определяете новый бар

- код индикатора, что возвращаете при выходе из OnCalculate

 
//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Print("Новый тик");
   Print("rates_total = "+(string)rates_total);
   Print("Количество баров Bars(_Symbol,_Period,0,rates_total-1) = "+(string)Bars(_Symbol,_Period,0,time[rates_total-1]));
   Print("TimeCurrent() = "+(string)TimeCurrent());

   return(rates_total);
  }
//+------------------------------------------------------------------+


 
savinkins:


Как минимум Bars вызов неправильный.

И, кстати, зачем? В индикаторе всегда есть переменная "rates_total" - размер входных таймсерий.

 
Vladimir Karputov:

Как минимум Bars вызов неправильный.

Можно подробнее?

Это просто тест, который ловит поступление тиков. Сам текст индикатора длинный, выкладывать его смысла нет. Его задача сохранять данные в файл, а потом по этим данным строить свечи. Поэтому начало свечи определяется по времени.

 

Если очень хочется исследовать Bars, то пропишите три строки:

   Print("Количество баров Bars(_Symbol,_Period,0,rates_total-1 + 50 секунд) = "+(string)Bars(_Symbol,_Period,0,time[rates_total-1]+50));
   Print("Количество баров Bars(_Symbol,_Period,0,rates_total-1) = "+(string)Bars(_Symbol,_Period,0,time[rates_total-1]));
   Print("Количество баров Bars(_Symbol,_Period,0,0) = "+(string)Bars(_Symbol,_Period,0,0));
 
Vladimir Karputov:

Если очень хочется исследовать Bars, то пропишите три строки:

Последняя строчка всегда вернет 1. Вторая - расчетное время бара (с 00 секунд). Но это расчетное время бара может относиться к предыдущему бару. В моем примере в п. 2 будет возвращен бар на 12:16:00, хотя на самом деле уже 12:17:02, и должен начаться следующий бар.

 
Vladimir Karputov:

Если очень хочется исследовать Bars, то пропишите три строки:

Вы наверное имели ввиду:

Bars(_Symbol,_Period)

вместо

Bars(_Symbol,_Period,0,0)
 
Nikolai Semko:

Вы наверное имели ввиду:

вместо

Да, имел в виду первую форму вызова Bars.

savinkins:

Последняя строчка всегда вернет 1. Вторая - расчетное время бара (с 00 секунд). Но это расчетное время бара может относиться к предыдущему бару. В моем примере в п. 2 будет возвращено 12:16:00, хотя на самом деле уже 12:17:02, и должен начаться следующий бар.

У Вас время на компьютере синхронизировано? У меня да, и я проверил, предварительно загрузив тестированием процессор на 100% и не увидел рассогласования:

2018.05.16 13:01:59.890 Новый тик
2018.05.16 13:01:59.890 rates_total = 101087
2018.05.16 13:01:59.890 Количество баров Bars(_Symbol,_Period,0,rates_total-1 + 50 секунд) = 101087
2018.05.16 13:01:59.890 Количество баров Bars(_Symbol,_Period,0,rates_total-1) = 101087
2018.05.16 13:01:59.890 Количество баров Bars(_Symbol,_Period) = 101087
2018.05.16 13:01:59.890 TimeCurrent() = 2018.05.16 13:01:59
2018.05.16 13:02:00.372 Новый тик
2018.05.16 13:02:00.372 rates_total = 101088
2018.05.16 13:02:00.372 Количество баров Bars(_Symbol,_Period,0,rates_total-1 + 50 секунд) = 101088
2018.05.16 13:02:00.372 Количество баров Bars(_Symbol,_Period,0,rates_total-1) = 101088
2018.05.16 13:02:00.372 Количество баров Bars(_Symbol,_Period) = 101088
2018.05.16 13:02:00.372 TimeCurrent() = 2018.05.16 13:02:00
 
Vladimir Karputov:

Да, имел в виду первую форму вызова Bars.

У Вас время на компьютере синхронизировано? У меня да, и я проверил, предварительно загрузив тестированием процессор на 100% и не увидел рассогласования:

Что значит, синхронизировано время? Как это сделать? При чем здесь время на компьютере, если TimeCurrent возвращает серверное время?

И эта ситуация бывает не на каждом баре.

 
savinkins:

Что значит, синхронизировано время? Как это сделать? При чем здесь время на компьютере, если TimeCurrent возвращает серверное время?

И эта ситуация бывает не на каждом баре.

В журнале колонка "Время" печатает время компьютера. У вас она не попадает в несколько секунд. Посмотрите мой результат - секунда в секунду.

Причина обращения: