Как написать торгового робота для квик

Блог им. robot-scalper

    • 19 февраля 2019, 14:37
    • |

Торговый робот для QUIK на LUA

К нам поступил запрос на создание многопараметрического робота, с кучей условий торговой логики и в конце с припиской: «За работу я готов оплатить 800 рублей». Как у заказчика получилась такая сумма осталось не ясно. Возможно, всё тривиально, и это просто все его доступные средства, которые остались от торговли по интуиции. А возможно человек просто не понимает какую работу нужно проделать и из чего образуется цена на торговых роботов. Но это не страшно. Мы как раз сейчас и постараемся разобраться в этом.

Итак, чтобы разработать робота нужно выполнить определенные этапы. Рассмотрим их.

  1. Нужно определиться с торговой стратегией и формализовать её (точки входа, стоп-лоссы, тейк-профиты, фильтры и т.п.);
  2. Желательно создать прототип данного робота;
  3. Проверить работоспособность стратегии и прототипа на исторических данных;
  4. Желательно провести оптимизацию стратегии и найти оптимальные значения параметров;
  5. Нужно провести анализ сделок и добавить общие фильтры на ситуации в которых робот часто показывает убытки. Главное, нельзя примерять переоптимизацию! Иначе в реальной торговли результаты будут сильно отличаться! После этого возвращаемся к пункту 4. И работаем до тех пор пока стратегия не будет универсальной или пока мы её не забракуем как непригодную. Так тоже бывает, и не редко.
  6. Теперь можно приступать к непосредственной разработке робота, например, на LUA под QUIK;
  7. После разработки нужно протестировать робота и убедиться в четкой работе скрипта. Если обнаружатся неточности в работе или явные баги, то их нужно исправить и заново запустить робота на тестирование;
  8. Для того чтобы пользователь мог легко управляться с роботом требуется сделать удобный интерфейс и подробное описание функционала, то есть создаем документацию;
  9. Плюс нужна подробная инструкция с картинками по установке и использованию робота для начинающих пользователей;
  10. И конечно же всё равно у заказчика будут появляться вопросы, на которые нам нужно отвечать. То есть, нужна техническая поддержка.

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

По поводу технических инструментов мы можем порекомендовать следующие варианты:

  1. Для тестирования прототипа стратегии на исторических данных хорошо подойдет программа TSLab.
  2. Для реальной торговли на боевом счете желательно использовать роботов на LUA. В этих скриптах можно прописать всевозможные проверки торговой логики и проверки на корректность входных данных (биржа может передавать и нулевую цену актива и пустые значения, робот при этом не должен «падать» и выдавать баги). Плюс, робот на LUA подключается непосредственно в QUIK, имеет высокое быстродействие, не занимает много ресурсов компьютера и не требует ежемесячной абонентской платы.

Рентабельно ли разрабатывать таким образом роботов за 800 рублей или даже за 3-5 тыс.рублей? Конечно же нет.
Что за такие цены могут предложить на рынке? Только скачанный где-то непонятный скрипт с сомнительной документацией и конечно без качественной техподдержки. Бесплатный сыр мы все знаем где бывает. Да и скупой платит дважды.

Нужно ли платить разработчикам роботов или нет, каждый решает для себя сам. Можно и не платить, а взять и методично, по пунктам, всё сделать самостоятельно. Сколько уйдет на это времени? И какой будет конечный вариант? Зависит непосредственно от опыта, знаний и умений конкретного человека.
Чем больше у человека опыта в программировании, в трейдинге, в автоматизации бизнес-процессов, в тестировании, в умении оптимизировать стратегии, тем быстрее и качественнее будет результат. Если вы начинающий алготрейдер и у вас нет наставника с его опытом и наработками, то настраиваться сразу желательно на 6 месяцев работы и более.
Профессиональный алготрейдер может передать знания по созданию прототипов, тестированию на истории и оптимизации роботов за более короткий срок. И это будет скорее всего платная услуга.

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

По различным вопросам обращайтесь в личку или на почту:
mail@robot-scalper.ru

Очень много интересной и важной информации можно найти здесь:
https://www.instagram.com/robot_scalper/

Наш сайт: Robot-Scalper.ru

Желаем Вам успехов в трейдинге!
Берегите себя и свой депозит!

  • хорошо

  • 18

Как и многие другие, я начинал свою работу в качестве трейдера с торгового терминала Metatrader4. И когда у меня созрела необходимость в написании собственных скриптов и советников (торговых роботов), я не мудрствуя лукаво открыл учебник по MQL4 и изучив основы этого языка, через пару часов уже мог состряпать простую программку.

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

Для чего я вам все это рассказал? Дело в том, что никакого особого опыта в программировании, кроме школьных уроков информатики у меня до этого не было. А это означает, что для того, чтобы справиться с этим делом вовсе не обязательно быть программистом.

Если же у вас за плечами уже есть какой-либо опыт программирования на любых языках, то данная задача вам покажется элементарной. Уверяю вас, так оно на самом деле и есть, на деле здесь всё оказывается куда проще и стоит только начать, как вы незаметно для себя уже превратитесь в матёрого создателя торговых роботов.

Как написать программу

В QUIK предусмотрена возможность установки двух основных типов программ скриптов и торговых роботов:

  1. Программ написанных на языке QPILE;
  2. Программ написанных на языке программирования LUA.

На мой взгляд, наиболее простым вариантом является работа с программами на языке 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, без установки каких-либо специализированных редакторов. Вы можете писать и редактировать программу прямо в текстовом файле.

Для этого сначала создаёте обычный текстовый файл:

Открытие текстового документа

Затем сохраняете его изменив расширение с .txt на .lua. Для этого необходимо проделать следующий ряд нехитрых манипуляций:

  • В меню текстового документа “Файл” необходимо выбрать пункт “Сохранить как”
  • В выпавшем окне сохранения нужно вместо расширения “Текстовый документ” выбрать расширение “Все файлы”
  • К названию сохраняемого документа добавить .lua
  • Нажать кнопку “Сохранить”
Сохранение файла lua

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

Ошибка в скрипте LUA
После запуска программы терминал показывает в ней ошибку

После этого достаточно будет её отредактировать и запустить вновь. В том случае, если ошибок больше нет, окно “Ошибки выполнения скрипта” останется пустым, а программа начнёт работать (об этом будет свидетельствовать характерный значок “play” перед названием). После того, как заложенный в неё алгоритм отработает, она остановится. Если же она специально зациклена (работает на постоянное отслеживание текущей рыночной ситуации), то остановить её можно будет нажатием на кнопку “Остановить”.

Интерфейс окна LUA-скриптов в QUIK
Основной интерфейс

Как протестировать торгового робота

В Метатрейдере с этим делом всё обстоит довольно просто — запускаешь тестер стратегий, выбираешь временной интервал ценовой истории и вперёд. Тестер прогонит через загруженного в него торгового робота весь массив цен из заданного в настройках интервала и выдаст вам график прибыли/убытка которые были бы получены роботом при реальной торговле online. При этом у вас ещё будет возможность оптимизировать настройки тестируемого торгового робота таким образом, чтобы получить наилучший результат (наибольший профит), правда на всё том же ограниченном интервале истории.

В QUIK такого тестера априори не существует. То есть тестировать созданных роботов на истории вы здесь не сможете**, но оно, пожалуй, и к лучшему. Почему к лучшему? Излишняя оптимизация на истории может сыграть с вами злую шутку. Дело в том, что самые замечательные результаты торговли в прошлом никогда не гарантируют вам того же и в будущем. Часто бывает так, что стратегии “заточенные” (читай — оптимизированные) под определённый интервал времени в прошлом и приносящие на нём стабильно высокий доход, в реальном времени начинают откровенно сливать депозит.

Но не расстраивайтесь, торговых роботов для терминала QUIK вы сможете тестировать в реальном времени. Правда для этого вам потребуется так называемый демо-счёт (вы ведь не хотите, чтобы тестируемый советник принялся сразу же торговать реальными деньгами).

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

Учебный QWIK можно скачать у любого брокера, желательно у того, через которого вы планируете в дальнейшем торговать. Правда здесь возможны некоторые заморочки связанные с тем, что не всегда учебная версия данного торгового терминала позволяет работать со скриптами LUA.

Если та версия, которую предлагает ваш брокер не поддерживает возможножность установки и запуска LUA-скриптов, то можете установить демку от брокера БКС. Это не реклама, просто у меня стоит такая же и я точно знаю, что данная версия позволяет работать с любыми скриптами и советниками написанными на языке программирования LUA (QLUA).


** По крайней мере чистыми средствами QUIK, без использования какого-либо дополнительного софта.

Как установить LUA-скрипт в торговый терминал

Процесс установки торгового робота (скрипта) одинаков и для учебного, и для реального терминалов. Он довольно прост и выглядит следующим образом:

  1. Сначала заходите в верхнее меню терминала “Сервисы” и находите там кнопку “LUA-скрипты”:
Открытие окна LUA-скриптов в QUIK
  1. После нажатия на неё, перед вами появится уже знакомое вам окно “Доступные скрипты”. Жмём кнопку “Добавить” и в выпавшем окне выбираем созданный вами файл торгового робота или скрипта.

Вот и всё, на этом процесс установки торгового робота закончен. Для того, чтобы он начал работать достаточно выбрать его кликом мышки и нажать кнопку “Запустить”. Если в программе не будет обнаружено ошибок, то она начнёт работать, а иначе выдаст вам соответствующее сообщение (см. выше).

Вы можете поделиться этой статьёй на своей странице в соцсетях:

  • Categories
  • Tags
  • Related Articles
  • Author

запуск-первого-скрипта-в-КВИК

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

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

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

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

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

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

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

Далее в меню NotePad нажимаем кнопку «Файл»«Сохранить как».
сохранить-как-_скрипт-в-notepad

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

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

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

function main()
  message("Запущен мой скрипт");
end

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

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

луа-скрипт

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

открыть-скрипт-квик

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

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

Окно-с-неправилным-сообщением-квик

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

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

Окно-с-правилным-сообщением-квик

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

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

Кодировка-в-ANSI

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



Цитата
ЛуаСкрипт написал:
Возникают проблемы с производительностью, стабильностью работы роботов и самого QUIK

Это зависит от квалификации программиста, а не от наличия/отсутствия примеров.
Lua придумали не мы и существует он очень давно. Что мешает посмотреть алгоритмы на не связанных с QUIK ресурсах, посвященных Lua?
И не надо говорить про «специфику», вся специфика относящаяся непосредственно к QUIK уже миллион раз обсуждалась еще со времен QPILE и с тех пор мало что изменилось.
И даже более того, 99% вопросов по «специфике», вообще никак не относятся к программированию на Lua, а относятся к функционалу самого терминала QUIK.
А функционал самого терминала QUIK должен быть Вам хорошо известен до того как Вы возьметесь программировать.

Цитата
ЛуаСкрипт написал:
Проблема — нет эталонного торгового робота от разработчиков

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

Цитата
ЛуаСкрипт написал:
2. проблема — нет типового способа получения данных их QUIK

Что значит «типового»? Вот мы считаем что все имеющиеся способы (DDE, ODBC, QLUA) являются типовыми.

Цитата
ЛуаСкрипт написал:
и передачу заявок обратно

тот же комментарий, мы считаем имеющиеся способы «типовыми».

Цитата
ЛуаСкрипт написал:
как передавать данные из QUIK в EXCEL

Что тут писать если есть DDE?
А в Excel есть VBA.
А дальше куда угодно.

Цитата
ЛуаСкрипт написал:
принимающий кода на VBA для MS Excell

такой пример уже есть, см примеры для Trans2quik

Цитата
ЛуаСкрипт написал:
также самый простой контроль выполнения заявок

что такое «контроль выполнения заявок»? Если интересует как получить данные то уже было отвечено выше. Если интересует как считать состояние портфеля, то формулы можно посмотреть в документации на терминал.

Цитата
ЛуаСкрипт написал:
запись логов.

запись в файл, это штатный функционал Lua, посмотрите его документацию, функция io.open

Цитата
ЛуаСкрипт написал:
3. Если вы сделаете штатный способ прикрутить Python 3 к QUIK — вообще будет супер!!

а почему Python? Вот лично Вам он нравится и удобен, а вот лично мне нет, теперь все языки поддерживать? Простите но нет.
И наша позиция относительно универсального API однозначна, для таких целей существует FIX адаптер. Да он платный, бесплатного аналога нет и не будет.

Если робот остался в длинной позиции, указываем L_Pos = true, а S_Pos = false  и наоборот, если в короткой позиции, то указываем S_Pos = trueL_Pos = false. Если без позиции, указываем falsefalseЭти действия удобно делать, просто комментируя не нужные строки кода.  

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

Давайте поясню понятие Транзакция. Транзакция — это процесс отправки заявки на биржу. В момент транзакции отслеживается корректность параметров заявки, и проверяются доступные лимиты по объемам заявки. При отправке транзакции могут возникать два вида ошибок на двух разных этапах. Первый этап, на котором могут возникать ошибки, это в момент вызова функции sendTransaction  эта функция отправляет транзакцию на сервер брокера. На этом этапе, ошибки отслеживаются терминалом QUIK, и все они связаны с корректностью составленной таблицы с параметрами заявки. Какие это могут быть ошибки, например, не указали, объем заявки или не указан торговый счет, т.е. это ошибки в коде скрипта. Второй этап, на котором могут возникнуть ошибки, из-за которых заявка не будет выставлена на бирже, это этап проверки параметров заявки в торговой системе. Этот этап наступает после того как терминал QUIK принял Вашу транзакцию и отправил ее дальше. Тут могут возникнуть ошибки следующего характера. Например, превышен допустимый объем заявки или указана цена, которая выше или ниже максимально возможной цены или заявка выставляется в момент отсутствия торгов. 

Ошибки первого этапа возникают только во время первичных, тестовых торгов роботом. После того как скрипт отлажен, ошибок этого типа не бывает. Ошибки второго этапа могут появляться в независимости от кода скрипта, но опять же при хорошем коде, в котором исключены моменты, при которых ошибка теоретически возможна, появление ошибки второго этапа сведена к минимуму. На самом деле остается одна единственная ситуация, при которой появление ошибки второго этапа возможна – это обрыв связи с сервером в момент, когда транзакция принята терминалом QUIK, но не дошла до сервера брокера. К счастью, это исключительно редкая ситуация, я бы сказал больше — теоретическая. По транзакциям пока все, пойдем дальше. 

Наш робот действует не молча, он постоянно записывает свои действия и параметры в указанные файлы. На каждой свече робот записывает текущие параметры  — Дата, Время, Цена закрытия, Значение скользящей средней, Ускорение, Текущая позиция лонг – шорт. Эти данные помогают отследить возможные ошибки в направлении позиции или восстановить работу скрипта после, например, случайного закрытия терминала QUIK. 
Помимо текущих параметров, записываются и результаты транзакций. Всегда есть возможность посмотреть, когда робот совершал сделки и прочитать сообщение об ошибках, если таковые будут. 

Хорошо, что нам уже известно про алгоритм укорение скользящей средней? Мы подробно разобрали этот алгоритм, кода тестировали его на исторических данных. Скрипт торгового робота и скрипт тестирования очень похожи. Оба этих скрипта получают данные, тестовый  скрипт считывает данные из файлов, торговый скрипт считывает данные с графиков QUIK. Далее оба скрипта выполняют одинаковые действия, рассчитывают параметры индикаторов и отслеживают условия для входа в позицию или выхода из нее. Различия, в действиях начинаются после того, как выполняются условия входа или выхода. Тестовый скрипт просто записывает данные, а торговый скрипт отправляет транзакцию на сервер 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 не воспринимается.

--[[  Многострочные комментарии располагаются между символами двух дефисов и квадратных скобок  ]]--      
Settings=              
        {                          
            Name = "Channel",           -- название индикатора
            period=5,                   -- параметр индикатора                          
            line=                                     
                {                               
                    {  
                        Name = "High",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(120,90, 140)
                    },
                    {
                        Name = "Low",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(120,90,140)
                    }
                }
       }

Здесь мы описали массив настроек, ввели название индикатора, параметры описали параметры двух линий индикатора Именно эти параметры будут доступны в пользовательском индикаторе для изменения при загрузке индикатора на Qlua в Quik

Настройка индикатора в Quik

  • (1)Название индикатора
  • (2)Установка значения для переменной period
  • (3)Установка цвета по умолчанию для линии High
  • (4)Название линии индикатора , которое мы прописали в ячейке «line» нашего листа настроек
  • (5)Тип линии который мы установили для использования по умолчанию Type =TYPE_LINE
  • (6)Толщина линии индикатора Width = 1
