27 марта 2014
Введение
Для начала обратим внимание на инструменты, которые будут описываться в этом тексте. Итак, 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 Введение в TradeScriptTM 10
Next 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) будет покупать если короткая скользящая средняя пересекает снизу-вверх длинную скользящую среднюю, и продавать, если пересечение идет в обратном направлении.
Скользящие средние бывают разной длины и типа (про индикаторы технического анализа мы сделаем отдельный пост), от которых зависит число генерируемых торговой системой сигналов. Более короткие скользящие средние (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)
# 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)
Еще одна ситуация, которую можно описать скриптом – ценовой разрыв (гэп). Так называется ситуация, когда на новый день акция начинает торговаться выше максимума предыдущего дня – такое может быть после неожиданного выхода положительных новостей, отчетов и т.п.
В такие моменты часто на открытии рынка подается много приказов на покупку, в результате чего акция может быть переоценена. За этим часто следует корректировка цены вниз – описанная ниже торговая система учитывает тот факт, что момент разворота обычно возникает в течение первого часа торгов. То есть, если разрыв не будет “закрыт” в течение первого часа, то можно предполагать, что покупка, с большей вероятностью, продолжится.
Наш скрипт возвращает акции, которые имели гэп не менее 2% и закрылись близко к максимуму. Стратегией на следующий день может быть покупка после первого часа торгов, если акция остается сильной. Стоп-лосс следует установить на минимуме дня. Консервативной целью прибыли может быть ½ гэпа — 1% в нашем случае.
Buy Signals
# Имеет место не менее чем 2% гэп вверх на высоком объеме
LOW > REF(HIGH,1) * 1.02 AND
VOLUME > SMA(VOLUME, 5) * 2
Sell Signals
# Имеет место не менее чем 2% гэп вниз на высоком объеме
HIGH SMA(VOLUME, 5) * 2
Exit Long
Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс.
Exit Short
Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс
# Имеет место не менее чем 2% гэп вверх на высоком объеме
LOW > REF(HIGH,1) * 1.02 AND
VOLUME > SMA(VOLUME, 5) * 2
Sell Signals
# Имеет место не менее чем 2% гэп вниз на высоком объеме
HIGH SMA(VOLUME, 5) * 2
Exit Long
Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс.
Exit Short
Используем цель прибыли приблизительно ½ от величины гэпа, а также стоп-лосс
Следующий скрипт, основан на применении индикатора Полосы Боллинджера – это временные серии, сдвинутые от скользящей средней вверх и вниз на определенное число стандартных отклонений. Эти полосы формируют границы колебаний цены. Полосы Боллинджера расширяются или сужаются в зависимости от рыночной волатильности.
Обычно цены остаются внутри полос Боллинджера. Одна из стратегий заключается в покупке или продаже после того как цены коснувшись границы разворачиваются обратно.
Движение, которое началось у одной полосы, обычно имеет тенденцию продолжиться до другой полосы.
Другая стратегия заключается в покупке или продаже, если цена пробила соответствующую полосу. В этом случае рынок обычно продолжает свое движение в этом направление определенное время.
Стратегия, описанная в следующем примере, представляет собой комбинацию этих двух систем: покупка происходит, если предыдущий бар коснулся нижней полосы, а текущий бар находится внутри диапазона (т.е. между полосами). Также система будет покупать, если максимум текущего бара превышает верхнюю полосу на определенный процент. Продажа осуществляется по противоположным правилам.
Buy Signals
# Покупаем, если предыдущее значение было ниже нижней полосы, а сейчас выше
SET Bottom = BBB(CLOSE, 20, 2, EXPONENTIAL)
SET Top = BBT(CLOSE, 20, 2, EXPONENTIAL)
((REF(CLOSE, 1) 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 REF(HIGH, 1) AND
CLOSE (REF(HIGH, 1) - REF(LOW, 1)) * 1.5 AND
# Тренд должен быть нисходящим
TREND(CLOSE, 30) = DOWN
# Покупаем, если предыдущее значение было ниже нижней полосы, а сейчас выше
SET Bottom = BBB(CLOSE, 20, 2, EXPONENTIAL)
SET Top = BBT(CLOSE, 20, 2, EXPONENTIAL)
((REF(CLOSE, 1) 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 REF(HIGH, 1) AND
CLOSE (REF(HIGH, 1) - REF(LOW, 1)) * 1.5 AND
# Тренд должен быть нисходящим
TREND(CLOSE, 30) = DOWN
Система «бычьего» и «медвежьего» поглощения (Japanese Candlestick Engulfing Line System)
Эффективной краткосрочной стратегией торговли часто является использование фигур технического анализа, вроде «бычьего» или «медвежьего поглощения» — в случае резкого роста объёма торгов, они сигнализируют о развороте тренда. Фигура поглощения состоит из короткой свечи, за которой следует свеча с более длинным телом, которое «поглощает» предыдущую короткую свечу.
Соответственно, «бычье» поглощение указывает на потенциальный разворот нисходящего тренда, а «медвежье» — на возможный разворот бычьего (то есть восходящего) тренда. Чем более заметен тренд, тем более сильной предсказательной силой обладают эти паттерны.
Код для подобной системы на TradeScript может выглядеть следующим образом:
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)
# Бычий паттерн
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 легко модифицировать и дополнять прямо в терминале.
Примечание: для того, чтобы загрузить выбранный скрипт в SmartX, необходимо скачать библиотеку на компьютер, установить терминал, а затем в меню «Расширения» выбрать Менеджер TradeScript и нажать «Загрузить».
Заключение
Полное описание языка TradeScript и описание построения довольно сложных торговых роботов на нем можно найти в специальном руководстве. Протестировать работу терминала и собственных роботов можно с помощью тестового контура — безрисковой торговой системы с виртуальными деньгами (открыть такой счет можно здесь).
Кроме того, при написании роботов следует учитывать в стратегии размер комиссии за совершение транзакций со стороны биржи и брокера — обычно биржа берет за скальперские сделки (которые открываются и закрываются в течение одного торгового дня) около 0,25 рублей за каждую, а комиссии брокера примерно соответствуют биржевым
(C) Источник
Не является индивидуальной инвестиционной рекомендацией
При копировании ссылка обязательна Нашли ошибку: выделить и нажать Ctrl+Enter