3.1 фиче реквест: Multi Security Strategy
Atom Ответить
22.03.2011


Пишу сюда пожелания к будущим версиям S#.

Следующее пожелание вызвано попыткой написать что-то типа PairTrading

MultiSecurityStrategy
============================

Редизайн Strategy для поддержки нескольких Security в одной Strategy.
Сейчас у Strategy фиксирована одна Security, один Portfolio. Методы BuyAt()/SellAt() привязаны к этой Security.

PositionManager трекает ровно одну Security.

Это не означает что стратегию работающую по нескольким инструментам нельзя сделать. Достаточно генерировать Order и руками выставлять в нем Security, Portfolio. Но позиции тоже придется мониторить руками.

Что хочется. Класс PositionManager, трекающий отображение (Security,Portfolio)->Position

Как я понимаю в самом BaseTrader так и сделано. Хочу, чтобы в PositionManager тоже было свойство Positions, элементы которого Position = (Portfolio,Security,CurrentValue)


C учетом того что стратегия одну Security скорее всего будет на одном Portfolio торговать, методы Strategy.BuyAt(), SellAt() в идеале должны принимать аргумент Security, находить для него Portfolio где эта Security торгуется (первый попавшийся Portfolio, если надо - потом его можно переопределить).

Понятно, что для этого надо по Security подходящий Portfolio искать (типа для LKM1@RTS это -RF- счет в SmartCOM, для LKOH@EQBR это -MS- счет, для РТС-Стандарта возможно третий счет)

Теги:


Спасибо:




11 Ответов
Mikhail Sukhov

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


А чем SecurityBasket не устраивает?
Спасибо:

pyhta4og

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


А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?
Автор топика
Спасибо:

Mikhail Sukhov

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


pyhta4og Перейти
А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?


Никак. То что вы пишите - это уже конкретный алгоритм робота. А это предполагается делать самостоятельно.
Спасибо:

pyhta4og

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


Mikhail Sukhov Перейти
pyhta4og Перейти
А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?


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


Попытаюсь объяснить.

Пишу я допустим pairs-trading. Внутри моей Strategy мне надо трекать позиции по двум Security. Если бы была одна Security, то это был бы вызов PositionManager.Position. А поскольку у меня их две, то приходится извращаться.

Было бы прикольней, если бы Strategy был изначально для Multi-Security.

Это пригодилось бы для арбитражных спот-фьюч, для опционов, для много чего.

Как бы я и не стал бы возникать с фичей, если бы включение ее в фреймворк не было бы на мой взгляд сильно логичным.

Если быть предельно конкретным, то я бы хотел чтобы у Strategy вместо Security было бы List<Security>, вместо Portfolio было бы List<Portfolio> и PositionManager содержал бы набор Position аналогично как в BaseTrader. Тут должна быть правка в StrategyManager.Register() чтобы много Security и Portfolio передавалось. Но доступа к нему нет.


Вот и пишу пожелание. Потому что из-за выхода за пределы изначального дизайна S# приходится делать кривые workaround.

Автор топика
Спасибо:

Mikhail Sukhov

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


pyhta4og Перейти

Пишу я допустим pairs-trading. Внутри моей Strategy мне надо трекать позиции по двум Security. Если бы была одна Security, то это был бы вызов PositionManager.Position. А поскольку у меня их две, то приходится извращаться.


Все, понял о чем речь.

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

Теперь вопрос. Достаточно ли поддержать SecurityBasket только в менеджерах?
Спасибо:

pyhta4og

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


Mikhail Sukhov Перейти

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

Это получится сумма позиций что ли? Т.е. одно число на два инструмента? Тогда это число особо смысла для меня не имеет.
Нужна позиция по каждому инструменту который торгует стратегия отдельно

Цитата:

Теперь вопрос. Достаточно ли поддержать SecurityBasket только в менеджерах?


Как бы я делал.


У вас в BaseTrader есть IEnumerable<Position> Positions;

Каждая Position содержит поле Security, Portfolio, CurrentValue

Я бы хотел чтобы у нового StrategyMultiPositionManager тоже было такое поле (Positions) в котором перечислены позиции стратегии по каждой бумаге.

И метод Position GetPosition(Security).
В общем случае Position зависит и от Security и от Portfolio, видимо поэтому в BaseTrader используется Map<Pair<Security,Portfolio>, Position>. В StrategyMultiPositionManager можно упростить и делать Map<Security,Position>, потому что можно считать что 100% стратегия не будет торговать один и тот же Security на нескольких Portfolio.


Помимо этого сама стратегия сейчас привязана к одной Security и одному Portfolio (я перечислил два свойства класса Strategy). Я бы добавил свойство IDictionary<Security,Portfolio>
- чтобы знать на каком Portfolio торгуется каждая Security, используемая Strategy.
Именно из этого свойства StrategyMultiPositionManager будет узнавать Portfolio для Security, когда будет обновлять Position по событиям NewMyTrade

Плюс есть StrategyManager.Register(Strategy, Portfolio, Security)
Я бы добавил StrategyManager.Register(Strategy, IDictionary<Security, Portfolio>) - который
а) заполнял бы Dictionary Strategy->Portfolio в Strategy.
б) инициализировал бы StrategyMultiPositionManager для стратегии добавляя в него Position для всех Security с CurrentValue=0



Автор топика
Спасибо:

Mikhail Sukhov

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


pyhta4og Перейти
Mikhail Sukhov Перейти

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

Это получится сумма позиций что ли? Т.е. одно число на два инструмента? Тогда это число особо смысла для меня не имеет.
Нужна позиция по каждому инструменту который торгует стратегия отдельно


Расчет дельта нейтральный позиций (я так понял у вас парный трейдинг, судя по запросу) - это целая глава в трейдинге. Ее нет стандартно. И да, делать ее в PositionManager неправильно. Это должен быть отдельный менеджер, потому что дельта поза - это не поза, а торговая стратегия.

pyhta4og Перейти

У вас в BaseTrader есть IEnumerable<Position> Positions;

Каждая Position содержит поле Security, Portfolio, CurrentValue

Я бы хотел чтобы у нового StrategyMultiPositionManager тоже было такое поле (Positions) в котором перечислены позиции стратегии по каждой бумаге.


Это серьезные изменения. Раз. И два, не уверен, что это правильный подход. Пока видится, что не совсем правильный.

Предлагаю начать с обозначения проблем. Первая проблема понятна - нет расчета дельта-нейтральной позы. Плюс нет и правильно PnL. Это все связано с менеджерами. Вторая - нет правильного определения инструмента при регистрации заявок в мульти инструментной стратегии. Что еще? Кстати, и приведите сразу, как сейчас решаете проблему (чужой опыт в этом направлении интересен)?
Спасибо:

pyhta4og

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


Цитата:

Расчет дельта нейтральный позиций (я так понял у вас парный трейдинг, судя по запросу) - это целая глава в трейдинге. Ее нет стандартно. И да, делать ее в PositionManager неправильно. Это должен быть отдельный менеджер, потому что дельта поза - это не поза, а торговая стратегия.

Нет речи о РАСЧЕТЕ дельта-нейтральных позиций, или стратегий. Это дело стратегий а не PositionManager.

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

Цитата:

Предлагаю начать с обозначения проблем. Первая проблема понятна - нет расчета дельта-нейтральной позы.
Плюс нет и правильно PnL. Это все связано с менеджерами.

Дельта-нейтрального расчета я не хотел, видимо это мое высказывание про 10 LKOH - LKM1 навело Вас на эту мысль. Коэффициенты хеджа пусть каждый считает как умеет. И ставит соответствующие заявки. Но вот результат в виде реальной позиции которая получилась в резултате сделок стратегия должна узнавать от S#

Цитата:

Вторая - нет правильного определения инструмента при регистрации заявок в мульти инструментной стратегии.


Это вероятно моя ремарка про BuyAt/SellAt. Для удобства можно было бы еще методы добавить c параметром Security.


Цитата:

Что еще? Кстати, и приведите сразу, как сейчас решаете проблему (чужой опыт в этом направлении интересен)?


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


У меня нет кнопки "Вложение" на форуме почему-то. Код сюда положил
Автор топика
Спасибо:

Mikhail Sukhov

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


pyhta4og Перейти

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


Посмотрел как устроены менеджеры. Сейчас они должны уже работать для SecurityBasket. Потому что там нет фильтра по инструменту, а расчет идет на основе получения данных из событий стратегии. А так как стратегия может иметь дочерние стратегии, где инструменты могут быть совсем другие, то и PnL будет рассчитываться так, как требуется в вашей задаче с парой инструментов. Да и позиция тоже будет правильная.

Теперь насчет получения не общего значения позы, а раздельно по инструменту в рамках стратегии. Как насчет использовать подход с дочерними стратегиями?
Спасибо:

pyhta4og

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


Цитата:

Посмотрел как устроены менеджеры. Сейчас они должны уже работать для SecurityBasket. Потому что там нет фильтра по инструменту, а расчет идет на основе получения данных из событий стратегии. А так как стратегия может иметь дочерние стратегии, где инструменты могут быть совсем другие, то и PnL будет рассчитываться так, как требуется в вашей задаче с парой инструментов. Да и позиция тоже будет правильная.


Мы с рефлектором тоже смотрели. Глаза сломали. В новом StrategyPositionManager в режиме расчета позиции по сделкам похоже баг - позиция только увеличивается.

Еще, я могу ошибаться, но если ордер на 3 контракта поматчат в три попытки по 1 контракту то тоже неправильно посчитает.


Насчет дочерних буду думать. В принципе идейно правильно, на одну ногу Quoting-продажу напустить, на другую маркет-закупку. И из родительской запускать то одну то другую.

Я не пробовал пока запускать несколько стратегий параллельно.

У них события NewOrder/OrderChanged вызываются только для тех заявок, что инициализированы именно этой стратегией?
Автор топика
Спасибо:

Mikhail Sukhov

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


pyhta4og Перейти

Мы с рефлектором тоже смотрели. Глаза сломали. В новом StrategyPositionManager в режиме расчета позиции по сделкам похоже баг - позиция только увеличивается.

Еще, я могу ошибаться, но если ордер на 3 контракта поматчат в три попытки по 1 контракту то тоже неправильно посчитает.


https://stocksharp.ru/fo...ition-v-PositionManager/

pyhta4og Перейти

Насчет дочерних буду думать. В принципе идейно правильно, на одну ногу Quoting-продажу напустить, на другую маркет-закупку. И из родительской запускать то одну то другую.

Я не пробовал пока запускать несколько стратегий параллельно.

У них события NewOrder/OrderChanged вызываются только для тех заявок, что инициализированы именно этой стратегией?


Этой и дочерними. Тоесть, родительная стратегия в себе содержит все дочерние заявки + свои (если таковые есть). Тоже справедливо и для событий - событие дочерней стратегии инициирует событие родительской.
Спасибо:


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

loading
clippy