Блог им. SerSer

RSI альтернативные возможности и нестандартное использование (LUA)

Индекс относительной силы (RSI от англ. relative strength index) — индикатор технического анализа, определяющий силутренда и вероятность его смены. Популярность RSI обусловлена простотой его интерпретации. Индикатор может рисовать фигуры технического анализа — «голова-плечи», «вершина» и другие, которые часто анализируют наравне с графиком цены

Каждый трейдер в своей жизни проходил через данный индикатор, были и сигналы, и «вроде как дивергенция», и перекупленность с перепроданностью на глазок

Но стандартно встроенная реализация RSI не позволяет сделать и малой части.

Например к RSI применить EMA (просто для визуального удобства, ну или для построения стратегий на пересечении 2-х MA):
RSI альтернативные возможности и нестандартное использование (LUA)


Или Болинджер (удобно при флете/пиле):
RSI альтернативные возможности и нестандартное использование (LUA)

или даже сам RSI ( царство дивергенций и контртренда):
RSI альтернативные возможности и нестандартное использование (LUA)


Но даже это тривиально.

Можно например использовать RSI для реализации альтернативной (от алгоритма AMA) адаптивной скользящей средней, ведь чем ближе значение индикатора к 50 — рынок во флете, а при достижении классических границ 30/70 — рынок трендовый:
RSI альтернативные возможности и нестандартное использование (LUA)


Если подумать у RSI огромный потенциал интеграции с различными индикаторами, алгоритмами и стратегиями.

----------------------------------------------------------------------------------------
ссылки на LUA исходники
xRSI_avg.lua
xRSI_BOL.lua
xRSI_RSI.lua
xEMA_RSI.lua

★31
19 комментариев
Еще можно построить свечной RSI и на нем искать паттерны. Только как это сделать в квике пока не понятно.
avatar
Karim, в Квике пока никак
avatar
ток грааль не в RSI
а в понимании того, когда он работает, а когда не работает
а на этот вопрос мало кто отвечать умеет)
Тимофей Мартынов, я же не пишу, что это грааль, я пишу о нестандартном применении технических индикаторов, то о чем в книгах не прочесть
avatar
Маркин Павел, полезные на самом деле индикаторы при правильном использовании. У меня есть код для CCI. Было бы здорово добавить возможность на него закидывать 1-2 скользящих SMA и/или EMA. Можете помочь с кодом?)
avatar
Sergey, так если есть код, добавить среднюю — пара строк всего, неужели сами не можете?
avatar
Маркин Павел, это не мой код, он стандартный квиковский, а в программировании я ноль. Только вот не понимаю, куда его можно скинуть, может кому нужен.
avatar
Sergey, очень мало кому нужен
avatar
Тимофей Мартынов, верно, грааль не в rsi, а в комбинации rsi  и стохастика. Все остальное неэффективная ерунда.
avatar
tulevik, Они все, rsi, cci, стохастики и прочие и прочие -все есть разные вариации одного и того же, суть не в том что они показывают, а в том, как нормализовать эти показания в контексте вероятностно-временного пространства.
avatar
У меня rsi-главный трендовый индикатор, а пост очень содержательный!
avatar
да использовали РСИ как детектор тренда (по принципу наоборот), но перестало это работать…
avatar
Sergey, он является стандартным и достаточно массово используемым, соответственно ценность генерируемой им информации нивелируется.
Вот если его с чемто скрестить то возможно получить что нибудь интересное.
Я посмотрю на досуге.
avatar
Маркин Павел, Вот код, на всякий:

Settings = {
Name = "*CCI (Commodity Channel Index)",
round = «off»,
Period = 9,
Metod = «EMA», --SMA, EMA, VMA, SMMA, VMA
VType = «Typical», --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
line = {{
        Name = «CCI»,
        Type = TYPE_HISTOGRAM,
        Color = RGB(255, 0, 0)
        },
        {
        Name = «line 0»,
        Type = TYPE_LINE,
        Color = RGB(0, 255, 0)
        }
        }
}
            
function Init()
    func = CCI()
    return #Settings.line
end

function OnCalculate(Index)
    return func(Index, Settings)
end

function CCI() --Commodity Channel I («CCI»)
    local CCI_MA=MA()
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 9)
local M = (Fsettings.Metod or «EMA»)
local VT = (Fsettings.VType or «Typical»)
local R = (Fsettings.round or «off»)
local b_ma = 0
local MD = 0
b_ma=CCI_MA(I, {Period=P, Metod = M, VType=VT, round=R}, ds)
if I>=P and b_ma then
        for i = I-P+1, I do
            MD = MD + math.abs(b_ma — Value(i, VT, ds))
        end
    Out = (Value(I, VT, ds)-b_ma) / (MD * 0.015 / P)
    return rounding(Out, R),0
else return nil,0 end
end
end

