Вроде бы делаю всё по инструкции, но не получается. Пытаюсь рассчитать значение 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 совсем другой. Как с этим бороться? Вот пример, который я брал за образец
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
Let_it_go написал: с 1 по 14 итерацию rsi_count[lll]=nil и только с 15 раза начинает что то считать, и то не правильно. Это цены Газпрома, я отсчитал 15 свечек влево. Там RSI совсем другой. Как с этим бороться?
То что RSI не выводит данные на первых свечках, это нормально. Если Вы видели формулу RSI то должны понимать это. Если считаете, что функция считает не правильно, проверьте расчеты на бумаге. Тогда придет понимание что Вы делаете не так.
Сергей, спасибо за ответ. Помогите решить загадку. Вот блок расчёта 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. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Они словно прилетели с другой планеты. У крайней правой свечи значение RSI 54,07. Вот оно:
Подскажите пожалуйста как получить правильное значение RSI. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Добрый день,
К сожалению, понять причину пока не удается. Можете прислать архив рабочего места QUIK на почту quiksupport@arqatech.com (без ключей доступа и файла chm), перед этим необходимо воспроизвести проблему и прислать рабочее место с открытым графиком, чтобы можно было увидеть цены, а также полученные скриптом результаты.
Let_it_go написал: Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Вот именно, 1 - это должна быть первая свеча, т.е. самая левая. А у Вас всё с точностью наоборот, естественно расчеты показывают не то что Вы ожидаете.