function
Init()
            return 2
end
-- выводить на график будем две линии
 
--[[
В функции OnCalculate
мы рассчитаем индикатор Price Channel – это две линии построенные по
экстремумам значений свечей за определенное количество баров. То есть первое
значение, которое будем рассчитывать это максимальное значение за period в
нашем случае он равен пяти, а второе значение, которое будет возвращать функция
это минимальное значение за period. Итак приступим к расчету.
]]--

function OnCalculate(index)
    local high=0
    local low=0
    Period = math.floor(Settings.period)

    if index<=Period then
       high=H(index)
       low=L(index)
       for i=index , 1 , -1 do
           if H(i)>high then high=H(i) end
           if low>L(i) then low=L(i) end
       end
    else
       high=H(index)
       low=L(index)
       for i=index , (index+1)-Period , -1 do
           if H(i)>high then high=H(i) end
           if low>L(i) then low=L(i) end
       end
    end
    return high , low
end

Создаем в редакторе файл с расширением lua записываем в него код и сохраняем его в папке LuaIndicators , после этого у нас появится новый индикатор и его можно будет добавить к себе на график как стандартный индикатор Quik (1)

Пользовательский индикатор на QLua

Ссылка для скачивания исходного кода индикатора на QLua

4. Написание робота на QLua под Quik

Написание торгового робота на QLua ведется в обычном текстовом редакторе, так же как и для написания индикатора. Отличие будет в структуре кода и в том, что располагать робот можно в любом удобном для вас месте на компьютере. В роботе является обязательной только одна функция main.

И так приступим. Напишем робота с простым алгоритмом. Рассчитаем внутри робота скользящую среднюю и будем принимать решение о покупке/продаже одного лота по инструменту исходя из количества в клиентском портфеле при закрытии прошлого бара ниже/выше среднего значения посчитанного по закрытию минутных баров инструмента. То есть при пересечении close бара средней снизу вверх проверим количество контрактов в портфеле по инструменту, и если оно меньше одного , то докупим разницу до одного контракта в лонг. Обратная ситуация при пересечении close закрытого бара среднего значения сверху вниз. Отправим транзакцию для получения одного лота в шорт по клиентскому портфелю.

-- переменная для прырывания цикла при срабатывании функции обратного вызова OnStop

is_run = true

-- присванивание переменным начальных базовых значений торгового алгоритма

Account = "NL0011100043"     -- торговый счет
Class_Code = "QJSIM"         -- класс торгуемого инструмента
Sec_Code = "SBER"            -- код торгуемого инструмента
TF = INTERVAL_M1             -- торговый таймфрейм
g_lots = 1                   -- количество торгуемых лот

function main()
    -- подписываемся на получение данных свечей по инструменту в массив ds
    ds = CreateDataSource(Class_Code, Sec_Code, TF)
    while is_run do
          sleep(1000)            -- обрабатываем цикл с задержкой 1сек.
          ds:SetEmptyCallback()  -- обновляем данные по инструменту в массиве ds
          local serv_time=tonumber(timeformat(getInfoParam("SERVERTIME"))) -- помещене в переменную времени сервера в формате HHMMSS                  
          if isConnected()==1 and serv_time>=10000 and serv_time<235000 then -- проверка наличия соеденения с сервером и поподания в торговое окно
             -- место для размещения торговой логики
             -- расчет значения скользящей средней
             local SMA = 0
             local period = 20
             local count_candle = ds:size()
             if count_candle>20 then
                local sum = 0
                for i=0 , period-1 do                                                  
                    sum = sum + ds:C(count_candle-i)
                end
                SMA = sum / period
                local lots = get_lots()             

                -- получение количества лот в клиентском портфеле по инструменту
                if ds:C(count_candle)>SMA and lots<g_lots then
                    -- получение минимального шага цены для организации величины проскальзываня в ордере
                    local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
                    local price_order = ds:C(count_candle)+(step*20)
                    -- цена для ордера будет = цена закрытия + 20-ть минимальных шагов инст.
                    send_order("B", math.abs(g_lots-lots) , price_order)
                end
                if ds:C(count_candle)<SMA and lots>(g_lots*(-1)) then
                    -- получение минимального шага цены для организации величины проскальзываня в ордере
                    local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
                    local price_order = ds:C(count_candle)-(step*20)    
                    -- цена для ордера будет = цена закрытия - 20-ть минимальных шагов инст.
                    send_order("S", math.abs(g_lots+lots) , price_order)
                end
             end                  
           end
    end
