<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Блок перерасчёта данных индикатора]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Блок перерасчёта данных индикатора форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 16 Oct 2026 18:37:44 +0300</pubDate>
		<item>
			<title>Блок перерасчёта данных индикатора</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83286/topic9648/">Блок перерасчёта данных индикатора</a></b> <i>Актуально для арбитражных индикаторов и аналогичных, использующих несколько инструментов в своём расчёте.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Использовал в своём <noindex><a href="https://pmntrade.ru/indikator_arbitrage_pro.html" target="_blank" rel="nofollow">Индикаторе для QUIK</a></noindex><noindex><a href="https://pmntrade.ru/indikator_arbitrage_pro.html" target="_blank" rel="nofollow">«Арбитраж PRO»</a></noindex><br /><br />
====code====
<pre>&nbsp;&nbsp;&nbsp;-- //////////////////////////
&nbsp;&nbsp;&nbsp;-- // Блок перерасчёта данных индикатора
&nbsp;&nbsp;&nbsp;-- //////////////////////////
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;-- Автор: Михаил Понамаренко (pmntrade.ru)
&nbsp;&nbsp;&nbsp;-- Версия: 20261016

&nbsp;&nbsp;&nbsp;-- Данный блок актуален только для индикаторов, которые используют несколько графиков одновременно,
&nbsp;&nbsp;&nbsp;-- например, арбитражные.
&nbsp;&nbsp;&nbsp;-- В некоторых ситуациях (получение новых данных сессии терминалом, переключение таймфреймов диаграммы)
&nbsp;&nbsp;&nbsp;-- индикатор не отображает или отображает неверно данные. Связано это с тем, что,
&nbsp;&nbsp;&nbsp;-- во многих случаях, сначала рассчитываются данные индикатора, а затем терминал получает данные графиков.
&nbsp;&nbsp;&nbsp;-- Соответственно, индикатор отображается без данных или с некорректными данными.
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;-- Для решения проблемы было решено создать определённый алгоритм.
&nbsp;&nbsp;&nbsp;-- 1. При запуске индикатора определяем, что он загружен и обрабатывается последний бар с учётом факта, что индикатор загружается 2 раза (вероятно ошибка в QUIK).
&nbsp;&nbsp;&nbsp;-- 2. Происходит сравнение значения предпоследнего бара на индикаторе и данных полученных в результате перерасчёта.
&nbsp;&nbsp;&nbsp;-- 3. Если данные не совпадают, проверяем не является ли этот график относительным (дв.клик лев.кн.мыши на названии графика/индикатора-
&nbsp;&nbsp;&nbsp;-- Дополнительно-галочка Абсолютное значение-в поле ниже число от которого будем считать изменение в процентах.)
&nbsp;&nbsp;&nbsp;-- Для относительных графиков решения нет, т.к. нет возможности из LUA получить переменную, является ли график относительным.
&nbsp;&nbsp;&nbsp;-- 4. Если график не относительный, происходит перерасчёт всех значений индикатора и одновременный вывод на график.
&nbsp;&nbsp;&nbsp;-- 5. Получаем правильно рассчитанный график истории при перезаказе данных (новой сессии) и переключении таймфреймов.
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;-- Для получения ситуации новой сессии нужно перейти в QUIK: 
&nbsp;&nbsp;&nbsp;-- Заказ данных - Перезаказать данные... - галочки Торговые данные текущей сессии, Локальные справочники.
&nbsp;&nbsp;&nbsp;-- Если после перезаказа данных история индикатора отображается, 
&nbsp;&nbsp;&nbsp;-- нужно заменить инструмент индикатора на другой из диаграммы.

&nbsp;&nbsp;&nbsp;-- Если применяется относительный график (дв.клик лев.кн.мыши на названии графика/индикатора-
&nbsp;&nbsp;&nbsp;-- Дополнительно-галочка Абсолютное значение-в поле ниже число от которого будем считать
&nbsp;&nbsp;&nbsp;-- изменение в процентах.), то в параметр "Name" нужно добавить символ "%", например, "Арбитраж PRO%".
&nbsp;&nbsp;&nbsp;-- При этом блок перерасчёта данных будет отключён и данные могут быть некорректны при перезаказе
&nbsp;&nbsp;&nbsp;-- данных (новой сессии) и переключении таймфреймов.
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;-- В функции CalculateData(i) должен находится код для расчёта индикатора.

&nbsp;&nbsp;&nbsp;-- Переменная reget позволяет перерасчёт только один раз при расчёте индикатора от первого бара.
&nbsp;&nbsp;&nbsp;if string.find(Settings&#91;"Name"&#93;, "%%", 0) then reget = true end -- если блок перерасчёта данных отключён
&nbsp;&nbsp;&nbsp;if reget == nil then -- если действует флаг единоразового исполнения перерасчёта данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- При запуске индикатор расчитывается 2 раза (причины не ясны, вероятно ошибка разработчиков).
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Если индекс в новом расчёте индикатора повторяется, значит индикатор загружен.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Блок ниже сработает только при новом тике инструмента, привязанного к индикатору.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if preindex == index then -- индекс повторяется, индикатор загружен
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if GetValue(Bars, 1) ~= nil then -- если есть значение последнего бара на индикаторе
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if GetValue(Bars - 1, 1) ~= CalculateData(Bars - 1) then -- если значение предпоследнего бара на индикаторе не совпадает с данными перерасчёта
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, index - 1 do -- перебор баров до предпоследнего
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetValue(i, 1, tonumber(CalculateData(i) or nil)) -- Индекс свечи начиная с 1,Номер линии индикатора начиная с 1,Число которое нужно установить либо nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- выход из цикла: перебор баров до предпоследнего
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reget = true -- флаг единоразового исполнения перерасчёта данных, true - перерасчёт выполнен
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else -- иначе значение предпоследнего бара на индикаторе совпадает с данными перерасчёта
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reget = true -- флаг единоразового исполнения перерасчёта данных, true - перерасчёт выполнен
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- выход из условия: если нет значения предпоследнего бара на индикаторе
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- выход из условия: если есть значение последнего бара на индикаторе
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end -- выход из условия: индекс повторяется
&nbsp;&nbsp;&nbsp;end -- выход из условия: если действует флаг единоразового исполнения перерасчёта данных
&nbsp;&nbsp;&nbsp;if index == 1 then reget = nil end -- обнуление флага единоразового исполнения перерасчёта данных
&nbsp;&nbsp;&nbsp;preindex = index -- запись индекса, для проверки на следующем расчёте</pre>
============= <br />
			<i>16.10.2026 17:12:58, Михаил Понамаренко.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83286/topic9648/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83286/topic9648/</guid>
			<pubDate>Fri, 16 Oct 2026 17:12:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
