<?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>Sun, 05 Apr 2026 21:13:54 +0300</pubDate>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message2047/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_YkcCXoGP" href="/user/21/" bx-tooltip-user-id="21">Michael Bulychev</a>,<br />Спасибо. Не внимательно прочитал ваш код. Не увидел, что вы создаете массив из функций. Хорошее, рабочее решение. <br />
			<i>13.03.2015 06:53:59, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message2047/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message2047/topic254/</guid>
			<pubDate>Fri, 13 Mar 2015 06:53:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1941/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Pr8kA2SJ" href="/user/748/" bx-tooltip-user-id="748">Дмитрий Минеев</a> пишет: <br />Michael Bulychev , спасибо за развернутый ответ. Но, в вашем случае призойдет то же самое, что и у меня:<br />На первой итерации, при расчете EMA(3) на 2 баре (например), мы получим корректное значение, но рассчет ЕМА(4) на том же баре затрет кешированное значение для ЕМА(3) и на следующей итерации оно посчитается не коррекно.<br />В вашем методе реализиции необходимо в функцию ЕМА() передавать переменную Line и поменять вычисление на:<br />
====code====
<pre> p = line&#91;index-Settings.startPeriod&#93; or C(index)
&nbsp;&nbsp; n = k*C(index)+(1-k)*p 
 </pre>
=============
вот так должно заработать.<br /><br />=============<br />Добрый день.<br />не затрет. Для каждого такого замыкания будет создана своя копия локальных данных cache{} и параметра period. Вот пример попроще:<br />
====code====
<pre>function counter_from(i)
&nbsp;&nbsp;&nbsp;local x=i
&nbsp;&nbsp;&nbsp;return function ()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=x+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x-1
&nbsp;&nbsp;&nbsp;end
end

c1 = counter_from(1)
c2 = counter_from(100)
for i=1, 10 do
&nbsp;&nbsp;&nbsp;print("c1 = " .. c1() .. ", c2 = " .. c2())
end
 </pre>
=============
результат:<br />
====code====
<pre>c1 = 1, c2 = 100
c1 = 2, c2 = 101
c1 = 3, c2 = 102
c1 = 4, c2 = 103
c1 = 5, c2 = 104
c1 = 6, c2 = 105
c1 = 7, c2 = 106
c1 = 8, c2 = 107
c1 = 9, c2 = 108
c1 = 10, c2 = 109
 </pre>
============= <br />
			<i>10.03.2015 14:59:46, Michael Bulychev.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1941/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1941/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 14:59:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1939/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			алгоритм - "ниасилил". Вам надо смотреть в сторону ускоренного алгоритма вычисления скользящих средних. в интернете - хоть и мало но, есть по этому поводу информация. применение же стандартного подхода, ничего кроме тормозов не даст, а уж тем более его использование в скриптах индикаторов. <br />
			<i>10.03.2015 14:37:05, sam063rus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1939/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1939/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 14:37:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1936/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_e8Lkfdzi" href="/user/21/" bx-tooltip-user-id="21">Michael Bulychev</a>, спасибо за развернутый ответ. Но, в вашем случае призойдет то же самое, что и у меня:<br />На первой итерации, при расчете EMA(3) на 2 баре (например), мы получим корректное значение, но рассчет ЕМА(4) на том же баре затрет кешированное значение для ЕМА(3) и на следующей итерации оно посчитается не коррекно.<br />В вашем методе реализиции необходимо в функцию ЕМА() передавать переменную Line и поменять вычисление на:<br />
====code====
<pre>p = line&#91;index-Settings.startPeriod&#93; or C(index)
&nbsp;&nbsp;&nbsp;n = k*C(index)+(1-k)*p 
</pre>
=============
вот так должно заработать. <br />
			<i>10.03.2015 14:20:02, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1936/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1936/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 14:20:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1933/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>Settings= {
&nbsp;&nbsp; Name = "averEMA",
&nbsp;&nbsp; startPeriod&nbsp;&nbsp; = 3,
&nbsp;&nbsp; endPeriod&nbsp;&nbsp; = 6,
&nbsp;&nbsp; line =
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "AverEMA",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= TYPE_LINE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp; }
}
&nbsp;&nbsp; 
function Init()
&nbsp;&nbsp; return 1
end

function average(_start, _end)
&nbsp;&nbsp;&nbsp;local sum=0
&nbsp;&nbsp;&nbsp;for i = _start, _end do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum=sum+C(i)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return sum/(_end-_start+1)
end

