<?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>Sat, 02 May 2026 21:29:54 +0300</pubDate>
		<item>
			<title>Индикатор фрактал</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38385/topic4569/">Индикатор фрактал</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			выкиньте этот код и напишите новый.<br />индикатор фрактал имеет &nbsp;очень простой алгоритм<br />примерно так:<br />если максимум текущей свечи меньше максимума предыдущей то ищем вершину в прошлом<br />аналогично для минимума<br />Подумайте над этим <br />
			<i>11.06.2019 17:43:25, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38385/topic4569/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38385/topic4569/</guid>
			<pubDate>Tue, 11 Jun 2019 17:43:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор фрактал</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38334/topic4569/">Индикатор фрактал</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пытаюсь переписать на Питоне индикатор Фрактал (код ниже). Но не могу понять что в этом коде происходит. Помогите пожалуйста написать на питоне индикатор фрактал для самого простого случая - список цен:<br />Например, как найти верхний фрактал (для пиков)?<br />price=&#91;186.99,190.99,191.24,197,196.75,196.8,196.8,198,201.26,203.32,208.44,207.17,207.95,210.4,212.2,212,209.7,213.61,213.14,217.9,216.29,215.5,217.85,216.59,211.01,210.43,214,219.1,213.9,204.43,208,204.19,202.08,206.89,203.41,205.25,205.86,205.8,205.4,207.8,206.54,205.5,202.92,205,203.95,205.25,205.1,206,203.66,203.55,205.9,207.7,209.8,210.61,207.7,214,218,214.1,215.07,214.42,217.7,218.23,219.05,221.8,227.5,232.3,238,243.68,238.86,239.5,237.8,233.24,234.3,232.79,232.6,235.41,235.67,236,227.8,223.18,228.8,225.17,229.1,232.52,232.8,231.49,230,227,224.22,227.88,228.69,228.19,226.94,226&#93;<br /><br />
====code====
<pre>Settings = {
Name = "*FRACTALS (Fractals)", 
Period = 5,
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 = "FRACTALS - Up", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_TRIANGLE_UP, 
&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 = "FRACTALS - Down", 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_TRIANGLE_DOWN, 
&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 = FRACTALS()
&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(Index)
local Out1,Out2 = func(Index, Settings)
&nbsp;&nbsp;&nbsp;SetValue(Out1, 2, ConvertValue(Settings,H(Out1)))
&nbsp;&nbsp;&nbsp;SetValue(Out2, 3, ConvertValue(Settings,L(Out2)))
&nbsp;&nbsp;&nbsp;return tonumber(Settings.Horizontal_line),nil,nil
end

function FRACTALS() --Fractals ("FRACTALS")
&nbsp;&nbsp;&nbsp;local H_tmp={}
&nbsp;&nbsp;&nbsp;local L_tmp={}
&nbsp;&nbsp;&nbsp;local it = {&#91;1&#93;=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 5)
if (P&#62;0) then
&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H_tmp={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_tmp={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it = {&#91;1&#93;=0, l=0}
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;if CandleExist(I,ds) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if I~=it&#91;Squeeze(it.l,P)&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.l = it.l + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&#91;Squeeze(it.l,P)&#93; = I
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Ip,Ipppp = Squeeze(it.l,P),Squeeze(it.l,P-1)+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local nP = math.floor(P/2)*2+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H_tmp&#91;Ipppp&#93; = GetValue(it&#91;Ip&#93;,HIGH,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_tmp&#91;Ipppp&#93; = GetValue(it&#91;Ip&#93;,LOW,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if it.l &#62;= nP then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local S = it&#91;Squeeze(it.l-nP+1+math.floor(nP/2),P)&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_h=math.max(unpack(H_tmp))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_l=math.min(unpack(L_tmp))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local L = GetValue(S,LOW,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local H = GetValue(S,HIGH,ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (val_h == H) and (val_h &#62;0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and (val_l == L) and (val_l &#62; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return S,S
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (val_h == H) and (val_h &#62; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return S,nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (val_l == L) and (val_l &#62; 0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil,S
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&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
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 GetValue(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 ((GetValue(I,HIGH,ds) + GetValue(I,LOW,ds)) / 2)
&nbsp;&nbsp;&nbsp;elseif VT == TYPICAL then&nbsp;&nbsp;&nbsp;--Typical
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ((GetValue(I,MEDIAN,ds) * 2 + GetValue(I,CLOSE,ds))/3)
&nbsp;&nbsp;&nbsp;elseif VT == WEIGHTED then&nbsp;&nbsp;&nbsp;--Weighted
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ((GetValue(I,TYPICAL,ds) * 3 + GetValue(I,OPEN,ds))/4) 
&nbsp;&nbsp;&nbsp;elseif VT == DIFFERENCE then&nbsp;&nbsp;&nbsp;--Difference
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (GetValue(I,HIGH,ds) - GetValue(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>08.06.2019 23:41:22, Let_it_go.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38334/topic4569/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38334/topic4569/</guid>
			<pubDate>Sat, 08 Jun 2019 23:41:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
