protected double CalculateValue(double value, int accuracy, AprRequest request, bool isPluse) { var origValue = value; var spread = value * (Merchant.DeltaSpread / 100); value = isPluse ? (value + spread) : (value - spread); double lpFee = value * (Merchant.LpMarkupPercent < 0 ? PayApiSettings.LpMarkup.Percent / 100 : Merchant.LpMarkupPercent / 100); double lpPips = Math.Pow(10, -1 * accuracy) * (Merchant.LpMarkupPips < 0 ? PayApiSettings.LpMarkup.Pips : Merchant.LpMarkupPips); var delta = spread + lpFee + lpPips; if (request != null) { var fee = value * (request.Percent / 100); var pips = Math.Pow(10, -1 * accuracy) * request.Pips; delta += fee + pips; } var result = origValue + (isPluse ? delta : -delta); var powRound = Math.Pow(10, -1 * accuracy) * (isPluse ? 0.49 : 0.5); result += isPluse ? powRound : -powRound; var res = Math.Round(result, accuracy); int mult = (int)Math.Pow(10, accuracy); res = Math.Ceiling(res * mult) / mult; if (res < 0) { res = 0; } return(res); }
protected async Task <AssertPairRateWithSession> GetRatesWithSession(string assertPair, AprRequest arpRequest) { var result = await GetRate(assertPair); var post = result as StatusCodeResult; if (post != null) { return(null); } var rate = (AssertPairRateWithSession)result; if (rate == null || arpRequest == null) { return(rate); } rate.Bid = CalculateValue(rate.Bid, rate.Accuracy, arpRequest, false); rate.Ask = CalculateValue(rate.Ask, rate.Accuracy, arpRequest, true); return(rate); }