Пишу сюда пожелания к будущим версиям 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)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
А чем SecurityBasket не устраивает?
А как с помощью 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.
Все, понял о чем речь.
Предлагаю сделать так. Все менеджеры стратегии (в том числе и 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>
Плюс есть StrategyManager.Register(Strategy, Portfolio, Security) Я бы добавил StrategyManager.Register(Strategy, IDictionary<Security, Portfolio>) - который а) заполнял бы Dictionary Strategy->Portfolio в Strategy. б) инициализировал бы StrategyMultiPositionManager для стратегии добавляя в него Position для всех Security с CurrentValue=0
Расчет дельта нейтральный позиций (я так понял у вас парный трейдинг, судя по запросу) - это целая глава в трейдинге. Ее нет стандартно. И да, делать ее в PositionManager неправильно. Это должен быть отдельный менеджер, потому что дельта поза - это не поза, а торговая стратегия.
Это серьезные изменения. Раз. И два, не уверен, что это правильный подход. Пока видится, что не совсем правильный.
Предлагаю начать с обозначения проблем. Первая проблема понятна - нет расчета дельта-нейтральной позы. Плюс нет и правильно PnL. Это все связано с менеджерами. Вторая - нет правильного определения инструмента при регистрации заявок в мульти инструментной стратегии. Что еще? Кстати, и приведите сразу, как сейчас решаете проблему (чужой опыт в этом направлении интересен)?
Речь идет о том, чтобы стратегия могла торговать несколько бумаг и знать сколько у нее позиция в каждой в штуках. Всего-лишь бухгалтерия. Сейчас она сделана из расчета что стратегия торгует одну бумагу. Хочу чтобы поддерживалось несколько.
Это вероятно моя ремарка про BuyAt/SellAt. Для удобства можно было бы еще методы добавить c параметром Security.
Ну я как написал, так и попытался закодить менеджер. Он параллельно базовому по OnOrderChanged трекает несколько инструментов. PnL менеджер я не трогал пока поэтому видимо он считает по одной бумаге основной.
У меня нет кнопки "Вложение" на форуме почему-то. Код сюда положил
Посмотрел как устроены менеджеры. Сейчас они должны уже работать для SecurityBasket. Потому что там нет фильтра по инструменту, а расчет идет на основе получения данных из событий стратегии. А так как стратегия может иметь дочерние стратегии, где инструменты могут быть совсем другие, то и PnL будет рассчитываться так, как требуется в вашей задаче с парой инструментов. Да и позиция тоже будет правильная.
Теперь насчет получения не общего значения позы, а раздельно по инструменту в рамках стратегии. Как насчет использовать подход с дочерними стратегиями?
Мы с рефлектором тоже смотрели. Глаза сломали. В новом StrategyPositionManager в режиме расчета позиции по сделкам похоже баг - позиция только увеличивается.
Еще, я могу ошибаться, но если ордер на 3 контракта поматчат в три попытки по 1 контракту то тоже неправильно посчитает.
Насчет дочерних буду думать. В принципе идейно правильно, на одну ногу Quoting-продажу напустить, на другую маркет-закупку. И из родительской запускать то одну то другую.
Я не пробовал пока запускать несколько стратегий параллельно.
У них события NewOrder/OrderChanged вызываются только для тех заявок, что инициализированы именно этой стратегией?
http://stocksharp.com/forum/1469/-3-0-19--Niepravil-no-schitaietsia-Position-v-PositionManager/
Этой и дочерними. Тоесть, родительная стратегия в себе содержит все дочерние заявки + свои (если таковые есть). Тоже справедливо и для событий - событие дочерней стратегии инициирует событие родительской.