Здравствуйте,
Имеется стратегия парной торговли, реализованная в виде BasketStrategy и нескольких принадлежащих ей ChildStrategies, каждая работает со своей Security. Есть ли удобный способ в S# посчитать суммарный Unrealized PnL (по открытым позициям) в рублях для этих стратегий, не используя TraderPnLManager (потому что параллельно работает еще одна стратегия)?
Спасибо,
Kommentare (8)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Смотрите в сторону 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.