public decimal CalculatePrice( decimal askPrice, decimal bidPrice, int pairAccuracy, int assetAccuracy, decimal markupPercent, int markupPips, PriceCalculationMethod priceValueType, IMarkup merchantMarkup) { _log.Info($"Rate calculation, askPrice = {askPrice}, bidPrice = {bidPrice}"); decimal originalPrice = GetOriginalPriceByMethod(bidPrice, askPrice, priceValueType); decimal spread = GetSpread(originalPrice, merchantMarkup.DeltaSpread); decimal priceWithSpread = GetPriceWithSpread(originalPrice, spread, priceValueType); decimal lpFee = GetMerchantFee(priceWithSpread, merchantMarkup.Percent); decimal lpPips = GetMerchantPips(merchantMarkup.Pips); decimal fee = GetMarkupFeePerRequest(priceWithSpread, markupPercent); decimal delta = GetDelta(spread, lpFee, fee, lpPips, markupPips, pairAccuracy); decimal result = GetPriceWithDelta(originalPrice, delta, priceValueType); return(GetRoundedPrice(result, pairAccuracy, assetAccuracy, priceValueType)); }
public decimal GetRoundedPrice(decimal originalPrice, int pairAccuracy, int assetAccuracy, PriceCalculationMethod method) { decimal result; switch (method) { case PriceCalculationMethod.ByBid: result = originalPrice - pairAccuracy.GetMinValue() * (decimal)0.5; break; case PriceCalculationMethod.ByAsk: result = originalPrice + pairAccuracy.GetMinValue() * (decimal)0.49; break; default: throw new UnexpectedPriceCalculationMethodException(method); } decimal rounded = Math.Round(result, assetAccuracy); long mult = (long)Math.Pow(10, assetAccuracy); decimal ceiled = Math.Ceiling(rounded * mult) / mult; return(ceiled < 0 ? 0 : ceiled); }
public decimal CalculatePrice( double askPrice, double bidPrice, int pairAccuracy, int assetAccuracy, double markupPercent, int markupPips, PriceCalculationMethod priceValueType, IMarkup merchantMarkup) { _log.WriteInfoAsync(nameof(CalculationService), nameof(CalculatePrice), new { askPrice, bidPrice }.ToJson(), "Rate calculation").GetAwaiter().GetResult(); double originalPrice = GetOriginalPriceByMethod(bidPrice, askPrice, priceValueType); double spread = GetSpread(originalPrice, merchantMarkup.DeltaSpread); double priceWithSpread = GetPriceWithSpread(originalPrice, spread, priceValueType); double lpFee = GetMerchantFee(priceWithSpread, merchantMarkup.Percent); double lpPips = GetMerchantPips(merchantMarkup.Pips); double fee = GetMarkupFeePerRequest(priceWithSpread, markupPercent); decimal delta = GetDelta(spread, lpFee, fee, lpPips, markupPips, pairAccuracy); decimal result = GetPriceWithDelta(originalPrice, delta, priceValueType); return(GetRoundedPrice(result, pairAccuracy, assetAccuracy, priceValueType)); }
public decimal GetPriceWithDelta(decimal originalPrice, decimal delta, PriceCalculationMethod method) { switch (method) { case PriceCalculationMethod.ByBid: return(originalPrice - delta); case PriceCalculationMethod.ByAsk: return(originalPrice + delta); default: throw new UnexpectedPriceCalculationMethodException(method); } }
public decimal GetPriceWithSpread(decimal originalPrice, decimal spread, PriceCalculationMethod method) { switch (method) { case PriceCalculationMethod.ByBid: return(originalPrice - spread); case PriceCalculationMethod.ByAsk: return(originalPrice + spread); default: throw new UnexpectedPriceCalculationMethodException(method); } }
public decimal GetOriginalPriceByMethod(decimal bid, decimal ask, PriceCalculationMethod method) { switch (method) { case PriceCalculationMethod.ByAsk: return(ask); case PriceCalculationMethod.ByBid: return(bid); default: throw new UnexpectedPriceCalculationMethodException(method); } }
public UnexpectedPriceCalculationMethodException(PriceCalculationMethod method) : base( "Unexpected price calculation method") { Method = method; }