Виталий А
Виталий А личный блог
27 марта 2020, 18:37

Скрипт lua читающий таблицу обезличенных сделок.

Всем привет. Может кому пригодится. Скрипт читает ленту сделок и раз в минуту подсчитывает разницу между покупками и продажами. Часть кода нашел в интернете часть кода написал сам. Не знаю может уже есть что то подобное. Цель была не написать что то оригинальное, а наработать навыки программирования на 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
35 Комментариев
  • bohemian rhapsody
    27 марта 2020, 19:21
    скинь в блокноте, плиз
  • Винни Пух
    27 марта 2020, 19:22
    А теперь новое ТЗ:
    Сделать тоже самое, но для всех ликвидных и в одной таблице, причем два разных скрипта: Фондовый и Срочный.


    Просто для каждого тикера отдельно запускать смысла… мало.

    пысы, со скриптом неполадки или я летом на лыжах. У меня такие минутные дельты получились. У вас еще с общим объемом сделок не коррелирует. Инструмент юзал для фюьча RIM0, может там собака зарыта.



  • Vitaliy
    27 марта 2020, 19:32
    полезная штука. Я подобное писал, правда в виде индикатора, который по любому инструменту работает. По сути своей индикатор Дельта для квика написал, ибо не хватало прям для счастья. Для практики программирования рекомендую прописать в скрипт функцию восстановления данных по всем имеющимся обезличенным сделкам :) Без нее мне было грустно с индикатором 
  • 3Qu
    27 марта 2020, 20:11
    Не помню, есть ли у самодельных таблиц экспорт по DDE. Такие данные, по идее, нужно в Excel VBA обрабатывать, и уже выводить там в таблицы в обработанной форме.
    Делаю так, но не с Quik.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн