lua скрипты для quik примеры

Создадим свой первый простой скрипт в КВИК

lua скрипты для quik примеры

В данной статье мы уже подошли вплотную к тому, чтобы создать свой первый скрипт для торгового терминала QUIK. И начнем создавать скрипт, а не индикатор, потому что для начала скрипт будет проще для понимания.

Итак, чтобы у нас находилось все в одном месте, а не раскиданы все файлы по компьютеру, создадим специальную папку для будущих скриптов и для удобства разместим ее прямо в папке с Квиком.

Как и где создаем каталоги и файлы

Открываем папку программы QUIK и прямо в ней создаем свою новую папку. Назвать ее можно как угодно, но желательно название задавать латинскими буквами, например «LuaScripts». В этой папке и будут храниться все созданные нами скрипты для КВИК на языке QLUA.

Заходим в нашу созданную папку «LuaScripts» и в этой папке создаем простой текстовый документ. ПКМ — правой кнопкой мыши в свободном пространстве и выбираем пункт «Текстовый документ».
lua скрипты для quik примеры

Затем переименовываем этот файл и пишем любое название латинскими буквами, например пусть будет «Script_N1», а также меняем расширение на нужное нам .lua, в итоге у нас получается файл «Script_N1.lua». Но хочу предупредить, что чаще всего расширения не видно у файлов, поэтому если Вы все сделаете как написал выше, то виндоус по умолчанию все равно добавит расширение .txt, поэтому можно открыть либо в проводнике, либо в «тотал командоре» либо включить отображение расширений файлов в свойствах папки, либо создать файл прямо в программе NotePad++.

Если хотим создать через НотПад. То вверху в меню данной программы нажимаем вкладку «Синтаксисы», выбираем пункт «L» и в открывшейся области выбираем «Lua».
lua скрипты для quik примеры

Далее в меню NotePad нажимаем кнопку «Файл»«Сохранить как».
lua скрипты для quik примеры

В открывшемся новом окне находите папку с Квиком и открываете созданную папку «Lua scripts». Внизу в этом же окне задаете имя файла «Script_N1» и еще чуть ниже выбираете тип файла LUA. Затем нажимаете «Сохранить».
lua скрипты для quik примеры

Все, файл нашего будущего скрипта создали, осталось дело за малым, написать в него код на языке LUA! Как мы уже знаем, что есть инструкция в КВИКе о том, как создается скрипт, называется этот файл с инструкцией QLUA.chm, располагается в папке с Квиком.

Напишем простейший код для примера

И сохраним сделанные нами изменения в файл путем нажатия на кнопку в меню
lua скрипты для quik примеры

Переходим к запуску скрипта «Script_N1.lua»
Хоть и очень просто, но все же уже первый скрипт написан! Давайте запустим его в QUIK.
Для этого Открываем терминал КВИК, в меню выбираем пункт «Сервисы»«LUA скрипты…».

lua скрипты для quik примеры

В появившемся окне «Доступные скрипты» справа нажимаем на кнопку «Добавить». Находим свой скрипт «Script_N1.lua» в папке «Lua scripts» и жмем «Открыть».

lua скрипты для quik примеры

У нас открывается наш скрипт. Теперь, чтобы его запустить, выделяем строку с нашим скриптом «Script_N1.lua» и справа в окне нажимаем кнопку «Запустить».
lua скрипты для quik примеры

После этого у нас появляется окно сообщений в КВИК вот такое!

lua скрипты для quik примеры

В окне какие-то каракули 🙂 Но давайте это устраним. В NotePad в редакторе скрипта в меню находим раздел «Кодировки» и далее выбираем «Преобразовать в ANSI».
lua скрипты для quik примеры

Еще раз сохраняем наш скрипт. Возвращаемся в КВИК и в окне «Доступные скрипты» жмем кнопку «Запустить».

lua скрипты для quik примеры

Теперь выходит окно с понятным сообщением!

Для того, чтобы постоянно в создаваемых в NotePad файлах не проводить преобразование в ANSI, можно сразу один раз в настройках указать кодировку нового документа.
Для этого в меню «Опции» — «Настройки». В появившемся окне выбираем из списка «Новый документ» и справа настраиваем следующее: «Кодировка — ANSI», «Формат Конца Строк — Windows (CR LF).

lua скрипты для quik примеры

На этом пока завершим наши действия на сегодня, не все сразу, но многое мы уже познали, много интересного еще нас ждет впереди!

Не откладывайте свой шанс заработать на бирже уже сегодня!

Источник

[Закрыто] Основы программирования 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 можно изобразить следующим образом:
lua скрипты для quik примеры

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

Источник

Как выполняются скрипты в терминале QUIK

lua скрипты для quik примеры

В прошлой статье мы разобрали как создать свой первый скрипт, запустили его. Давайте вспомним код из него:

