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

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

  1. Здравствуйте. Подскажите, пожалуйста, что подразумевается под "получением обезличенной сделки"? Совершение сделки мной? Или совершение сделки по инструменту вообще (т. е. приход котировки)?

      1. А таблица обезличенных сделок создаётся отдельно для каждого инструмента, верно? Так же, как и стакан. А если мне нужно получать приход новой котировки по каждому символу из таблицы текущих торгов, какой коллбэк лучше использовать (если это вообще возможно)? OnParam()?

  2. -- Такую строку удобно, в последствии, передавать в C# и разделять на элементы

    А как вы предлагаете реализовывать передачу данные в другие модули? Пусть например в C#.

    1. С# это не модуль, про какие модули вопрос? Внутри Lua нет смысла заниматься подобным, как впрочем и для С#, наверное, есть реализации передачи таблиц, что быстрее в разы т.к. передается ссылка на память с таблицей, а не строка.

      1. Как вы строку из LUA будете передавать в другое приложение написанное на C#? Вы это имели ввиду

        "Такую строку удобно, в последствии, передавать в C#"

      1. Привет!Спасибо за реагирование.Я запускаю такой код, скрипт запущен, ошибок нет, но и обещанной строки нет. В чем подвох?
        IsRun=true
        function main()
        while IsRun do
        sleep(1)
        end
        end
        function OnStop()
        IsRun = false;
        end
        function OnAllTrade(alltrade)
        if alltrade.sec_code == "BRK1" 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

        1. Потому что создается просто строка и никуда не передается, попробуйте DealStr сохранять в файл, тогда увидите, что код примера рабочий
          либо проще:
          добавьте в конце OnAllTrade
          message(DealStr); IsRun = false
          бот выведет сообщение -два и остановится

          1. Да, получилось.Благодарю Вас. А возможно ли в этом коде организовать непрерывный вывод всех данных этой строки в таблицу? Я создал таблицу в main, но при запуске выдалось около сотни пустых однострочных таблиц.

                1. Добрый день! Можно любые, но не стоит, т.к. терминал не будет работать пока не завершит расчет On-функция.
                  Сделку можно передать в main используя межпоточные функции и там уже обрабатывать как угодно "долго".

                  local events = {} --список обезличенных сделок
                  function OnAllTrade(alltrade)
                  if alltrade.sec_code == "BRK1" then
                  table.sinsert(events, alltrade) --добавить в конец списка
                  end
                  end
                  function main()
                  while not exitflag do
                  while #events > 0 do
                  local alltrade = table.sremove(events, 1) --удалить первый элемент списка
                  --обработка сделки
                  end
                  sleep(1)
                  end
                  end
                  function OnStop() exitflag = true end

  3. Всем привет) продолжаю тупить за кодом и у меня возник вопрос, что бозначает точка между переменными "Settings.period" для чего она в обще ? и что обозначает двоеточие ":"

    1. Здравствуйте 🙂
      Settings = {} это таблица, массив
      period - это ключ массива
      следующие записи эквивалентны:
      Settings.period = 10
      Settings['period'] = 10
      изучите вот этот раздел https://quikluacsharp.ru/category/qlua-osnovy/

      двоеточие - это вызов метода класса, в который передается ссылка на экземпляр класса, но думаю Вам это пока не нужно 🙂