Market Vectors / Financial One

Пишем робота “по шагам”: Шаг 1

18222

[Евгений Ерошкин, частный инвестор]

F&O №8-9, 2011

На чем пишем?

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

Плюс этого языка состоит в том, что он прост и интегрирован непосредственно в терминал Quik [1], что повышает надежность связки «Терминал-Робот». Из минусов можно выделить отсутствие интерфейса взаимодействия с пользователем (то есть программу можно запустить и остановить, но управлять ею в процессе работы нельзя). Также проблематично на Qpile обрабатывать большие массивы данных, что накладывает ограничение на создание механических систем для работы с большим количеством входных параметров. Но для реализации простых стратегий функционала этого языка вполне достаточно.

С чего начать?

Робот – это программный код, который можно набрать в любом текстовом редакторе, даже в «Блокноте» стандартного пакета Windows. Однако удобнее его писать в специализированных редакторах. В них автоматически нумеруются строки и подсвечиваются операторы, что улучшает восприятие кода и упрощает его отладку. Наиболее распространены редакторы «Notepad + +» и «SciTE», они бесплатны, и для них можно найти модули для корректной подсветки синтаксиса Qpile. Есть также специализированный редактор «Qpile Master 1.2», который в бесплатном варианте имеет ограниченный функционал.

Стратегия и инструмент

Любой робот работает по заранее заданному алгоритму, который является логическим воплощением торговой стратегии. Cтратегия является самой важной частью любого автомата (хотя по объему может занимать небольшую часть кода). Ее выбор – основополагающий этап для построения любой торговой системы, именно она делает одну систему прибыльной, а другую убыточной при прочих равных условиях. Вопросу выбора стратегии посвящено немало книг [2,3]. Целью данного цикла статей является процесс написания робота, который самостоятельно принимает решения о покупке/продаже, выставляет заявки и проверяет их исполнение (но не гарантируется, что он обязательно окажется прибыльным). Какой алгоритм выбрать для торговой системы, каждый трейдер решает сугубо индивидуально. Мы же рассмотрим одну из самых простых стратегий – торговлю в канале. Ее алгоритм прост: если цена ниже определенного уровня, покупаем, а если выше – продаем. Если котировки выходят за пределы канала в невыгодном для нас направлении, фиксируем убытки.

В качестве рабочего инструмента используем фьючерс на обыкновенные акции Сбербанка. На момент написания статьи ближайшими контрактами были SRU1 (исполнение 14 сентября 2011 года) и SRZ1 (исполнение 14 декабря). Этот инструмент хорош тем, что характеризуется высокой ликвидностью и небольшим размером гарантийного обеспечения (1700 рублей на момент написания статьи). То есть, если мы будем торговать одним контрактом и закрывать позицию в случае убытка, даже в худшем случае это не приведет к существенным финансовым потерям. Но не следует забывать, что фьючерс имеет ограниченный срок жизни и вхождение в позицию незадолго до исполнения увеличивает риск возможных потерь. Для покупки и продажи выберем уровни 8500 и 9100 рублей (см. рис. 1).

Рис. 1 Динамика сентябрьского фьючерса на обыкновенные акции ОАО «Сбербанк России»

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

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

Шаг 1

Итак, стратегия и инструмент определены. Открываем редактор и начинаем писать код. Любая программа на Qpile должна содержать одну таблицу для вывода данных, как минимум, с одним столбцом. Для начала напишем код, состоящий всего из одного оператора. Он будет выводить в таблицу текущее время сервера (см. код «Время сервера»).

После того, как код написан, сохраняем файл с расширением *.qpl, затем в терминале Quik открываем пункт меню «Таблицы->Портфели->Задать портфель» (программы в Quik именуются портфелями) или нажимаем клавиши Ctrl+F10. Выбираем наш файл, кликаем на кнопке «Открыть», «Загрузить локально», а затем «Выход» (см. рис. 2).

Рис. 2 Пункты меню для загрузки и запуска программ Qpile

Наша программа загружена! Все портфели в Quik работают в циклическом режиме с заданным периодом, который по умолчанию равен 10 секундам. Чтобы уменьшить его, необходимо сделать соответствующие настройки: открываем пункт меню «Таблицы->Портфели->Доступные портфели» (или Ctrl+F11), выбираем наш портфель и ставим период расчета 1 сек (это минимальное значение), после чего сохраняем изменения. Эту операцию не надо проводить каждый раз, установленное значение сохраняется для каждого загруженного портфеля отдельно. Чтобы запустить программу, в меню находим «Таблицы->Портфели->Просмотр портфеля» (или Ctrl+F12), выбираем наш портфель, а в «Доступных параметрах» - «Добавить все». После клика на кнопке «Да» программа начинает работать, и появляется наша таблица. Если в коде есть явные ошибки, будет выдано сообщение с их описанием и номером строки кода. Если ошибки не явные (например, логические), то сообщение может и не появиться, но данных в таблице не будет. В этом случае программу можно запустить в режиме отладки. Кликаем по нашей таблице правой кнопкой мыши и выбираем «Начать расчет в режиме отладки». По шагам можно отследить ход выполнения программы и значения переменных. Если код достаточно длинный, для отладки можно использовать функцию BREAKPOINT(), которая останавливает выполнение программы в заданной точке и запускает режим отладки. Если все сделано правильно, в нашем случае появится таблица с одним столбцом «TIME» и текущим временем сервера, к которому подключен терминал (см. рис. 3). Чтобы остановить программу, достаточно закрыть окно с таблицей.

Рис. 3 Программа, выводящая текущее время сервера

Шаг 2

Теперь, когда первая программа заработала, начинаем ее усовершенствование: будем получать текущие цены спроса/предложения по выбранному инструменту, значения наших уровней, название инструмента и время до исполнения в днях. Все эти данные так- же выведем в таблицу (см. код «Инструмент»). Загрузим программу в Quik и запустим ее. Если все реализовано без ошибок, мы получим следующую таблицу (см. рис. 4).

Рис. 4 Вывод параметров инструмента в таблицу

Скачать код

У нас есть все необходимые данные, поэтому остается лишь сравнивать текущие цены с нашими уровнями. Если цена спроса выше верхнего уровня, это сигнал к про- даже, если предложение ниже нашего нижнего уровня, необходимо осуществить покупку. Оформим эту логику в коде (см. код «Сравнение», приведено только тело основной программы).

Теперь наша программа будет выводить сообщения, если цены выйдут за пределы канала. Однако они будут появляться при каждом цикле выполнения программы, то есть раз в секунду, что неудобно в работе. Заменим наши операторы сообщений на приведенные ниже строки.

' Если цена спроса выше уровня HI, надо продавать

IF PriceBid >= HiLevel SERVER_TIME ="SELL"

END IF

' Если цена спроса ниже уровня LOW, надо покупать

IF PriceOffer <= LowLevel SERVER_TIME = "BUY"

END IF

В этом случае сигналы на покупку/продажу будут выводиться, но в столбец «TIME» таблицы.

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

Не рекомендуется сразу пытаться торговать с помощью робота на реальном счете (особенно в начале пути приобретения опыта написания программ), поскольку даже при потенциально прибыльной стратегии возможны ошибки в коде, которые, в свою очередь, могут привести к серьезным потерям (допустим, выставляется заявка с неправильной ценой и/ или объемом) вплоть до обнуления счета. Целесообразно для отладки кода использовать демо-счет.

Скачать код Инструмент

Скачать код Сравнение

Литература:

1. А. Н. Пашаев, А. Ю. Ермошин, О. И. Малинкин, А. В. Морев, «Торговые системы Quik и NetTrader. Как начать», Омега-Л, 2007 г.

2. Ричард Вайсман, «Механические торговые системы. Психология трейдинга и технический анализ», Альпина Паблишер, 2011 г.

3. Джеффри Оуэн Кац, Донна Л. Маккормик, «Энциклопедия торговых стратегий», Альпина Бизнес Букс, Альпина Паблишер, 2007 г.

Понятия:

Qpile (ProgrammableInterfaceandLogicEnvironment)– бейсикоподобный язык, который имеет в своемарсенале операторы для получения данныхиз терминала Quik и отправки заявок.

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

Торговая сессия– период времени, в течение которого проводятся торги на бирже.






Вернуться в список новостей

Комментарии (0)
Оставить комментарий
Отправить
Новые статьи