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