Секреты TSLab | Торговые роботы | События
9 Апр

Торговые роботы для Quik. QPILE и QLua.

Введение. Торговые роботы для Quik. QPILE и QLua.

Основная часть торговых стратегий, в основе которых лежит технический анализ, может быть автоматизирована. Довольно часто для автоматизации торговых алгоритмов используются связки систем технического анализа (AmiBroker, WealthLab) с торговыми терминалами. Подобные связки позволяют проверить работоспособность торговой идеи на исторических данных и торговать в режиме реального времени без  изменения торговой стратегии. Основным недостатком подобных связок является сложность настройки взаимодействия системы технического анализа и торгового терминала.

 Другим способом автоматизации торговых стратегий является использование специальных программных комплексов для разработки торговых роботов, таких как TsLab, Cofite. При использовании подобных систем нет необходимости в ручной настройке взаимодействия с торговыми терминалами и другими API. Но подобные системы являются платными.  Более подробно о перечисленных выше способах, вы можете прочитать в статье «Создание торговых роботов. QPILE / WealthLab / TSLab / StockSharp».  

 В то же время, существует бесплатный способ создания торговых роботов для Quik, с помощью встроенных средств для автоматизации торговых стратегий. Именно о нем, мы поговорим в этой статье.

Торговые роботы для Quik. QUIK + Qpile.

 До версий 6.4 торговый терминал Quik предоставлял свой встроенный скриптоязык – Qpile. Данный язык обладает небольшим набором возможностей, по сравнению с языками высокого уровня, например  C# или C++, но его возможностей вполне достаточно для автоматизации простых торговых стратегий.

С помощью скриптоязыка Qpile можно создавать новые таблицы для расчета в реальном времени пользовательских значений на основе любых рыночных данных. Таким образом, Qpile позволяет выполнять вычисление параметров, отсутствующих в системе QUIK либо торговой системе биржи, создавать алгоритмы, генерирующие сигналы на изменение позиций по инструментам. Среди основных преимуществ языка Qpile можно выделить:

  1. Простота использования, что позволяет разрабатывать алгоритмы, имея небольшой опыт программирования.
  2. Удобный доступ ко всем данным торгового терминала, включая графики цен с индикаторами и стакан котировок.
  3. Интегрированность с торговой системой Quik позволяет избавиться от проблем с получением любых данных из торговой системы, которые могут наблюдаться при экспорте данных по каналам DDE или ODBC. Не требуется настройки для получения данных.
  4. Нет необходимости в установке дополнительного программного обеспечения. Для запуска торгового робота на языке Qpile необходимо минимальное количество операций по настройке.
  5. Возможность пошаговой отладки алгоритмов в торговом терминале Quik.

 Несмотря на множество преимуществ, у него так же есть определенные недостатки:

  1. Отсутствует возможность тестирования алгоритма на исторических данных. Тестировать торгового робота придется сразу в режиме реального времени, или же реализовывать стратегию на другой платформе, где есть возможность тестирования на исторических данных. 
  2. Отсутствие возможностей для создания графического интерфейса. Qpile позволяет создавать только стандартные таблицы Quik.
  3. Ограниченные возможности для управления программой и ввода данных. Т.к. нет возможности взаимодействия с графическим интерфейсом, все операции ввода-вывода необходимо производить с помощью внешних текстовых файлов, причем редактирование приходится осуществлять вручную, либо создавать дополнительные утилиты на других языках программирования.
  4. Медленное исполнение скриптов на Qpile. Основной приоритет, при распределении вычислительных ресурсов торговой системы, отдается процессу торговли, поэтому выполнение кода объемом пару тысяч строк может занять несколько секунд.
  5. Отсутствие возможности работать с тиковыми данными и невозможности реагирования на события в момент их возникновения, например, нельзя обработать новый тик, в момент его получения, такое ограничение создает дополнительные трудности при реализации HFT стратегий.
  6. Интервал обработки данных в программе не может быть меньше  1 сек. (ограничение системы Quik), что так же вносит определенные сложности для реализации скальперских торговых роботов, совершающих сотни сделок в минуту.

Торговые роботы для Quik. QUIK + QLua.

Терминалы Quik, старше версии 6.4.0 поддерживают скрипты на Lua, что предоставляет совершенно новые возможности для разработки торговых роботов и расширений для терминала. Среди основных преимуществ QLua можно выделить:

  1. Прямой доступ к торговым данным терминала. Так же как и Qpile, QLua встроен в Quik, поэтому скрипты на нем получают данные напрямую из объектов терминала, минуя импорт по DDE или ODBC, таким образом, нет необходимости в дополнительной настройке экспорта данных в сторонние приложения.
  2. Lua достаточно прост, почти как Qpile, но, несмотря на свою простоту, Lua достаточно мощный язык, что позволяет разрабатывать сложные алгоритмы и торговые роботы.
  3. Высокая скорость работы и отсутствие минимального интервала обработки данных как в Qpile. Минимальные задержки на отправку транзакций при работе через терминал Quik.
  4. Возможность создания пользовательских интерфейсов. В отличие от Qpile, в Lua можно создавать свой собственный интерфейс с помощью сторонних графических библиотек, что упрощает работу с приложением и дает дополнительные возможности для настройки и управления торговыми алгоритмами.
  5. Lua может применяться для решения широкого круга задач, имеет большое сообщество и множество сторонних библиотек, которые значительно упрощают разработку и понимание языка.

Так же как и Qpile, Lua является интерпретируемым языком программирования, т.е. исходный код на Lua выполняется с помощью специальной библиотеки-интерпретатора. В Quik есть свой интерпретатор для языка Lua – библиотека QLua. Эта библиотека предоставляет пользователю возможность взаимодействовать с торговым терминалом Quik при помощи скриптов, созданных на языке Lua.

QLua обеспечивает доступ к внутренним данным торгового терминала Quik и отправку клиентских транзакций из скрипта Lua на сервер Quik. QLua, в отличие от языка Qpile, предоставляет возможность асинхронной обработки данных в скрипте по мере их получения, а так же возможность непрерывно опрашивать клиентский терминал для получения новых данных. Для асинхронной обработки используются специальные функции обратного вызова, которые описываются в скрипте.

QLua обеспечивает обработку следующих событий от торгового терминала Quik:

  1. получение новых данных
  2. подключение к серверу Quik
  3. отключение от сервера Quik
  4. остановка выполнения скрипта
  5. закрытие торгового терминала Quik.

Все перечисленные события могут вызывать пользовательские функции в скрипте торгового робота. Дополнительной возможностью является загрузка в скрипт библиотек, написанных на других языках программирования и возможность распространять скомпилированные программы (т.е. прятать исходный код штатными средствами).

Текущая реализация QLua не предоставляет средств для экспорта данных в другие системы технического анализа и создания индикаторов. Так же следует отметить, что некорректная работа сторонних библиотек, загруженных скриптом, может приводить к ошибкам в работе терминала Quik и сказаться на стабильности работы других торговых скриптов, так же загруженных в Quik.

Управление скриптами QLua в Quik.

QLua является дополнительным компонентом торгового терминала QUIK. Возможности использования устанавливаются брокером индивидуально. Для корректной работы QLua необходимо наличие файла qlua.dll, который должен располагаться в одной папке с файлами торгового терминала Quik, например, C:\Program Files\QUIK.

Доступ к функциям QLua осуществляется из главного меню программы. После установки компонента, в меню программы появится дополнительный пункт Таблицы / LUA / Доступные скрипты. 

торговые роботы для quik. QLua

LUA / Доступные скрипты. Данное окно предназначено для добавления, удаления, перезагрузки и запуска скриптов (рис. 1).

Структура QLua скрипта

В отличие от большинства других строгих языков программирования, в Lua исполнение кода программы начинается последовательно, если этот код не является телом функции. Отдельные конструкции языка разделяются пробелом с необязательной точкой с запятой в конце:

//это наша первая программа на Lua

print("Hello from World!");

//а это функция, которая не вызовется

function Init()
print("Hello from Function!");
end

При запуске будет выведена только первая строка (Hello from World), так как функцию Init никто не вызовет, и то что написано внутри, не выполнится. Каждый скрипт может содержать ноль и более различных функций, которые могут, как использоваться в какой-либо цепочке вызовов, так и не использоваться в работе текущего скрипта.

Итеративная модель программирования

Язык QLua, как и Qpile, предоставляет возможность разработки итеративных торговых скриптов. Для этого необходимо в скрипте написать всю необходимую логику прямо в основной части файла. Код, оформленный подобным образом, будет выполнен единожды при запуске торгового скрипта. Запуск торгового скрипта выполняется в окне управления скриптами (рис. 1). Следует отметить, что запускать подобный скрипт вручную можно множество раз. Данный вариант реализации торговых скриптов может быть использован, когда необходимо время от времени выполнять какие-то расчеты на базе сделок, заявок или другой информации, но в тоже время нет необходимости в постоянном перерасчете этих значений.

Если необходимо выполнять определенные действия через заданный интервал, то можно написать в скрипте одну единственную функцию с предопределенным именем main() и всю логику работы торгового робота поместить в эту функцию. Функция main выполняется в отдельном потоке, т.е. она не мешает работе основного функционала терминала Quik, наличие функции sleep() позволяет периодически приостанавливать скрипт и возобновлять его работу через какой-то промежуток времени. Таким образом, если зациклить main() и вставить sleep(), то получаем эмуляцию подхода, использующегося при программировании на встроенном Qpile, т.е. периодический расчет чего-либо через заданный интервал времени.

 Событийная модель программирования.

