Вроде бы делаю всё по инструкции, но не получается. Пытаюсь рассчитать значение RSI на основе данных этой таблицы. Она считается сама по своим правилам 1=122.5475;2=122.63;3=122.6325;4=122.635;5=122.535;6=122.5375;7=122.6075;8=122.6575;9=122.63;10=122.61;11=122.71;12=122.9225;13=122.885;14=122.935;15=123.105;16=123.155;17=123.115;18=123.085;19=123.2;20=123.2725;21=123.3225;22=123.2825;23=123.2375;24=123.2275;25=123.19;26=123.26;27=123.27;28=123.305;29=123.2725;30=123.32;31=123.3575;32=123.3825;33=123.4625;34=123.46;35=123.475;36=123.3725;37=123.3125;38=123.2975;39=123.2575;40=123.2475;41=123.065;42=122.9225;43=122.91;44=122.96;45=122.9325;46=122.8125;47=122.79;48=122.84;49=123.0175;50=123.05;0=123 Её название sintez_table
Пишу так, почти копируя из инструкции к INDICATORS.ZIP
Код
func = RSI()
local rsi_count={}
for lll=1,#sintez_table do
rsi_count[lll]=func(lll, {Period=15, VType="Any"}, sintez_table)
end
с 1 по 14 итерацию rsi_count[lll]=nil и только с 15 раза начинает что то считать, и то не правильно. Это цены Газпрома, я отсчитал 15 свечек влево. Там RSI совсем другой. Как с этим бороться? Вот пример, который я брал за образец
Пользователь
Сообщений: Регистрация: 29.03.2017
23.04.2017 11:14:53
Вот весь код
Код
function OnInit ()
class_code="TQBR"
interval=INTERVAL_M5 --интервал
how_many_candles=50
ticker_list="GAZP,SBER,VTBR"
ds={}
num_candles={}
line_count_table={}
container={}
is_run = true
dofile ("C:\\Program Files\\Lua\\5.1\\lua\\2.lua") --читаем индикатор RSI из INDICATORS.ZIP
end
function OnStop(s)
is_run = false
return 100
end
function mycallbackforallstocks(class,sec,index)
num_candles[sec]=ds[sec]:Size()
if index==num_candles[sec] then
for i=0, how_many_candles do
local close_price=ds[sec]:C(num_candles[sec]-i)
local open_price=ds[sec]:O(num_candles[sec]-i)
local high_price=ds[sec]:H(num_candles[sec]-i)
local low_price=ds[sec]:L(num_candles[sec]-i)
local typical_price=(close_price+open_price+high_price+low_price)/4
table.insert(container[sec],i,typical_price)
end
end
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class_code,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class_code,sec,...) end)
return ds[sec]
end
function main()
for sec in string.gmatch(ticker_list,"%a+") do
container[sec]={}
DataSource(class_code,sec,interval)
end
while is_run do
for sec in string.gmatch(ticker_list,"%a+") do
sleep (10000)
for second_sec in string.gmatch(ticker_list,"%a+") do
sintez_table={}
sintez_name=sec..second_sec..""
for x=0,how_many_candles do
if sec==second_sec then
local temp_t=container[sec]
sintez_table[x]=temp_t[x]
else
local temp_t=container[sec]
local temp_tt=container[second_sec]
sintez_table[x]=temp_t[x]/temp_tt[x]
end
end
func = RSI()
local rsi_count={}
for lll=1,#sintez_table do
rsi_count[lll]=func(lll, {Period=15, VType="Any"}, sintez_table)
end
end
end
end --is_run
end --main
Пользователь
Сообщений: Регистрация: 23.01.2015
23.04.2017 18:20:55
Цитата
Let_it_go написал: с 1 по 14 итерацию rsi_count[lll]=nil и только с 15 раза начинает что то считать, и то не правильно. Это цены Газпрома, я отсчитал 15 свечек влево. Там RSI совсем другой. Как с этим бороться?
То что RSI не выводит данные на первых свечках, это нормально. Если Вы видели формулу RSI то должны понимать это. Если считаете, что функция считает не правильно, проверьте расчеты на бумаге. Тогда придет понимание что Вы делаете не так.
Пользователь
Сообщений: Регистрация: 29.03.2017
23.04.2017 19:38:27
Сергей, спасибо за ответ. Помогите решить загадку. Вот блок расчёта RSI
Код
func = RSI()
local rsi_count={}
message (""..#sintez_table[sintez_name],1)
for yyy=1,#sintez_table[sintez_name] do
rsi_count[yyy]=func(yyy, {Period=15, VType="Any"}, sintez_table[sintez_name])
end
Вот таблица sintez_table[sintez_name], которая в неё заходит. Это цены закрытия газпрома на пятиминутках. Поле 1 - это крайняя правая свеча.
Код
{1=123;2=122.53;3=122.61;4=122.7;5=122.65;6=122.6;7=122.51;8=122.63;9=122.63;10=122.67;11=122.65;12=122.6;13=122.81;14=122.97;15=122.85;16=123.08;17=123.13; и так далее.
А вот итоговая таблица rsi_count со значениями RSI
Они словно прилетели с другой планеты. У крайней правой свечи значение RSI 54,07. Вот оно:
Подскажите пожалуйста как получить правильное значение RSI. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
24.04.2017 13:28:20
Цитата
Let_it_go написал: Сергей, спасибо за ответ. Помогите решить загадку. Вот блок расчёта RSI
Код
func = RSI()
local rsi_count = {}
message ( "" .. # sintez_table[sintez_name], 1 )
for yyy = 1 , # sintez_table[sintez_name] do
rsi_count[yyy] = func(yyy, {Period = 15 , VType = "Any" }, sintez_table[sintez_name])
end
Вот таблица sintez_table[sintez_name], которая в неё заходит. Это цены закрытия газпрома на пятиминутках. Поле 1 - это крайняя правая свеча.
Они словно прилетели с другой планеты. У крайней правой свечи значение RSI 54,07. Вот оно:
Подскажите пожалуйста как получить правильное значение RSI. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Добрый день,
К сожалению, понять причину пока не удается. Можете прислать архив рабочего места QUIK на почту (без ключей доступа и файла chm), перед этим необходимо воспроизвести проблему и прислать рабочее место с открытым графиком, чтобы можно было увидеть цены, а также полученные скриптом результаты.
Пользователь
Сообщений: Регистрация: 23.01.2015
26.04.2017 15:03:27
Цитата
Let_it_go написал: Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Вот именно, 1 - это должна быть первая свеча, т.е. самая левая. А у Вас всё с точностью наоборот, естественно расчеты показывают не то что Вы ожидаете.