<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Как работает OnCalculate?]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Как работает OnCalculate? форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Mon, 04 May 2026 17:36:19 +0300</pubDate>
		<item>
			<title>Как работает OnCalculate?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message7361/topic772/">Как работает OnCalculate?</a></b> <i>При использование getParamEx в OnCalculate замечены пробелы в данных... Как быть?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			&nbsp;OnCalculate вызывается на каждую обезличенную сделку,<br />а &nbsp;getParamEx читает из срезов ТТП , <br />ТТП обновляется илшь при изменении и если данные еще не устарели в пришедшем срезе<br />Т е расчет по OnCalculate и по getParamEx скорее будут не совпадать, а &nbsp;иногда совпадать. <br />
			<i>28.07.2015 19:30:05, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message7361/topic772/</link>
			<guid>http://forum.quik.ru/messages/forum10/message7361/topic772/</guid>
			<pubDate>Tue, 28 Jul 2015 19:30:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Как работает OnCalculate?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message7354/topic772/">Как работает OnCalculate?</a></b> <i>При использование getParamEx в OnCalculate замечены пробелы в данных... Как быть?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте!<br />Захотел я посмотреть подробнее из чего состоит свеча графика &quot;Количество открытых позиций&quot;. Сделал вот такой индикатор:<br />(Все эксперименты проводились на графике фьючерса на Сбербан SRU5)<br /><br />
====code====
<pre>Settings= 
{&nbsp;&nbsp;Name = "_OI_Separator",&nbsp;&nbsp;
&nbsp;&nbsp; line =&nbsp;&nbsp; 
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{Name = "Увеличение открытого интереса", Color = RGB(0, 192, 0), Type = TYPE_HISTOGRAM, Width = 3},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{Name = "Уменьшение открытого интереса", Color = RGB(192, 0, 0), Type = TYPE_HISTOGRAM, Width = 3}&nbsp;&nbsp;
&nbsp;&nbsp; } 
} 
-----------------------------------------------------------------------------
function Init()
&nbsp;&nbsp;sec_code = "SRU5"
&nbsp;&nbsp;class_code=getSecurityInfo("",sec_code).class_code

&nbsp;&nbsp;oi_plus&nbsp;&nbsp;= 0
&nbsp;&nbsp;oi_minus = 0
&nbsp;&nbsp;oi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0
&nbsp;&nbsp;idx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= -1

&nbsp;&nbsp;oi_prev = getParamEx (class_code, sec_code, "numcontracts").param_value
&nbsp;&nbsp;oi_curr = oi_prev

&nbsp;&nbsp;return 2
end
-----------------------------------------------------------------------------
function OnCalculate(index)

&nbsp;&nbsp;if index ~= idx then
&nbsp;&nbsp;&nbsp;&nbsp;oi_plus = 0
&nbsp;&nbsp;&nbsp;&nbsp;oi_minus = 0
&nbsp;&nbsp;&nbsp;&nbsp;idx = index
&nbsp;&nbsp;end

&nbsp;&nbsp;oi_prev = oi_curr
&nbsp;&nbsp;oi_curr = getParamEx (class_code, sec_code, "numcontracts").param_value

&nbsp;&nbsp;local d = oi_curr - oi_prev

&nbsp;&nbsp;if d &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;oi_plus = oi_plus + d
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;oi_minus = oi_minus + d
&nbsp;&nbsp;end

&nbsp;&nbsp;return oi_plus, oi_minus
end&nbsp;&nbsp;
-----------------------------------------------------------------------------

&nbsp;&nbsp;return oi_plus, oi_minus
end&nbsp;&nbsp;
-----------------------------------------------------------------------------
</pre>
=============
 <br />Запустил. Работает только с момента запуска, но это ладно. Когда вычел показания двух столбиков гистограммы одного бара (увеличение ОИ-уменьшение ОИ), то увидел, что эта разница не совпадает с разницей Close-Open стандартного графика &nbsp;&quot;Количество открытых позиций&quot;.<br /><br />Тогда решил сделать, ну совсем простой тест с Объемом. Получается тоже ерунда.<br />
====code====
<pre>Settings= 
{&nbsp;&nbsp;Name = "_test_vol",&nbsp;&nbsp;
&nbsp;&nbsp; line =&nbsp;&nbsp; 
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{Name = "_Volume", Color = RGB(64, 64, 64), Type = TYPE_HISTOGRAM, Width = 3}&nbsp;&nbsp;
&nbsp;&nbsp; } 
} 
----------------------------------------------------
function Init()
&nbsp;&nbsp;sec_code = "SRU5"
&nbsp;&nbsp;class_code=getSecurityInfo("",sec_code).class_code

&nbsp;&nbsp;vol = 0
&nbsp;&nbsp;idx = 0

&nbsp;&nbsp;return 1
end
----------------------------------------------------
function OnCalculate(index)
 
&nbsp;&nbsp;if idx ~= index then
&nbsp;&nbsp;&nbsp;&nbsp;vol = 0
&nbsp;&nbsp;&nbsp;&nbsp;idx = index 
&nbsp;&nbsp;end

&nbsp;&nbsp;vol = vol + getParamEx (class_code, sec_code, "qty").param_value
&nbsp;&nbsp;return vol 
end&nbsp;&nbsp;
----------------------------------------------------
</pre>
=============
Предполагаю, что OnCalculate вызывается не так часто, как хотелось бы.<br />Попробовал поиграть с OnParam, но он, видимо, для индикаторов не применим.<br /><br />В документации сказано, что OnCalcelate &quot;вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора&quot;. Ну, ладно ОИ, но на объем-то почему не всегда реагирует?<br /><br />Подскажите как получать корректные данные? <br />Спасибо! <br />
			<i>28.07.2015 13:18:04, Дмитрий.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message7354/topic772/</link>
			<guid>http://forum.quik.ru/messages/forum10/message7354/topic772/</guid>
			<pubDate>Tue, 28 Jul 2015 13:18:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
