Всем привет. Может кому пригодится. Скрипт читает ленту сделок и раз в минуту подсчитывает разницу между покупками и продажами. Часть кода нашел в интернете часть кода написал сам. Не знаю может уже есть что то подобное. Цель была не написать что то оригинальное, а наработать навыки программирования на lua.
TICER = "SBER";
CLASS_CODE = "TQBR";
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY = 0;
function OnInit()
CreateTable();
end
function main()
while not stopped do
if IsWindowClosed(t_id) then
stopped = true;
end
sleep(100);
end
end
function CreateTable()
t_id = AllocTable();
AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 15);
AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 15);
AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 15);
AddColumn(t_id, 4, "Цена", true, QTABLE_DOUBLE_TYPE, 15);
tab = CreateWindow(t_id);
SetWindowCaption(t_id, TICER.." Баланс покупок/продаж");
SetTableNotificationCallback(t_id, EventCallBack);
end
function OnAllTrade(alltrade)
if alltrade.sec_code == TICER then
fl = tostring(alltrade.flags);
if H==alltrade.datetime.hour then
if M==alltrade.datetime.min then
if fl == "1025" then VSELL = VSELL+alltrade.qty; end --Продажа
if fl == "1026" then VBUY = VBUY+alltrade.qty; end
else
M=alltrade.datetime.min;
--Rows --срока Coll -- Колонка
InsertRow(t_id, -1);
local Rows, Col = GetTableSize(t_id);
local Delta = VBUY-VSELL;
--local t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
local t = tostring(H)..":"..tostring(M);
SetCell(t_id, Rows-1, 0, t);
SetCell(t_id, Rows-1, 1, tostring(VBUY));
SetCell(t_id, Rows-1, 2, tostring(VSELL));
SetCell(t_id, Rows-1, 3, tostring(Delta));
SetCell(t_id, Rows-1, 4, tostring(alltrade.price));
if Delta<0 then Red(Rows-1,3); end
if Delta>0 then Green(Rows-1,3); end
if Delta==0 then Yellow(Rows-1,3); end
if fl == "1025" then VSELL = alltrade.qty; end --Продажа
if fl == "1026" then VBUY = alltrade.qty; end
end
else
H = alltrade.datetime.hour;
M = alltrade.datetime.min;
end
end
end
function Red(row,col)
SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end
function EventCallBack(t_id, msg, par1, par2)
if msg==QTABLE_CLOSE then
OnStop();
end;
end
function OnStop(s)
if t_id ~= nil then
DestroyTable (t_id);
end;
stopped = true;
end
Сделать тоже самое, но для всех ликвидных и в одной таблице, причем два разных скрипта: Фондовый и Срочный.
Просто для каждого тикера отдельно запускать смысла… мало.
пысы, со скриптом неполадки или я летом на лыжах. У меня такие минутные дельты получились. У вас еще с общим объемом сделок не коррелирует. Инструмент юзал для фюьча RIM0, может там собака зарыта.
Фильтрую нужные инструменты на входе при заказе данных.
Что-то вроде этого:
В общем там такой себе граальчик своего рода, если правильно обработать и посмотреть на данные ) Под верным углом, так сказать :)
Делаю так, но не с Quik.
function main()
— подписка на получение данных свечи
ds_s, Err1 =CreateDataSource (EX_CODE, FUT_S, INTERVAL_M1)
if Err1 == "" or Err1 == nil then
message(«Пока ОК 1»)
while not (ds_s:Size() >0) do
sleep(10)
end
— определение функции обратного вызова
Err1 = ds_s:SetUpdateCallback (cbCandleS)
if Err1 == true then
message(«cb1 OK»)
else
message(«Err1»… tostring(Err1))
end
else
message(«Ошибка 1»… Err1)
end
Это уже не в main()
— изменение свечи S и запись в БД (получение реал-тайм данных)
function cbCandleS(i) --
local dt ={}
local evt =0
dt = GetCandle(ds_s, FUT_S, i)
--message(«Изменение свечи S»)
a, b = CCS.cvCandleS(dt)
--message( «CCS.cvCandleS(dt) »… a)
end
Я все получаю и свечи и сделки
function OnAllTrade(alltrade)
if alltrade.sec_code == FUT_S or alltrade.sec_code == FUT_L then
--message(«Обезлич сделка beg »… alltrade.sec_code)
at ={alltrade.datetime, alltrade.sec_code, alltrade.trade_num, alltrade.flags, alltrade.price,
alltrade.qty, alltrade.value, alltrade.period}
CCS.AllTrade2DB(at)
--message(«Обезлич сделка end »… alltrade.sec_code)
end
end
Если почитать Р.Иерузалимски, то Lua не самостоятельный язык, а язык расширяемый и расширяющий. Т.е., он изначально разрабатывался не для самостоятельного применения, а для взаимодействия с другими программами.
В общем, я этой концепции и придерживаюсь, Луа обеспечивает только передачу данных в ПО и взаимодействие ПО с терминалом. Вся обработка на стороне, в нормальных средах программирования с большими возможностями.