Блог им. XXM

Канал Кёльтнера. Индикатор для 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

1.1К | ★13
8 комментариев
по любому спасибо +++++ а можно версию без сигналов на покупку-продажу? а то каждый раз приходится под цвет фона треугольники подгонять.
Тут нет этих финтиклюшек — «сигналов на покупку-продажу».
В коде французские кавычки («ёлочки») должны быть переделаны в тексте выше в «английские двойные» либо в 'английские одиночные' — особенности сайта...

avatar
XXM, о!!! ну теперь вообще крутяк! спасибо за усовершенствование :)) уже года полтора торгую с ипользованием канала! вариантов настройки и стратегий — множество!
Приветствую,


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

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

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

Благодарю за труд!
avatar

С некоторыми индикаторами обычно происходит так: сделал, опубликовал, забыл. С этим также.
Примите как есть, если что нужно сделать — сами.
К тому же, на SMA переделать проще с EMA, чем наоборот.
avatar
XXM, :) да, я понимаю. Также понимаю, что SMA в расчетах в сто раз проще. Также понимаю, что нужно просто строчку расчета поменять.

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

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

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

ПС. Привет Стерлитамаку!
avatar
Не примите за «отфутболивание», но попытайте QuikLuaCSharp 
Переделать на SMA — для меня сильно-сильно влом (((
avatar
XXM, да все нормально, боевой товарищ помог мне немного, по факту там 1 строчку поменяли и все заработало как SMA )
avatar

Читайте на SMART-LAB:
Фото
Снижение военной премии в нефти: что это меняет для доллара и G10
Во второй половине понедельника – начале вторники рынки активно пересматривают премию за худший сценарий на энергетическом рынке, что цепочкой...
Фото
12 марта Группа Ренессанс страхование опубликует МСФО за 2025 год
Напоминаем, что 12 марта 2026 года RENI опубликует МСФО Группы за 2025 год, а также проведет День инвестора, чтобы рассказать о ситуации на...
Фото
Как заработать на росте цен на удобрения
Дарья Фёдорова Конфликт на Ближнем Востоке и перекрытие Ормузского пролива вызвали ралли не только цен на нефть и газ, но также алюминий и...
Фото
Гендиректор Инарктики продал свои акции компании. Что это может значить?
Вечером в пятницу (6 марта ) вышел сущфакт о том, что Соснов Илья Геннадьевич, гендиректор Инарктики, продал свои акции компании. В нашем...

теги блога XXM ☑️

....все тэги



UPDONW
Новый дизайн