Здравствуйте,
Имеется стратегия парной торговли, реализованная в виде BasketStrategy и нескольких принадлежащих ей ChildStrategies, каждая работает со своей Security. Есть ли удобный способ в S# посчитать суммарный Unrealized PnL (по открытым позициям) в рублях для этих стратегий, не используя TraderPnLManager (потому что параллельно работает еще одна стратегия)?
Спасибо,
コメント (8)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Смотрите в сторону StrategyPnLManager
Спасибо. Попробовал SecurityPnLManager в каждой из стратегий с последующим суммированием всех Position * Price * MinStepPrice / MinStepCount. Первая попытка с StrategyPnLManager не задалась, такое впечатление что не умножает на MinStepPrice / MinStepCount. Наверное что-то неправильно инициализирую - используется EmulationTrader и Security инициализируются вручную.
Заметил еще одну вещь - при использовании EmulationTrader при совершении сделок видно изменение PnL при приходе новых котировок. Например:
То же самое упражнение при использовании RealTimeEmulationTrader<SmartTrader> показывает что SecurityPositionManager и SecurityPnLManager по каким-то причинам не смогли понять что были совершены сделки.
Не могли бы помочь понять в чем может быть дело?
Версия S# : 4.0.3
Большая просьба в первую очередь поставить 4.0.11, т.к. со времён 4.0.3 было очень много фиксов.
Александр, поставил 4.0.11, не помогло.
В стратегии подменяются PositionManager и PnLManager в перегруженном методе Start().
Вот так не работает.
А вот так работает.
Т.е. в итоге заработало? Сделайте инициализацию Security.Trader = Trader при создании инструмента.
Да, заработало. Дело, кажется, вот в чем: я использую ITrader = RealTimeEmulationTrader<SmartTrader> для тестирования стратегии, но когда я смотрю на Securities полученные из ITrader, я вижу что в свойстве Trader у этих Securities стоит экземпляр класса SmartTrader, а не RealTimeEmulationTrader<SmartTrader> как ожидалось.
Это логично, т.к. все инструменты в действительности приходят из RealTimeEmulationTrader.Trader, т.е. на самом деле из SmartTrader
И что значит ожидалось? Ожидалось кем, зачем? :)
Я просто почему-то подумал (😊) что все элементы в Trader.Securities будут иметь ссылку именно на тот экземпляр Trader'а, которому они принадлежат чтобы избежать потенциальных проблем с использованием extension методов и подпиской на события. Выдуманный пример - если в стратегии есть следующая логика:
То есть FooHandler будет подписан на событие NewMyTrades класса SmartTrader, а не RealTimeEmulationTrader<SmartTrader>, который и будет эмулировать эти MyTrades. Каюсь, не проверял, но заподозрил что если в описанной ситуации SmartTrader наблюдает за сделками пришедшими из SmartCOM, то FooHandler не будет вызван потому что сделка сгенерируется в RealTimeEmulationTrader<SmartTrader>, а не в SmartTrader.