protected void ProcessPublicTrades(IEnumerable <PublicTrade> trades) { var tradesList = trades as List <PublicTrade> ?? trades.ToList(); if (RecentTrades.All(x => x.SymbolInformation.Symbol != CurrentSymbol.Symbol)) { RecentTrades.Clear(); } long?lastId = RecentTrades.FirstOrDefault()?.Id; if (lastId != null) { tradesList.RemoveAll(x => x.Id <= lastId); } using (RecentTrades.SuppressChangeNotifications()) { if (tradesList.Count > 0) { RecentTrades.InsertRange(0, tradesList); if (RecentTrades.Count > TradesMaxItemCount) { RecentTrades.RemoveRange(TradesMaxItemCount, Math.Abs(TradesMaxItemCount - RecentTrades.Count)); } } CalcQuantityPercentageTotal(RecentTrades); } }
private void Run() { //var subServerTime = Observable.Interval(TimeSpan.FromSeconds(2)).Publish(); //var subExchangeInfo = Observable.Interval(TimeSpan.FromMinutes(5)).Publish(); //subServerTime.Subscribe( // (long x) => // { // var result = client.GetServerTime2(); // UpdateStatus(); // if (result.Success) // { // ServerTime = result.Data.serverTime.FromUnixTimestamp(); // } // }).DisposeWith(Disposables); //subExchangeInfo.Subscribe( // (long x) => // { // var result = client.GetExchangeInfo2(); // UpdateStatus(); // if (result.Success) // { // ProcessExchangeInfo(result.Data.symbols.Select(CreateSymbolInformation)); // } // }).DisposeWith(Disposables); var subServerTime = client.SubscribeServerTime().Publish(); var subExchangeInfo = client.SubscribeExchangeInfo().Publish(); var sub24hrPriceTicker = Observable.Interval(TimeSpan.FromSeconds(10)).Publish(); var subCurrentSymbol = this.WhenAnyValue(vm => vm.CurrentSymbol).Where(id => id != null).DistinctUntilChanged().Publish(); var sub24hrPriceTickerWs = client.SubscribeMarketSummariesAsync(null).Publish(); subServerTime.Subscribe( (Binance.ServerTime x) => { ServerTime = x.serverTime.FromUnixTimestamp(); UpdateStatus(); }).DisposeWith(Disposables); subExchangeInfo.Subscribe( (Binance.ExchangeInfo x) => { ProcessExchangeInfo(x.symbols.Select(CreateSymbolInformation)); UpdateStatus(); }).DisposeWith(Disposables); sub24hrPriceTicker.Subscribe( (long x) => { var result = client.Get24hrPriceTicker2(); UpdateStatus(); if (result.Success) { Process24hrPriceTicker(result.Data.Select(ToPriceTicker)); } }).DisposeWith(Disposables); sub24hrPriceTickerWs.Subscribe( (Binance.WsPriceTicker24hr ticker) => { OnRefreshMarketSummary2(ToPriceTicker(ticker)); }).DisposeWith(Disposables); subCurrentSymbol.Subscribe( (string symbol) => { RecentTrades.Clear(); OrderBook.Clear(); if (HasTradesPush) { var obs = SubscribeRecentTrades(symbol, TradesMaxItemCount); TradesHandle.Disposable = obs.Subscribe(OnTrade); } if (HasTradesPull) { //var obs = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(10)); //PublicTradesHandle.Disposable = obs.Subscribe( // (long x) => // { // var result = client.GetRecentTrades2(symbol, TradesMaxItemCount); // if (result.Success) // { // var trades = result.Data.Select(ToPublicTrade).Reverse().ToList(); // trades.ForEach(t => t.Symbol = symbol); // ProcessPublicTrades(trades); // } // }); } if (HasOrderBookPull) { var obs2 = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(2)); DepthHandle.Disposable = obs2.Subscribe( (long x) => { var result = client.GetDepth2(symbol, OrderBookMaxItemCount); if (result.Success) { var depth = result.Data; var asks = depth.asks.Select(a => new OrderBookEntry() { Price = decimal.Parse(a[0]), Quantity = decimal.Parse(a[1]), Side = TradeSide.Sell }); var bids = depth.bids.Select(b => new OrderBookEntry() { Price = decimal.Parse(b[0]), Quantity = decimal.Parse(b[1]), Side = TradeSide.Buy }); ProcessOrderBook(asks.Reverse().Concat(bids)); } }); } }).DisposeWith(Disposables); subServerTime.Connect().DisposeWith(Disposables); subExchangeInfo.Connect().DisposeWith(Disposables); //sub24hrPriceTicker.Connect().DisposeWith(Disposables); subCurrentSymbol.Connect().DisposeWith(Disposables); sub24hrPriceTickerWs.Connect().DisposeWith(Disposables); TradesHandle.DisposeWith(Disposables); DepthHandle.DisposeWith(Disposables); }