Код написан всего в несколько строчек. Оставим на потом разбор самих функций, используемых в скрипте, а сейчас рассмотрим именно порядок исполнения функций в коде. Это нужно именно для понимания того, что код не всегда будет исполняться по порядку, в котором мы его создаем, например со второй строки. Это зависит от используемых функций в коде. В нашем примере мы использовали одну функцию — main. Скрипт, написанный на LUA в терминале КВИК, может включать одновременно ряд функций, обрабатывающих различные события (например, изменение котировок, новая сделка и пр.).

Последовательность исполнения скрипта на языке LUA в КВИКе представим так:

lua скрипты для quik примеры

И главное, функции обработки событий, выполняются в основном потоке терминала QUIK, в отличие от функции main(), из этого следует, что они должны работать мало, иначе будут видны «подтормаживания» в работе КВИКа.

Представим наш скрипт Укрупненно в виде такой схемы

lua скрипты для quik примеры

Схематично показан наш скрипт. Состоит из четырех компонентов. В красном блоке расположена главная функция main. И как писали выше, что функция может находиться не в начале скрипта. Пара желтых блоков — это функции, которые создает сам пользователь. Нижний синий блок — это функция обратного вызова. И немного поговорим о данной функции.

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

lua скрипты для quik примеры

Если откроем справочник QLUA.chm из папки с КВИКом, то можем узнать, что за события используются в КВИКЕ и что за функции с ними связаны. Находим в заглавии — Функции обратного вызова.

lua скрипты для quik примеры

И узнаем, что функция 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.

А теперь разберем все на живом примере.

lua скрипты для quik примеры

На первый взгляд может показаться все сложно и непонятно, но давайте разберемся!

Сначала объявляем таблицу t и в поле 0 устанавливаем время, в течении которого работает терминал QUIK. Для нас будет точка старта выполнения кода. В другие графы запишем разницу между временем в необходимый момент и стартовой точкой, в итоге узнаем сколько времени прошло в любой момент кода. Со следующей строки запишем время старта скрипта, потом сделаем паузу в 100 мс. Дальше в нужных точках кода указываем, где расположено исполнение и время в данный момент, этим мы определим последовательность выполнения кода. В завершении, перед остановкой функции main, покажем информацию, где покажем все указанные точки.

Можете скачать файл и запустить в Квике у себя. Должно получиться данное сообщение.

lua скрипты для quik примеры

Смотрим на метки по времени. 1я метка «Запуск» и время 0, скрипт только запустился и прошло 0 мс. 2я метка «Отметили myFirstFunc» и время 0,101, это означает — Квик получил информацию, что есть функция myFirstFunc спустя 101мс после старта скрипта, но только лишь узнал про функцию, при этом основа функции не исполнилась. А чем был занять скрипт эти 100мс? Собственно ничем 🙂 Просто ожидал. Получил команду sleep(100) в строка номер 2. Обращаем ваше внимание, что функция main тоже отмечена, в это время, но не исполняется пока и новый поток для нее не создан. Так же поступили и другие метки участвующих функций.

lua скрипты для quik примеры

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

В статье попытались понять последовательность выполнения процессов в запущенных нами скриптах, написанных на языке LUA в торговом терминале QUIK.

Вы уже сейчас можете записаться на Видео курс и научиться самому делать таких роботов и любых других!

Если же вам не хочется тратить время на обучение, то вы просто можете выбрать уже готовые роботы из тех, что представлены у нас!

Также можете посмотреть совершенно бесплатные наработки для МТ4, Квика, МТ5. Данный раздел также постоянно пополняется.

Не откладывайте свой шанс заработать на бирже уже сегодня!

Источник

Код робота на LUA для QUIK

lua скрипты для quik примеры

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

Предназначается для новичков в алготрейдинге, что-то типа болванки.

Важно: выставление заявок я закомментировал, поэтому можете смело запускать этот скрит, он не натворит ужаса по счету.

lua скрипты для quik примеры

lua скрипты для quik примеры

lua скрипты для quik примеры

lua скрипты для quik примеры

lua скрипты для quik примеры

lua скрипты для quik примеры

lua скрипты для quik примеры

Предназначается для новичков в алготрейдинге, что-то типа болванки.

Извините за дальнейшее занудство.

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

К недостаткам я бы отнёс:
* неудачное форматирование;
* отсутствие должных комментариев;
* нет ссылки на библиотеку «QL» и подсказки, что она нужна для логгирования в файлы (и, может быть, зачем-то ещё);
* переменные объявляются то локальными, то глобальными;
* [«TRANS_ID»]=tostring(math.random(2000000000)) — нет гарантии, что не получится повторяющихся идентификаторов транзакций;
* молимся, что при отправке транзакций нет ошибок.

Понятно, что если делать всё по уму и корректно, то код распухнет и новичков будет отпугивать своей громоздкостью. Но в финансах лучше перестраховаться, чем терпеть убытки из-за недоделок в коде. Так что неясно, как лучше поступить.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *