Заметка

Среднесрочная система для пары доллар-рубль. Часть 2. Разработка робота на QPILE

  2  

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

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

Еще раз, хотелось бы напомнить о торговом алгоритме:

Вход в лонг: пробой наибольшей из N предыдущих свечей относительно текущей внутри дня, с 11,00 до 18,45

Управление позицией: позиция закрывается либо по стоп-лосу, либо в 23,30 в в пятницу.

Стоп-лосс:

Для позиции лонг, минимум из двух значений:

1) stopLoss1 = high

2) stopLoss2 = Close[bar] / 100 * (100+stopLossPercent)

где, stopLossPercent = 0.4 % — оптимизируемый параметр, максимальный риск на сделку.

Условия входа в шорт противоположные.

Вначале хотелось бы описать структуру файлов робота. Самого робота я назвал BEC (Break Extremum Candles):

  1. robot_bec.qpl             -           главный файл торгового робота
  2. strategy_func.qpl       -           файл с функциями специфичными для данного робота
  3. func.qpl                      -           файл с функциями, облегчающими работу с языком QPILE, эти функции так или иначе очень часто применяются для разработки любого робота
  4. config.qpl                   -           конфигурационный файл
  5. data.txt                       -           файл, хранящий позицию и цену входа в сделку
  6. log.txt                         -           файл, хранящий действия робота, в том числе и его ошибки

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

 

Рис. 1. Алгоритм торгового робота

Со входом в позицию, при реализации, проблем не должно возникнуть, т.к. работа происходит на стандартном механизме транзакций, о которых можно почитать непосредственно в документации к QUIK. Выполнение функции осуществления сделки вынесено в отдельную функцию createOrderByMarket(), которая описана в файле func.qpl. В качестве параметров в этой функции выступают operation – тип операции "B" или "S" (Покупка или продажа соответственно), shareCount – количество лотов для покупки.

Хотелось бы отметить методику определения количества открытых позиций. На самом деле это один из тонких моментов терминала. Дело в том, что в документации рекомендуется использовать функцию Qpile для получения открытых позиций по фьючерсу — GET_ITEM(«FUTURES_CLIENT_HOLDINGS», index). Однако, эта функция работает очень медленно, т.к. получает информацию от биржи, а не рассчитывается в терминале. Содержание таблицы ограничений по клиентским счетам транслируется с биржи, Quik лишь отображает переданную информацию.

Разработчики  QUIK рекомендуют следующее решение:

Алгоритм следующий (для решения описанной задачи — «Как определить, что определенная заявка исполнилась в текущий момент времени и каков объем позиции после исполнении данной заявки?»). Если Вас интересует процесс исполнения заявок, то смотреть надо только на сделки (а не на статусы заявок или на лимиты/позиции). Именно факт сделки сигнализирует о том, что произошло исполнения на определенный объем (указанный в сделке) по определенной заявке (номер указан в сделке). Чтобы узнать объем позиции оставшийся после исполнения данной сделки следует до начала обработки сделок в своей системе получить начальное значение позиции, а затем его самостоятельно расчитывать/корректировать по каждой сделке. То есть, единственный способ синхронизировать исполнения и размер позиции — это расчитывать размер позиции по сделкам самостоятельно в своей системе, а не получать его извне.

Поэтому, для себя определил два возможных вариантов решения:

1) ввести задержку при расчете портфеля

2) перебрать все сделки робота и так образом определять количество открытых позиций

Как более простой вариант, это введение задержки при получении количества сделок, на чем я остановился.

Отдельно стоит уделить внимание функции управления позицией managePosition (Рис. 2).

 

Рис. 2. Управление позицией

Прежде чем запускать робота, нужно отредактировать конфигурационный файл. Необходимо указать корректные номера счета, код инструмента, установить проскальзывание и другие служебные переменные в файле config.qpl.

Загрузка робота в QUIK происходит с помощью стандартных действий. Для этого выбрать в меню – Таблицы – Портфели – Задать портфель, затем выбрать Таблицы – Портфели – Просмотр портфеля, и выбрать загруженный скрипт RobotBEC (Рис. 3, Рис 4).

 

Рис. 3. Загрузка робота

 

Рис. 4. Внешний вид робота

Безусловно, использование языка программирования QPILE может быть немного затратным в силу ограничений языка. Поэтому использовать его или не использовать – дело каждого разработчика. С момента появления новых инструментов для разработки роботов появилась возможность использовать более совершенные инструментов, такие как LUA (встроенного в QUIK), программы для создания и тестирования роботов TradeMatic и др. Но, тем не менее, практика программирования роботов и торговых систем важна, и стоит применять именно необходимый наиболее подходящий для решения задачи, инструмент. В данном случае мы использовали язык QPILE и разработали робота, который стабильно работает на валютной паре доллар-рубль.

Прикрепленные файлы

·   robot.rar

Комментарии

ctacrs — 24 апреля 2014 г.

а как с тейк-профитом быть?
когда фиксировать позицию?

0 +

Максим Милованов — 24 апреля 2014 г.

ctacrs, закрытие позиции происходит в пятницу в конце рабочего дня.

0 +

Максим Милованов — 24 апреля 2014 г.

ctacrs, Управление позицией: позиция закрывается либо по стоп-лосу, либо в 23,30 в в пятницу.

0 +

AlexVB — 24 апреля 2014 г.

Максим, добрый день. У меня возник один вопрос по переменной, которую вы используете в функции robot_bec.qpl Имеются переменные curTradesCount и tradesCount. curTradesCount получается как результат исполнения функции getTradesCount(secCode). А как расчитывается tradesCount я не нашел. По всей видимости после значение этой переменной должно быть равно curTradesCount полученному на предыдущей итерации? Не могли бы помочь прояснить данный нюанс.

0 +

Максим Милованов — 25 апреля 2014 г.

AlexVB, Да, действительно, в коде пропущена строчка после строки getServerTime():
tradesCount = curTradesCount 'Предыдущие значение открытых позиций

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

0 +

ctacrs — 25 апреля 2014 г.

на 5 минутках с фиксом 1 раз в неделю. это очень трендово. сейчас рынок колбасит во все стороны.
у меня только за сегодня 3 раза по стопу закрывалось.

0 +

Максим Милованов — 25 апреля 2014 г.

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

0 +

Максим Милованов — 25 апреля 2014 г.

ctacrs, проверил работу робота, действительно на недели был один стоп. Однако трендовое движение в четверг-пятницу было полностью взято. Проверьте, возможно, у вас настройки в файле config.qpl неверные.

0 +

DimonA — 23 мая 2014 г.

почему не скачать здесь? смс с кодом не присылают на скачку

0 +

orekton — 23 мая 2014 г.

DimonA, отключил подтверждение. качайте

0 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору