XXM
XXM личный блог
12 марта 2016, 11:26

Канал Кёльтнера. Индикатор для QUIK.

Было уже ранее (хотя бы тут: http://smart-lab.ru/blog/239825.php)
Но сейчас без картинки.
Только код:

UPD: скачать можно на Google.Диск

--KeltnerChannel.lua, ver.1.4 © hismatullin.h@gmail.com, 28.10.2015
local math_floor = math.floor
local table_insert = table.insert
local math_abs = math.abs
local math_max = math.max

function dValue(index, v_type)
v_type = v_type or «C»
if v_type == «O» then
return O(index)
elseif v_type == «H» then
return H(index)
elseif v_type == «L» then
return L(index)
elseif v_type == «C» then
return C(index)
elseif v_type == «V» then
return V(index)
elseif v_type == «M» then
return (H(index) + L(index))/2
elseif v_type == «T» then
return (H(index) + L(index)+C(index))/3
elseif v_type == «W» then
return (H(index) + L(index)+2*C(index))/4
else
return C(index)
end
end

Settings =
{
Name = «Keltner Channel»,
PeriodEMA = 3,
PeriodATR = 10,
K = 0.6,
value_type = «C»,
line=
{
{
Name = «MA»,
Color = RGB(0, 128, 0),
Type = 1,
Width = 1
},
{
Name = «MA+»,
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 1
},
{
Name = «MA-»,
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 1
}
}
}
function Init()
message([[Keltner Channel, ver.1.4 © hismatullin.h@gmail.com, 28.10.2015]], 1)
return 3
end


function average(_start, _end)
local sum=0
local l0 = 0
for i = _start, _end do
l0 = dValue(i, Settings.value_type)
sum=sum+l0
end
return sum/Settings.Period
end

function round(value)
return math_floor(value / step + 0.5) * step
end

function TrHighest(index)
local max_table = {}
table_insert(max_table, math_abs(H(index)-L(index)))
table_insert(max_table, math_abs(H(index)-C(index-1)))
table_insert(max_table, math_abs(C(index-1)-L(index)))
return math_max(unpack(max_table))
end


tr = {}
trEma = {}
cEma = {}
local per = 0

function average(_start, _end)
local sum=0
for i = _start, _end do
sum=sum + tr[i]
end
return sum/(_end-_start+1)
end

— нужен для начального расчета ЕМА
function averageC(_start, _end)
local sum=0
local l0 = 0
for i = _start, _end do
l0 = dValue(i, Settings.value_type)
sum=sum+l0
end
return sum/(_end-_start+1)
end


function trEMA(ind, _p)
local period = _p
local index = ind
if index <= period then
trEma[index] = average(1,index)
--message(«trEma[»..index.."] "..tostring(trEma[index]),3)
--return nil --trEma[index]
return trEma[index]
end
local n = (trEma[index-1]*(period-1) + tr[index])/period
trEma[index] = n
return n
end


function averageEMA(ind, _p)
local n = 0
local p = 0
local period = _p
local index = ind
local k = 2/(period+1)
local l0 = dValue(index, Settings.value_type)
if index < period then
cEma[index] = averageC(1,index)
return cEma[index]
--nil
end
p = cEma[index-1] or l0
n = k*l0+(1-k)*p
cEma[index] = n
return n
end


function OnCalculate(index)
if index == 1 then
t=getDataSourceInfo()
tr[index]=H(index)-L(index)
step = getSecurityInfo(t.class_code, t.sec_code).min_price_step --NUMBER, Минимальный шаг цены
per = math_max(Settings.PeriodEMA, Settings.PeriodATR)
--message(t.sec_code..", интервал="..t.interval..', step= '..step,1)
else
tr[index]=TrHighest(index)
end

local _sma = averageEMA(index, Settings.PeriodEMA)
_sma = round(_sma)
local _atr = trEMA(index, Settings.PeriodATR)
if index < per then
return nil
end

local delta = round(_atr*Settings.K)
local _low = _sma-delta
local _high = _sma+delta
return _sma, _high, _low
end

8 Комментариев
  • Мимо проходил
    12 марта 2016, 15:27
    по любому спасибо +++++ а можно версию без сигналов на покупку-продажу? а то каждый раз приходится под цвет фона треугольники подгонять.
    • Мимо проходил
      12 марта 2016, 15:39
      XXM, о!!! ну теперь вообще крутяк! спасибо за усовершенствование :)) уже года полтора торгую с ипользованием канала! вариантов настройки и стратегий — множество!
  • marat_tmr
    06 января 2017, 13:43
    Приветствую,


    увидел интересный топик про каналы кельтнера, поставил все возможные плюсы.

    вопрос появился: там в основе лежит EMA,

    а есть ли версия с SMA?

    Благодарю за труд!
    • marat_tmr
      08 января 2017, 10:13
      XXM, :) да, я понимаю. Также понимаю, что SMA в расчетах в сто раз проще. Также понимаю, что нужно просто строчку расчета поменять.

      Но когда код в глаза не видел с института — это становится не такой простой задачей. )

      Можно ли каким-то примитивным образом, задав коэффициент в виде единицы или просто заменив одну переменную в расчетах превратить в SMA, чтобы весь остальной код вообще не править? Ваша подсказка будет очень кстати.

      В любом случае, спасибо за труд!

      ПС. Привет Стерлитамаку!
    • marat_tmr
      09 января 2017, 22:14
      XXM, да все нормально, боевой товарищ помог мне немного, по факту там 1 строчку поменяли и все заработало как SMA )

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн