Exemple #1
0
        public SymbolViewModel(Exchange exchange, IWpfExchangeService exchangeService, IChartHelper chartHelper,
                               IOrderBookHelper orderBookHelper, ITradeHelper tradeHelper,
                               Preferences preferences, ILoggerFacade logger)
            : base(exchangeService, logger)
        {
            this.exchange        = exchange;
            this.orderBookHelper = orderBookHelper;
            this.tradeHelper     = tradeHelper;

            TradeLimit              = preferences.TradeLimit;
            TradesDisplayCount      = preferences.TradesDisplayCount;
            TradesChartDisplayCount = preferences.TradesChartDisplayCount;

            ShowAggregateTrades = preferences.ShowAggregateTrades;

            OrderBookLimit             = preferences.OrderBookLimit;
            OrderBookDisplayCount      = preferences.OrderBookDisplayCount;
            OrderBookChartDisplayCount = preferences.OrderBookChartDisplayCount;

            TimeFormatter  = chartHelper.TimeFormatter;
            PriceFormatter = chartHelper.PriceFormatter;

            symbolCancellationTokenSource = new CancellationTokenSource();

            OnPropertyChanged(string.Empty);
        }
Exemple #2
0
        public override async Task OrderNotificationsAsync(List <StrategyNotification> orderNotifications)
        {
            if (orderNotifications == null)
            {
                throw new ArgumentNullException(nameof(orderNotifications));
            }

            if (cancellationTokenSource.IsCancellationRequested)
            {
                return;
            }

            await orderBookSemaphoreSlim.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(true);

            try
            {
                if (cancellationTokenSource.IsCancellationRequested)
                {
                    return;
                }

                if (Symbols != null)
                {
                    IsLoadingOrderBook = false;

                    var orderBookDisplayCount      = Strategy.OrderBookDisplayCount;
                    var orderBookChartDisplayCount = Strategy.OrderBookChartDisplayCount;

                    if (OrderBook == null)
                    {
                        var orderBookNotification = orderNotifications.Last();

                        var ob = JsonConvert.DeserializeObject <TradeView.Core.Model.OrderBook>(orderBookNotification.Message);

                        var orderBookHelper = orderBookHelperFactory.GetOrderBookHelper(ob.Exchange);

                        var symbol            = Symbols.First(s => s.ExchangeSymbol.Equals(ob.Symbol, StringComparison.Ordinal));
                        var pricePrecision    = symbol.PricePrecision;
                        var quantityPrecision = symbol.QuantityPrecision;

                        OrderBook = await orderBookHelper.CreateLocalOrderBook(symbol, ob, orderBookDisplayCount, orderBookChartDisplayCount).ConfigureAwait(true);
                    }
                    else
                    {
                        bool             first           = true;
                        IOrderBookHelper orderBookHelper = null;
                        Symbol           symbol          = null;
                        int quantityPrecision;
                        int pricePrecision;

                        var orderBookUpdates = new List <TradeView.Core.Model.OrderBook>();

                        foreach (var notification in orderNotifications)
                        {
                            var ob = JsonConvert.DeserializeObject <TradeView.Core.Model.OrderBook>(notification.Message);

                            if (first)
                            {
                                orderBookHelper = orderBookHelperFactory.GetOrderBookHelper(ob.Exchange);

                                symbol            = Symbols.First(s => s.ExchangeSymbol.Equals(ob.Symbol, StringComparison.Ordinal));
                                quantityPrecision = symbol.QuantityPrecision;
                                pricePrecision    = symbol.PricePrecision;
                            }

                            orderBookUpdates.Add(ob);
                        }

                        var newOrderBookUpdates
                            = orderBookUpdates
                              .OrderBy(ob => ob.LastUpdateId)
                              .Where(ob => ob.LastUpdateId > OrderBook.LastUpdateId).ToList();

                        foreach (var ob in newOrderBookUpdates)
                        {
                            orderBookHelper.UpdateLocalOrderBook(OrderBook, ob,
                                                                 symbol.PricePrecision, symbol.QuantityPrecision,
                                                                 orderBookDisplayCount, orderBookChartDisplayCount);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                OnException($"{Strategy.Name} : OrderNotificationsAsync - {ex.Message}", ex);
            }
            finally
            {
                orderBookSemaphoreSlim.Release();
            }

            await Task.FromResult <object>(null).ConfigureAwait(false);
        }