Выложу то что есть, чуь позже несколько дополню.
Вначале файла константы, их необходимо задать подходящие вам.
Результаты пишутся в файл. Пока подразумевается что скрипт будет работать весь день, при перезапуске начнет все расчитывать сначала. Через некоторое время дополню его так, чтобы при старте он считывал свой же выходной файл и, таким образом, получал предыдущие данные за день.
Ограничения и условия использования:
задается бумага и класс, но все тикеры должны быть разные;
стаканы для инструментов, по которым осуществляется мониторинг, должны быть открыты; если тскан не открыт - спред не мониторится и не логируется;
если стакан пуст или в нем есть только спрос или только предложение - спред по такому инструменту не логируется.
Сохраняем текст в файл spread-logger-1.lua и запускаем. Выходные данные будут записываться в файл spread-logger-1.lua.log в том же каталоге, откуда запущен скрипт.
SEC = {}
SEC["LKOH"] = "EQBR"
SEC["SBER"] = "EQBR"
SEC["MSNG"] = "EQBR"
PERIOD = 10*60
spreads = {}
function ReadLogFile()
nnn = 0
message("Readed " .. tostring(nnn) .. " record(s)")
end
function OnInit(path)
scriptPath = path
logFileName = scriptPath .. ".log"
is_run = true
message("Start " .. logFileName)
ReadLogFile()
end
function OnStop()
is_run = false
end
function OutSpreadToLog()
local file = io.open(logFileName, "a+t")
local i,sec
for sec,class in pairs(SEC) do
local qt = getQuoteLevel2(class, sec)
if ((qt.bid_count+0 > 0) and (qt.offer_count+0 > 0)) then
local bid = qt.bid[qt.bid_count+0].price
local offer = qt.offer[1].price
local p_spread = (offer - bid) / bid * 100
local key = sec .. ":" .. class
local elem = spreads[key]
if elem == nil then
spreads[key] = { Count = 1, Spread = p_spread, Avr = p_spread, Min = p_spread, Max = p_spread }
elem = spreads[key]
else
elem.Spread = p_spread
elem.Avr = (elem.Avr * elem.Count + p_spread) / (elem.Count + 1)
elem.Count = elem.Count + 1
if elem.Min > p_spread then elem.Min = p_spread end
if elem.Max < p_spread then elem.Max = p_spread end
end
file:write("[" .. tostring(elem.Count) .. "] " .. sec .. ":" .. class .. "=" .. tostring(p_spread) .. " avr=" .. tostring(elem.Avr) .. " min=" .. tostring(elem.Min) .. " max=" .. tostring(elem.Max) .. "\n")
end
end
file:write("---\n")
file:close()
end
function main()
while is_run do
OutSpreadToLog()
local n = PERIOD
while (n > 0) and is_run do
sleep(1000)
n = n - 1
end
end
end
Строки выходного файла сейчас сохраняются в таком формате:
[КОЛИЧЕСТВО] КОД_БУМАГИ:КЛАСС=СПРЕД avr=УСРЕДНЕННОЕ min=МИНИМУМ max=МАКСИМУМ
Вопросы, предложения, претензии - пишите, не стесняйтесь.