Перерисовка индикатора из кода

Страницы: 1
RSS
Перерисовка индикатора из кода, Перезапуск OnCalculate()
 
Здравствуйте!
Имеется индикатор, использующий данные графика "А" через функцию getCandlesByIndex().
Каждое утро на сервере происходит перезаказ данных. (Можно эмулировать: Заказ данных - Перезакать данные...)
График "А" ещё не получен от сервера, а индикатор уже производит расчёт.
Т.к. данных графика "А" нет, индикатор не может быть рассчитан.

Решается входом в "Редактирование настроек графика" и нажатием "Применить" или "Ок". В этом случае, происходит перезапуск OnCalculate() и индикатор перерисовывается.

Как сделать перезапуск OnCalculate() или есть другое решение?

 
У меня аналогичный индикатор есть по произвольной формуле считает данные 2-х инструментов, тоже при переинициализации приходится Применить нажимать, так что присоединяюсь к вопросу.
 
Цитата
Михаил Понамаренко написал:
Как сделать перезапуск OnCalculate()
Из кода, никак.

Цитата
Михаил Понамаренко написал:
или есть другое решение?

посмотрите как сделано в примерах:
https://forum.quik.ru/forum17/topic1157/

там такой проблемы не наблюдается.
 
Sergey Gorokhov, в примерах getCandlesByIndex() не используется.
Речь идёт об индикаторах, которые берут данные из других графиков.
 
Михаил Понамаренко,
Это мало что меняет.
Если не можете разобраться присылайте код на адрес quiksupport@arqatech.com
 
Sergey Gorokhov, проблема выявляется, когда на диаграмме несколько графиков.
Ниже упрощённый код:
Код
Settings =
{
 Name = "!Тест" -- Название индикатора
}
function Init()
 return 1
end
function OnCalculate(index) -- Первая (самая левая) свечка имеет индекс 1
 tChartA, NumA, LegendA = getCandlesByIndex("A", 0, index - 1, 1) -- информация о свечках по идентификатору
 return tChartA[0].close -- вывод результата на график
end
Нужно создать диаграмму с двумя графиками.
На нижний график добавляем идентификатор "A".
Загружаем индикатор на первый график, получаем дублирование Close:

Пытаемся переключить таймфрейм, получаем нули:

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

Вроде бы все проблемы решены, но нет. Теперь при перезаказе данных на этом индикаторе недоступен верхний график. Устанавливаем идентификатор на верхний график, перезаказываем данные Заказ данных - Перезакать данные...:


Чтобы решить проблему, считаю, нужно производить расчёт индикаторов после получения данных по всем графикам на диаграмме.
 
Цитата
Михаил Понамаренко написал:
Предположим, что индикатор загружен на верхний график SRM7, а второй график не может быть прочитан, т.к. графики загружаются последовательно.
Да так и есть, графики отрисовываются последовательно, в связи с чем, пока рисуется первый, нельзя получить данные со второго.
И с это изменить нельзя.

Цитата
Михаил Понамаренко написал:
Вроде бы все проблемы решены, но нет. Теперь при перезаказе данных на этом индикаторе недоступен верхний график. Устанавливаем идентификатор на верхний график, перезаказываем данные Заказ данных - Перезакать данные...:

А вот на этом месте по подробней, на Вашем же примере, когда идентификатор "A" на верхнем графике, а индикатор "!Тест1" создан с привязкой к нижнему, после перезаказа данных, он нормально рисуется.
 
Sergey Gorokhov, посмотрите видео:
 
Михаил Понамаренко,

У Вас устаревшая версия терминала, проверьте поведение на последней версии, сейчас это 7.10
 
Sergey Gorokhov, проблема актуальна:
 
Михаил Понамаренко,
Все равно не воспроизводится.
быть может у Вас индикатор все-таки создан из окна с верхним графиком?
Попробуйте повторить на разных инструментах.
 
Я решал подобную задачу для арбитража.
Давно это было, поэтому пишу примерно.
Способ решения примерно такой.
На каждом тике проверяется количество свечей на графиках и если оно изменилось то перерисовывается график до последней свечи с минимальным номером.
 
нашел в архиве эту задачу.
У меня для нее была написана специально dll колбека для обмена информацией между графиками.
 
Николай Камынин, индикатор в QUIK прорисовывается раньше, чем приходят данные графика. А перерисовать индикатор не представляется возможным любыми способами, в т.ч. во внешней библиотеке. Или я не прав?
 
Цитата
Sergey Gorokhov написал:
Михаил Понамаренко  ,
Все равно не воспроизводится.
быть может у Вас индикатор все-таки создан из окна с верхним графиком?
Попробуйте повторить на разных инструментах.
Для чистоты эксперимента, установил QUIK 7.10 с Вашего сайта. Ничего не менял в настройках, только скопировал тестовый индикатор и добавил окно второго инструмента. Инструменты другие. Но картина такая же. (
 
Михаил Понамаренко

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

Поэтому в одних условиях ваш индикатор будет строиться правильно, в других случаях у вас будут нули.

Способа заставить рассчитываться индикаторы в нужной нам последовательности нет (не предоставлено, да и невозможно)

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

Сигналом к такому перерасчету может быть (в частности) приход первого тика в ваш индикатор после первичного расчета. Тик придет уже после расчета всех индикаторов, в том числе и нужного вам. Этот сигнал будет при построении индикатора во врея торгов. Если торгов нет или нет соединения с брокером - изобретайте сигнал к пересчету сами.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
s_mike@rambler.ru, спасибо за хорошую мысль. Действительно, перерисовать индикатор можно только таким способом, прогнав весь массив тайм-серии сначала. А событием для этого сделаю ненулевую цену графика. Попробую.
Но, всё равно, "телега бежит впереди лошади".
Может уважаемые разработчики хоть, как пожелание зарегистрируют запуск расчёта индикаторов после получения данных всех графиков на диаграмме.  
 
Сейчас нарисовал алгоритм арбитража
Вроде бы перерисовывается при смене масштабов в реале посмотрим в понедельник.
Суть алгоритма следующая
Поясняю на примере арбитража сбербанка
На 1 графике помещаем себрбанк -П и он его метим меткой т е его будет читать по getCandlesByIndex
На втором графике размещаем сбербанк обычка
На третьем графике размещаем разность цен (арибтраж) который связывается со сбербанком обычкой.
-------------------
в результате получается следующее:
арбитраж строится по обычке,
прием графиков в окне идет последовательно поэтому первым принимаются данные по префам.
вот такая картинка в итоге:

 
 
Выкладываю байт код для создания индикатора арбитража как на предыдущей картинке
https://yadi.sk/d/BsGPAXPn3HFfyY
его надо поместить в каталог ...\QUIK\LuaIndicators
параметры индикатора:
Settings={
sec ="SBERP",  -- идентификатор  для первого графика
Name = "*ar_nkx", --имя индикатора
mline=0, --номер линии с графиком цены на первом графике
}

Чтобы открыть индикатор, надо встать мышью на второй график и добавить график *ar_nkx
В результате будет создан график по разности close второго и первого графиков.
 
Всё же, решить проблему не удалось. Проблема именно в том, что пересчёт индикатора задним числом удалось сделать только на новом тике. Если пересчитывать ранее, например, на последнем баре, получаем всё те же нули с верхнего графика.
Страницы: 1
Читают тему
Наверх