Пытаюсь написать среднюю скользящую по RSI. Идентификатор на графике есть, но при запуске рисуется прямая. При этом после установки индикатора со временем постепенно идет прорисовка, но явно не средняя получается (картинка: https://dropmefiles.com/8uQPI )
Индикатор:
Код
Settings=
{
Name = "ma_rsi_period2",
period = 10,
ID_RSI = "SBER_RSI_ID",
line =
{
{ Name = "RSI MA Simple",
Color = #ff0000,
Type = TYPE_LINE,
Width = 2
}
}
}
function Init()
t = {}
start_ind = 0
tindex = 0
lastSMARSI = 0
return 1
end
function OnCalculate(index)
if index>=1 then
Graph_RSI, Number_RSI, Legend_RSI = getCandlesByIndex(Settings.ID_RSI, 0, index-1, 1)
else
return nil
end
if Graph_RSI~=0 then
local Graph_RSI = Graph_RSI[0].close
if Graph_RSI == 0 or Graph_RSI == nil then
return nil
else
if start_ind == 0 then start_ind = index end
end
if index < (Settings.period + start_ind) then
if tindex < index then
table.insert(t, Graph_RSI)
tindex = index
end
return nil
else
local sum = 0
if index > tindex then
table.insert(t, Graph_RSI)
table.remove(t, 1)
for i = 1, #t do
sum = sum + tonumber(t[i])
end
sum = sum + tonumber(Graph_RSI)
tindex = index
lastSMARSI = sum/Settings.period
return sum/Settings.period
end
return lastSMARSI
end
else
return nil
end
end
В код пришлось вводить много дополнительных условий и переменных, т.к. в процессе написания выяснилось, что иногда бывает несколько одинаковых index на свечу. Поэтому ввел lastSMARSI которая должна выводиться, если скрипт работает с той же самой свечкой.
Не я не про код! Только маленькая ремарка в отношении смысла. Про постановку вопроса? А зачем?
Вы читаете значение из RSI?, и пытаетесь его ещё дополнительно сгладить, Вы представляете какой период оцениваете?
Нет технических вопросов совсем нет, до нас все придумали ! Вашем исполнении техника мягко говоря хромает,. зачем создавать индикатор в QUIk а потом его читать, (QUIk без Вашей помощи упадет )
Алгоритмы все известны, пишите сразу RSI, усредняйте (Period RSI + Period Вашего усреднения). А зачем? Это из области "Если Все прыгнули в колодец, то и мне пора"
Высказываясь так, "Ни чего личного", хочу чтоб Вы для себя с формулировали задачу. А зачем?
Альфа эквивалентной EMA связана с длиной простой скользящей средней как
Обычно на такое не отвечаю, но просто чтобы не набежала еще толпа желающих просто посотрясать воздух и пофилосовствовать, коих на форуме стала тьма, а не посоветовать что-то в конкретном коде: я вообще RSI не использую. Это простой пример.
Любой индикатор легко считается в скрипте qlua, сделать там же среднюю по значениям индикатора не проблема, вопрос именно в пристыковке средней к индикатору на графике силами кода индикатора.
Сергей написал: Любой индикатор легко считается в скрипте qlua, сделать там же среднюю по значениям индикатора не проблема, вопрос именно в пристыковке средней к индикатору на графике силами кода индикатора.
Вы сами то понимаете что написали?
Цитата
Сергей написал: Обычно на такое не отвечаю, но просто чтобы не набежала еще толпа желающих просто посотрясать воздух и пофилосовствовать, коих на форуме стала тьма
Вам тут больше на код не кто не скажет, "Белиберда", просто потому что время дороже.
Цитата
Сергей написал: а не посоветовать что-то в конкретном коде:
Цитата
VPM написал: Алгоритмы все известны, пишите сразу RSI, усредняйте (Period RSI + Period Вашего усреднения).
Индикаторы Опубликованы на этом сайте, берите, усредняйте, при вычислении результатов учитывайте два периода усреднения (Период усреднения RSI и Ваш период). Примеров двойного усреднения полно опубликованных. Хотел в своей библиотеке найти где то был сразу не нашел. Но вот пример как я пользуюсь индикаторами через присвоение.
function Cached.RSI__() local log=math.log local exp=math.exp local abs=math.abs local Price={} local EMA={} local Noise,Peak={},{} local UOE={}
local fLaguerre=Cached.Laguerre_Ehlers() local fPeriod=Cached.Period_SineWave()
return function( I,FSettings,ds )
local I = I local ds=ds local FSettings = (FSettings or {})
Cached -- моя библиотека дальше присвоение и создание переменных (для данной ф. это глобальные).
return function( I,FSettings,ds ) - это замыкание в луа, собственно сама функция то что мы считаем. дальше присвоение и создание локальных переменных
Сергей написал: В код пришлось вводить много дополнительных условий и переменных, т.к. в процессе написания выяснилось, что иногда бывает несколько одинаковых index на свечу.
Не бывает ни когда. Индекс пришел или не пришел.
Можно отслеживать:
newbar = Индекс > Индекс1 or false; Индекс1=Индекс