3Qu
3Qu личный блог
14 декабря 2019, 20:42

Коммуникации Quik Lua с внешним миром.

Мне нравится Lua. Lua хороший компактный язык на котором можно сделать индикаторы, различные вспомогательные программы, помогающие трейдеру и даже несложные торговые системы (ТС, роботы). Пожалуй единственная книга по Lua — Роберту Иерузалимски: Программирование на языке Lua. Ее можно найти в интернете.

Lua имеет также несложный C-API позволяющий связать программы Quik Lua с внешним миром через DLL и получить доступ практически ко всему, в том числе к любым математическим библиотекам обработки данных, что необходимо для сколь-нибудь сложным ТС. Однако, для этого уже необходимо знание не только Lua, но и Lua C-API, языка С/С++, а также умения писать DLL. При этом надо будет решить еще ряд проблем, которые возникнут по ходу пьесы в процессе этой деятельности. Далеко не каждый пользователь Quik и Lua может все это реализовать в обозримое время.
У Quik Lua (QLua) есть еще недостатки — все события терминала в Lua работают в потоке терминала, и получив из них данные надо как можно быстрей завершать функции обработки этих данных и освобождать поток терминала, иначе терминал просто повиснет. Единственная функция QLua работающая в собственном потоке — это main() и вся сколь-нибудь сложная обработка может находиться только в ней.
Кроме того, для Lua крайне мало библиотек, а существующие работают оч не быстро. В принципе, это и не нужно, если можно организовать связь с внешним миром через C-API. Но нам от этого легче не становится.) Короче, для написания хорошей сложной ТС нам надо выйти за пределы QLua и установить связь с внешним миром, и сделать это доступными средствами.
Сейчас наиболее продвинутым языком, включающим в себя массу библиотек обработки данных является Python. По применимости для обработки данных он, пожалуй, занимает первое место в мире, а по распространенности входит в первую пятерку. В числе библиотек — математические, статистические, машинного обучения и пр., и пр. Таких библиотек более тысячи только в Anaconda, большинство из которых устанавливается при ее инсталяции. Вы можете не использовать Anaconda и скачать Python с сайта python.org, в этом случае, вам придется добавлять нужные вам библиотеки (пакеты) самостоятельно. Этот подход сложнее, но имеет некоторые преимущества.
Эти библиотеки в основном написаны на С++ и работают очень быстро, а сам Python при этом выполняет роль языка сценариев. И хотя сам Python язык не очень быстрый, его доля в исполняемой программе невелика и существенного влияния на быстродействие он не оказывает. Во всяком случае, для большинства ТС, включая интрадей, быстродействия систем на Python вполне хватает. Python, кстати, на начальном уровне, когда уже можно работать, легко осваивается за пару недель. Литературы в интернете много и не буду что-либо рекомендовать.
Итак, мы будем связывать QLua с Python. И делать это через обмен файлами с данными.
Сам я этот способ связи сейчас не применяю и работаю через DLL. Однако, ранее много использовал для самых разных целей, в том числе для проверки и отладки различных торговых программ. Писать DLL, все-таки, достаточно муторно, а опробовать обработку данных со связью через файлы не представляет сложности, да и всякие изменения вносятся очень просто. А DLL — это уже на последнем этапе, когда все уже готово.
Итак, файловый обмен. Код приводить не буду, он элементарен, файловые операции все знают. Опишу только принципы обмена данными. Но, если будут просьбы опубликовать экземпл, то со временем сделаю.
Пусть мы получили данные из события терминала в функцию OnAllTrade(alltrade). Для обмена с DLL функция выглядит так:

-- получение обезличенных сделок в Lua
function OnAllTrade(alltrade)
if alltrade.sec_code == FUT_S or alltrade.sec_code == FUT_L then
--message("Обезлич сделка beg " .. alltrade.sec_code)
at ={alltrade.datetime, alltrade.sec_code, alltrade.trade_num, alltrade.flags, alltrade.price,
alltrade.qty, alltrade.value, alltrade.period}
CCS.AllTrade2DB(at) -- вызов функции DLL
--message("Обезлич сделка end " .. alltrade.sec_code)
end
end

В этом коде мы должны вместо функции вызова DLL написать и подставить другую функцию, преобразующую данные at к текстовому формату CSV. Получим строку букв и чисел разделенных запятыми. Данные готовы для передачи во внешний мир.
Теперь для передачи данных нам потребуется два файла:
AllTradeD — служит для передачи данных, и
AllTradeF — пустой файл, служит флагом для индикации готовности данных к считыванию.

На первом шаге мы открываем и записываем данные at в файл AllTradeD, закрываем файл, после чего создаем пустой файл AllTradeF, индицирующий приемной стороне, что данные готовы к считыванию, и закрываем его. Данные преданы.
Теперь обратимся к приемной стороне, уже Python, в нашем случае.
В программе Python организуем цикл, проверяющий наличие файла AllTradeF. Как только файл обнаружен, данные готовы к чтению. Читаем данные из файла AllTradeD и обязательно закрываем файл. Теперь удаляем файл AllTradeF, что будет означать для передающей стороны (QLua), что приемник готов к получению следующей порции данных. Далее процесс повторяется до полного одержания.
Да, передающая сторона должна открывать файл AllTradeD для записи, а не для дополнения.
Собственно, передача данных из Python в QLua делается аналогично.

Теперь о быстродействии такой системы.
Мне удалось получить скорость передачи ~1Gb/s c RAM-Disk. Разумеется с HDD такую скорость обмена не получить, но если у вас есть SSD, то скорость обмена будет вполне удовлетворительной. Даже если у вас нет SSD, то сейчас уже на многих компьютерах появились порты USB 3.0 и 3.1. Имея соответствующую флешку и осуществляя запись на нее также получаем очень приличную скорость обмена.
Использование для записи флешки USB 2.0 вместо HDD тоже дает некоторое преимущество в скорости, т.к. диск порой занят не только вашими, но и другими делами, и временами скорость обмена может существенно падать.

89 Комментариев
  • Karim
    14 декабря 2019, 21:09
    Зачем такие сложности. Проще передавать данные через память, а не через файл. Да и быстрее.
    Да и Lua-машина в квике запускается в отдельном потоке, кроме того, в отдельном потоке запускаютя каллбеки.
  • ICWiener
    14 декабря 2019, 21:12
    Да сам то квик медленный, а тут еще навесить все это

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

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