Здравствуйте, участники форума.
Пишу индикатор, который отслеживает появление нового бара по времени. Натолкнулся на то, что время реального появления бара запаздывает по сравнению с серверным временем. Пример в скриншоте:
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); } //+------------------------------------------------------------------+
Как минимум 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));
Если очень хочется исследовать Bars, то пропишите три строки:
Последняя строчка всегда вернет 1. Вторая - расчетное время бара (с 00 секунд). Но это расчетное время бара может относиться к предыдущему бару. В моем примере в п. 2 будет возвращен бар на 12:16:00, хотя на самом деле уже 12:17:02, и должен начаться следующий бар.
Если очень хочется исследовать Bars, то пропишите три строки:
Вы наверное имели ввиду:
Bars(_Symbol,_Period)
вместо
Bars(_Symbol,_Period,0,0)
Вы наверное имели ввиду:
вместо
Да, имел в виду первую форму вызова Bars.
Последняя строчка всегда вернет 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
Да, имел в виду первую форму вызова Bars.
У Вас время на компьютере синхронизировано? У меня да, и я проверил, предварительно загрузив тестированием процессор на 100% и не увидел рассогласования:
Что значит, синхронизировано время? Как это сделать? При чем здесь время на компьютере, если TimeCurrent возвращает серверное время?
И эта ситуация бывает не на каждом баре.
Что значит, синхронизировано время? Как это сделать? При чем здесь время на компьютере, если TimeCurrent возвращает серверное время?
И эта ситуация бывает не на каждом баре.
В журнале колонка "Время" печатает время компьютера. У вас она не попадает в несколько секунд. Посмотрите мой результат - секунда в секунду.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, участники форума.
Пишу индикатор, который отслеживает появление нового бара по времени. Натолкнулся на то, что время реального появления бара запаздывает по сравнению с серверным временем. Пример в скриншоте:
1. Последний тик предыдущего бара 12:16:59 (TimeCurrent()). Количество баров 42276.
2. Поступил следующий тик в 12:17:02. Но количество баров почему-то не поменялось 42276.
3. И только на следующем тике в 12:17:02 количество баров увеличивается и составляет 42277.
Почему так происходит, есть ли смысл писать в сервисдеск или багом это не считается? Есть ли возможность по ВРЕМЕНИ тика определить поступление нового бара на график?