Для получения обезличенных сделок в 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
А таблица обезличенных сделок создаётся отдельно для каждого инструмента, верно? Так же, как и стакан. А если мне нужно получать приход новой котировки по каждому символу из таблицы текущих торгов, какой коллбэк лучше использовать (если это вообще возможно)? OnParam()?
-- Такую строку удобно, в последствии, передавать в C# и разделять на элементы
А как вы предлагаете реализовывать передачу данные в другие модули? Пусть например в C#.
С# это не модуль, про какие модули вопрос? Внутри Lua нет смысла заниматься подобным, как впрочем и для С#, наверное, есть реализации передачи таблиц, что быстрее в разы т.к. передается ссылка на память с таблицей, а не строка.
Как вы строку из LUA будете передавать в другое приложение написанное на C#? Вы это имели ввиду
"Такую строку удобно, в последствии, передавать в C#"
https://quikluacsharp.ru/stati-uchastnikov/lua-c-bez-s-dll/ вот так.
Добрый день! Скопировал и попытался запустить этот скрипт, заменив бумагу на RIM1, но Квик никак не отреагировал. Что делаю не так?
Привет! Это лишь фрагмент кода, нужны функции main и OnStop.
Не советую выводить message(DealStr) - квик зависнет.
Привет!Спасибо за реагирование.Я запускаю такой код, скрипт запущен, ошибок нет, но и обещанной строки нет. В чем подвох?
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
Потому что создается просто строка и никуда не передается, попробуйте DealStr сохранять в файл, тогда увидите, что код примера рабочий
либо проще:
добавьте в конце OnAllTrade
message(DealStr); IsRun = false
бот выведет сообщение -два и остановится
Да, получилось.Благодарю Вас. А возможно ли в этом коде организовать непрерывный вывод всех данных этой строки в таблицу? Я создал таблицу в main, но при запуске выдалось около сотни пустых однострочных таблиц.
Возможно, только так себе затея, почитайте справку QLUA.chm , которая в корне квик лежит. Раздел "программируемая таблица".
Добрый день.А какие в функции OnAllTrade можно применять другие функции и операции?В справке об этом ничего нет.
Добрый день! Можно любые, но не стоит, т.к. терминал не будет работать пока не завершит расчет 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
Спасибо Вам огромное-теперь пазл сложился.
Рад помочь
Всем привет) продолжаю тупить за кодом и у меня возник вопрос, что бозначает точка между переменными "Settings.period" для чего она в обще ? и что обозначает двоеточие ":"
Здравствуйте 🙂
Settings = {} это таблица, массив
period - это ключ массива
следующие записи эквивалентны:
Settings.period = 10
Settings['period'] = 10
изучите вот этот раздел https://quikluacsharp.ru/category/qlua-osnovy/
двоеточие - это вызов метода класса, в который передается ссылка на экземпляр класса, но думаю Вам это пока не нужно 🙂