public TradePriceUpdateJob(ITradesCache tradesCache, IMarketDataService marketDataService) { _job = tradesCache.Trades.Connect() .Filter(trade => trade.Status == TradeStatus.Live) .Group(trade => trade.CurrencyPair) .SubscribeMany(groupedData => { var locker = new object(); decimal latestPrice = 0; //subscribe to price and update trades with the latest price var priceHasChanged = marketDataService.Watch(groupedData.Key) .Synchronize(locker) .Subscribe(price => { //TODO: Bid or offer depending on Buy/Sell latestPrice = price.Bid; UpdateTradesWithPrice(groupedData.Cache.Items, latestPrice); }); //connect to data changes and update with the latest price var dataHasChanged = groupedData.Cache.Connect() .WhereReasonsAre(ChangeReason.Add, ChangeReason.Update) .Synchronize(locker) .Subscribe(changes => UpdateTradesWithPrice(changes.Select(change => change.Current), latestPrice)); return(new CompositeDisposable(priceHasChanged, dataHasChanged)); }) .Subscribe(); }
public TradePriceUpdateJob(ITradesCache tradesCache, IMarketDataService marketDataService) { _job = tradesCache.Trades.Connect() .Filter(trade => trade.Status == TradeStatus.Live) .Group(trade => trade.CurrencyPair) .SubscribeMany(groupedData => { var locker = new object(); decimal latestPrice = 0; //subscribe to price and update trades with the latest price var priceHasChanged = marketDataService.Watch(groupedData.Key) .Synchronize(locker) .Subscribe(price => { //TODO: Bid or offer depending on Buy/Sell latestPrice = price.Bid; UpdateTradesWithPrice(groupedData.Cache.Items, latestPrice); }); //connect to data changes and update with the latest price var dataHasChanged = groupedData.Cache.Connect() .WhereReasonsAre(ChangeReason.Add, ChangeReason.Update) .Synchronize(locker) .Subscribe(changes => UpdateTradesWithPrice(changes.Select(change => change.Current), latestPrice)); return new CompositeDisposable(priceHasChanged, dataHasChanged); }) .Subscribe(); }
public TradeManagementService(ITradesCache tradesCache, ITradeGenerator tradeGenerator, IMessagePublisher <Trade> messagePublisher) { _tradesCache = tradesCache; _tradeGenerator = tradeGenerator; _messagePublisher = messagePublisher; }
public LiveTradesViewer(ITradesCache tradesCache, ILogger logger, ISchedulerProvider schedulerProvider) { _logger = logger; var filterApplier = this.PropertyValueChanged(t => t.SearchText) .Throttle(TimeSpan.FromMilliseconds(250)) .Select(propargs => BuildFilter(propargs.Value)) .Subscribe(_filter.Change); var loader = tradesCache.Trades.Connect(trade => trade.Status == TradeStatus.Live) //prefilter live trades only .Filter(_filter) // apply user filter .Transform(trade => new TradeProxy(trade),new ParallelisationOptions(ParallelType.Ordered,5)) .Sort(SortExpressionComparer<TradeProxy>.Descending(t => t.Trade.Timestamp),SortOptimisations.ComparesImmutableValuesOnly) .ObserveOn(schedulerProvider.Dispatcher) .Bind(Data) // update observable collection bindings .DisposeMany() //since TradeProxy is disposable dispose when no longer required .Subscribe(); _cleanUp = new CompositeDisposable(loader, _filter, filterApplier); }
public LiveTradesViewer(ITradesCache tradesCache, ILogger logger, ISchedulerProvider schedulerProvider) { _logger = logger; var filterApplier = this.PropertyValueChanged(t => t.SearchText) .Throttle(TimeSpan.FromMilliseconds(250)) .Select(propargs => BuildFilter(propargs.Value)) .Subscribe(_filter.Change); var loader = tradesCache.Trades.Connect(trade => trade.Status == TradeStatus.Live) //prefilter live trades only .Filter(_filter) // apply user filter .Transform(trade => new TradeProxy(trade), new ParallelisationOptions(ParallelType.Ordered, 5)) .Sort(SortExpressionComparer <TradeProxy> .Descending(t => t.Trade.Timestamp), SortOptimisations.ComparesImmutableValuesOnly) .ObserveOn(schedulerProvider.Dispatcher) .Bind(Data) // update observable collection bindings .DisposeMany() //since TradeProxy is disposable dispose when no longer required .Subscribe(); _cleanUp = new CompositeDisposable(loader, _filter, filterApplier); }