В блоге на Хабре мы много пишем о биржевых технологиях и торговых роботах. В сегодняшнем материале вопрос создания таких систем будет рассмотрен подробнее — на примере встроенного в торговый терминал SmartX скриптового языка программирования TradeScript.
Что за TradeScript
TradeSript – векторный язык программирования, разработанной американской компанией Modulus Financial Engineering специально для создания торговых роботов. Данный инструмент входит в пакет технологий, которые были лицензированы (OEM) нашей компанией для создания торгового терминала SmartX (подробнее о его создании мы рассказывали здесь).
Среди плюсов TradeScript простота синтаксиса, который, тем не менее, позволяет описывать торговые стратегии разной сложности. Язык хорошо подходит для использования новичками — для этого достаточно будет изучить простое руководство, а опытные разработчики разберутся с ним за полчаса.
Движок языка работает на стороне терминала и подключается в качестве плагина-расширения к SmartX. Помимо возможности собственно написания скриптов присутствует и модуль бэктестинга для тестирования созданной стратегии на исторических данных.
Благодаря своей встроенности прямо в терминал, для создания роботов не нужно использовать коннекторы для передачи в него приказов, что необходимо в случае многих других сред разработки. Это позволяет добиваться значительно более высокой надежности и быстродействия.
Начинаем писать роботов: примитивы и векторы
Одно из важных понятий в языке 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 10
Next symbol
Для описания крайне простого действия, нужно «потратить» 9-10 строк кода. С помощью векторного языка можно то же полезное действие можно уложить в одну строку:
SET MedianAverage = SimpleMovingAverage((CLOSE + OPEN) / 2, 30)
Таким образом, на TradeScript можно описывать все те же стратегии, что и на процедурных языках вроде C++, VB или Java.
Примеры реальных стратегий
Для определения момента для открытия или закрытия позиций многие трейдеры используют технический анализ. Это метод, при котором торговцы ищут на графиках финансовых инструментов различные паттерны. Для этого используются так называемые технические индикаторы.
Многие из существующих индикаторов (скользящие средние, осцилляторы, индексы, функции диапазонов и линейной регрессии и т.п.) встроены в TradeSript в виде примитивов, так что их можно использовать при программировании роботов. Такая программа может включать один или несколько индикаторов. Рассмотрим примеры кода торговых роботов на TradeScript, использующих индикаторы теханализа.
Пересечение скользящих средних
Один из самых популярных индикаторов — скользящие средние. При его использовании в качестве сигналов для совершения операций используют факты пересечения линиями друг друга.
Ниже — пример кода системы, основанной на пересечении скользящих средних (Moving Average Crossover). Такой робот будет покупать если короткая скользящая средняя пересекает снизу-вверх длинную скользящую среднюю, и продавать, если пересечение идет в обратном направлении.
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)
Система Parabolic SAR/MA System
Существуют и более сложные вариации систем на основе скользящих средних — например, это индикатор Parabolic SAR. Обычно параболические системы используют для получения сигналов выхода из позиций, но можно использовать их и для принятия решений о входе в них (покупать или продавать в короткой позиции).
В нашем примере робот принимает такие решения на основе пересечения скользящих средних и пересечения индикатором Parabolic SAR снизу вверх цены закрытия.
Buy Signals
# Покупаем, если скользящие средние пересеклись сегодня или вчера и
# если PSAR пересеклись сегодня или вчера
(CROSSOVER(CLOSE, PSAR(0.02, 0.2)) OR
CROSSOVER(REF(CLOSE,1), PSAR(0.02, 0.2)))
AND
(CROSSOVER(EMA(CLOSE, 10), EMA(CLOSE, 20)) OR
CROSSOVER(REF(EMA(CLOSE, 10),1), REF(EMA(CLOSE, 20),1)))
Sell Signals
# Продаем, если скользящие средние пересеклись сегодня или вчера и
# если PSAR пересеклись сегодня или вчера
(CROSSOVER(PSAR(0.02, 0.2), CLOSE) OR
CROSSOVER(PSAR(0.02, 0.2), REF(CLOSE,1)))
AND
(CROSSOVER(EMA(CLOSE, 20), EMA(CLOSE, 10)) OR
CROSSOVER(REF(EMA(CLOSE, 20),1), REF(EMA(CLOSE, 10),1)))
Ценовой разрыв
На бирже нередки ситуации, в которой в начале нового торгового дня цена акции сразу оказывается выше максимума предыдущего дня. Такое может происходить в случае появления каких-то позитивных новостей, выхода важных отчетов, влияющих на бизнес и т.п.
Когда трейдеры видят такой позитивный гэп, то многие из низ начинают подавать приказы на покупку — в результате возможна переоценка акции. После такого внезапного взлета есть вероятность отката цены на прежние значения в течение пары часов после старта торгов.
В примере ниже, мы учитываем тот факт, что момент разворота обычно возникает в течение первого часа торгов. То есть, если разрыв не будет “закрыт” в течение первого часа, то можно предполагать, что покупка, с большей вероятностью, продолжится. Скрипт возвращает акции, которые имели гэп не менее 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
Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс
«Бычье» и «медвежье» поглощение (Japanese Candlestick Engulfing Line System)
Еще один интересный элемент технического анализа — фигуры «бычьего» или «медвежьего» поглощения. Они могут свидетельствовать о развороте какого-либо рыночного тренда. Суть фигуры поглощения состоит в том, что возникает короткая японская свеча, за которой следует свеча с более длинным телом, «поглощающим» предыдущую короткую свечу. Бычье поглощение указывает на разворот нисходящего тренда — цена может вырасти, а медвежье, наоборот, на ее возможное снижение.
Вот каким может быть скрипт, использующий этот принцип:
Signals
# Бычий паттерн
CANDLESTICKPATTERN() = BULLISH_ENGULFING_LINE AND TREND(CLOSE, 30) =
DOWN AND VOLUME > REF(VOLUME, 1)
# Медвежий паттерн
CANDLESTICKPATTERN() = BEARISH_ENGULFING_LINE AND TREND(CLOSE, 30) = UP
AND VOLUME > REF(VOLUME, 1)
Заключение
На нашем старом сайте опубликована библиотека, включающая 22 простых торговых робота на TradeScript — на их основе можно создавать более сложные торговые стратегии. В завершение — еще несколько полезных ссылок по теме создания торговых роботов.