Лучший онлайн-брокер для работы на бирже
67,37
рейтинг
4 марта 2014 в 13:53

Разработка → How-to: Пишем торговых роботов на TradeScript tutorial

image

Тема создания механических торговых систем или попросту биржевых роботов вызывает на Хабре определенный интерес. Мы частенько освещаем теоретические аспекты алгоритмической торговли, но не так часто говорим о ее практической составляющей. Поэтому в сегодняшнем топике будут рассматриваться реальные примеры различных роботов, созданных с помощью скриптового языка TradeScript.

Введение


Для начала обратим внимание на инструменты, которые будут описываться в этом тексте. Итак, TradeSript – это векторный язык программирования, созданный американской компанией Modulus Financial Engineering специально для создания торговых роботов. Этот язык входит в пакет технологий, которые были лицензированы (OEM) нашей компанией для создания торговго терминала SmartX (подробнее о его создании можно почитать в этом топике).

Главный плюс TradeScript – это простота синтаксиса, который, тем не менее, позволяет описывать торговые стратегии любой сложности. В результате использовать его для создания роботов можно практически не имея опыта программирования. Если же такой опыт есть, то освоить язык можно буквально за полчаса.

Движок языка работает на стороне терминала и подключается в качестве плагина-расширения к SmartX. Помимо возможности собственно написания скриптов присутствует и возможность их тестирования в двух режимах: на реальных данных и на исторических.

image

В TradeScript существует много встроенных функций (примитивов), облегчающих написание скриптов. Например, вот так выглядит примитив TREND:

TREND(CLOSE, 30) = UP

Эта функция вернет значение Истина, если имеет место восходящий тренд – рассчитывается за последние 30 дней по ценам закрытия торговых сессий.

Благодаря тому что TradeScript – векторный язык, он реально удобен для описания торговых стратегий. Каждая операция здесь применяется сразу ко всему набору значений (вектору или полю). Это позволяет мыслить и оперировать категориями агрегатов данных, без необходимости использовать циклы или индивидуальные скалярные операции.

Например, чтобы рассчитать простую скользящую среднюю «срединной» цены акций за
последние 30 периодов при помощи обычного языка программирования типа BASIC, нуж-
но написать что-то типа:

For each symbol 

 For bar = 30 to max 

 Average = 0 

 For n = bar - 30 to bar 

 median = (CLOSE + OPEN) / 2 

 Average = Average + median 

 Next 

 MedianAverages(bar) = Average / 30 

 Next bar Введение в TradeScriptTM 10 

 Next symbol 


То есть, для описания простейшего действия, нужно “потратить” 9-10 строк кода. С помощью векторного языка можно управиться и с помощью конструкции вида:

SET MedianAverage = SimpleMovingAverage((CLOSE + OPEN) / 2, 30)

В общем, если МТС может быть выражена математическими формулами или может быть запрограммирована в каком-либо процедурном языке программирования, например, C++, VB или Java, Вы можете быть уверены, что эта МТСтакже может быть запрограммирована при помощи TradeScript.

А теперь перейдем непосредственно к написанию роботов.

Поехали


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

В общем случае робот или механическая торговая система (МТС) – это набор правил, которые определяют точки входа и выхода в позицию для конкретной ценной бумаги или финансового инструмента (фьючерса и т.п.). Обычно МТС включают один или несколько индикаторов, например, система основанная на пересечении скользящих средних (Moving Average Crossover) будет покупать если короткая скользящая средняя пересекает снизу-вверх длинную скользящую среднюю, и продавать, если пересечение идет в обратном направлении.

image

Скользящие средние бывают разной длины и типа (про индикаторы технического анализа мы сделаем отдельный пост), от которых зависит число генерируемых торговой системой сигналов. Более короткие скользящие средние (MA – Moveing Average) генерируют больше сигналов, поскольку пересекаются чаще. Соответственно, и число «ложных» сигналов в их случае гораздо выше, поэтому необходимо искать баланс между ложными сигналами и упущенной прибылью.

Одним из решений этой проблемы может быть использование какого-то второго индикатора для фильтрации сигналов входа/выхода. Для выхода, в частности, часто используют параболическую систему (Parabolic SAR). В скрипте ниже для входа используется 20/60 EMA, а для выхода – параболическая система.

Buy Signals 

# 20-периодная EMA пересекает снизу-вверх 60-периодную EMA 

CROSSOVER(EMA(CLOSE, 20), EMA(CLOSE, 60)) 

Sell Signals 

# 20-периодная EMA пересекает сверху вниз 60-периодную EMA 

CROSSOVER(EMA(CLOSE, 60), EMA(CLOSE, 20)) 

Exit Long 

# Цена закрытия пересекает снизу-вверх Parabolic SAR 

CROSSOVER(CLOSE, PSAR(CLOSE, 0.02, 0.2)) 

Exit Short 

# Цена закрытия пересекает сверху вниз Parabolic SAR 

CROSSOVER(PSAR(CLOSE, 0.02, 0.2), CLOSE)


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

image

В такие моменты часто на открытии рынка подается много приказов на покупку, в результате чего акция может быть переоценена. За этим часто следует корректировка цены вниз – описанная ниже торговая система учитывает тот факт, что момент разворота обычно возникает в течение первого часа торгов. То есть, если разрыв не будет “закрыт” в течение первого часа, то можно предполагать, что покупка, с большей вероятностью, продолжится.

Наш скрипт возвращает акции, которые имели гэп не менее 2% и закрылись близко к
максимуму. Стратегией на следующий день может быть покупка после первого часа тор-
гов, если акция остается сильной. Стоп-лосс следует установить на минимуме дня. Консервативной целью прибыли может быть ½ гэпа — 1% в нашем случае.

Buy Signals 

# Имеет место не менее чем 2% гэп вверх на высоком объеме 

LOW > REF(HIGH,1) * 1.02 AND 

VOLUME > SMA(VOLUME, 5) * 2 

Sell Signals 

# Имеет место не менее чем 2% гэп вниз на высоком объеме 

HIGH < REF(LOW,1) * 0.98 AND 

VOLUME > SMA(VOLUME, 5) * 2 

Exit Long 

Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс. 

Exit Short 

Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс


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

image

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

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

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

Buy Signals 

# Покупаем, если предыдущее значение было ниже нижней полосы, а сейчас выше 

SET Bottom = BBB(CLOSE, 20, 2, EXPONENTIAL) 

SET Top = BBT(CLOSE, 20, 2, EXPONENTIAL) 

((REF(CLOSE, 1) < REF(Bottom, 1)) AND 

CLOSE > Bottom) OR 

# Также покупаем, если цена закрытия выше верхней полосы на 2% 

CLOSE > Top * 1.02 

Sell Signals 

# Продаем, если предыдущее значение было выше верхней полосы, а сейчас ниже 

SET Bottom = BBB(CLOSE, 20, 2, EXPONENTIAL) 

SET Top = BBT(CLOSE, 20, 2, EXPONENTIAL) 

((REF(CLOSE, 1) > REF(Top, 1)) AND 

CLOSE < Top) OR 

# Также продаем, если цена закрытия ниже нижней полосы на 2% 

CLOSE < Bottom * 0.98 


Следующий скрипт называется MACD Momentum System, и в нем для идентификации рыночной цены используется EMA и функция TREND, а индикатор MACD –для определения рыночного момента.

image

Индикатор MACD отражает изменение соотношения сил «быков» (трейдеров, играющих на повышение) и «медвеей» (соответственно, играют на понижение).

Если тренд индикатора MACD направлен вверх, это говорит, что на рынке преобладают быки, если тренд направлен вниз, это свидетельствует о преобладании медведей. Это известно как рыночный момент.

Эта система покупает, если и инерция (тренд EMA) и момент (MACD) идут в направлении
повышающихся цен. Система продает, если имеет место противоположная ситуация. Сигнал на выход возникает, если тренд инерции и момента меняется на противополож-
ный.

Buy Signals 

# Покупаем, если момент и инерция имеют однонаправленный тренд 

TREND(EMA(CLOSE, 20), 15) = UP AND 

TREND(MACD(13, 26, 9, SIMPLE), 5) = UP 

Sell Signals 

# Продаем, если момент и инерция имеют однонаправленный тренд 

TREND(EMA(CLOSE, 20), 15) = DOWN AND 

TREND(MACD(13, 26, 9, SIMPLE), 5) = DOWN 

Exit Long Signal 

# Выходим, если тренд инерции и момента имеет противоположное направления 

TREND(EMA(CLOSE, 20), 15) = DOWN OR 

TREND(MACD(13, 26, 9, SIMPLE), 5) = DOWN 

Exit Short Signal 

# Выходим, если тренд инерции и момента имеет противоположное направления 

TREND(EMA(CLOSE, 20), 15) = UP OR 

TREND(MACD(13, 26, 9, SIMPLE), 5) = UP

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

P. S. Протестировать работу описанных торговых систем вы можете, скачав терминал SmartX здесь, а затем подключившись к нашему тестовому контуру – безрисковой торговой системе с виртуальными деньгами. В рамках Тестовой Лиги Трейдеров можно сравнить свои результаты в виртуальной торговли с достижениями других инвесторов.

P. P. S. С целью популяризации алгоритмической торговли «Ай Ти Инвест» совместно с «МФД-Инфоцентр» и Московской Биржей проводит конкурс «Алгоритмус-2014», в ходе которого управляющие активами будут соревноваться друг с другом. Следить за ходом конкурса можно здесь, подробные правила расположены тут.
Автор: @itinvest
ITinvest
рейтинг 67,37
Лучший онлайн-брокер для работы на бирже

Комментарии (8)

  • –6
    Статью не читал — хотел только комменты почитать на эту тему.
    • 0
      А что конкретно в комментариях интересует? Может так расскажем
      • 0
        Я не верю, что на этом можно заработать в нашей стране. Всё, что мне попадалось почитать было похоже на построение пирамид и прочих мошеннических схем, а не работу с реальной биржей. Нет прозрачности, есть много тренеров-коучей, которые за деньги научат зарабатывать на бирже, то есть вход платный, а что ты получишь или сможешь ли зарабатывать на этом ещё не известно. Поэтому я и хотел почитать отзывы хабра-сообщества на эту тему, а их нет.
      • 0
        Покажите пример стратегии, основанной на технических индикаторах, которая показывала прибыльность после совершения минимум 100 сделок в течении минимум 3 месяцев.
  • 0
    Интересно очень, но есть вопрос:
    1. Что означает Exit Long Signal и Exit Short Signal, хотя в расширении есть только Exit buy(optional) и Exit sell (optional)?
    2. И еще при тесте сигналов покупки и возврата в бэк трэке часто бывает несколько раз подряд sell или buy. Вопрос как можно продать больше чем у тебя есть? Если для теста я взял 1 лот.
    • 0
      наверно имеется ввиду короткая продажа
    • 0
      1. Exit buy(optional) и Exit sell (optional) – это название вкладок в разделе «стратегия» в TradeScript. При необходимости в них задаются условия для формирования сигнала, соответственно Exit Long Signal и Exit Short Signal (как это есть в примере). Вкладки могут оставаться незаполненными в некоторых, например переворотных, стратегиях, о чем говорит (optional) в их названии.

      2. В бэк тестере (тестирование на исторических данных) и во вкладке «сигналы» в разделе «стратегия» (в режиме реальных торгов) будут отображаться все сигналы, которые соответствуют алгоритмам, заданным в соответствующих вкладках (Buy, Sell, Exit buy(optional) и Exit sell (optional)).

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

      Проверьте значение «Стартовый объем позиции», «Максимальный объем позиции» и откорректируйте их.
  • 0
    В каждую программу необходимо заложить % комиссии брокера, это есть существенный упускаемый в примерах параметр

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка