Блог им. 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

1.1К | ★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

Читайте на SMART-LAB:
Фото
Актуальный состав портфеля и взгляд на рынок 2026: по-прежнему 0% позитива.
Добрый вечер! С момента предыдущего поста, касающегося моего портфеля, прошел квартал.  Пришло время актуализировать его состав. Также поделюсь...
Фото
Биткоин попробует разыграть «треугольную карту»?
«Цифровое золото» прорвало верхнюю границу восходящего треугольника на уровне 94 500 и сейчас тестирует пробитую горизонталь, формируя серию...
Фото
Индикатор Fractal: торговые сигналы и робот для OsEngine. Видео
В этом видео разбираем индикатор Fractal Билла Вильямса — один из самых известных инструментов в трейдинге. Покажем, как формируются фракталы,...
Фото
Стратегия 2026 по рынку акций от Mozgovik Research: трудный год, но, возможно, последний год низких цен
Сегодня у меня первый день официального отпуска. За окном темная звездная ночь, яркая белая луна, +24С и шум волн Андаманского моря. Неудачный...

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

....все тэги



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