Здравствуйте. Пробую рисовать разные индикаторы.
Вот пару месяцев назад нарисовал индикатор из четырех EMA со стрелкой, при пересечении.
Вроде бы все исправно работает, но есть странный момент при загрузке компьютера.
Выглядит все следующим образом: компьютер работает, данные считаются, индикатор обновляется.
Потом компьютер выключаю. Допустим на ночь. Включаю утром (через 6-8 часов) и вижу вот такую картину (см.рисунок).
Т.е. при единичной загрузке индикатор отчего-то не пересчитывает данные за тот период, что ПК был выключен.
При закрытии/открытии терминала - данные обновляются, и индикатор опять считается должным образом, без "пробелов".
Подскажите, в чем может быть дело? Я уже и чужой код смотрел, и стандартные библиотеки ковырял, в поисках решения, ничего так и не понял.
Спасибо. Код приложен.
Я не могу понять какой чужой код вы смотрели. Я такого
if(first) { limit=rates_total-1; first=false; } else limit=1;
ни у кого не видел.
Определять первый запуск привычней ориентируясь на количество посчитанных баров prev_calculated
для начала нужно избавиться от переменной first, а вообще limit если запуск не первый должен быть равен не 1, а rates_total минус prev_calculated.
это все нужно грамотно закодировать.
Здравствуйте. Пробую рисовать разные индикаторы.
Т.е. при единичной загрузке индикатор отчего-то не пересчитывает данные за тот период, что ПК был выключен.
В коде не учтено, что может случиться загрузка данных во время работы индикатора. То есть код основан на том, что еще до момента запуска индикатора на графике имеется вся необходимая история котировок. Но это не так. Котировки, время которых меньше, чем текущее, могут поступать и через минуту, и через полчаса (утрировано) после запуска индикатора.
Для правильной обработки этого процесса все уже давно придумано:
int limit = rates_total - prev_calculated; //---- последний посчитанный бар будет пересчитан if (prev_calculated > 0) ++limit;
Хотя я для простоты кода выделяю всего два случая:
- Если prev_calculated отличается от rates_total на 0 или 1, то рассчитывается только 1 или 2 последних бара соответственно. Это ситуация с равномерным обновлением истории котировок, т. е. либо поступил новый тик текущего бара, либо в течение естественного течения времени появился новый бар на графике.
- Все остальные случаи (prev_calculated отличается от rates_total на 2 бара и более) - загрузка котировок. Проще всего пересчитать всю историю.
Я не могу понять какой чужой код вы смотрели. Я такого
ни у кого не видел.
Определять первый запуск привычней ориентируясь на количество посчитанных баров prev_calculated
Собственная придумка.
Логику видел так: при загрузке индикатора (открылся ли терминал в целом, или поместили индикатор на график, в частности), при инициализации - рассчитать один раз весь объем доступных данных.
Затем подсчитывать каждый бар при его появлении, чтобы не пересчитывать все заново на каждом тике/баре.
На истину не претендую, профессионалом себя не считаю, пробую разобраться, ничего более.
В коде не учтено, что может случиться загрузка данных во время работы индикатора. То есть код основан на том, что еще до момента запуска индикатора на графике имеется вся необходимая история котировок. Но это не так. Котировки, время которых меньше, чем текущее, могут поступать и через минуту, и через полчаса (утрировано) после запуска индикатора.
Для правильной обработки этого процесса все уже давно придумано:
Хотя я для простоты кода выделяю всего два случая:
- Если prev_calculated отличается от rates_total на 0 или 1, то рассчитывается только 1 или 2 последних бара соответственно. Это ситуация с равномерным обновлением истории котировок, т. е. либо поступил новый тик текущего бара, либо в течение естественного течения времени появился новый бар на графике.
- Все остальные случаи (prev_calculated отличается от rates_total на 2 бара и более) - загрузка котировок. Проще всего пересчитать всю историю.
Спасибо за развернутый ответ, буду пробовать!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте. Пробую рисовать разные индикаторы.
Вот пару месяцев назад нарисовал индикатор из четырех EMA со стрелкой, при пересечении.
Вроде бы все исправно работает, но есть странный момент при загрузке компьютера.
Выглядит все следующим образом: компьютер работает, данные считаются, индикатор обновляется.
Потом компьютер выключаю. Допустим на ночь. Включаю утром (через 6-8 часов) и вижу вот такую картину (см.рисунок).
Т.е. при единичной загрузке индикатор отчего-то не пересчитывает данные за тот период, что ПК был выключен.
При закрытии/открытии терминала - данные обновляются, и индикатор опять считается должным образом, без "пробелов".
Подскажите, в чем может быть дело? Я уже и чужой код смотрел, и стандартные библиотеки ковырял, в поисках решения, ничего так и не понял.
Спасибо. Код приложен.