Создание стратегий. Корзина защитных стратегий.
Atom Ответить
04.05.2012


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

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

Рассмотрим такой момент как защита сделки. Когда стратегия входит в сделку и совершает трейд, часто требуется защитить сделку стопами, профитами и может быть чем-нибудь еще. Логично будет разделить разные элементы защиты и создать на каждый отдельную защитную стратегию. В базовой поставке S# есть уже несколько готовых защитных стратегий: StopLoss, TakeProfit и так далее. Все они базируются на стратегии котирования, что не всегда бывает необходимо. Например, если ваш брокер имеет ограничение на количество транзакций в секунду, то запустив несколько одновременных стратегий котирования можно попасть в неудобную ситуацию превышения лимита транзакций. Поэтому для себя лично я реализовал свои защитные стратегии, базированные НЕ на котировании, а на простом рыночном входе. Для удобной работы с пачкой защитных стратегий, была реализована корзина защитных стратегий. Перейдем собственно к делу.

Для реализации корзины стратегий, нам понадобится универсальный интерфейс защитной стратегии.


Далее на базе интерфейса мы уже можем реализовать корзину стратегий. Каждая из защитных стратегий корзины, будет защищать одну конкретную сделку. И вся корзина будет защищать эту сделку. Смысл корзины в том, что когда активировалась одна из защитных стратегий, остальные должны быть остановлены. Защитная стратегия просто совершает сделку обратную защищаемой сделке, отсюда необходимо избегать ситуации, когда сработают несколько защитных стратегий. Как только активировалась защитная стратегия, корзина тоже переходит в Активное состояние. В принципе корзина сама реализует интерфейс защитной стратегии и ведет себя аналогичным образом. После завершения активной защитной стратегии, корзина тоже завершает свою работу. Ниже пример реализации:



Далее реализуем защитную стратегию которую будем добавлять в корзину. Первое что хочется показать, это реализацию стратегии, которая выставляет физический стоп и мониторит его состояние. Как только стоп активируется, стратегия становится активной. Если стратегию остановить, стоп заявка снимается. Я выбрал эту стратегию, из-за определенных нюансов в реализации, которые многим помогут.




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

Теперь собственно пример использования всего этого добра . Смотрим ниже.





4 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 04.05.2012
Ответить


ra81 Перейти
В базовой поставке S# есть уже несколько готовых защитных стратегий: StopLoss, TakeProfit и так далее. Все они базируются на стратегии котирования, что не всегда бывает необходимо. Например, если ваш брокер имеет ограничение на количество транзакций в секунду, то запустив несколько одновременных стратегий котирования можно попасть в неудобную ситуацию превышения лимита транзакций.


Нужно переопределить ProtectiveStrategy.GetNewPrice и выставлять заведомо исполняемую цену.
Спасибо:

ra81

Фотография
Дата: 04.05.2012
Ответить


Mikhail Sukhov Перейти
ra81 Перейти
В базовой поставке S# есть уже несколько готовых защитных стратегий: StopLoss, TakeProfit и так далее. Все они базируются на стратегии котирования, что не всегда бывает необходимо. Например, если ваш брокер имеет ограничение на количество транзакций в секунду, то запустив несколько одновременных стратегий котирования можно попасть в неудобную ситуацию превышения лимита транзакций.


Нужно переопределить ProtectiveStrategy.GetNewPrice и выставлять заведомо исполняемую цену.

Да можно, правда для входа в позицию я выбрал несколько другой подход. Между регистрацией заявки в случае ошибки и новой регстрацией есть тамаут который можно задавать. Все из за не очень удачного терминала альфа директа :). У него свои капризы. Да и на самом деле был больше интерес в реализации с нуля, для набивки руки. Это добавило мне много очков экспы и пару левелов.
Автор топика
Спасибо:

PavelAd

Фотография
Дата: 30.08.2012
Ответить


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

ra81

Фотография
Дата: 30.08.2012
Ответить


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


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

Опять же я сверху упоминал что я в стакане не сижу. На моих таймфреймах роли не играют 1-2 секунды задержки, а то и минута.
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy