public ITradingPair AddOrUpdatePair(IOrderDetails order, string pair, decimal feesMarketCurrency, decimal feesPairCurrency, decimal?amountOverride = null, decimal?averagePriceOverride = null)
        {
            decimal amount          = amountOverride ?? order.AmountFilled;
            decimal amountAfterFees = amount - feesPairCurrency;
            decimal averagePrice    = averagePriceOverride ?? (order.AveragePrice + (feesMarketCurrency / amount));

            if (tradingPairs.TryGetValue(pair, out TradingPair tradingPair))
            {
                if (!tradingPair.OrderIds.Contains(order.OrderId))
                {
                    tradingPair.OrderIds.Add(order.OrderId);
                    tradingPair.OrderDates.Add(order.Date);
                }
                tradingPair.AveragePrice = (tradingPair.Cost + amountAfterFees * averagePrice) / (tradingPair.Amount + amountAfterFees);
                tradingPair.Amount      += amountAfterFees;
                tradingPair.Fees        += feesMarketCurrency;
                tradingPair.SetMetadata(tradingPair.Metadata.MergeWith(order.Metadata));
            }
            else
            {
                tradingPair = new TradingPair
                {
                    Pair     = pair,
                    OrderIds = new List <string> {
                        order.OrderId
                    },
                    OrderDates = new List <DateTimeOffset> {
                        order.Date
                    },
                    AveragePrice = averagePrice,
                    Amount       = amountAfterFees,
                    Fees         = feesMarketCurrency,
                    Metadata     = order.Metadata
                };
                tradingPairs.TryAdd(pair, tradingPair);
                tradingPair.SetCurrentValues(tradingService.GetPrice(tradingPair.Pair), tradingService.Exchange.GetPriceSpread(tradingPair.Pair));
                tradingPair.Metadata.CurrentRating = tradingPair.Metadata.Signals != null?signalsService.GetRating(tradingPair.Pair, tradingPair.Metadata.Signals) : null;

                tradingPair.Metadata.CurrentGlobalRating = signalsService.GetGlobalRating();
                if (tradingPair.Metadata.LastBuyMargin == null)
                {
                    tradingPair.Metadata.LastBuyMargin = tradingPair.CurrentMargin;
                }
            }
            return(tradingPair);
        }
示例#2
0
        public virtual void AddBuyOrder(IOrderDetails order)
        {
            lock (SyncRoot)
            {
                if (order.Side == OrderSide.Buy && (order.Result == OrderResult.Filled || order.Result == OrderResult.FilledPartially))
                {
                    decimal balanceDifference  = -order.AverageCost;
                    decimal feesPairCurrency   = 0;
                    decimal feesMarketCurrency = 0;
                    decimal amountAfterFees    = order.AmountFilled;

                    if (order.Fees != 0 && order.FeesCurrency != null)
                    {
                        if (order.FeesCurrency == tradingService.Config.Market)
                        {
                            feesMarketCurrency = order.Fees;
                            balanceDifference -= order.Fees;
                        }
                        else
                        {
                            string feesPair = order.FeesCurrency + tradingService.Config.Market;
                            if (feesPair == order.Pair)
                            {
                                feesPairCurrency = order.Fees;
                                amountAfterFees -= order.Fees;
                            }
                            else
                            {
                                feesMarketCurrency = tradingService.GetCurrentPrice(feesPair) * order.Fees;
                            }
                        }
                    }
                    balance += balanceDifference;

                    if (tradingPairs.TryGetValue(order.Pair, out TradingPair tradingPair))
                    {
                        if (!tradingPair.OrderIds.Contains(order.OrderId))
                        {
                            tradingPair.OrderIds.Add(order.OrderId);
                            tradingPair.OrderDates.Add(order.Date);
                        }
                        tradingPair.AveragePricePaid    = (tradingPair.AverageCostPaid + order.AverageCost) / (tradingPair.TotalAmount + order.AmountFilled);
                        tradingPair.FeesPairCurrency   += feesPairCurrency;
                        tradingPair.FeesMarketCurrency += feesMarketCurrency;
                        tradingPair.TotalAmount        += amountAfterFees;
                        tradingPair.Metadata            = tradingPair.Metadata.MergeWith(order.Metadata);
                    }
                    else
                    {
                        tradingPair = new TradingPair
                        {
                            Pair     = order.Pair,
                            OrderIds = new List <string> {
                                order.OrderId
                            },
                            OrderDates = new List <DateTimeOffset> {
                                order.Date
                            },
                            AveragePricePaid   = order.AveragePrice,
                            FeesPairCurrency   = feesPairCurrency,
                            FeesMarketCurrency = feesMarketCurrency,
                            TotalAmount        = amountAfterFees,
                            Metadata           = order.Metadata
                        };
                        tradingPairs.TryAdd(order.Pair, tradingPair);
                        tradingPair.SetCurrentValues(tradingService.GetCurrentPrice(tradingPair.Pair), tradingService.GetCurrentSpread(tradingPair.Pair));
                        tradingPair.Metadata.CurrentRating = tradingPair.Metadata.Signals != null?signalsService.GetRating(tradingPair.Pair, tradingPair.Metadata.Signals) : null;

                        tradingPair.Metadata.CurrentGlobalRating = signalsService.GetGlobalRating();
                    }
                }
            }
        }