function MA() --Moving Average («MA»)
local t_SMA = F_SMA()
local t_EMA = F_EMA()
local t_VMA = F_VMA()
local t_SMMA = F_SMMA()
local t_WMA = F_WMA()
return function(I, Fsettings, ds)
    local Out = nil
    local Fsettings=(Fsettings or {})
    local P = (Fsettings.Period or 9)
    local M = (Fsettings.Metod or «EMA»)
    local VT = (Fsettings.VType or «Close»)
    local R = (Fsettings.round or «off»)
    if M == «SMA» then
        Out = t_SMA(I, P, VT, ds, R)
    elseif M == «EMA» then
        Out = t_EMA(I, P, VT, ds, R)
    elseif M == «VMA» then
        Out = t_VMA(I, P, VT, ds, R)
    elseif M == «SMMA» then
        Out = t_SMMA(I, P, VT, ds, R)
    elseif M == «WMA» then
        Out = t_WMA(I, P, VT, ds, R)
    else
        Out = nil
    end
    return rounding(Out, R)
end
end
------------------------------------------------------------------
--Moving Average SMA, EMA, VMA, SMMA, VMA
------------------------------------------------------------------
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n
]]
function F_SMA()
return function (I, Period, VType, ds, round)
local Out = nil
    if I >= Period then
        local sum = 0
        for i = I-Period+1, I do
            sum = sum +Value(i, VType, ds)
        end
        Out = sum/Period
    end
    return rounding(Out,round)
end
end

--[[Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)
]]
function F_EMA()
local EMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
    if I == 1 then
        EMA_TMP[I]=rounding(Value(I, VType, ds),round)
    else
        EMA_TMP[I]=rounding((EMA_TMP[I-1]*(Period-1)+2*Value(I, VType, ds)) / (Period+1),round)
        
    end
    
    if I >= Period then
        Out = EMA_TMP[I]
    end
    return rounding(Out,round)
end
end

--[[
William Moving Average (WMA)
( Previous WILLMA * ( Period — 1 ) + Data ) / Period
]]
function F_WMA()
    local WMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
   if I == 1 then
      WMA_TMP[I]=rounding(Value(I, VType, ds),round)
   else
      WMA_TMP[I]=rounding((WMA_TMP[I-1]*(Period-1)+Value(I, VType, ds)) / Period,round)
      
   end
   if I >= Period then
      Out = WMA_TMP[I]
   end
   return rounding(Out,round)
end
end

--[[Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)
]]
function F_VMA()
return function (I, Period, VType, ds, round)
local Out = nil
    if I >= Period then
        local sum = 0
        local sumV = 0
        for i = I-Period+1, I do
            sum = sum +Value(i, VType, ds)*Value(i, «Volume», ds)
            sumV = sumV +Value(i, «Volume», ds)
        end
        Out = sum/sumV
    end
    return rounding(Out,round)
end
end

--[[Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) — SMMAi-1 + Pi) / n
]]
function F_SMMA()
local SMMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
    if I >= Period then
        local sum = 0
        for i = I-Period+1, I do
            sum = sum +Value(i, VType, ds)
        end
        
        if I == Period then
            SMMA_TMP[I]=rounding((sum-Value(I, VType, ds)+Value(I, VType, ds)) / Period, round)
        else
            SMMA_TMP[I]=rounding((sum-SMMA_TMP[I-1]+Value(I, VType, ds)) / Period, round)
        end
        
        Out = SMMA_TMP[I]
    end
    return rounding(Out,round)
end
end


function rounding(num, round)
if round and string.upper(round)== «ON» then round=0 end
if num and tonumber(round) then
    local mult = 10^round
    if num >= 0 then return math.floor(num * mult + 0.5) / mult
    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»
    if VType == «O» then        --Open
        Out = (O and O(I)) or (ds and ds:O(I))
    elseif VType == «H» then     --High
        Out = (H and H(I)) or (ds and ds:H(I))
    elseif VType == «L» then    --Low
        Out = (L and L(I)) or (ds and ds:L(I))
    elseif VType == «C» then    --Close
        Out = (C and C(I)) or (ds and ds:C(I))
    elseif VType == «V» then    --Volume
        Out = (V and V(I)) or (ds and ds:V(I))
    elseif VType == «M» then    --Median
        Out = ((Value(I,«H»,ds) + Value(I,«L»,ds)) / 2)
    elseif VType == «T» then    --Typical
        Out = ((Value(I,«M»,ds) * 2 + Value(I,«C»,ds))/3)
    elseif VType == «W» then    --Weighted
        Out = ((Value(I,«T»,ds) * 3 + Value(I,«O»,ds))/4)
    elseif VType == «D» then    --Difference
        Out = (Value(I,«H»,ds) — Value(I,«L»,ds))
    elseif VType == «A» then    --Any
        if ds then Out = ds[I] else Out = nil end
    end
return Out
end
avatar
Sergey, Спасибо, у меня есть.
avatar
Подскажите, зачем при коэффициенте alfa для EMA в xEMARSI идет умножение периода _p2 на 2?

alfa =2/(_p2*2+1)

P.S.Спасибо за индикаторы!
Что то не удалось скачать индикатор xRSI_BOL.lua. Может можно обновить ссылочку?
avatar

теги блога Маркин Павел

....все тэги



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