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); }
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(); } } } }