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);
        }
示例#3
0
        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);
            }
        }
示例#7
0
 public UnexpectedPriceCalculationMethodException(PriceCalculationMethod method) : base(
         "Unexpected price calculation method")
 {
     Method = method;
 }