<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Помогите с RSI]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Помогите с RSI форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 22:31:15 +0300</pubDate>
		<item>
			<title>Помогите с RSI</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38295/topic4564/">Помогите с RSI</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Итоговая версия, может кому пригодится.<br /><br />Relative Strength I(RSI) x Moving Average (MA):
====code====
<pre>Settings = {
Name = "*RSI xMA",
Period = 14, 
Metod = "MMA", --SMA, MMA, EMA, WMA, SMMA, VMA
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 = "RSI",
&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;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "EMA(RSI)",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 0, 255)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
MA_Period = 26,
MA_Method = "EMA",
Round = "on",
Multiply = 1,
Horizontal_line="20"
}

function Init()
&nbsp;&nbsp;&nbsp;func = RSI()
&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index)
local Out1,Out2 = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
&nbsp;&nbsp;&nbsp;if HL then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 50+HL,50-HL,Out1,Out2
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,nil,Out1,Out2
&nbsp;&nbsp;&nbsp;end
end

function RSI() --Relative Strength I("RSI")
&nbsp;&nbsp;&nbsp;local RSI_MA_U = MA()
&nbsp;&nbsp;&nbsp;local RSI_MA_D = MA()
&nbsp;&nbsp;&nbsp;local EMARSI_MA = MA()
&nbsp;&nbsp;&nbsp;local sumU = {}
&nbsp;&nbsp;&nbsp;local sumD = {}
&nbsp;&nbsp;&nbsp;local cand = {pp=nil, p=nil}
&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 M = (Fsettings.Metod or MMA)
local VT = (Fsettings.VType or CLOSE)
local P2 = (Fsettings.MA_Period or 26)
local M2 = (Fsettings.MA_Method or "EMA")
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it={pp=it.p, p=I, l=it.l+1}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cand.pp = cand.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cand.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Up = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Down = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cand.pp &#60; cand.p then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up = cand.p - cand.pp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cand.pp &#62; cand.p then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down = cand.pp - cand.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_Up = RSI_MA_U(it.l, {Period=P, Metod = M, VType=ANY}, {&#91;it.l&#93; = Up})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_Down = RSI_MA_D(it.l, {Period=P, Metod = M, VType=ANY}, {&#91;it.l&#93; = Down})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_RSI = nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_EMARSI = nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if val_Down==0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_RSI = 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_EMARSI = EMARSI_MA(it.l, {Period=P2, Metod = M2, VType=ANY}, {&#91;it.l&#93; = val_RSI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return val_RSI, val_EMARSI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_RSI = 100 - (100 / (1 + (val_Up / val_Down)))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_EMARSI = EMARSI_MA(it.l, {Period=P2, Metod = M2, VType=ANY}, {&#91;it.l&#93; = val_RSI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return val_RSI, val_EMARSI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
return nil
end
end

function MA() --Moving Average ("MA")
&nbsp;&nbsp;&nbsp;local T_MA = {&#91;SMA&#93;=F_SMA(),&#91;MMA&#93;=F_MMA(),&#91;EMA&#93;=F_EMA(),&#91;VMA&#93;=F_VMA(),&#91;SMMA&#93;=F_SMMA(),&#91;WMA&#93;=F_WMA()}
return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;local Fsettings=(Fsettings or {})
&nbsp;&nbsp;&nbsp;local P = (Fsettings.Period or 14)
&nbsp;&nbsp;&nbsp;if (P &#62; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return T_MA&#91;string.upper(Fsettings.Metod or EMA)&#93;(I, P, (Fsettings.VType or CLOSE), ds)
&nbsp;&nbsp;&nbsp;end
return nil
end
end

------------------------------------------------------------------
----Moving Average SMA, MMA, EMA, WMA, SMMA, VMA
------------------------------------------------------------------
--&#91;&#91;Simple Moving Average (SMA)
SMA = sum(Pi) / n&#93;&#93;
function F_SMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function (I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Modified Moving Average (MMA)
MMA = (MMAi-1*(n-1) + Pi) / n&#93;&#93;
function F_MMA() 
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {p=I, l=it.l+1} 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 &#60;= P + 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (it.l == P) or (it.l == P + 1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp*(P-1) + GetValueEX(it.p,VT,ds)) / P
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)&#93;&#93;
function F_EMA() 
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {p=I, l=it.l+1} 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp*(P-1) + 2*GetValueEX(it.p,VT,ds)) / (P+1)
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period&#93;&#93;
function F_WMA()
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it={p=I, l=it.l+1}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp * (P-1) + GetValueEX(it.p,VT,ds)) / P
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)&#93;&#93;
function F_VMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local sum2 = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&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 = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds) * GetValueEX(it.p,VOLUME,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0) + GetValueEX(it.p,VOLUME,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / (sum2&#91;Ip&#93; - (sum2&#91;Ippp&#93; or 0))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n&#93;&#93;
function F_SMMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local sum2 = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&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 = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = ((sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) - (sum2&#91;Ipp&#93; or 0)+ GetValueEX(it.p,VT,ds)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sum2&#91;Ip&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;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
&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>07.06.2019 08:56:09, Максим ААА.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38295/topic4564/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38295/topic4564/</guid>
			<pubDate>Fri, 07 Jun 2019 08:56:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Помогите с RSI</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38294/topic4564/">Помогите с RSI</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PnvJOpCu" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> написал:<br />исправьте функцию OnCalculate вот так:<br />=============<br />Спасибо! <br />
			<i>07.06.2019 08:53:22, Максим ААА.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38294/topic4564/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38294/topic4564/</guid>
			<pubDate>Fri, 07 Jun 2019 08:53:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Помогите с RSI</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38293/topic4564/">Помогите с RSI</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_OCp8k51f" href="/user/13083/" bx-tooltip-user-id="13083">Максим ААА</a> написал:<br />Доделал другой скрипт. Работает, но не выводит среднюю и рси вместе.<br />=============<br /><br />исправьте функцию OnCalculate вот так:<br />
====code====
<pre>
function OnCalculate(Index)
local Out1,Out2 = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
&nbsp;&nbsp; if HL then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 50+HL,50-HL,Out1,Out2
&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,nil,Out1,Out2
&nbsp;&nbsp; end
end
</pre>
============= <br />
			<i>07.06.2019 06:31:21, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38293/topic4564/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38293/topic4564/</guid>
			<pubDate>Fri, 07 Jun 2019 06:31:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Помогите с RSI</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38292/topic4564/">Помогите с RSI</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Доделал другой скрипт. Работает, но не выводит среднюю и рси вместе.<br /><br />Пытаюсь вывести в функции RSI()
====code====
<pre>return val_RSI, val_EMARSI</pre>
=============
Если выводить по одному val_RSI или val_EMARSI, то работает:<br />
====code====
<pre>return val_EMARSI</pre>
=============
<br />Не могу понять что не так, подскажите, почему?<br /><br />Весь код:
====code====
<pre>Settings = {
Name = "*RSI xMA",
Period = 14, 
Metod = "MMA", --SMA, MMA, EMA, WMA, SMMA, VMA
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 = "RSI",
&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;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "EMARSI",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 0, 255)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
MA_Period = 26,
MA_Method = "EMA",
Round = "on",
Multiply = 1,
Horizontal_line="20"
}

function Init()
&nbsp;&nbsp;&nbsp;func = RSI()
&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 50+HL,50-HL,Out
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,nil,Out
&nbsp;&nbsp;&nbsp;end
end

function RSI() --Relative Strength I("RSI")
&nbsp;&nbsp;&nbsp;local RSI_MA_U = MA()
&nbsp;&nbsp;&nbsp;local RSI_MA_D = MA()
&nbsp;&nbsp;&nbsp;local EMARSI_MA = MA()
&nbsp;&nbsp;&nbsp;local sumU = {}
&nbsp;&nbsp;&nbsp;local sumD = {}
&nbsp;&nbsp;&nbsp;local cand = {pp=nil, p=nil}
&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 M = (Fsettings.Metod or MMA)
local VT = (Fsettings.VType or CLOSE)
local P2 = (Fsettings.MA_Period or 26)
local M2 = (Fsettings.MA_Method or "EMA")
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it={pp=it.p, p=I, l=it.l+1}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cand.pp = cand.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cand.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Up = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Down = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62; 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cand.pp &#60; cand.p then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up = cand.p - cand.pp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cand.pp &#62; cand.p then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down = cand.pp - cand.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_Up = RSI_MA_U(it.l, {Period=P, Metod = M, VType=ANY}, {&#91;it.l&#93; = Up})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_Down = RSI_MA_D(it.l, {Period=P, Metod = M, VType=ANY}, {&#91;it.l&#93; = Down})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_RSI = nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_EMARSI = nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if val_Down==0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_RSI = 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_EMARSI = EMARSI_MA(it.l, {Period=P2, Metod = M2, VType=ANY}, {&#91;it.l&#93; = val_RSI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return val_RSI, val_EMARSI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_RSI = 100 - (100 / (1 + (val_Up / val_Down)))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_EMARSI = EMARSI_MA(it.l, {Period=P2, Metod = M2, VType=ANY}, {&#91;it.l&#93; = val_RSI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return val_RSI, val_EMARSI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
return nil
end
end

function MA() --Moving Average ("MA")
&nbsp;&nbsp;&nbsp;local T_MA = {&#91;SMA&#93;=F_SMA(),&#91;MMA&#93;=F_MMA(),&#91;EMA&#93;=F_EMA(),&#91;VMA&#93;=F_VMA(),&#91;SMMA&#93;=F_SMMA(),&#91;WMA&#93;=F_WMA()}
return function (I, Fsettings, ds)
&nbsp;&nbsp;&nbsp;local Fsettings=(Fsettings or {})
&nbsp;&nbsp;&nbsp;local P = (Fsettings.Period or 14)
&nbsp;&nbsp;&nbsp;if (P &#62; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return T_MA&#91;string.upper(Fsettings.Metod or EMA)&#93;(I, P, (Fsettings.VType or CLOSE), ds)
&nbsp;&nbsp;&nbsp;end
return nil
end
end

------------------------------------------------------------------
----Moving Average SMA, MMA, EMA, WMA, SMMA, VMA
------------------------------------------------------------------
--&#91;&#91;Simple Moving Average (SMA)
SMA = sum(Pi) / n&#93;&#93;
function F_SMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function (I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Modified Moving Average (MMA)
MMA = (MMAi-1*(n-1) + Pi) / n&#93;&#93;
function F_MMA() 
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {p=I, l=it.l+1} 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 &#60;= P + 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (it.l == P) or (it.l == P + 1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp*(P-1) + GetValueEX(it.p,VT,ds)) / P
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)&#93;&#93;
function F_EMA() 
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {p=I, l=it.l+1} 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp*(P-1) + 2*GetValueEX(it.p,VT,ds)) / (P+1)
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period&#93;&#93;
function F_WMA()
&nbsp;&nbsp;&nbsp;local tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = {pp=nil, p=nil}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {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 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it={p=I, l=it.l+1}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.pp = tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.p = (tmp.pp * (P-1) + GetValueEX(it.p,VT,ds)) / P
&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;return tmp.p
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)&#93;&#93;
function F_VMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local sum2 = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&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 = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds) * GetValueEX(it.p,VOLUME,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum2&#91;Ipp&#93; or 0) + GetValueEX(it.p,VOLUME,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / (sum2&#91;Ip&#93; - (sum2&#91;Ippp&#93; or 0))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
return nil
end
end

--&#91;&#91;Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n&#93;&#93;
function F_SMMA()
&nbsp;&nbsp;&nbsp;local sum = {}
&nbsp;&nbsp;&nbsp;local sum2 = {}
&nbsp;&nbsp;&nbsp;local it = {p=0, l=0}
return function(I, P, VT, ds)
&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 = {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={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;sum&#91;Ip&#93; = (sum&#91;Ipp&#93; or 0) + GetValueEX(it.p,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = (sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum2&#91;Ip&#93; = ((sum&#91;Ip&#93; - (sum&#91;Ippp&#93; or 0)) - (sum2&#91;Ipp&#93; or 0)+ GetValueEX(it.p,VT,ds)) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sum2&#91;Ip&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;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
&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>06.06.2019 16:18:36, Максим ААА.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38292/topic4564/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38292/topic4564/</guid>
			<pubDate>Thu, 06 Jun 2019 16:18:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Помогите с RSI</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38289/topic4564/">Помогите с RSI</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день!<br /><br />Если кто-то уже делал подобное, помогите, пожалуйста, модифицировать код индикатора RSI, чтобы поверх самого индикатора считалась еще EMA самого RSI.<br /><br />RSI:
====code====
<pre>Settings = {
Name = "*RSI (Relative Strength Index)", 
round = "on",
Period = 14, 
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
line = {{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "RSI",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(255, 0, 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}

function Init() 
&nbsp;&nbsp;&nbsp;&nbsp;func = RSI()
&nbsp;&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index) 
&nbsp;&nbsp;&nbsp;&nbsp;return func(Index, Settings)
end

function RSI() --Relative Strength I("RSI")
&nbsp;&nbsp;&nbsp;&nbsp;local Up = {}
&nbsp;&nbsp;&nbsp;&nbsp;local Down = {}
&nbsp;&nbsp;&nbsp;&nbsp;local val_Up = {}
&nbsp;&nbsp;&nbsp;&nbsp;local val_Down = {}
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = 0
&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = 0
end
if I&#62;1 then
&nbsp;&nbsp;&nbsp;&nbsp;local Val = Value(I,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;local ValPrev = Value(I-1,VT,ds)
&nbsp;&nbsp;&nbsp;&nbsp;if ValPrev &#60; Val then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = Val - ValPrev
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Up&#91;I&#93; = 0
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if ValPrev &#62; Val then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = ValPrev - Val
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Down&#91;I&#93; = 0
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if (I == P) or (I == P+1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sumU = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sumD = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = I-P+1, I do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumU = sumU + Up&#91;i&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumD = sumD + Down&#91;i&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Up&#91;I&#93; = sumU/P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Down&#91;I&#93; = sumD/P
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if I &#62; P+1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Up&#91;I&#93; = (val_Up&#91;I-1&#93; * (P-1) + Up&#91;I&#93;) / P
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_Down&#91;I&#93; = (val_Down&#91;I-1&#93; * (P-1) + Down&#91;I&#93;) / P
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if I &#62;= P then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = 100 / (1 + (val_Down&#91;I&#93; / val_Up&#91;I&#93;))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return rounding(Out, R)
&nbsp;&nbsp;&nbsp;&nbsp;end
end
end
end

function rounding(num, round) 
if round and string.upper(round)== "ON" then round=0 end
if num and tonumber(round) then
&nbsp;&nbsp;&nbsp;&nbsp;local mult = 10^round
&nbsp;&nbsp;&nbsp;&nbsp;if num &#62;= 0 then return math.floor(num * mult + 0.5) / mult
&nbsp;&nbsp;&nbsp;&nbsp;else return math.ceil(num * mult - 0.5) / mult end
else return num end
end

function Value(I,VType,ds) 
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
&nbsp;&nbsp;&nbsp;&nbsp;if VType == "O" then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Open
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (O and O(I)) or (ds and ds:O(I))
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "H" then&nbsp;&nbsp;&nbsp;&nbsp; --High
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (H and H(I)) or (ds and ds:H(I))
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "L" then&nbsp;&nbsp;&nbsp;&nbsp;--Low
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (L and L(I)) or (ds and ds:L(I))
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "C" then&nbsp;&nbsp;&nbsp;&nbsp;--Close
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (C and C(I)) or (ds and ds:C(I))
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "V" then&nbsp;&nbsp;&nbsp;&nbsp;--Volume
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (V and V(I)) or (ds and ds:V(I)) 
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "M" then&nbsp;&nbsp;&nbsp;&nbsp;--Median
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "T" then&nbsp;&nbsp;&nbsp;&nbsp;--Typical
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "W" then&nbsp;&nbsp;&nbsp;&nbsp;--Weighted
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4) 
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "D" then&nbsp;&nbsp;&nbsp;&nbsp;--Difference
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Out = (Value(I,"H",ds) - Value(I,"L",ds))
&nbsp;&nbsp;&nbsp;&nbsp;elseif VType == "A" then&nbsp;&nbsp;&nbsp;&nbsp;--Any
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ds then Out = ds&#91;I&#93; else Out = nil end
&nbsp;&nbsp;&nbsp;&nbsp;end
return Out
end</pre>
=============
<br />Я пробовал использовать одну версию с другого ресурса, но она не совсем сходится с квиковской, что критично. Квиковский же код сложен.<br />Вот версия, которую я пробовал использовать, если кому-то нужно:
====code====
<pre>Settings = 
{
&nbsp;&nbsp;&nbsp;Name = "xRSI_EMA",
&nbsp;&nbsp;&nbsp;RSIperiod = 7,
&nbsp;&nbsp;&nbsp;EMAperiod = 6,
&nbsp;&nbsp;&nbsp;line=
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "RSI",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(255, 0, 0),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width = 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "EMA_RSI",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 0, 192),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width = 2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;}
}
----------------------------------------------------------
function FF()

&nbsp;&nbsp;&nbsp;local EMAR={}

&nbsp;&nbsp;&nbsp;local RSI={}
&nbsp;&nbsp;&nbsp;local RSI_H={}
&nbsp;&nbsp;&nbsp;local RSI_L={}

&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return function(ind, _p, _p2)
&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 alfa = 0

&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;EMAR={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_H={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_L={}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMAR&#91;index&#93;=C(index)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI&#91;index&#93;=50
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_H&#91;index&#93;=0.01
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_L&#91;index&#93;=0.01
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&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;if C(index) &#62; C(index-1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_H&#91;index&#93;=RSI_H&#91;index-1&#93;*(1-2/(_p+1)) + (math.abs(C(index)-C(index-1)))*2/(_p+1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_L&#91;index&#93;=RSI_L&#91;index-1&#93;*(1-2/(_p+1))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_H&#91;index&#93;=RSI_H&#91;index-1&#93;*(1-2/(_p+1))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSI_L&#91;index&#93;=RSI_L&#91;index-1&#93;*(1-2/(_p+1)) + (math.abs(C(index)-C(index-1)))*2/(_p+1)
&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;&nbsp;&nbsp;&nbsp;RSI&#91;index&#93;=RSI_H&#91;index&#93;/(RSI_H&#91;index&#93;+RSI_L&#91;index&#93;)*100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alfa =2/(_p2+1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMAR&#91;index&#93;=EMAR&#91;index-1&#93;*(1-alfa) + RSI&#91;index&#93;*alfa
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return RSI&#91;index&#93;, EMAR&#91;index&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
end
----------------------------------------------------------

function Init()
&nbsp;&nbsp;&nbsp;myFF = FF()
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return 2
end
function OnCalculate(index)
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;return myFF(index, Settings.RSIperiod, Settings.EMAperiod)
end
</pre>
============= <br />
			<i>06.06.2019 13:09:01, Максим ААА.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38289/topic4564/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38289/topic4564/</guid>
			<pubDate>Thu, 06 Jun 2019 13:09:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
