Let_it_go,Вот рабочий набросок вашей задумки
Код |
---|
dofile(getWorkingFolder().."\\LuaIndicators\\SD.lua")
dofile(getWorkingFolder().."\\LuaIndicators\\RSI.lua")
rsi_tf=INTERVAL_M5
mov_tf=INTERVAL_M1
class = 'TQBR'
fut_list = {'SBER','GAZP'}
rsi_period = 14
mov_period = 14
secs = {}
function OnInit(script)
is_run = true
end
function OnStop()
is_run = false
return 2000
end
function main()
for _,sec in pairs(fut_list) do
DataSource(class,sec,rsi_tf)
DataSource(class,sec,mov_tf)
end
local sec1, ds_rsi, ds_mov, num_rsi, num_mov, dev
while is_run do
sleep(1000)
for _,sec in pairs(fut_list) do
sec1 = secs[sec]
ds_rsi = sec1[rsi_tf]
ds_mov = sec1[mov_tf]
num_rsi = ds_rsi:Size()
for i = ds_rsi.lastI, num_rsi do
-- lastI надо пересчитывать т.к. последняя свеча будет изменяться неоднократно
sec1.rsi_count[i] = sec1.RSI(i, {Period=rsi_period, VType="Typical"}, ds_rsi)
message(sec ..' rsi_count - '.. i ..' : '.. tostring(sec1.rsi_count[i]))
end
ds_rsi.lastI = num_rsi
num_mov = ds_mov:Size()
for i = ds_mov.lastI, num_mov do
-- lastI надо пересчитывать т.к. последняя свеча будет изменяться неоднократно
dev = sec1.SD(i, {Period=mov_period, VType="Typical"}, ds_mov)
message(sec ..' dev - '.. i ..' : '.. tostring(sec1.rsi_count[i]))
end
ds_mov.lastI = num_mov
end
end
end
--[[ -- если автомат работает в цыкле можно применить SetEmptyCallback()
function mycallbackforallstocks(ds, I) -- ds = self, I = Index
local class = ds.class
local sec = ds.sec
local interval = ds.interval
end
--]]
function DataSource(class,sec,interval)
local ds = CreateDataSource(class,sec,interval)
ds.class = class
ds.sec = sec
ds.interval = interval
ds.lastI = 1
-- ds:SetUpdateCallback(function(...) mycallbackforallstocks(self.class,self.sec,...) end)
ds:SetEmptyCallback()
if not secs[sec] then secs[sec] = {} end
secs[sec][interval] = ds
secs[sec].RSI = RSI()
secs[sec].rsi_count = {}
secs[sec].SD = SD()
return
end
|
Так как для последних свечек данные будут меняться несколько раз (причем для каждого набора отдельно), надо пожалуй проверять на действительное изменение данных или на изменение индексов свечек.
Можно из цыкла перенести обработку в функцию
mycallbackforallstocks но надо учитывать что она будет вызываться для каждого набора по мере его изменения (в том числе неоднократно для последней свечи