end 

-- функция возвращает количество лот в клиентском портфеле по заданному инструменту
function get_lots()
    local lots = 0
    local n = getNumberOf("futures_client_holding")
    local futures_client_holding={}                    
    for i=0,n-1 do             
       futures_client_holding = getItem("futures_client_holding", i)
       if tostring(futures_client_holding["sec_code"])==Sec_Code then
          lots=tonumber(futures_client_holding["totalnet"])
       end
    end      
    return lots
end
----------------------

-- отправка транзакции
function send_order(operation, quantity, price)       
    -- получение минимального шага цены для округления цены отправляемого ордера
    local step=tonumber(getParamEx(Class_Code, Sec_Code, "SEC_PRICE_STEP").param_value)
    local trans_params = 
          {
            CLIENT_CODE = Account,
            CLASSCODE = Class_Code,
            SECCODE = Sec_Code,
            ACCOUNT = Account,
            TYPE = "L",
            TRANS_ID = tostring(1),
            OPERATION = tostring(operation),
            QUANTITY = tostring(math.abs(quantity)),
            PRICE = tostring(math.floor(tonumber(price)/step)*step),  -- округление цены при отправлении транзакции
            ACTION = "NEW_ORDER" 
          }
    local res = sendTransaction(trans_params)
    if string.len(res) ~= 0 then
        message('Error: '..res,3)
        return 0
    else
        return trans_id
    end      
end

function OnStop(stop_flag)              
     is_run=false
     stop_flag=1
     ds:Close() 
end


function timeformat(time_unf)
     local in1, in2=0,0
     local time_form=0      
     in1=string.find(time_unf,":" , 0)
     if in1~=nil and in1~=0 then
        in2=string.find(time_unf,":" , in1+1) 
        time_form=string.sub(time_unf, 0 ,in1-1)..string.sub(time_unf, in1+1 ,in2-1)..string.sub(time_unf, in2+1 ,string.len(time_unf))
     end
     return time_form
end

После редактирования кода сохраняем его в удобном для вас месте с расширением lua. Для запуска робота надо зайти в Сервисы ->Lua скрипты


Запуск робота на QLua

  • (1)Добавляем скрипт из сохраненнго места
  • (2)Проверяем его появление в таблице запущенных скриптов, после запуска появится зеленая стрелка индицирующая работу скрипта
  • (3)Запускаем его в работу
  • (4)Проверяем в поле отсутствие ошибок при работе

Ссылка для скачивания исходного кода робота на QLua

5. Заключение

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

В рамках торгового робота написанного как пример выше, мы получили готовую механическую торговую систему в сто строк кода. Что является очень хорошим результатом.

Для написания индикаторов в Квик, Qlua является единственно возможным вариантом.

В общем — торгуйте алгоритмами. Используйте хорошие технологии!

Создание Торгового Робота – одно из направлений компании “KBrobot$”

Как разработать, создать (написать код) Торгового Робота для терминала QUIK, Метатрейдер 5 или любой другой торговой платформы, на которой Вы торгуете на бирже?

Насколько сложен сам процесс разработки и создания Торгового Робота или это под силам каждому начинающему трейдеру? Давайте попробуем ответить на эти вопросы подробнее.

Чтобы достигнуть поставленной задачи, необходимо придерживаться общей схемы создания Торгового Робота

СХЕМА РАЗРАБОТКИ ТОРГОВОГО РОБОТА

Этапы разработки торгового робота

  • Наличие прибыльного торгового алгоритма является ключевым и важнейшим фактором Вашего успеха! Именно торговый алгоритм является основным ядром в приведенной выше схеме по разработке и созданию Торговых Роботов. Откуда эти алгоритмы берутся? Это могут быть полезные идеи или советы других опытных трейдеров. Или появиться в результате вашего личного опыта торговли и наблюдения за поведением и закономерностями биржевого рынка.
  • На втором этапе Вам нужно Ваши идеи и наблюдения проанализировать и представить в виде некого промежуточного этапа: технического задания, которое уже будет понятно для программиста и позволит описать закономерности рынка и Ваши наблюдения представить математически и графически. Как показывает опыт, очень удобно, когда Ваши сигналы на открытие позиции или формации рынка представлены графически. Это упрощает создание и разработку Торгового Робота на следующем этапе.
  • Третий этап: создание кода Вы можете сделать самостоятельно (если владеете языком программирования для Вашей торговой платформы) или поручить проверенным программистам, которые знакомы с биржевым рынком. Важно, чтобы разработчики кода уже имели опыт написания программ для биржевой торговли и имели опыт работы с различными форс мажорными факторами, которые могут возникнуть при дальнейшем использовании Торгового Робота.
  • Четвертый этап разработки и создания Торгового Робота обычно включает в себя тестирование сначала на Демо счете (если это возможно), а затем тестирование созданного Торгового Робота на реальных деньгах и счетах. Многие факторы, например, задержки котировок брокера, проскальзывание при выставлении заявок иногда удается оценить заранее, но проверить окончательно нужно уже на реальных счетах.

Проблемы разработки торгового робота

  • Вы что-то не учли в своем алгоритме при разработке Торгового Робота, а это окажется критически важным при торговле
  • Произошел сбой у Вашего брокера или на бирже, и созданный Торговый Робот совершил непредсказуемы действия
  • Кардинально изменился рынок и требуется вносить коррекции в алгоритм Торгового Робота
  • Появились неучтенные факторы, которые могут привести к сбою в работе созданного Торгового Робота: например, торговля вблизи планки (то есть минимальной и максимально возможной цены биржевого инструмента)

Чтобы пройти весь путь и добиться успеха потребуется слаженная команда трейдеров, программистов и математиков. Создание реальных прибыльных Торговых Роботов иногда занимает от нескольких месяцев до нескольких лет.

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

Взаимойдействие при создании торгового робота на заказ

  • Вы присылаете нам предварительный алгоритм Торгового Робота, который планировали реализовать. На этом этапе Вы можете не раскрывать всех секретов и тонкостей вашего будущего Робота, а нужна общая схема, чтобы оценить наши необходимое на разработку время.
  • После получения предварительного алгоритма, мы приблизительно оцениваем стоимость Робота, определяем возможность написания данной программы и определяем платформу, которая позволяет наиболее эффективно реализовать ваш алгоритм. Если Вас устраивает цена и оговоренные сроки исполнения, то Вы делаете 50% предоплату, мы включаем в план разработок ваш заказ и приступаем к следующему этапу
  • После этого, если еще остались какие-то технические вопросы по вашему алгоритму, то мы их уточняем и приступаем к работе. Желательно, если есть графические рисунки сигналов, то лучше их предоставить. Как показывает практика, не всегда просто словами описать сигналы, которые Вы хотите использовать в трейдинге.
  • После того, как Робот будет готов и пройдет у нас этап тестирования, Вы полностью оплачиваете заказ и получаете готовую программу для проверки. На этом этапе вы можете внести коррективы, если возникли какие-то отклонения от оговоренного алгоритма. Все доработки делаются бесплатно.
  • Процесс разработки Робота занимает, как правило, от 1 до 2 недель в зависимости от сложности алгоритма. Плюс 1 неделя на исправление замечаний (если они возникли).
  • Вы получаете пожизненную гарантию на нашу программу и техподдержку.

У Вас есть хороший алгоритм?

Вы приняли решение разработать и создать Торгового Робота?

…пишите нам на [email protected].

Мы согласуем с Вами все детали будущего Торгового Робота и поможем его создать!

Если Вы еще недавно в трейдинге и еще не определились с собственным алгоритмом, то рекомендуем воспользоваться уже готовыми Роботами, представленным на нашем сайте

Понравилась статья? Поделить с друзьями:
  • Как написать торгового робота mt4
  • Как написать тонометр
  • Как написать тому фелтону чтобы он ответил
  • Как написать тому кто нравится
  • Как написать тому кому давно не писал