Как экономнее написать код

Страницы: 1
RSS
Как экономнее написать код
 
Добрый день.
Подскажите пожалуйста как записать этот код без создания лишней таблицы s
Цитата
function mycallbackforallstocks(class,sec,index)

   local num_candles=ds[sec]:Size()
   if index==num_candles then        
   container[sec]={}
   s=container[sec]
       for i=0, how_many_candles do
           local close_price=ds[sec]:C(num_candles-i)
           local open_price=ds[sec]:O(num_candles-i)
           local high_price=ds[sec]:H(num_candles-i)
           local low_price=ds[sec]:L(num_candles-i)
           local typical_price=(close_price+open_price+high_price+low_price)/4
           s[i]=typical_price    
       end            
   end
end

Я пытался записать в таком виде, но код не работает.
Цитата
function mycallbackforallstocks(class,sec,index)

   local num_candles=ds[sec]:Size()
   if index==num_candles then        
   container[sec]={}
       for i=0, how_many_candles do
           local close_price=ds[sec]:C(num_candles-i)
           local open_price=ds[sec]:O(num_candles-i)
           local high_price=ds[sec]:H(num_candles-i)
           local low_price=ds[sec]:L(num_candles-i)
           local typical_price=(close_price+open_price+high_price+low_price)/4
           container[sec].[i]=typical_price    
       end            
   end
end

Спасибо заранее
 
А что в итоге хотите получить?
 
Цитата
Let_it_go написал:

Цитата
function mycallbackforallstocks(class,sec,index)

   local num_candles=ds[sec]:Size()
   if index==num_candles then        
   container[sec]={}
       for i=0, how_many_candles do
           local close_price=ds[sec]:C(num_candles-i)
           local open_price=ds[sec]:O(num_candles-i)
           local high_price=ds[sec]:H(num_candles-i)
           local low_price=ds[sec]:L(num_candles-i)
           local typical_price=(close_price+open_price+high_price+low_price)/4
             container[sec].=typical_price      
       end            
   end
end
Можно как-то так:
Код
function mycallbackforallstocks(class,sec,index) 
  if container==nil then container={} end
  if container[sec]==nil then container[sec]={} end
-----------------------------
  local close=ds[sec]:C(index)
  local open=ds[sec]:O(index)
  local high=ds[sec]:H(index)
  local low=ds[sec]:L(index)
  container[sec][index]=(close+open+high+low)/4
end
 
Спасибо, Николай.
Я хочу получить таблицу-контейнер, в которой будут храниться цены за последние how_many_candles свечей (how_many_candles-пользовательская переменная, например равная 50). В контейнер будет записываться типическая цена (Typical).
Всё это нужно для создания синтетических инструментов и их анализа. Я хочу получить значение пары GAZP/SBER: сколько сберов надо отдать за 1 Газпром, получить по GAZP/SBER цены за  how_many_candles свечей и эти данные загнать в индикаторы Сергея Горохова INDICATORS.ZIP. Например посчитать RSI по паре GAZP/SBER
Вопрос о финальной стадии "запихивания" я задал в этой ветке.
https://forum.quik.ru/forum10/topic2733/
Что то не клеится при расчёте 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
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
end 
 
Вот что пишется в лог: RSI первые 15 итераций нил, и только с 15 он получает какое то значение
lll - это три "л" - переменная итератор

 
Цитата
Let_it_go написал:
Спасибо, Николай.
Я хочу получить таблицу-контейнер, в которой будут храниться цены за последние how_many_candles свечей (how_many_candles-пользовательская переменная, например равная 50). В контейнер будет записываться типическая цена (Typical).
Всё это нужно для создания синтетических инструментов и их анализа. Я хочу получить значение пары GAZP/SBER: сколько сберов надо отдать за 1 Газпром, получить по GAZP/SBER цены за  how_many_candles свечей и эти данные загнать в индикаторы Сергея Горохова INDICATORS.ZIP. Например посчитать RSI по паре GAZP/SBER
Вопрос о финальной стадии "запихивания" я задал в этой ветке.
https://forum.quik.ru/forum10/topic2733/
Что то не клеится при расчёте RSI. Вот весь код, который на данный момент сырой и глючный.
Код
 
Про контейнер
В приведенном мною варианте Вы получите
таблицу container[sec] в которй будут все ваши цены
далее вы просто берете от конца этой таблицы нужное вам число значений
т е
делаем так

Код
local t=container[sec]; --это таблица цен по данному инструменту
local len=#t -- это текущее количество цен в контейнере
local n=len-N; if n<1 then n=1; end -- это номер первого из N значений цен т е Ваши цены в t[n] до t[len]

Теперь про индикатор
Я бы не использовал функции из INDICATORS.ZIP, по той причине, что они слишком универсальны и следовательно громоздкие.
Я использую обычно один из следующих вариантов:
1) использую встроенную RSI и читаю значения с графика, когда лень или нет надобности в 2).
2) беру  формулу и пишу функцию под задачу без излишеств.
 
Код
local t=container[sec]; --это таблица цен по данному инструменту local len=#t -- это текущее количество цен в контейнере 
local n=len-N; if n<1 then n=1; end -- это номер первого из N значений цен т е Ваши цены в t[n] до t[len]  
Большая буква N - это сколько последних свечек я хочу брать для анализа? То есть аналог моей переменной how_many_candles?
сразу как вы выложили свой вариант функции
Код
function mycallbackforallstocks(class,sec,index)    
if container==nil then container={} end   
if container[sec]==nil then container[sec]={} end 
-----------------------------   
local close=ds[sec]:C(index)   
local open=ds[sec]:O(index)   
local high=ds[sec]:H(index)   
local low=ds[sec]:L(index)   
container[sec][index]=(close+open+high+low)/4 
end 
я её испробовал, но она не работает. Код вылетает с ошибкой нил на строчке
sintez_table[x]=temp_t[x]/temp_tt[x]
 
Но ошибку эту я никому не скажу
Страницы: 1
Читают тему
Наверх