lua quik примеры скриптов с описанием
Код робота на LUA для QUIK
В двух словах: робот анализирует спот, выставляет лимитные и стоп-лимитные заявки по фьючерсу. Делает пересчет сигналов по выбранному тайм-фрейму, снятие выставленных заявок, запись в файл текущего состояния, ведение логов, сообщения, запрос текущей позиции и пр. Из робота удалена алгоритмика вычисления сигнала и в текущем виде скрипт будет иметь сигнал на покупку на каждом баре.
Предназначается для новичков в алготрейдинге, что-то типа болванки.
Важно: выставление заявок я закомментировал, поэтому можете смело запускать этот скрит, он не натворит ужаса по счету.
Предназначается для новичков в алготрейдинге, что-то типа болванки.
Извините за дальнейшее занудство.
Для новичков лучше давать образцово показательный код, чтобы они видели, как надо писать программы. К сожалению, данная болванка не очень этому соответствует.
К недостаткам я бы отнёс:
* неудачное форматирование;
* отсутствие должных комментариев;
* нет ссылки на библиотеку «QL» и подсказки, что она нужна для логгирования в файлы (и, может быть, зачем-то ещё);
* переменные объявляются то локальными, то глобальными;
* [«TRANS_ID»]=tostring(math.random(2000000000)) — нет гарантии, что не получится повторяющихся идентификаторов транзакций;
* молимся, что при отправке транзакций нет ошибок.
Понятно, что если делать всё по уму и корректно, то код распухнет и новичков будет отпугивать своей громоздкостью. Но в финансах лучше перестраховаться, чем терпеть убытки из-за недоделок в коде. Так что неясно, как лучше поступить.
Примеры простого торгового робота на Lua и Python от разработчиков QUIK
Внимание
Выполнение 1,2 пунктов наверное не займёт много времени от разработчиков и не потребует вносить изменения в код QUIK и Документацию.
PS Примеры наверное можно разместить на GitHub или чёмто подобном.
Цитата |
---|
ЛуаСкрипт написал: Не думаю что у разработчиков написание такого робота заняло бы более 1 го дня. |
Оптимистичненько. Не более 1 года, так реальней звучит.
Цитата |
---|
ЛуаСкрипт написал: Возникают проблемы с производительностью, стабильностью работы роботов и самого QUIK |
Это зависит от квалификации программиста, а не от наличия/отсутствия примеров.
Lua придумали не мы и существует он очень давно. Что мешает посмотреть алгоритмы на не связанных с QUIK ресурсах, посвященных Lua?
И не надо говорить про «специфику», вся специфика относящаяся непосредственно к QUIK уже миллион раз обсуждалась еще со времен QPILE и с тех пор мало что изменилось.
И даже более того, 99% вопросов по «специфике», вообще никак не относятся к программированию на Lua, а относятся к функционалу самого терминала QUIK.
А функционал самого терминала QUIK должен быть Вам хорошо известен до того как Вы возьметесь программировать.
Да нет, и не будет. Все наши функции необходимые для реализации такого робота описаны в документации QLUA.chm.
Все Lua функции можно найти в документации на Lua и сторонних ресурсах которые ему посвящены.
Если Вам не понятно, как отправить транзакцию или получить нужные данные, готовы подсказать.
Что значит «типового»? Вот мы считаем что все имеющиеся способы (DDE, ODBC, QLUA) являются типовыми.
тот же комментарий, мы считаем имеющиеся способы «типовыми».
Что тут писать если есть DDE?
А в Excel есть VBA.
А дальше куда угодно.
такой пример уже есть, см примеры для Trans2quik
что такое «контроль выполнения заявок»? Если интересует как получить данные то уже было отвечено выше. Если интересует как считать состояние портфеля, то формулы можно посмотреть в документации на терминал.
Торговый робот для QUIK. На каком языке программирования его написать, как протестировать и как установить в торговый терминал
Как и многие другие, я начинал свою работу в качестве трейдера с торгового терминала Metatrader4. И когда у меня созрела необходимость в написании собственных скриптов и советников (торговых роботов), я не мудрствуя лукаво открыл учебник по MQL4 и изучив основы этого языка, через пару часов уже мог состряпать простую программку.
Дальше-больше, после реализации простых скриптов пришло желание запрограммировать более сложные алгоритмы торговли. Возникали, конечно, вопросы, но ответы на них достаточно легко дают Яндекс с Гуглом. В настоящее время существуют столько сайтов и форумов посвящённых данной тематике, что достаточно трудно найти такой вопрос, который остался бы без ответа после более-менее тщательного штудирования интернета.
Для чего я вам все это рассказал? Дело в том, что никакого особого опыта в программировании, кроме школьных уроков информатики у меня до этого не было. А это означает, что для того, чтобы справиться с этим делом вовсе не обязательно быть программистом.
Если же у вас за плечами уже есть какой-либо опыт программирования на любых языках, то данная задача вам покажется элементарной. Уверяю вас, так оно на самом деле и есть, на деле здесь всё оказывается куда проще и стоит только начать, как вы незаметно для себя уже превратитесь в матёрого создателя торговых роботов.
Как написать программу
В QUIK предусмотрена возможность установки двух основных типов программ скриптов и торговых роботов:
На мой взгляд, наиболее простым вариантом является работа с программами на языке LUA. Область применения данного языка программирования не ограничивается только написанием программ для торговых терминалов, на нём пишут и компьютерные игры, и мобильные приложения, и много чего ещё. Но нас сейчас интересует его использование в контексте написания программ торговых роботов для торгового терминала QUIK. К слову сказать, используемая здесь разновидность данного языка часто именуется QLUA (Q от QUIK).
Программирование на LUA
Описать все особенности и синтаксические конструкции языка в рамках одной этой статьи конечно не получится, впрочем в этом и нет особой необходимости. Как я уже говорил, синтаксис здесь довольно простой и включает в себя все основные команды свойственные любому современному языку программирования. Есть, конечно, некоторые специфические моменты, но все они подробно описаны на многочисленных тематических ресурсах. Например здесь: https://forum.quik.ru/forum10/topic2029/
Я сильно не заморачивался ни синтаксисом, ни изучением языка, а просто сразу начал писать программу. По ходу необходимости, уточнял синтаксис той или иной необходимой мне команды через поисковики. Например запрос типа “оператор для открытия позиции в QLUA” подсказывал мне, что для данной цели необходимо использовать оператор sendTransaction(), а запрос “синтаксис оператора sendTransaction() в LUA” выдавал в первой же позиции результатов поиска сайт содержащий ответ:
На этом сайте вы найдёте синтаксис всех команд языка с конкретными примерами их использования: http://luaq.ru/
А вот здесь вы найдёте полное руководство по азам программирования на LUA: https://lua.org.ru/contents_ru.html
Кроме этого есть ещё масса других ресурсов содержащих исчерпывающую информацию по данной теме.
Где писать программу. Какой редактор использовать?
Прелесть состоит в том, что для написания программ на QLUA можно обойтись штатными средствами Windows, без установки каких-либо специализированных редакторов. Вы можете писать и редактировать программу прямо в текстовом файле.
Для этого сначала создаёте обычный текстовый файл:
Неудобство данного метода написания состоит в том, что без редактора невозможно скомпилировать файл и проверить его на наличие ошибок. Однако это не так критично, как может показаться на первый взгляд, поскольку наличие ошибок (а также их краткое описание) вам выдаст торговый терминал после того как вы попытаетесь запустить в нем программу.
После запуска программы терминал показывает в ней ошибку
После этого достаточно будет её отредактировать и запустить вновь. В том случае, если ошибок больше нет, окно “Ошибки выполнения скрипта” останется пустым, а программа начнёт работать (об этом будет свидетельствовать характерный значок “play” перед названием). После того, как заложенный в неё алгоритм отработает, она остановится. Если же она специально зациклена (работает на постоянное отслеживание текущей рыночной ситуации), то остановить её можно будет нажатием на кнопку “Остановить”.
Как протестировать торгового робота
В Метатрейдере с этим делом всё обстоит довольно просто – запускаешь тестер стратегий, выбираешь временной интервал ценовой истории и вперёд. Тестер прогонит через загруженного в него торгового робота весь массив цен из заданного в настройках интервала и выдаст вам график прибыли/убытка которые были бы получены роботом при реальной торговле online. При этом у вас ещё будет возможность оптимизировать настройки тестируемого торгового робота таким образом, чтобы получить наилучший результат (наибольший профит), правда на всё том же ограниченном интервале истории.
В QUIK такого тестера априори не существует. То есть тестировать созданных роботов на истории вы здесь не сможете**, но оно, пожалуй, и к лучшему. Почему к лучшему? Излишняя оптимизация на истории может сыграть с вами злую шутку. Дело в том, что самые замечательные результаты торговли в прошлом никогда не гарантируют вам того же и в будущем. Часто бывает так, что стратегии “заточенные” (читай – оптимизированные) под определённый интервал времени в прошлом и приносящие на нём стабильно высокий доход, в реальном времени начинают откровенно сливать депозит.
Но не расстраивайтесь, торговых роботов для терминала QUIK вы сможете тестировать в реальном времени. Правда для этого вам потребуется так называемый демо-счёт (вы ведь не хотите, чтобы тестируемый советник принялся сразу же торговать реальными деньгами).
В отличие от метатрейдера в котором и реальные, и учебные счета открываются в одном и том же терминале, в квике для этого нужно установить специальный учебный терминал. По сути своей это тот же QUIK, только данные он берет со специального – учебного сервера (котировки немного отстают по времени от реальных, но в целом повторяют их с достаточной точностью) и для торговли здесь используются виртуальные деньги.
Учебный QWIK можно скачать у любого брокера, желательно у того, через которого вы планируете в дальнейшем торговать. Правда здесь возможны некоторые заморочки связанные с тем, что не всегда учебная версия данного торгового терминала позволяет работать со скриптами LUA.
Если та версия, которую предлагает ваш брокер не поддерживает возможножность установки и запуска LUA-скриптов, то можете установить демку от брокера БКС. Это не реклама, просто у меня стоит такая же и я точно знаю, что данная версия позволяет работать с любыми скриптами и советниками написанными на языке программирования LUA (QLUA).
** По крайней мере чистыми средствами QUIK, без использования какого-либо дополнительного софта.
Как установить LUA-скрипт в торговый терминал
Процесс установки торгового робота (скрипта) одинаков и для учебного, и для реального терминалов. Он довольно прост и выглядит следующим образом:
Вот и всё, на этом процесс установки торгового робота закончен. Для того, чтобы он начал работать достаточно выбрать его кликом мышки и нажать кнопку “Запустить”. Если в программе не будет обнаружено ошибок, то она начнёт работать, а иначе выдаст вам соответствующее сообщение (см. выше).
Как выполняются скрипты в терминале QUIK
В прошлой статье мы разобрали как создать свой первый скрипт, запустили его. Давайте вспомним код из него:
Код написан всего в несколько строчек. Оставим на потом разбор самих функций, используемых в скрипте, а сейчас рассмотрим именно порядок исполнения функций в коде. Это нужно именно для понимания того, что код не всегда будет исполняться по порядку, в котором мы его создаем, например со второй строки. Это зависит от используемых функций в коде. В нашем примере мы использовали одну функцию — main. Скрипт, написанный на LUA в терминале КВИК, может включать одновременно ряд функций, обрабатывающих различные события (например, изменение котировок, новая сделка и пр.).
Последовательность исполнения скрипта на языке LUA в КВИКе представим так:
И главное, функции обработки событий, выполняются в основном потоке терминала QUIK, в отличие от функции main(), из этого следует, что они должны работать мало, иначе будут видны «подтормаживания» в работе КВИКа.
Представим наш скрипт Укрупненно в виде такой схемы
Схематично показан наш скрипт. Состоит из четырех компонентов. В красном блоке расположена главная функция main. И как писали выше, что функция может находиться не в начале скрипта. Пара желтых блоков — это функции, которые создает сам пользователь. Нижний синий блок — это функция обратного вызова. И немного поговорим о данной функции.
Функция обратного вызова может запускаться в любое время. Исполняется функция, при появлении нового события, коих может быть большое количество и для каждого своя функция.
Если откроем справочник QLUA.chm из папки с КВИКом, то можем узнать, что за события используются в КВИКЕ и что за функции с ними связаны. Находим в заглавии — Функции обратного вызова.
И узнаем, что функция Main — это функция обратного вызова.
Цитата из инструкции:
«Функция, реализующая основной поток выполнения в скрипте. Для ее выполнения терминал QUIK создает отдельный поток. Скрипт считается работающим, пока работает функция main(). При завершении работы функции main() скрипт переходит в состояние «остановлен». Если скрипт находится в состоянии «остановлен», то не происходит вызовов функций обработки событий терминала QUIK, содержащихся в этом скрипте.»
Главный момент — это то, что Main исполняется в своем новом потоке и не мешает процессам основного функционала терминала КВИК.
Допустим, сам КВИК сейчас занят подгрузкой исторических данных для открытых графиков инструментов, пока это происходит, цена в моменте меняется, т.к. торги идут, появляется нужная нам цена для входа. В скрипте указали алгоритм, что при появлении нужной цены надо тут же открыть позицию на покупку, скрипт готов к покупке, но не может это сделать, он ждет пока QUIK подгрузит все исторические данные. И пока это происходит (вроде бы несколько секунд), но нужная цена уже изменилась, а наш скрипт только начал работу. Это и есть выполнение скрипта в одном потоке с выполнением терминала КВИК. Постараемся исключить этот момент, применив main, тем самым сделаем свой отдельно работающий поток, тем самым добиваемся немедленной покупки, даже если сам терминал в это время загружен каким-то процессом.
Перейдем к следующему блоку в нашей схеме — OnInit (функция обратного вызова), в схеме показана синим. В справочнике по LUA про эту функцию написано следующее:
«Функция вызывается терминалом QUIK перед вызовом функции main(). В качестве параметра принимает значение полного пути к запускаемому скрипту.»
Основное для нас — функция OnInit исполняется до начала выполнения функции main. Следовательно по порядку — сначала сработает функция OnInit, а после ее выполнения, начнет отрабатывать функция Main. А т.к. вызывается OnInit до вызова main, то выполнение функции OnInit осуществляется в общем потоке QUIK, т.к. main еще не была вызвана, следовательно отдельного поток еще нет.
Рассмотрим функции, создаваемые нами, т.е. пользователями.
Программист может создать в своем скрипте сколь угодно много собственных функций, которые будут исполняться по отдельному событию, так как они не являются функциями обратного вызова, а следовательно их нужно вызывать. На схеме указано, в main и OnInit вызов функции, следовательно из данных функций вызываются пользовательские функции. Пользовательские функции исполняются в том потоке, в котором их вызвали. В потоке платформы QUIK запускается функция myFirstFunc. Функция mySecondFunc запустится уже в другом своем потоке, т.к. вызвана с помощью функции main.
А теперь разберем все на живом примере.
На первый взгляд может показаться все сложно и непонятно, но давайте разберемся!
Сначала объявляем таблицу t и в поле 0 устанавливаем время, в течении которого работает терминал QUIK. Для нас будет точка старта выполнения кода. В другие графы запишем разницу между временем в необходимый момент и стартовой точкой, в итоге узнаем сколько времени прошло в любой момент кода. Со следующей строки запишем время старта скрипта, потом сделаем паузу в 100 мс. Дальше в нужных точках кода указываем, где расположено исполнение и время в данный момент, этим мы определим последовательность выполнения кода. В завершении, перед остановкой функции main, покажем информацию, где покажем все указанные точки.
Можете скачать файл и запустить в Квике у себя. Должно получиться данное сообщение.
Смотрим на метки по времени. 1я метка «Запуск» и время 0, скрипт только запустился и прошло 0 мс. 2я метка «Отметили myFirstFunc» и время 0,101, это означает — Квик получил информацию, что есть функция myFirstFunc спустя 101мс после старта скрипта, но только лишь узнал про функцию, при этом основа функции не исполнилась. А чем был занять скрипт эти 100мс? Собственно ничем 🙂 Просто ожидал. Получил команду sleep(100) в строка номер 2. Обращаем ваше внимание, что функция main тоже отмечена, в это время, но не исполняется пока и новый поток для нее не создан. Так же поступили и другие метки участвующих функций.
Смотрим на цвет курсора. Сначала цвет был синим, что показывает процесс исполнения кода в потоке самой платформы QUIK, а после исполнения функции OnInit() поток в QUIK начинает выполнять функционал самого терминала, при этом создан новый поток — окрашен в желтый цвет. После завершения функции main, новый поток исчезает и сам скрипт останавливается.
В статье попытались понять последовательность выполнения процессов в запущенных нами скриптах, написанных на языке LUA в торговом терминале QUIK.
Вы уже сейчас можете записаться на Видео курс и научиться самому делать таких роботов и любых других!
Если же вам не хочется тратить время на обучение, то вы просто можете выбрать уже готовые роботы из тех, что представлены у нас!
Также можете посмотреть совершенно бесплатные наработки для МТ4, Квика, МТ5. Данный раздел также постоянно пополняется.
Не откладывайте свой шанс заработать на бирже уже сегодня!
[Закрыто] Основы программирования LUA в QUIK (QLUA)
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщений 2
1 Тема от admin 2012-12-18 00:43:41
Тема: Основы программирования LUA в QUIK (QLUA)
Введение
Начиная с версии 6.5 в терминале QUIK была добавлена возможность запуска пользовательских скриптов, написанных на языке Lua. В сравнении в ранее имевшимся внутренним языком QUPILE, добавление скриптов на Lua дало пользователям не только более мощный и удобный язык программирования, но и предоставило принципиально новые возможности для создания торговых роботов, в частности возможность мгновенной реакции на изменение рыночных данных за счет реализованной возможности событийного программирования. Событиями могут выступать: изменение стакана котировок, изменение параметров инструментов, совершение сделок на бирже, совершение сделок по поручениям (заявкам), поданным из терминала пользователя (вручную или из скриптов) и т.д.
Документация по Lua в QUIK и базовые примеры от ARQA: quik_lua.zip
Список изменений и нововведений в QUIK по части функциональности Lua-скриптов можно посмотреть здесь.
Виды скриптов на Lua для QUIK
Для выполнения разного рода задач терминал QUIK поддерживает следующие виды скриптов:
Lua-скрипты: в них доступна вся функциональность для написания роботов, включая возможность получения рыночных данных, параметров инструментов, задание реакции на изменение рыночных данные, выставление заявок, создание таблиц внутри интерфейса терминала QUIK с выводом в них нужной пользователю информации. Эти скрипты могут располагаться в любом месте, доступном терминалу (локальный диск, сетевой ресурс и т.д.).
Пользовательские индикаторы: это отдельный вид программ на Lua, предназначенный в первую очередь для вывода на графиках терминала индикаторов технического анализа, алгоритм которых реализуется в скриптах данного вида. Помимо этого, индикаторам доступны функции вывода меток на графиках. В большинстве случаев индикаторы для своего расчёта в качестве исходных берут данные с определённого графика, хотя имеется и возможность получения других данных (правда, на данный момент очень сложно обеспечить синхронизацию ганных на графике и внешних данных, с графиком не связаннх). В скриптах индикаторов доступен ограниченный набор внешних функций, по сравнению с Lua-скриптами.
Далее будут рассматриваться только Lua-скрипты и особенности их написания в QUIK. Создание индикаторов будет рассмотрено в отдельной теме.
Что включает в себя Lua в QUIK
В качестве интерпретатора используется Lua:
версии 5.1.5 в QUIK версий 6.x, 7.x и 8.0..8.4
версии 5.3 в QUIK версий 8.5 и более новых
Включены библиотеки: io, string, math, package, os, table. ( пруф )
Помимо этого скриптам на Lua, запущенным в терминале QUIK, доступны дополнительные функции, предназначенные для получения рыночных данных, взаимодействия с терминалом. Кроме того, пользователь может размещать в своём скрипте функции с заранее предопределёнными наименованиями (так называется callback-функции), которые позволяют реализовывать в торговых роботах реакцию на рыночные события. Ввиду такого расширения Lua в рамках терминала QUIK обычно называют QLua, подчеркивая наличие указанных дополнений. Хотелось бы отметить, что эти дополнения никак не изменяют собственно синтаксис самого языка Lua, а лишь добавляют в него некоторые функции по аналогии с функциями разных библиотек. Поэтому для изучения программирования на самом языке Lua в QUIK годится абсолютно любая книга по Lua.
Здесь не будет рассматриваться собственно программирование на самом языке Lua, считается, что читатель найдёт эту информацию самостоятельно. Ниже будет подробно рассказано о том, какие возможности для написания программ имеются именно в рамках терминала QUIK.
Как программировать на LUA в QUIK
б) Можно написать в Lua-скрипте одну единственную функцию с предопределенным именем main() и всю логику работы робота (или вычислительного скрипта) поместить в эту функцию. Функция main выполняется в отдельном потоке, т.е. она не мешает работе основного функционала терминала QUIK, наличие функции sleep() позволяет выполнять периодически приостанавливать скрипт и возобновлять его работу через какой-то промежуток времени.
Фактически, если зациклить main() и вставить sleep(), то получаем полную эмуляцию подхода, использующегося при программировании на встроенном QPILE: периодический расчет чего-либо через заданный интервал времени.
в) В QLUA доступна событийная модель программирования. Т.е. теперь нет необходимости в одной «главной» функции «выявлять» происходящие изменения и на основании анализа этих изменений выполнять какие-то действия.
С первым и вторым подходом все достаточно понятно, да и используемый для этого интерфейс весьма напоминает тот, который использовался в QPILE, так что на нем подробно останавливаться не буду.
Программирование на QLUA с использованием событий
При выборе такого подхода получаем весьма гибкую среду выполнения пользовательских скриптов внутри QUIK, позволяющую мгновенно получать интересующие события от терминала, производя нужную нам обработку этих событий.
Для того, чтобы обработать то или иное событие, необходимо просто прописать в своем скрипте функцию с предопределенным названием. Все доступные функции обработки событий есть в документации по QLUA. Поддерживаются самые различные события совершение на бирже очередной сделки, выставление новой заявки пользователем (или скриптом), изменение стакана котировок и т.д.
Схематически принцип выполнения скриптов LUA внутри терминала QUIK можно изобразить следующим образом:
Обратите внимание, что все функции обработки событий, в отличие от функции main(), выполняются в рамках основного потока терминала QUIK, а значит время их работы должно быть сравнительно небольшим, иначе будут заметны «подвисания» в работе терминала.