В блоге на Хабре мы много пишем о биржевых технологиях и торговых роботах. В сегодняшнем материале вопрос создания таких систем будет рассмотрен подробнее — на примере встроенного в торговый терминал 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, использующих индикаторы теханализа.

Пересечение скользящих средних


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

image

Ниже — пример кода системы, основанной на пересечении скользящих средних (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. Обычно параболические системы используют для получения сигналов выхода из позиций, но можно использовать их и для принятия решений о входе в них (покупать или продавать в короткой позиции).

image

В нашем примере робот принимает такие решения на основе пересечения скользящих средних и пересечения индикатором 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)))

Ценовой разрыв


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

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 

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

«Бычье» и «медвежье» поглощение (Japanese Candlestick Engulfing Line System)


Еще один интересный элемент технического анализа — фигуры «бычьего» или «медвежьего» поглощения. Они могут свидетельствовать о развороте какого-либо рыночного тренда. Суть фигуры поглощения состоит в том, что возникает короткая японская свеча, за которой следует свеча с более длинным телом, «поглощающим» предыдущую короткую свечу. Бычье поглощение указывает на разворот нисходящего тренда — цена может вырасти, а медвежье, наоборот, на ее возможное снижение.

image

Вот каким может быть скрипт, использующий этот принцип:

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 — на их основе можно создавать более сложные торговые стратегии. В завершение — еще несколько полезных ссылок по теме создания торговых роботов.

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


  1. Dageron
    30.12.2017 15:48

    В SmartХ планируется поддержка крипто-бирж?


    1. itinvest Автор
      30.12.2017 21:09

      Пока таких планов нет, но у нас есть целый ряд продуктов/услуг для криптоинвесторов — о них скоро будет отдельный топик, правда уже в новом году.


  1. pokryshkin
    30.12.2017 17:26
    -1

    Как студенты пишут рефераты? Компилируют из нескольких.
    Как компании пишут статьи? Также. Видимо студентов понабрали, или привычки остались.
    В общем забыли указать саму главную статью-донор habrahabr.ru/company/itinvest/blog/214601


    1. itinvest Автор
      30.12.2017 21:08
      +2

      Откуда столько негатива в праздничные выходные? :) В нашем блоге уже под три сотни материалов, логично использовать контент не по одному разу. Также статья, которую вы указали, вышла уже пару лет назад — вряд ли многие текущие читатели нашего блога тогда ее видели, при том что информация не потеряла актуальности. И, к слову, про TradeScript у нас были и другие статьи и какая-то информация из них попала в новый топик, так что ваше расследование оказалось не совсем полным.

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


      1. pokryshkin
        31.12.2017 01:37
        -4

        Откуда столько негатива в праздничные выходные? :)

        Никакого негатива, исключительно факты.

        В нашем блоге уже под три сотни материалов, логично использовать контент не по одному разу.

        Т.е. вы намеренно копипастой занимаетесь? А сеошнику и копирайтеру вы зарплату тоже ксерокопиями денег платите? Или они хотят оригинальные банкноты? Я вот хочу читать оригинальный контент.


        1. samsivan
          31.12.2017 02:33
          +7

          Дружище, ты реально как-то злой. Я вот предыдущие выпуски в бородатых годах не застал — сегодня мне было интересно прочитать, и я благодарен за пост. Тем более, это корпоративный блог, могут писать что хотят и как хотят, в рамках правил — а где-то давно еще вроде Бурум писал, что переработка материалов не является нарушением.


        1. itinvest Автор
          31.12.2017 02:40
          +2

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

          К тому же, обычно это никого не напрягает — на самом деле мы упоминаем какие-то факты из старых материалов в новых статьях регулярно, если они не изменились, вы пока за 4-5 лет нашей жизни на Хабре первый недовольный. Это даже если не касаться вопроса того, чем конкретно вас не устраивает тот факт, что какие-то факты из сегодняшней статьи уже встречались в статье три года назад (уже выше сказали, что сегодняшний материал сделан с опорой сразу на несколько статей + внутреннюю документацию) — неужели же вы ее наизусть помните? Это сомнительно, так что и проблемы на самом деле нет. Но всякое бывает, конечно :)

          На этом разрешите завершить конкретно этот тред. Хороших выходных и праздников!


          1. pokryshkin
            31.12.2017 03:13
            -4

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


  1. sibvic
    30.12.2017 18:05

    А есть где-то скомпонованная документация по языку? Я специализируюсь на написании биржевых роботов, добавлю ещё один язык в свое портфолио и в своей генератор стратегий. :)


    1. itinvest Автор
      30.12.2017 21:03

      Можно посоветовать наше руководство + документацию фирмы-разработчика Modulus


  1. Tim_23
    30.12.2017 21:04

    Когда трейдеры видят такой позитивный гэп
    . Не могу привыкнуть к таким странным терминам. К трендам уже привык, но гэп. Почему не скачок цены?


    1. itinvest Автор
      30.12.2017 21:04

      Чем термин странный? Это вполне нормальное английское слово, коих очень много проникает в язык в разных профессиональных областях — можно, для примерование взять то же программирование


    1. Germanets
      30.12.2017 23:21

      В русском вариант ближе «разрыв цены», как по мне.


      1. itinvest Автор
        31.12.2017 00:28

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