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

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

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

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

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

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

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

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


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

Vladimir Karputov
Модератор
183268
Vladimir Karputov  
savinkins:

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

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

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

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

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

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


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

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

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

Sergey Savinkin
2099
Sergey Savinkin  
//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+


Vladimir Karputov
Модератор
183268
Vladimir Karputov  
savinkins:


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

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

Sergey Savinkin
2099
Sergey Savinkin  
Vladimir Karputov:

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

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

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

Vladimir Karputov
Модератор
183268
Vladimir Karputov  

Если очень хочется исследовать 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));
Sergey Savinkin
2099
Sergey Savinkin  
Vladimir Karputov:

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

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

Nikolai Semko
6595
Nikolai Semko  
Vladimir Karputov:

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

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

Bars(_Symbol,_Period)

вместо

Bars(_Symbol,_Period,0,0)
Vladimir Karputov
Модератор
183268
Vladimir Karputov  
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
Sergey Savinkin
2099
Sergey Savinkin  
Vladimir Karputov:

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

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

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

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

Vladimir Karputov
Модератор
183268
Vladimir Karputov  
savinkins:

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

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

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

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