コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
 public TradeManagementService(ITradesCache tradesCache,
                               ITradeGenerator tradeGenerator,
                               IMessagePublisher <Trade> messagePublisher)
 {
     _tradesCache      = tradesCache;
     _tradeGenerator   = tradeGenerator;
     _messagePublisher = messagePublisher;
 }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }