public PnLWidgetViewModel(DemoWorkspaceViewModel host, String cacheID = null) : base(host, cacheID) { Strategies = new ReactiveList <StrategyWidgetViewModel>(); this.WhenAnyObservable(vm => vm.Strategies.CountChanged).Subscribe(change => StrategiesCount = change); var strategyObservable = StrategyService.All.Connect() .Transform(strategy => new StrategyWidgetViewModel(Workspace) { Strategy = strategy }) .Bind(_strategies) .DisposeMany() .Subscribe(); var pricesObservable = PriceService.All .Connect() .ObserveOn(AppScheduler.MainThread) .Do(changes => { PnLGlobal = Strategies.Sum(strategy => strategy.Trades.Sum(trade => trade.PnL)); }) .DisposeMany() .Subscribe(); OpenStrategyWorkspace = ReactiveCommand.Create <StrategyWidgetViewModel>((vm) => { var state = this.Workspace.Dashboard.GetState(); this.Workspace.Dashboard.CreateWorkspace(new DemoWorkspaceState(vm.Name, state.Date, DemoWorkspaceType.Strategy) { Strategy = vm.Strategy }, true); }); this.WhenAny(vm => vm.TradesCount, vm => vm.StrategiesCount, vm => vm.PnLGlobal, (trd, str, pnl) => String.Format("PnL viewer - {0} Strategies - {1} Trades(s) - PnL [{2}] ", StrategiesCount, TradesCount, PnLGlobal)) .Subscribe(header => { Header = header; }); var tradesCountObservable = Observable .Interval(TimeSpan.FromMilliseconds(500)) .ObserveOnDispatcher() .Subscribe(observer => { TradesCount = Strategies.Sum(strategy => strategy.TradesCount); }); Cleanup(tradesCountObservable, strategyObservable, pricesObservable); }
public StrategyChartWidgetViewModel(DemoWorkspaceViewModel host, String cacheID) : base(host, cacheID) { StrategyChartItems = new ReactiveList <StrategyChartItemViewModel>(); this.WhenAnyValue(vm => vm.Workspace) .Where(obj => null != obj) .Subscribe((obs) => { Strategy = obs.State.Strategy; }); this.WhenAnyValue(vm => vm.Strategy) .Where(chg => chg != null) .Subscribe(chg => { var tradeObservable = Strategy.Trades .Connect() .Group(trade => trade.Counterparty) .Transform(group => new StrategyChartItemViewModel(group)) .Bind(StrategyChartItems) .DisposeMany() .Subscribe(); Cleanup(tradeObservable); }); this.WhenAnyObservable(vm => vm.Strategy.Trades.CountChanged) .Subscribe((obs) => { Header = String.Format("{0} Counterparties", Strategy.Trades.Items.Select(trade => trade.Counterparty).Distinct().Count()); //force chart to redraw this.RaisePropertyChanged("StrategyChartItems"); }); }
public DemoWidgetViewModelBase(DemoWorkspaceViewModel host, String cacheID = null) : base(host, cacheID) { }
public StrategyWidgetViewModel(DemoWorkspaceViewModel host, String cacheId = null) : base(host, cacheId) { var pricesObservable = PriceService.All .Connect() .ObserveOn(AppScheduler.MainThread) .Do(changes => { changes.ForEach(change => { var pnl = 0.0; for (var i = 0; i < Trades.Count; i++) { if (Trades[i].Trade.Asset == change.Current.Asset.Name) { Trades[i].PnL = Trades[i].Trade.Price - change.Current.Value; } pnl += Trades[i].PnL; } StrategyPnL = pnl; }); }) .DisposeMany() .Subscribe(); Cleanup(pricesObservable); this.WhenAnyValue(vm => vm.Workspace) .Where(obj => null != obj) .Subscribe((obs) => { Strategy = obs.State.Strategy; }); this.WhenAnyValue(vm => vm.Strategy) .Where(obj => null != obj) .Subscribe((obs) => { Trades = new ReactiveList <TradeViewModel>(); var tradeObservable = _strategy.Trades .Connect() .Transform(trade => new TradeViewModel(trade)) .Bind(_trades) .DisposeMany() .Subscribe(); Cleanup(tradeObservable); }); _tradesCount = this.WhenAnyObservable(vm => vm.Trades.CountChanged) .ToProperty(this, vm => vm.TradesCount); this.WhenAnyObservable(vm => vm.Trades.CountChanged) .Select(change => Trades.Sum(trade => trade.Price + trade.PnL)) .Subscribe(chg => { MarketValue = chg; }); this.WhenAny(vm => vm.TradesCount, vm => vm.StrategyPnL, (trd, pnl) => String.Format("Strategy viewer - {0} Trades - PnL [{1}] ", TradesCount, StrategyPnL)) .Subscribe(header => { Header = header; }); }