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

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 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): 127 комментариев

  1. Добрый вечер, скажите пожалуйста, есть предположим функция

    1
    
     OnAllTrade

    , может ли она пропустить сделку при очень волатильном моменте? Например 1-у сделку функция обработала, и резка появились много сделок, 2, 3, 4, 5, и пока она обрабатывала 2-ю, появились 3-5 сделки, так вот, она потом начнет с 5? Или квик ведет некий кеш, где хранит обработанные номера сделок, и обработает все по порядку? Или лучше самому завести некий счетчик и обрабатывать все сделки в цикле например в

    1
    
    repeat/ until

    Заранее спасибо)

      1. Например что-то типа этого :

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        
         
        count = 1
         
         function OnAllTrade(alltrade) 	
            if alltrade.period == 1 or alltrade.period == 0 then 	
        	    repeat     			
        		    trd = getItem("all_trades", count) 	
        		     if trd.sec_code == Settings.seccode then			  		
                                    if CheckBit(trade.flags, 1) then 
                                    else 						    
                                    end
                             end		
        		     count = count + 1		
                   until count == getNumberOf("all_trades")	
            end
        end
          1. Здравствуйте! В функциях обратного вызова нужно делать самый минимум, потому что они тормозят работу всего терминала, самый идеальный вариант внутри OnAllTrade добавлять сделку в какой-то массив и все, а сам массив уже обрабатывать внутри main, которая работает в отдельном потоке и терминал не тормозит.

          2. Хотя, я вообще перебираю таблицу обезличенных сделок внутри main в цикле while, т.е. перебрали всю таблицу, запомнили индекс последней обработанной сделки, в следующий раз уже с этого индекса +1 обрабатываю и опять до конца, так ничего не пропустить, только нужно еще делать проверку, бывает что сделка в таблице появилась, но у нее еще не все поля заполнены, тогда в переменной сохраняем предыдущий индекс и в следующей итерации цикла возвращаемся снова к этой сделке.

    1. local item = getItem("all_trades", getNumberOf("all_trades")-11) --item будет 10 строкой таблицы обезличенных сделок с конца
      if item then ... end -- item может быть не только nil, но и пустой таблицей

        1. Что то зашел в тупик. По образцу в статье сделал так:
          IsRun=true
          function main()
          while IsRun do
          sleep (500);
          end
          end
          --- Функция вызывается терминалом QUIK при получении обезличенной сделки
          function OnAllTrade(alltrade)
          -- Если сделка по инструменту RTS-6.15(RIM5), то
          if alltrade.sec_code == "RIM8" then
          -- создает строку информации о сделке
          DealStr = tostring(alltrade.qty)
          message("bool"..DealStr)
          end;
          end;
          А вот как использовать Ваш пример кода не особо понимаю(

                1. Что то не выходит, то выводит какие то цифры и терминал виснет и вырубает, то ничего не происходит. Не могу понять структуру в целом. И пример не могу найти, где getItem используется в том варианте как мне нужно((

                  1. Не проверял, но, вроде бы, должно работать

                    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
                    
                    SEC_CODE = 'RIM8'
                     
                    RUN = true
                     
                    main = function()
                       local last_index = -1
                       while RUN do
                          -- Получает количество строк в таблице
                          local lines_count = getNumberOf('all_trades')
                          -- Перебирает строки до последнего индекса (lines_count - 1)
                          while lines_count - 1 > last_index do
                             -- Увеличивает счетчик обрабатываемых индексов
                             last_index = last_index + 1
                             -- Получает строку таблица под индексом last_index
                             local trade = getItem('all_trades', last_index)
                             -- Если сделка по нужному инструменту и количество в сделке больше 100
                             -- если выводить сообщение по каждой сделке, то терминал будет подвисать из-за большого количества сообщений
                             if trade.sec_code == SEC_CODE and trade.qty > 100 then
                                -- Выводит сообщение
                                message(trade.sec_code..':'..trade.qty)
                             end
                          end
                          sleep(10)
                       end
                    end
                     
                    OnStop = function()
                       RUN = false
                    end
                    1. Спасибо огромное, разобрался, переделал под себя)))) И такой вопрос - а подвисания терминала из-за расчетов в коде или из-за большого количества вывода сообщений?
                      Цитата " -- если выводить сообщение по каждой сделке, то терминал будет подвисать из-за большого количества сообщений
                      if trade.sec_code == SEC_CODE and trade.qty > 100 then"

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

        1. Александр мы с вами обшались по скайпу как-то,с дмитрием я раз в 1-3 месяца общаюсь.может выберем время пообшаться в троем )))1 раз в неделю -1 час ,у всех разное восприятие рынка .

  3. Добрый день.
    Написал скрипт (по вашему примеру выше и скрипту 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