Получение обезличенных сделок из QUIK в QLua(Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 4, среднее: 5,00 из 5)
Загрузка...

QUIK-Qlua-poluchenie-dannyh   Для получения обезличенных сделок в QLua(Lua) служит функция обратного вызова OnAllTrade(). Эта функция вызывается терминалом QUIK каждый раз при получении новой обезличенной сделки по инструменту, на который есть подписка. Чтобы сделать подписку на нужные инструменты, необходимо пройти: "Связь" -> "Заказ всех сделок...". В окне "Выбор инструментов для заказа всех сделок" выбрать нужные инструменты и нажать кнопку "Сохранить". Так же,  в терминале должно быть открыто окно "Таблицы" -> "Таблица всех сделок", в котором должно быть настроено отображение нужных инструментов (правой кнопкой мыши в окне -> "Редактировать таблицу").

 

Пример:

-- При вызове в функцию передается новая строка таблицы, которая имеет следующие поля:
trade_num   -- Номер сделки в торговой системе (NUMBER)
flags       -- Набор битовых флагов  (NUMBER)  
price       -- Цена  (NUMBER)  
qty         -- Количество бумаг в последней сделке в лотах  (NUMBER)  
value       -- Объем в денежных средствах  (NUMBER)  
accruedint  -- Накопленный купонный доход (NUMBER)   
yield       -- Доходность  (NUMBER)  
settlecode  -- Код расчетов  (STRING)  
reporate    -- Ставка РЕПО (%)  (NUMBER)  
repovalue   -- Сумма РЕПО  (NUMBER)  
repo2value  -- Объем выкупа РЕПО  (NUMBER)  
repoterm    -- Срок РЕПО в днях  (NUMBER)  
sec_code    -- Код бумаги заявки  (STRING)  
class_code  -- Код класса  (STRING)  
datetime    -- Дата и время  (TABLE)  
period      -- Период торговой сессии (NUMBER)   
   -- Возможные значения: 
      "0" -- Открытие 
      "1" -- Нормальный 
      "2" -- Закрытие 
 
--- Функция вызывается терминалом QUIK при получении обезличенной сделки
function OnAllTrade(alltrade)
   -- Если сделка по инструменту RTS-6.15(RIM5), то
   if alltrade.sec_code == "RIM5" then
      -- создает строку информации о сделке			
      DealStr = tostring(alltrade.trade_num)
              ..";"
	      ..tostring(alltrade.datetime.year)
	      .."-"
	      ..tostring(alltrade.datetime.month)
	      .."-"
	      ..tostring(alltrade.datetime.day)
	      .." "
	      ..tostring(alltrade.datetime.hour)
	      ..":"
	      ..tostring(alltrade.datetime.min)
	      ..":"
	      ..tostring(alltrade.datetime.sec)
	      .."."
	      ..tostring(alltrade.datetime.mcs)
	      ..";"
	      ..tostring(alltrade.price)
	      ..";"
	      ..tostring(alltrade.qty)
	      ..";"
	      ..tostring(alltrade.flags); -- "1" - ПРОДАЖА, "2" - КУПЛЯ
   end;
end;
-- В результате, при каждой новой сделке по RTS-6.15 в переменной DealStr будет строка, следующего вида:
   -- "1074452502;2015-3-24 16:19:55.710000;85940;1;2"
   -- Такую строку удобно, в последствии, передавать в C# и разделять на элементы

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Получение обезличенных сделок из QUIK в QLua(Lua): 100 комментариев

  1. tostring(alltrade.flags); -- "1" - ПРОДАЖА, "2" - КУПЛЯ - не правда ваша, Дмитрий.
    Это битовые флаги и как правило так и есть, но не всегдааааа!!! (мне попадались совершенно другие числа).
    Для работы с битовыми флагами есть специальные функции, все знают какие)))

  2. Добрый день.
    Написал скрипт (по вашему примеру выше и скрипту BuySell из соседней ветки, вывожу сделки в таблицу), запускаю и у меня выводится только одна строка.
    Подскажите, счетчик внутри OnAllTrade() может менять глобальную переменную? И почему-то в OnAllTrade() функция message() тоже не срабатывает. Не пойму в чем дело. Терминал версии 7.5.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    IsRun = true;
     
    function OnInit()
       valfiltr = 500000;
       k  = 0;
       dts = getTradeDate().day;
       message("скрипт запущен")
    end;
     
    function main()
       CreateTable(); ---стандартная
       while IsRun do
          sleep(1);
       end;
    end;
     
    function OnAllTrade(alltrade)
       if alltrade.value > valfiltr then            --tonumber(alltrade.value) > valfiltr then
          if alltrade.datetime.day == dts then
             if alltrade.class_code == "SPBFUT" then
                --message("скрипт запущен")
                SetCell(t_id, k, 0, tostring(k));
                SetCell(t_id, k, 1, tostring(alltrade.datetime.year) .. "-" .. tostring(alltrade.datetime.month) .. "-" ..tostring(alltrade.datetime.day));
                SetCell(t_id, k, 2, tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min));
                SetCell(t_id, k, 3, tostring(alltrade.price));
                SetCell(t_id, k, 4, tostring(alltrade.qty));
                SetCell(t_id, k, 5, alltrade.sec_code);   
                nu = nil 
                alltrade = nil
                k = k + 1
             end
          end
       end
    end;
     
    function OnStop()
       if t_id ~= nil then DestroyTable(t_id) end
       IsRun = false;
    end