<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: разные данные на индикаторе ADX]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме разные данные на индикаторе ADX форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Wed, 08 Apr 2026 15:15:58 +0300</pubDate>
		<item>
			<title>разные данные на индикаторе ADX</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36621/topic4313/">разные данные на индикаторе ADX</a></b> <i>ADX Lua некорректные данные на ВТБ</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо! <br />
			<i>27.02.2019 09:22:18, Сомов Илья.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36621/topic4313/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36621/topic4313/</guid>
			<pubDate>Wed, 27 Feb 2019 09:22:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>разные данные на индикаторе ADX</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36609/topic4313/">разные данные на индикаторе ADX</a></b> <i>ADX Lua некорректные данные на ВТБ</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте,<br />Нашли причину, в коде было лишнее округление в 60 и 63 строках. Приносим извинения.<br />Правильный код ниже, в архиве на сайте поправим позже.<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>
Settings = {
Name = "*ADX (Average Directional Movement Index)", 
Period = 14, 
Metod = "EMA", --(SMA, MMA, EMA, WMA, SMMA, VMA)
line = {{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "Horizontal line",
&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 = "ADX", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 162, 232)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "ADX +DI",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 206, 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "ADX -DI",
&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="off"
}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
function Init() 
&nbsp;&nbsp;&nbsp;func = ADX()
&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index) 
&nbsp;&nbsp;&nbsp;return tonumber(Settings.Horizontal_line),ConvertValue(Settings,func(Index, Settings))
end

function ADX() --Average Directional Movement Index ("ADX")
&nbsp;&nbsp;&nbsp;local pDI_MA=MA()
&nbsp;&nbsp;&nbsp;local mDI_MA=MA()
&nbsp;&nbsp;&nbsp;local ADX_MA=MA()
&nbsp;&nbsp;&nbsp;local f_TR=TR()
&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 EMA)
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (M==VMA) then M=SMA end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {pp=0, p=0, l=0}
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local i_TR = f_TR(I,ds)
&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;if it.l &#62; 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if GetValueEX(it.p,HIGH,ds) &#62; GetValueEX(it.pp,HIGH,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDM = math.abs(GetValueEX(it.p,HIGH,ds)-GetValueEX(it.pp,HIGH,ds))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else pDM = 0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if GetValueEX(it.p,LOW,ds) &#60; GetValueEX(it.pp,LOW,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDM = math.abs(GetValueEX(it.pp,LOW,ds)-GetValueEX(it.p,LOW,ds))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else mDM = 0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pDM &#62; mDM then mDM=0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mDM &#62; pDM then pDM=0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pDM == mDM then pDM=0 mDM = 0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if i_TR~=0 then pSDI = pDM / i_TR * 100 else pSDI = 0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if i_TR~=0 then mSDI = mDM / i_TR * 100 else mSDI = 0 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local pDI = pDI_MA(it.l-1, {Period=P, Metod=M, VType=ANY}, {&#91;it.l-1&#93; = pSDI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mDI = mDI_MA(it.l-1, {Period=P, Metod=M, VType=ANY}, {&#91;it.l-1&#93; = mSDI})
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l&#62;P and pDI and mDI then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ADX_MA(it.l-P, {Period=P, Metod=M, VType=ANY}, {&#91;it.l-P&#93;=math.abs(pDI-mDI)/(pDI+mDI)*100}),pDI,mDI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,pDI,mDI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
return nil,nil,nil
end
end

function TR() --True Range ("TR")
&nbsp;&nbsp;&nbsp;local it = {pp=0, p=0, l=0}
return function (I, ds)
&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 it={pp=it.p, p=I, l=it.l+1} end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return math.abs(GetValueEX(it.p,DIFFERENCE, ds))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return math.max(math.abs(GetValueEX(it.p,DIFFERENCE, ds)), 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;math.abs(GetValueEX(it.p,HIGH,ds) - GetValueEX(it.pp,CLOSE,ds)), 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;math.abs(GetValueEX(it.pp,CLOSE,ds)-GetValueEX(it.p,LOW,ds)))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;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>
=============
</td></tr></tbody></table> <br />
			<i>26.02.2019 17:36:36, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36609/topic4313/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36609/topic4313/</guid>
			<pubDate>Tue, 26 Feb 2019 17:36:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>разные данные на индикаторе ADX</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message36608/topic4313/">разные данные на индикаторе ADX</a></b> <i>ADX Lua некорректные данные на ВТБ</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день.<br />Подскажите причину по которой данные индикатора ADX LUA отличаются от данных встроенного ADX quik<br />adx на lua скачан с quik.ru (modified 26 ‎июля ‎2018 ‎г)<br />Проблема обнаружена на графике ВТБ. На некоторых других проблемы нет. <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=5700&" width="1920" height="1040" /><br /><i>26.02.2019 16:34:46, Сомов Илья.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message36608/topic4313/</link>
			<guid>http://forum.quik.ru/messages/forum10/message36608/topic4313/</guid>
			<pubDate>Tue, 26 Feb 2019 16:34:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
