/// <summary> /// Choose the best fiat value for this trade /// </summary> /// <param name="trade">Trade</param> /// <param name="provider">Provider</param> /// <param name="date">date</param> /// <returns>Decimal value</returns> public static decimal ChooseFiatValueForTrade(this Trade trade, FiatProviderBase provider, DateTime date) { // Check same as provider if (trade.From.Coin == provider.Coin) { trade.Fees = trade.SumarizeFees(trade.From.Coin == provider.Coin ? trade.To.Coin : trade.From.Coin); return(trade.From.Value); } else if (trade.To.Coin == provider.Coin) { trade.Fees = trade.SumarizeFees(trade.From.Coin == provider.Coin ? trade.To.Coin : trade.From.Coin); return(trade.To.Value); } else if (trade.From.Coin == ECoin.USD) { trade.Fees = trade.SumarizeFees(trade.From.Coin == provider.Coin ? trade.To.Coin : trade.From.Coin); return(trade.From.Value * provider.GetFiatPrice(null, ECoin.USD, date)); } else if (trade.To.Coin == ECoin.USD) { trade.Fees = trade.SumarizeFees(trade.From.Coin == provider.Coin ? trade.To.Coin : trade.From.Coin); return(trade.To.Value * provider.GetFiatPrice(null, ECoin.USD, date)); } // Check BTC first foreach (var market in AvailableMarkets) { if (!trade.FromOrToIs(market)) { continue; } var price = provider.GetFiatPrice(trade.Exchange, market, date); price *= (trade.From.Coin == market ? trade.From.Value : trade.To.Value); trade.Fees = trade.SumarizeFees(trade.From.Coin == market ? trade.To.Coin : trade.From.Coin); return(price); } throw new ArgumentException("Market not found"); }
/// <summary> /// Compute fiat values /// </summary> /// <param name="trades">Trades</param> /// <param name="provider">Provider</param> public static void ComputeFiatValues(this IEnumerable <Trade> trades, FiatProviderBase provider) { foreach (var trade in trades) { if (!trade.FiatCostWithoutFees.HasValue) { trade.FiatCostWithoutFees = trade.ChooseFiatValueForTrade(provider, trade.Date); } if (!trade.FiatFees.HasValue) { trade.FiatFees = 0; foreach (var fee in trade.Fees) { trade.FiatFees += trade.ChooseFiatPriceForFee(provider, fee); } } } }
/// <summary> /// Choose the best price for this trade /// </summary> /// <param name="provider">Provider</param> /// <param name="fee">Trade</param> /// <param name="trade">Trade</param> /// <returns>Decimal value</returns> public static decimal ChooseFiatPriceForFee(this Trade trade, FiatProviderBase provider, Quantity fee) { return(provider.GetFiatPrice(trade.Exchange, fee.Coin, trade.Date) * fee.Value); }