<?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>Tue, 28 Apr 2026 15:07:38 +0300</pubDate>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47860/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			хорошее решение <br />
			<i>20.08.2020 10:05:01, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47860/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47860/topic5725/</guid>
			<pubDate>Thu, 20 Aug 2020 10:05:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47857/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добавлю свои пять копеек к решению проблемы.<br />-----------------------------------------<br />Обычно такая проблема возникает, &nbsp;если есть массивы, которые определяются лишь при старте индикатора.<br />В результате, при смене тайма, они остаются не пустыми. <br />В итоге нарушается индексация и возникают отсутствующие элементы <br />-------------------------<br /><B>П</B><B>роблему решаем</B><B> так:</B><br />----------------------------<br />Создаем специальную функцию инициализации всех переменных индикатора.<br />-----------------------<br />Эту функцию вызываем в двух местах - <br />в &nbsp;Init() &nbsp;- здесь можно и не вызывать, но делаю это, так как Init как бы для этого создана. Вызывается в индикаторе один раз при запуске и не влияет на скорость исполнения.<br />и в onCalculate() при индексе равном 1<br />Например так:<br />--------------------------------<br />function OnCalculate(k)<br />if k==1 then<br />-- вызываем функцию инициализации<br />end<br /> -------------------------- <br />Если будете выполнять данное правило, то проблем при переключении тайма не будет. <br />
			<i>20.08.2020 07:22:53, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47857/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47857/topic5725/</guid>
			<pubDate>Thu, 20 Aug 2020 07:22:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47704/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Проблема устранена.<br />Аналогичная проверка потребуется и в других индикаторах, где используется подобная конструкция.<br />Для PSAR даже дважды:<br />
====code====
<pre>it={ppp=it.pp, pp=it.p, p=I, l=it.l+1}

if it.p &#60; it.pp then it.pp = it.p-1 end -- van
if it.pp &#60; it.ppp then it.ppp = it.pp-1 end -- van
</pre>
============= <br />
			<i>13.08.2020 15:43:53, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47704/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47704/topic5725/</guid>
			<pubDate>Thu, 13 Aug 2020 15:43:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47703/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			А обойти можно дополнительной проверкой: <B>if it.p &lt; it.pp then it.pp = it.p-1 end<br /></B>Спасибо за внимание)<B><br /></B>
====code====
<pre>function CMO(I, Fsettings, ds) --Chande Momentum Oscillator ("CMO")
&nbsp;&nbsp;&nbsp;local sum={}
&nbsp;&nbsp;&nbsp;local sum2={}
&nbsp;&nbsp;&nbsp;local it = {pp=0, p=0, l=0}
return function (I, Fsettings, ds)

local Fsettings=(Fsettings or {})
local P = (Fsettings.CMO_Period or 14)
local VT = (Fsettings.CMO_VType or CLOSE)
PrintDbgStr(P)
&nbsp;&nbsp;
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {pp=0, p=0, l=0}
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;if CandleExist(I,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
&nbsp;&nbsp;&nbsp;&nbsp;if it.p &#60; it.pp then it.pp = it.p-1 end&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
</pre>
============= <br />
			<i>13.08.2020 15:35:47, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47703/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47703/topic5725/</guid>
			<pubDate>Thu, 13 Aug 2020 15:35:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47699/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ну если быть дотошным, то при увеличении таймфрейма ошибка выскакивает в строке 
====code====
<pre>GetValueEX(it.pp,VT,ds)</pre>
=============
т.к. <B>it.pp</B> хранит номер предыдущего индекса, а при первом прогоне этого номер старшей свечи предыдущего графика.<br />При увеличении таймфрейма количество свечей уменьшается, отсюда идет обращение к несуществующему элементу массива.<br /><br />Отсюда вопрос:<br />Есть ли способ обнулить переменные блока ниже?
====code====
<pre>function CMO() --Chande Momentum Oscillator ("CMO")
&nbsp;&nbsp; local sum={}
&nbsp;&nbsp; local sum2={}
&nbsp;&nbsp; local it = {pp=0, p=0, l=0}
return function (I, Fsettings, ds)</pre>
============= <br />
			<i>13.08.2020 15:24:58, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47699/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47699/topic5725/</guid>
			<pubDate>Thu, 13 Aug 2020 15:24:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47612/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_n2JCXfMM" href="/user/14177/" bx-tooltip-user-id="14177">Kaavan</a> написал:<br />это для последовательного вызова? А трижды FCMO1 вызвать нельзя было?<br /><br />=============<br /><br />это для расчета индикаторов с разными параметрами.<br />например если надо сделать три (или сколько нужно) индикатора и у каждого свой период. <br />
			<i>10.08.2020 19:40:57, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47612/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47612/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 19:40:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47604/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />У Вас же абсолютно бессмысленное вложение во вложении во вложении.<br />=============<br />услышал. Действительно еще недопонимаю нюансов - поэтому и пишу. Попробую упростить.<br /><br /><br />====quote====<br />local FCMO1 = CMO()<br />local FCMO2 = CMO()<br />local FCMO3 = CMO()<br />=============<br />это для последовательного вызова? А трижды FCMO1 вызвать нельзя было? <br />
			<i>10.08.2020 15:53:06, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47604/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47604/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 15:53:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47602/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_M1oqpzXc" href="/user/14177/" bx-tooltip-user-id="14177">Kaavan</a> написал:<br />в этом смысл<br />=============<br />Не убедительно.<br />Просто если Вы не знаете как сделать по другому, это не значит что нужно делать вслепую как у нас. тем более несколько глубин вложений одно в другом<br />Вот мы например сделали вложения в индикаторах, чтобы можно было делать несколько функций расчета индикатора. <br /><br />local FCMO1 = CMO()<br />local FCMO2 = CMO()<br />local FCMO3 = CMO()<br />и т.п.<br /><br />У Вас же абсолютно бессмысленное вложение во вложении во вложении.<br />Почему теряются переменные, не понятно, возможно какая-то особенность lua, но совершенно точно сам индикатор тут не причем ибо даже на A+B подобное может повториться. <br />
			<i>10.08.2020 14:40:50, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47602/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47602/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 14:40:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47601/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /> Просто основной код индикатора использует служебную функцию, которая пользуется вашими индикаторам<br />=============<br />в этом смысл<br /><br />полный код:
====code====
<pre>Settings = {
Name = "*CMO (TEST)", 
Period = 14, 
VType = "Close", --(Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference)
line = {{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "Horizontal line (top)",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(140, 140, 140)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "Horizontal line (bottom)",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(140, 140, 140)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "CMO", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(221, 44, 44)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
Round = "off",
Multiply = 1,
Horizontal_line="50"
}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
function Init()
&nbsp;&nbsp;&nbsp;func = Test1()
&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
&nbsp;&nbsp;&nbsp;if HL then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return HL,-HL,Out
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,nil,Out
&nbsp;&nbsp;&nbsp;end
end

function Test1()
&nbsp;&nbsp;&nbsp;&nbsp;local FTest = Test2()
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FTest(I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;
end 

function Test2()
&nbsp;&nbsp;&nbsp;&nbsp;local FCMO = CMO()
&nbsp;&nbsp;&nbsp;&nbsp;local dsCMO = {Val = {}, Min = {}, Max = {}} 
&nbsp;&nbsp;&nbsp;&nbsp;return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dsCMO.Val&#91;I&#93; = FCMO(I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return dsCMO.Val&#91;I&#93;
&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;
end&nbsp;&nbsp;

function CMO() --Chande Momentum Oscillator ("CMO")
&nbsp;&nbsp;&nbsp;local sum={}
&nbsp;&nbsp;&nbsp;local sum2={}
&nbsp;&nbsp;&nbsp;local it = {pp=0, p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
local VT = (Fsettings.VType or CLOSE)
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {pp=0, p=0, l=0}
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;if CandleExist(I,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local diff = GetValueEX(it.p,VT,ds) - GetValueEX(it.pp,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if diff &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + diff
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif diff &#60; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0) - diff
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif diff == 0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local CMO1 = sum&#91;Ip&#93;-(sum&#91;Ippp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local CMO2 = sum2&#91;Ip&#93;-(sum2&#91;Ippp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (CMO1 - CMO2) / (CMO1 + CMO2) * 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
return nil
end
end


SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"

function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
&nbsp;&nbsp;&nbsp;(type(ds)=="table" and (ds&#91;I&#93;~=nil or (type(ds.Size)=="function" and (I&#62;0) and (I&#60;=ds:Size()))))
end

function Squeeze(I,P)
&nbsp;&nbsp;&nbsp;return math.fmod(I-1,P+1)
end

function ConvertValue(T,...)
local function r(V, R) 
&nbsp;&nbsp;&nbsp;if R and string.upper(R)== "ON" then R=0 end
&nbsp;&nbsp;&nbsp;if V and tonumber(R) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if V &#62;= 0 then return math.floor(V * 10^R + 0.5) / 10^R
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else return math.ceil(V * 10^R - 0.5) / 10^R end
&nbsp;&nbsp;&nbsp;else return V end
end
local arg = {...}
arg.n = select('#', ...)
&nbsp;&nbsp;&nbsp;if arg.n &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, arg.n do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg&#91;i&#93;=arg&#91;i&#93; and r(arg&#91;i&#93; * ((T and T.Multiply) or 1), (T and T.Round) or "off")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return unpack(arg)
&nbsp;&nbsp;&nbsp;else return nil end
end


function GetValueEX(I,VT,ds) 
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
&nbsp;&nbsp;&nbsp;if VT == OPEN then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Open
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (O and O(I)) or (ds and ds:O(I))
&nbsp;&nbsp;&nbsp;elseif VT == HIGH then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--High
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (H and H(I)) or (ds and ds:H(I))
&nbsp;&nbsp;&nbsp;elseif VT == LOW then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Low
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (L and L(I)) or (ds and ds:L(I))
&nbsp;&nbsp;&nbsp;elseif VT == CLOSE then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Close
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (C and C(I)) or (ds and ds:C(I))
&nbsp;&nbsp;&nbsp;elseif VT == VOLUME then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Volume
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (V and V(I)) or (ds and ds:V(I)) 
&nbsp;&nbsp;&nbsp;elseif VT == MEDIAN then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Median
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
&nbsp;&nbsp;&nbsp;elseif VT == TYPICAL then&nbsp;&nbsp;&nbsp;--Typical
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
&nbsp;&nbsp;&nbsp;elseif VT == WEIGHTED then&nbsp;&nbsp;&nbsp;--Weighted
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4) 
&nbsp;&nbsp;&nbsp;elseif VT == DIFFERENCE then&nbsp;&nbsp;&nbsp;--Difference
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Any
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (ds and ds&#91;I&#93;)
&nbsp;&nbsp;&nbsp;end
return nil
end
</pre>
============= <br />
			<i>10.08.2020 14:33:34, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47601/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47601/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 14:33:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47600/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_ZY8CUD0t" href="/user/14177/" bx-tooltip-user-id="14177">Kaavan</a>, <br />Не видим причин делать вложенные функции внутри вложенных функций внутри вложенной функции.<br />Зачем? Каков смысл?<br />Если хотите разобраться, выкладываейте полный код а не часть (или это и есть полный код? тогда проблема в этом т.к. нет нужных функций) <br />
			<i>10.08.2020 14:15:24, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47600/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47600/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 14:15:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47599/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			При этом построение индикатора выполняется корректно <br />
			<i>10.08.2020 14:02:50, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47599/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47599/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 14:02:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47598/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Получилось.<br />Двойной вызов.<br /><br />Вот такая надстройка над вашим индикатором
====code====
<pre>Settings = {
Name = "*CMO (TEST)", 
Period = 14, 
VType = "Close", --(Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference)
line = {{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "Horizontal line (top)",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(140, 140, 140)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "Horizontal line (bottom)",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(140, 140, 140)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "CMO", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(221, 44, 44)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
Round = "off",
Multiply = 1,
Horizontal_line="50"
}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
function Init()
&nbsp;&nbsp;&nbsp;func = Test1()
&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
&nbsp;&nbsp;&nbsp;if HL then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return HL,-HL,Out
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,nil,Out
&nbsp;&nbsp;&nbsp;end
end

function Test1()
&nbsp;&nbsp;&nbsp;&nbsp;local FTest = Test2()
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FTest(I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;
end 

function Test2()
&nbsp;&nbsp;&nbsp;&nbsp;local FCMO = CMO()
&nbsp;&nbsp;&nbsp;&nbsp;local dsCMO = {Val = {}, Min = {}, Max = {}} 
&nbsp;&nbsp;&nbsp;&nbsp;return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dsCMO.Val&#91;I&#93; = FCMO(I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return dsCMO.Val&#91;I&#93;
&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;
end&nbsp;&nbsp;
</pre>
=============
<br />дает подобную ошибку <span class="bx-font" style="color:#0000ff">ТОЛЬКО ПРИ УВЕЛИЧЕНИИ ТАЙМФРЕЙМА</span>.<br />для строки &nbsp;<B>return dsCMO.Val&#91;I&#93; </B>пишет <B>CMO_TEST.lua:54: attempt to perform arithmetic on a nil value</B><br /><br />Дело не в том, что мне заняться нечем. Просто основной код индикатора использует служебную функцию, которая пользуется вашими индикаторами.<br />Отсюда такая вложенность. <br />
			<i>10.08.2020 14:02:01, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47598/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47598/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 14:02:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47597/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			К вашему индикатору претензий нет. <br />Проблема в том, что вызывая его из промежуточной функции что-то происходит такое, что ошибка появляется. Словно утечка какая-то или некорректная инициализация глобальных переменных.<br />Попробую воспроизвести ситуацию снова на чистом индикаторе. <br />
			<i>10.08.2020 13:49:05, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47597/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47597/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 13:49:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47584/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_1cwXVlw8" href="/user/14177/" bx-tooltip-user-id="14177">Kaavan</a> написал:<br />Имеется индикатор, используемый поставляемый вами CMO()<br />=============<br />Это не правда, у нас другой код в индикаторе.<br />На <noindex><a href="https://arqatech.com/upload/iblock/398/INDICATORS.zip" target="_blank" rel="nofollow">нашем</a></noindex> такая проблема не возникает. <br />
			<i>10.08.2020 06:21:48, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47584/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47584/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 06:21:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47583/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			При уменьшении таймфрейма такой ошибки не возникает <br />
			<i>10.08.2020 03:37:33, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47583/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47583/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 03:37:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка в индикаторе при увеличении таймфрейма</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47582/topic5725/">Ошибка в индикаторе при увеличении таймфрейма</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день!<br />Столкнулся с такой проблемой, которую не могу обойти никакими условиями.<br />Скорее всего каких-то нюансов не учитываю.<br /><br />Имеется индикатор, используемый поставляемый вами CMO()<br />
====code====
<pre>Settings = {
&nbsp;&nbsp;Name = "*Kaavan Signals TEST", 
&nbsp;&nbsp;CMO_Period = 14, 
&nbsp;&nbsp;line = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "CMO",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 255, 0),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_POINT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width = 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

function Init()
&nbsp;&nbsp; func = GetSignals()
&nbsp;&nbsp; return #Settings.line
end

function OnCalculate(Index) 
&nbsp;&nbsp; return func(Index, Settings)
end

function GetSignals()
&nbsp;&nbsp;local FCMO = CMO()&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Chande Momentum Oscillator ("CMO")
&nbsp;&nbsp;local dsCMO = {Val = {}, Min = {}, Max = {}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;
&nbsp;&nbsp;return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;&nbsp;if I &#60; Fsettings.CMO_Period then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil
&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dsCMO.Val&#91;I&#93; = FCMO(I, Fsettings, ds)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- считаем CMO
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end&nbsp;&nbsp;
end

------------------------------
function CMO() --Chande Momentum Oscillator ("CMO")
&nbsp;&nbsp;&nbsp;local sum={}
&nbsp;&nbsp;&nbsp;local sum2={}
&nbsp;&nbsp;&nbsp;local it = {pp=0, p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.CMO_Period or 14)
local VT = (Fsettings.CMO_VType or CLOSE)
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {pp=0, p=0, l=0}
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;if CandleExist(I,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local diff = GetValueEX(it.p,VT,ds) - GetValueEX(it.pp,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if diff &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + diff
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif diff &#60; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0) - diff
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif diff == 0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local CMO1 = sum&#91;Ip&#93;-(sum&#91;Ippp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local CMO2 = sum2&#91;Ip&#93;-(sum2&#91;Ippp&#93; or 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (CMO1 - CMO2) / (CMO1 + CMO2) * 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
return nil
end
end

</pre>
=============
Отрабатывает без ошибок, но при увеличении таймфрейма выдает следующую ошибку:<B>attempt to perform arithmetic on a nil value</B><br />на строке 55: 
====code====
<pre>local diff = GetValueEX(it.p,VT,ds) - GetValueEX(it.pp,VT,ds)
</pre>
=============
Аналогично и с другими используемыми индиктаорами.<br />В чем может быть проблема и как от неё уйти? <br />
			<i>10.08.2020 03:28:25, Kaavan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47582/topic5725/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47582/topic5725/</guid>
			<pubDate>Mon, 10 Aug 2020 03:28:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
