-- QUIK Ticker Information System json = require "JSON" require "string" local zmq = require "zeromq" local quik = require "quik_api" running = true function get_data(class, code) local lot_size = tonumber(quik.getParamEx(class, code, "LOTSIZE").param_value) local tick_size = tonumber(quik.getParamEx(class, code, "SEC_PRICE_STEP").param_value) local tick_value = tonumber(quik.getParamEx(class, code, "STEPPRICET").param_value) local long_name = quik.getParamEx(class, code, "LONGNAME").param_image return { ticker = class .. "#" .. code, lot_size = lot_size, tick_size = tick_size, tick_value = tick_value, long_name = long_name } end function handle_message(msg) quik.message("Incoming message") local rq = json:decode(msg) local class, code = string.match(rq.ticker, "(%w+)#(%w+)") quik.message("Requested: " .. rq.ticker) local data = get_data(class, code) if data == nil then quik.message("Error") return "ERROR: can't get data: (" .. class .. "/" .. code .. ")", "" end quik.message("Returning data") return "OK", json:encode(data) end Ctx = nil Sock = nil function OnStop() if Sock then Sock:close() Sock = nil end if Ctx then Ctx:term() Ctx = nil end end function main() local status, err = pcall(pmain) if not status then quik.message("Error: " .. err) end OnStop() end function pmain() local err Ctx = zmq.new_ctx() Sock = Ctx:socket(zmq.REP) Sock:setsockopt_int(zmq.SOCKOPT_LINGER, 0) _, err = Sock:bind("tcp://*:5523") if err then quik.message("Bind error: " .. tostring(rc)) return end local poller = Ctx:poller() poller:add(Sock, zmq.POLLIN) while running do local events, msg events, err = poller:poll(60000) if #events > 0 then quik.message("Incoming") msg, err = Sock:recv() if not err then local outmsg_header, outmsg_data = handle_message(msg) Sock:send({outmsg_header, outmsg_data}) end end end end