Курсы Lua
Курсы Lua, создание торговых роботов для терминала QUIK.
16. Создание индикаторов технического анализа в QUIK с помощью языка Lua.
Подключайтесь на автоследование за моими торговыми роботами.
В данном примере торгового робота рассмотрим создание собственных индикаторов технического анализа и вывод их на экран в окно графика.
Создание собственного индикатора, на примере графика скользящей средней, хорошо описано в документации к QUIK, в файле «Создание индикаторов технического анализа.pdf». Предлагаю Вам, ознакомится с ним. Скачать его можно по следующей ссылке.
Используя подход, описанный в файле «Создание индикаторов технического анализа.pdf», не получится получить доступ к двум инструментам и построить индикатор исходя из цен с двух инструментов. Ниже мы рассмотрим пример построения индикатора по двум графикам цены. Условие для скрипта торгового робота будет следующим. Нужно создать индикатор, который отображает разницу между ценой акции и ценой фьючерса, например для арбитражной торговли. В качестве инструментов возьмем акции Сбербанка и ближайший фьючерс на них SRH8.
Начнем. Создание индикаторов имеет ряд своих особенностей. Первое – это местоположение файла со скриптом торгового робота. Скрипт в обязательном порядке должен быть размещен в папке «LuaIndicators», которая в свою очередь находится в папке c программой QUIK. У меня на компьютере путь к папке выглядит следующим образом: C:\\QUIK_VTB24\\LuaIndicators. Если у Вас в папке программы QUIK нет папки «LuaIndicators», то ее необходимо сознать. Терминал QUIK считывает папку «LuaIndicators» и если находит скрипт на языке LUA, отвечающий минимально необходимым требованиям (о требованиях поговорим чуть позже), то сразу добавляет индикатор в список доступных индикаторов, список открывается, когда мы открываем окно «Добавление графика». Окно «Добавление графика» открывается из контекстного меню на графике пункт «Добавить график (индикатор)».
Еще один нюанс, если в коде индикатора допущена синтаксическая ошибка, то данный индикатор не будет отображаться в окне «Добавление графика».
Создадим новый файл для скрипта торгового робота с именем «023 График арбитраж.lua» и сохраним в папку LuaIndicators.
Перейдем к коду индикатора. Для индикатора существует, минимальный обязательный код, без которого терминал QUIK не сможет его распознать и работать с ним.
Минимальный код, на языке Lua выглядит следующим образом.
Источник статьи: http://oojoo.ru/16-sozdaniie-indikatorov-tiekhnichieskogho-analiza/
Как написать свой индикатор для quik
Тема сегодняшней публикации — скриптовый язык QLUA. QLUA — мощнейший инструмент для написания торговых роботов. И сегодня мы обсудим его плюсы и минусы. Посмотрим как написать простой индикатор и первого робота на нём. В начале своего пути долго выбирал среду разработки, искал эффективное и в тоже время простое решение для написания торговых роботов и советников. Этот путь занял несколько лет, и что я только не перепробовал в то время. Excel, Metastock, TsLab. Но в итоге остановился на QLua, справедливо решив, что это то, что мне нужно.
1) Почему стоит выбрать QLua.
2) Немного истории и о преимуществах QLua в сравнении с предшественником QPile.
3) Написание индикаторов на QLua.
4) Написание робота на QLua под Quik
5) Заключение
1. Почему стоит выбрать QLua.
Постараюсь коротенько описать плюсы и минусы. Начать стоит с того, что в рамках РФ самый распространенный терминал для торговли акциями и фьючерсами является Quik. Если отталкиваться от того, что наш терминал Quik, то выбор будет между: программами для тестирования, языками высокого уровня и встроенными языками в терминал Qlua , QPile.
Если сравнивать с системами, где алгоритм выстраивается путем построения блок-схем, то преимуществом Qlua является отсутствие платы за использование торговой системы как в TsLab и нет необходимости в использовании доп. «прокладок» как Wealth-lab. В системах построения из блоков таких как: TsLab, Wealth-lab и т.д. проблематично выстраивать сложные системы, а для уменьшения количества блоков и получения доп. функций требуется знание высокоуровневых языков типа: C#, Pascal для написания кубиков вручную.
Если рассматривать написание роботов на таких языках как: C#, Delphi , то здесь однозначным минусом является сложность написания кода и его размер для создания простейшего робота. Скриптовые же язык QLua или Qpile позволяют реализовать идею в более короткие сроки.
Сценарный язык (язык сценариев, жарг. скриптовый язык, от англ. scripting language) — высокоуровневый язык сценариев (англ. script) — кратких описаний действий, выполняемых системой. Сценарий — это программа, имеющая дело с готовыми программными компонентами, что очень сильно упрощает написание кода торгового робота. То есть для получения данных по значению закрытия свечи достаточно написать строчку кода типа: ds:C(20) все, и мы получаем значение закрытия двадцатой свечи инструмента. Нет необходимости писать «километры» кода. При этом доступен весь функционал как в полноценном языке программирования.
Из минусов можно отметить, что QLua используется только в рамках терминала Quik и данный язык не доступен для работы с другими терминалами и торговыми системами. Так же учитывая, что Quik является только терминалом и не позволяет производить тестирование торговых алгоритмов. В QLua нет простого решения для тестирования роботов, как это можно сделать в рамках таких платформ как: TsLab и Wealth-Lab.
2. Немного истории и о преимуществах QLua в сравнении с предшественником QPile.
До QLua был QPile, в общем–то он и сейчас есть. Интерпретатор скриптового языка QPile был разработан ARQA Technologies в 2002г. и развивался до 2012г., позже в терминал Quik был добавлен Lua интерпретатор. Так же есть вероятность, что компания ARQA Technologies возможно в ближайшем будущем откажется от дальнейшей поддержки QPile. Qpile как и Qlua является скриптовым языком и обладает рядом возможностей. По праву он является первым языком для написания роботов и советников для терминала Quik. Является простым для изучения и функциональным инструментом, но обладает рядом минусов.
И так, какими плюсами обладает QLua в сравнении с QPile:
— у QLua нет задержки на обработку торговой логики робота в 1сек. Это конечно не критично для среднесрочных стратегий, но для написания скальперских роботов может стать критичным.
— у QLua есть многопоточность. Реализовано это в виде основного потока торговой логики и функций обратного вызова(«колбэков»).
— есть возможность писать и подключать библиотеки на других языках, сам Lua кстати написан на Си
— появилась возможность писать пользовательские индикаторы и использовать их как стандартные.
— синтаксис языка немного похож на JavaScript и C#, отсюда удобство работы с операторами переменными и т.д.
— скрипты обычно интерпретируются, а не компилируются. QLua обладает JIT-компиляторами так как в его основе лежит язык Lua. Что позволяет прятать исходный код, в то время как у Qpile он всегда открыт. Ссылка как компилятор для скрытия исходного кода Qlua
3. Написание индикаторов на QLua.
(1) Пользовательский индикатор
Как уже упоменалось выше в рамках терминала Quik существует два скриптовых языка это: Qpile и QLua. Qpile являестя более ранним языком, который появился в Quik и на нем нельзя было писать индикаторы. Позже разработчики расширили функционал и добавили QLua, в рамках которого стало возможным писать индикаторы. В данной части статье пойдет речь о создании индикатора под Quik.
Индикатор на QLua представляет из себя файл с расширением *.lua или *.luac и визуально ничем не отличается от робота. Исключением является его месторасположение. Для того чтобы Quik увидел индикатор его надо разместить в папке LuaIndicators. Папка LuaIndicators должна храниться в корне папки Квика , если ее там нет , то ее надо создать. Для того чтобы быстро открыть папку Квика надо нажать на его ярлык на рабочем столе правой кнопкой мыши и выбрать «Расположение файла».
И так перейдем к созданию индикатора. Для этого нам понадобится любой текстовый редактор типа Notepade.
Индикатор на QLua для Quik состоит из трех основных частей.
Первая часть это объявление и заполнение глобального массива Settings , который содержит в себе переменные параметров индикатора, тип линии для отображения, толщину, цвет. В массиве Settings располагаются пользовательские переменные для изменения параметров индикатора из пользовательского интерфейса Квика.
Вторая часть это функция Init , она запускается один раз при инициализации индикатора. Возвращает количество линий индикатора.
Третья часть функция OnCalculate(index) получает на вход номер свечи. Она запускается интерпретатором столько раз сколько свечей на графике и возвращает численное значение индикатора. Если линий несколько в индикаторе , то несколько численных значений. Для удобства понимания кода там будут комментарии. Для комментирования строки в QLua используется «—». Все содержимое после двух дефисов интерпретатором кода на QLua не воспринимается.
Здесь мы описали массив настроек, ввели название индикатора, параметры описали параметры двух линий индикатора Именно эти параметры будут доступны в пользовательском индикаторе для изменения при загрузке индикатора на Qlua в Quik
- (1)Название индикатора
- (2)Установка значения для переменной period
- (3)Установка цвета по умолчанию для линии High
- (4)Название линии индикатора , которое мы прописали в ячейке «line» нашего листа настроек
- (5)Тип линии который мы установили для использования по умолчанию Type =TYPE_LINE
- (6)Толщина линии индикатора Width = 1
Создаем в редакторе файл с расширением lua записываем в него код и сохраняем его в папке LuaIndicators , после этого у нас появится новый индикатор и его можно будет добавить к себе на график как стандартный индикатор Quik (1)
4. Написание робота на QLua под Quik
Написание торгового робота на QLua ведется в обычном текстовом редакторе, так же как и для написания индикатора. Отличие будет в структуре кода и в том, что располагать робот можно в любом удобном для вас месте на компьютере. В роботе является обязательной только одна функция main.
И так приступим. Напишем робота с простым алгоритмом. Рассчитаем внутри робота скользящую среднюю и будем принимать решение о покупке/продаже одного лота по инструменту исходя из количества в клиентском портфеле при закрытии прошлого бара ниже/выше среднего значения посчитанного по закрытию минутных баров инструмента. То есть при пересечении close бара средней снизу вверх проверим количество контрактов в портфеле по инструменту, и если оно меньше одного , то докупим разницу до одного контракта в лонг. Обратная ситуация при пересечении close закрытого бара среднего значения сверху вниз. Отправим транзакцию для получения одного лота в шорт по клиентскому портфелю.
После редактирования кода сохраняем его в удобном для вас месте с расширением lua. Для запуска робота надо зайти в Сервисы ->Lua скрипты
- (1)Добавляем скрипт из сохраненнго места
- (2)Проверяем его появление в таблице запущенных скриптов, после запуска появится зеленая стрелка индицирующая работу скрипта
- (3)Запускаем его в работу
- (4)Проверяем в поле отсутствие ошибок при работе
5. Заключение
Подводя итоги хочется сказать, что если используется для торговли терминал Quik, то одним из самых простых способов написания автоматизированных торговых систем является скриптовый язык QLua. И надеюсь, сегодня Вы в этом сами убедились.
В рамках торгового робота написанного как пример выше, мы получили готовую механическую торговую систему в сто строк кода. Что является очень хорошим результатом.
Для написания индикаторов в Квик, Qlua является единственно возможным вариантом.
В общем — торгуйте алгоритмами. Используйте хорошие технологии!
Источник статьи: http://o-s-a.net/posts/qlua.html
Как я писал биржевого робота для Quik. Часть 1
Материал доступен также в качестве видео:
В наш век, очень многих волнует вопрос нетрудового получения крупных сумм денег рискованными путями.
Есть какие-то черные и серые темы, мошенничество, взломы, вирусы-вымогатели и т.д., но заниматься таким я бы никому не советовал.
Получите судимость, и на нормальную работу потом устроиться будет очень трудно.
Поэтому, под хоть как-то оправданным риском в данном случае я понимаю разнообразные ставки на спорт, а так же игру на бирже.
А чтобы уменьшить риски, сделать выигрыш более-менее системным, требуется осваивать много информации и проводить регулярную аналитическую работу.
Чувствуете? Опять придется работать.
Это не всегда интересно людям, и они стараются автоматизировать и переложить на кого-то рутину, а именно загрузку данных, их анализ, принятие оптимального решения, и совершение транзакций.
В идеале должен быть программный продукт, в котором есть одна кнопка «Деньги», при нажатии на которую на счет падает круглая сумма.
Безусловно, азартные игры (в том числе на бирже под соусом солидного инвестирования) это порок, и я не агитирую играть, поскольку слабовольные люди могут легко поломать себе судьбу с помощью всего этого. Но и отговаривать не буду — я вам все-таки не нянька.
К слову, у меня был опыт и в разработке анализатора коэффициентов букмекерских контор, но было это лет 10 назад, сейчас я сильно в эту тему не погружен, и об этом как-нибудь в другой раз.
Сегодня хотелось бы поговорить о биржевой торговле, на примере московской бирже, также известной как ММВБ, ММВБ-РТС, мамба, MOEX.
И о технических аспектах организации торговых роботов.
Для торговли предоставляется биржевой терминал, который называется Quik.
Разумеется, поторговав через него, в какой-то момент мне стало интересным написать какого-то торгового робота. Который бы торговал за меня, а я бы занялся наиболее интересной частью процесса — тратил бы выигранные на бирже деньги.
Я изучил предложение на рынке конструкторов таких роботов, и решил что хотя идея набора логики из кубиков хороша для детей, не нюхавших кода, но в них недостаточно возможностей.
Как назло, еще и апи для расширения для них было на шарпе (C # ), а я все-таки больше люблю в Java/Scala, а одновременная разработка на джаве/скале и шарпе чревата шизофренией, уж не обессудьте.
Поэтому я решил, что проще накорябать на коленке своего робота для Квика на джаве/скале, а там уж как пойдет, адаптировать под плазу2, или еще под что.
Квик предоставлял несколько вариантов взаимодействия с внешним миром, а именно:
3. Онлайн подключения посредством расширений на ЛУА
Разумеется, поскольку речь про деньги, мне хотелось обеспечить наиболее быстрый обмен, поэтому я выбрал третий способ.
Язык ЛУА не является мега-популярным, и реализовывать всю логику робота в нем было бы странно, учитывая что к примеру в java/scala доступена масса библиотек, технологий и инструментов, начиная с возможности парсинга новостей, и заканчивая анализом бигдаты в хадупе и спарке.
Забегая вперед, одной лишь джавой/скалой мне ограничиться не удалось, пришлось плотно интегрировать все это хозяйство с питоном.
Тем не менее, было необходимо связать Квик через ЛУА с приложением в джава машине.
Замечательный сайт Смарт Лаба с ходу предложил прототип решения — через так называемые Windows named pipe.
Спустя пару часов решение подтвердило свою работоспособность, но с недостатками.
1. В ЛУА существуют так называемые колбеки, которые, присылают обновления стакана, а также обезличенные сделки (из которых, собственно, можно на лету рисовать свечной график).
А пример со смартлаба предполагал интерактивные запросы в квик, что существенно увеличило бы задержку.
Недолго думая, я продублировал поток, с тем чтобы один пересылал колбеки, а второй — обрабатывал в квике входящие запросы.
2. Второй недостаток был серьезнее. То ли из-за реализации работы с named pipe в джаве, то ли из-за моих кривых рук во время отладки приложения квик регулярно зависал. Как только отваливалось джава приложение, квик приходилось аварийно завершать через диспетчер задач, а частенько я не успевал сделать это вовремя, и вся машина намертво висла. Это было крайне неприятно.
3. Третье. В моем распоряжении имелся домашний сервер, собственно, просто комп с мощным многоядерным камнем, забитый под завязку оперативкой общим оъемом под сотню гигабайт, для эксперементов с бигдатой.
Разумеется, под линуском, с несколькими виртуалками внутри. Для работы с Windows named pipe, по определению, требовалась Windows, что не позволяло использовать в приложении большой объем памяти сервера, либо требовалось промежуточное звено для шлюзования команд и колбеков из named pipe в какой-то сетевой протокол.
Что было бы лишним звеном.
Короче говоря, я нашел более приличный способ — библиотеку сетевых сокетов для ЛУА, а основную идею двух каналов, оставил как есть.
Тайминги проброса данных по локальной гигабитной сетке, по моей оценке, примерно те же что и при локальной передаче через named pipe, а именно десятки миллисекунд.
На стороне робота организуется tcp сервер, слушающий несколько портов. Квик посредством скрипта на ЛУА цепляется туда, и происходит обмен данными.
Данные стаканов и обезличенных сделок обрабатываются на лету, но также складируются в сиквел базу данных — у меня Postgres, но также это могут быть например и паркетные файлы в спарке, или прости господи Json в MongoDb.
В момент, когда робот чует, что произойдет разворот курса, он делает заявку на покупку/продажу актива, или же фьючерса на актив. Одновременно с этим, можно выставить стоп-лосс, либо стоп+тейк профит, в зависимости от вашей стратегии.
Если вы верите в теории заговора, о том что брокер, видя у себя ваш стоп-лосс на тысячу рублей, спит и видит как бы его нахлобучить в сговоре с ВЭБом, вы можете реализовать собственный приватный умный стоп-лосс внутри своего робота, который, например, не будет срабатывать при длинных проколах на свече, и прочих кукловодских происках, а мужественно держаться до победного маржин-кола. )
В общем, далее все ограничивается только вашей фантазией и знанием Граалей.
Источник статьи: http://zen.yandex.ru/media/id/5ecac67da3811a33d94a3702/kak-ia-pisal-birjevogo-robota-dlia-quik-chast-1-5ee94c91cbbc2d362a05579f