Странности при расчёте RSI

Страницы: 1
RSS
Странности при расчёте RSI
 
Вроде бы делаю всё по инструкции, но не получается.
Пытаюсь рассчитать значение 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 

Вот что пишет по ней лог
Код
04/23/17 02:57:33,777 lll=1 --RSI нил с 1 по 14 итерацию!
04/23/17 02:57:33,778 lll=2
04/23/17 02:57:33,778 lll=3
04/23/17 02:57:33,778 lll=4
04/23/17 02:57:33,779 lll=5
04/23/17 02:57:33,779 lll=6
04/23/17 02:57:33,779 lll=7
04/23/17 02:57:33,780 lll=8
04/23/17 02:57:33,780 lll=9
04/23/17 02:57:33,781 lll=10
04/23/17 02:57:33,781 lll=11
04/23/17 02:57:33,781 lll=12
04/23/17 02:57:33,782 lll=13
04/23/17 02:57:33,782 lll=14
04/23/17 02:57:33,782 lll=15
04/23/17 02:57:33,783 80.053908355794
04/23/17 02:57:33,783 lll=16
04/23/17 02:57:33,783 81.074168797953
04/23/17 02:57:33,784 lll=17
04/23/17 02:57:33,784 77.668883444172
04/23/17 02:57:33,784 lll=18
с 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
Цитата
15=45.16129032258;16=52.247191011236;17=53.64238410596;18=55.049510293285;19=50.455017557743;20=53.707553576841;21=57.759070857593;22=58.280681837772;23=57.519667476454;24=55.202735385381;25=54.808498895974;26=55.82259907704;27=52.459205012593;28=58.488685908264;29=54.00408787307;30=57.200487140693;31=54.366893503637;32=58.172679106206;33=54.902096111672;34=58.639313255201;35=59.242444841989;36=59.869437994342;37=60.520156737138;38=51.183333005753;39=53.732604763887;40=50.503202822483;41=50.099934045228;42=47.269100836032;43=37.790871438216;44=41.271472125246;45=39.214546641535;46=42.710751669773;47=38.286796126335;48=35.649273536806;49=37.494660694456;50=44.335867229081;
Они словно прилетели с другой планеты. У крайней правой свечи значение RSI 54,07. Вот оно:


Подскажите пожалуйста как получить правильное значение RSI. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
 
Цитата
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 - это крайняя правая свеча.
Код
  { 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
Цитата
15=45.16129032258;16=52.247191011236;17=53.64238410596;18=55.049510293285;19=50.455017557743;20=53.707553576841;21=57.759070857593;22=58.280681837772;23=57.519667476454;24=55.202735385381;25=54.808498895974;26=55.82259907704;27=52.459205012593;28=58.488685908264;29=54.00408787307;30=57.200487140693;31=54.366893503637;32=58.172679106206;33=54.902096111672;34=58.639313255201;35=59.242444841989;36=59.869437994342;37=60.520156737138;38=51.183333005753;39=53.732604763887;40=50.503202822483;41=50.099934045228;42=47.269100836032;43=37.790871438216;44=41.271472125246;45=39.214546641535;46=42.710751669773;47=38.286796126335;48=35.649273536806;49=37.494660694456;50=44.335867229081;
Они словно прилетели с другой планеты. У крайней правой свечи значение RSI 54,07. Вот оно:


Подскажите пожалуйста как получить правильное значение RSI. Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?
Добрый день,

К сожалению, понять причину пока не удается.
Можете прислать архив рабочего места QUIK на почту quiksupport@arqatech.com (без ключей доступа и файла chm), перед этим необходимо воспроизвести проблему и прислать рабочее место с открытым графиком, чтобы можно было увидеть цены, а также полученные скриптом результаты.
 
Цитата
Let_it_go написал:
Быть может, мне нужно таблицу переделать с конца на начало, чтобы крайнее правое поле было последним значением таблицы?

Вот именно, 1 - это должна быть первая свеча, т.е. самая левая. А у Вас всё с точностью наоборот, естественно расчеты показывают не то что Вы ожидаете.
Страницы: 1
Читают тему
Наверх