В QLua так же доступна событийная модель программирования. Т.е. больше нет необходимости в одной функции обрабатывать все произошедшие изменения с прошлого вызова обработчика и на основании анализа этих данных выполнять какие-то действия. При выборе событийного подхода пользователь получает возможность мгновенно получать интересующие события от терминала и выполнять расчет всех необходимых параметров для принятия решений непосредственно в обработчиках событий.

Для того чтобы обработать то или иное событие, необходимо просто прописать в своем скрипте функцию с предопределенным названием. Поддерживаются самые различные события, например, новый тик по инструменту, совершение на бирже очередной сделки, выставление новой заявки торговым скриптом, изменение стакана котировок, изменение позиции по инструменту в портфеле и многие другие. Для обработки событий скрипт должен содержать функции с предопределенными названиями, названия функций для обработки всех событий приведены в документации по QLua в разделе «Обработчики обратного вызова».

Принцип выполнения скриптов внутри торгового терминала Quik представлен на рисунке 2.

Рисунок 2- Принцип выполнения скриптов Lua в Quik

Принцип выполнения скриптов внутри торгового терминала Quik представлен на рисунке 2. Принцип выполнения скриптов Lua в Quik

Выполнение всех операций происходит после запуска торгового скрипта в окне управления скриптами и всегда начинается с обработки тела скрипта вне каких-либо функций и вызова обработчика с именем OnInit. В функцию инициализации передается  полный путь к запускаемому скрипту, который может использоваться для определения пути к сохраняемым данным, например, логам работы скрипта и т.д. После того, как функция OnInit завершится, происходит создание отдельного потока приложения Quik, и в этом потоке начинает выполняться функция main(), которая обязательно должна присутствовать в скрипте. Скрипт считается работающим до тех пор, пока выполняется функция main, как только она завершится, скрипт переходит в состояние «остановлен» и полностью прекращается обработка всех данных, т.е. вызов всех определенных обработчиков событий.

Следует отметить, что все функции обработки событий, в отличие от функции main(), выполняются в рамках основного потока терминала Quik, поэтому время их работы должно быть сравнительно небольшим, чтобы не влиять на работу торгового терминала и обработчиков  других скриптов.

В завершении рассмотрим простой скрипт, который будет записывать в файл информацию по всем выставляемым из терминала заявкам:

f=nil
stopped = false

//функция инициализации, в которой создается файл для сохранения данных

function OnInit(path)
            f = io.open("orders.txt", "w+t")
end

//функция обработки остановки скрипта, в которой необходимо установить флаг, что работа скрипта завершена

function OnStop(signal)
            stopped = true
end

//функция обработки новой заявки, в которой данные по заявке будут сохраняться в файл

function OnOrder(order)
            if f~=nil then
                        f:write(os.date() ..";".. order.ordernum ..";".. order.seccode ..";".. order.price ..";".. order.qty ..";".. order.balance ..";".. "\n")
                        f:flush()
            end
end

//главная функция скрипта, которая будет выполняться пока не установлен соответствующий флаг

function main( ... )
            while stopped ~= true do
                        sleep(50)
            end;
end

 

Список литературы

  1. http://quik2dde.ru
  2. http://www.qlua.org/
  3. http://ru.wikipedia.org/wiki/Lua


comments powered by HyperComments

Саня
2017-01-02 03:23:37
Казино Вулкан раздают деньги сегодня http://cenforce100.ru/casino-vulkan.php
8
Сен
2017

Доверительное управление. Результаты в августе 2017 года.

Доверительное управление. Результаты в августе 2017 года. Стратегия “Опционы” принесла в августе прибыль в размере… »

6
Авг
2017

Доверительное управление. Результаты в июле 2017 года.

Доверительное управление. Результаты в июле 2017 года. В июле индекс РТС вновь колебался в достаточно узком… »

14
Июл
2017

Доверительное управление. Результаты в июне 2017 года.

Доверительное управление. Результаты в июне 2017 года. Июнь индекс РТС вновь провел преимущественно в боковых движениях, а… »

11
Июн
2017

Доверительное управление. Результаты в мае 2017 года.

Доверительное управление. Результаты в мае 2017 года. В мае “болтанка” индекса РТС продолжилась, на паре… »

7
Май
2017

Доверительное управление. Результаты в апреле 2017 года.

Доверительное управление. Результаты в апреле 2017 года. В апреле мы наблюдали очередной месяц “боковика” по… »