function cached_EMA(__period, __k)
&nbsp;&nbsp;&nbsp;local cache={}
&nbsp;&nbsp;&nbsp;local period = __period
&nbsp;&nbsp;&nbsp;local k = __k or 2/(period+1)
&nbsp;&nbsp;&nbsp;return function(ind)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local n = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local p = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--local period = _p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local index = ind
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index &#60; period then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = average(1,index)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = cache&#91;index-1&#93; or C(index)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = k*C(index)+(1-k)*p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = n
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n
&nbsp;&nbsp;&nbsp;end
end

function OnCalculate(index)&nbsp;&nbsp; 
&nbsp;&nbsp; local s=0
&nbsp;&nbsp; if index == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;&nbsp; = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i=Settings.startPeriod, Settings.endPeriod do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line&#91;i - Settings.startPeriod + 1&#93; = cached_EMA(i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end

&nbsp;&nbsp; s = 0
&nbsp;&nbsp; for i = 1, #line do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local res = line&#91;i&#93;(index)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if res == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = s + res
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
&nbsp;&nbsp; 
&nbsp;&nbsp; return s/#line
end

 </pre>
============= <br />
			<i>10.03.2015 13:09:14, Michael Bulychev.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1933/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1933/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 13:09:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1932/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_z5YcToYG" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> пишет: <br /><br />====quote====<br /> Дмитрий Минеев пишет: <br />Как это поможет решению моего вопроса?<br /><br />=============<br />переписать пример так, чтобы он генерировал функции, кажется сложнее, чем переписать так, чтобы была глобальная таблица, в которой хранились бы нужные данные о предыдущих значениях. Для каждого периода своя ячейка в таблице.<br /><br />=============<br />Ок. Спасибо. Попробую. <br />
			<i>10.03.2015 12:45:15, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1932/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1932/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 12:45:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1931/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4WKFMzAc" href="/user/748/" bx-tooltip-user-id="748">Дмитрий Минеев</a> пишет: <br />Как это поможет решению моего вопроса?<br /><br />=============<br />переписать пример так, чтобы он генерировал функции, кажется сложнее, чем переписать так, чтобы была глобальная таблица, в которой хранились бы нужные данные о предыдущих значениях. Для каждого периода своя ячейка в таблице. <br />
			<i>10.03.2015 11:45:43, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1931/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1931/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 11:45:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1929/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Ll2fw9Rb" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> пишет: <br /><br />====quote====<br /> Дмитрий Минеев пишет: <br />То, что вы описали - понятно. Но предложенный вами вариант не подходит. Пользователь в параметрах указывает интервал, за который будут считаться средние. Т.е. я заранее не знаю, сколько функций создавать. Есть ли другой выход? Или возможно как то создать динамический массив из функций?<br /><br />=============<br />Все зависит от Вашего воображения.<br />Перепишите пример так чтобы он запоминал последнее значение индикатора в переменной.<br /><br />=============<br />Как это поможет решению моего вопроса? <br />
			<i>10.03.2015 11:32:11, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1929/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1929/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 11:32:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1927/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6x7BygCX" href="/user/748/" bx-tooltip-user-id="748">Дмитрий Минеев</a> пишет: <br />То, что вы описали - понятно. Но предложенный вами вариант не подходит. Пользователь в параметрах указывает интервал, за который будут считаться средние. Т.е. я заранее не знаю, сколько функций создавать. Есть ли другой выход? Или возможно как то создать динамический массив из функций?<br /><br />=============<br />Все зависит от Вашего воображения.<br />Перепишите пример так чтобы он запоминал последнее значение индикатора в переменной. <br />
			<i>10.03.2015 11:07:53, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1927/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1927/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 11:07:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1926/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			То, что вы описали - понятно. Но предложенный вами вариант не подходит. Пользователь в параметрах указывает интервал, за который будут считаться средние. Т.е. я заранее не знаю, сколько функций создавать. Есть ли другой выход? Или возможно как то создать динамический массив из функций? <br />
			<i>10.03.2015 11:04:07, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1926/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1926/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 11:04:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1922/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте,<br />Особенность индикатора EMA в том что для его расчета требуется знать свое предыдущее значение.<br />В нашем примере для этого используется механизм замыканий. <br />Так как для разных периодов Вы используете одну функцию, то происходит пересечения, когда функция с одним периодом берет предыдущее значение из функции с другим периодом.<br />Для решения проблемы, используйте две разные функции EMA <br /> &nbsp; if index == 1 then<br />	EMA3 &nbsp; = _EMA()<br />	EMA4 &nbsp; = _EMA()<br />	line &nbsp; = {}<br /> &nbsp; end<br /><br />и далее по коду, для разных периодов используйте разные функции <br />
			<i>10.03.2015 07:38:26, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1922/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1922/topic254/</guid>
			<pubDate>Tue, 10 Mar 2015 07:38:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Обращение к индикатору с разными параметрами.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message1900/topic254/">Обращение к индикатору с разными параметрами.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравсвтуйте.<br />Вопрос по индикатору EMA, описанному в примере по <noindex><a href="http://quik.ru/depot/quik_lua.zip" target="_blank" rel="nofollow">ссылке</a></noindex>. Все что описано работает. Но в моей задаче, я вычисляю среднюю EMA по нескольким периодам. Пример:<br />averEMA = (EMA(index, 3) + EMA(index, 4) + EMA(index, 5)) / 3.<br />Так как это функция, при расчете EMA с периодом 4 я затираю значение рассчитаной ЕМА3, на этой же итерации. А оно будет нужно на следующем баре. Код индикатора:<br />
====code====
<pre> Settings= {
&nbsp;&nbsp;&nbsp;Name = "averEMA",
&nbsp;&nbsp;&nbsp;startPeriod&nbsp;&nbsp;&nbsp;= 3,
&nbsp;&nbsp;&nbsp;endPeriod&nbsp;&nbsp;&nbsp;= 6,
&nbsp;&nbsp;&nbsp;line =
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "AverEMA",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= RGB(90, 110, 200),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= TYPE_LINE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}
}
&nbsp;&nbsp;&nbsp;
function Init()
&nbsp;&nbsp;&nbsp;return 1
end

function OnCalculate(index)&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;local s
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if index == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMA&nbsp;&nbsp;&nbsp;= _EMA()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;&nbsp;&nbsp;= {}
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;s = 0
&nbsp;&nbsp;&nbsp;for i = Settings.startPeriod, Settings.endPeriod do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local k
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = EMA(index, i)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = s + k
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if index &#60;= Settings.endPeriod then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&#91;index&#93; = 0&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;line&#91;index&#93; = s / (Settings.startPeriod - (Settings.endPeriod - 1))
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;message("---- message 1 -----")
&nbsp;&nbsp;&nbsp;message("EMA3 = "..tostring(EMA(index, 3)))
&nbsp;&nbsp;&nbsp;--message("---- message 2 -----")
&nbsp;&nbsp;&nbsp;--message("EMA3 = "..tostring(EMA(index, 3))..", EMA4 = "..tostring(EMA(index, 4)))
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return line&#91;index&#93;

end
function _MA()
&nbsp;&nbsp;&nbsp;local cache={}
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return function(iIndex, iPeriod)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local period&nbsp;&nbsp;&nbsp;= iPeriod&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local index&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= iIndex
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local result&nbsp;&nbsp;&nbsp;= 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= ""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index &#60; period then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = index - period + 1, index do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = sum + C(i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = sum / period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = result
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
end 

function _EMA()
&nbsp;&nbsp;&nbsp;local cache={}
&nbsp;&nbsp;&nbsp;local MA = _MA()
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return function(ind, _p, kk)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local n = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local p = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local period = _p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local index = ind
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local k = kk or 2/(period + 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index &#60;= period then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cache&#91;index - 1&#93; == 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or cache&#91;index - 1&#93; == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = MA(index - 1, period)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = cache&#91;index - 1&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = C(index) * k + (1-k)*p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = n
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n
&nbsp;&nbsp;&nbsp;end
end </pre>
=============
Результаты теста можно увидеть на скринах. В коде изменяется только строка вывода сообщения. <noindex><a href="http://screencast.com/t/Im747xre9R7" target="_blank" rel="nofollow">Первый вариант</a></noindex>: Одна строка содержит только ЕМА3 и она выводится корректно. И <noindex><a href="http://screencast.com/t/yfc9Xrtur" target="_blank" rel="nofollow">второй вариант</a></noindex>, когда выводится результата вычисления ЕМА3 и ЕМА4. И в этом случае ЕМА3 корректна только на первой итерации, дальше она считается не верно. Как такого избежать? <br />
			<i>07.03.2015 01:46:53, Дмитрий Минеев.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message1900/topic254/</link>
			<guid>http://forum.quik.ru/messages/forum10/message1900/topic254/</guid>
			<pubDate>Sat, 07 Mar 2015 01:46:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
