# Rounding Error

I am attempting to round my StopLossPrice to the nearest tick but there is an error which I don't know how to solve. Most of the time the value returned is correct although sometimes StopLossPrice returns a value similar to x.xxx0000000001. I have tried replacing MODE_TICKVALUE with _Digits, MODE_TICKSIZE. Thanks for help in advance!

```
double StopLossPrice()
if(BullishCandlestick() == true && BullishHammer() == true)
{
stopLossPrice = (iClose(NULL, NULL, 1)) - (stopLossinPips * GetPipValue());
}
else if(BullishCandlestick() == false && BullishHammer() == true)
{
stopLossPrice = (iClose(NULL, NULL, 1)) - (stopLossinPips * GetPipValue());
}

// Selling Opportunities
else if(BullishCandlestick() == true && BearishShootingStar() == true)
{
stopLossPrice = (iClose(NULL, NULL, 1)) + (stopLossinPips * GetPipValue());
}
else if(BullishCandlestick() == false && BearishShootingStar() == true)
{
stopLossPrice = (iClose(NULL, NULL, 1)) + (stopLossinPips * GetPipValue());
}

return stopLossPrice;
}

double stopLossPrice = StopLossPrice();
double StopLossPrice = NormalizeDouble(stopLossPrice, MODE_TICKVALUE);```

1. luxecapital: returns a value similar to x.xxx0000000001.

Floating-point has an infinite number of decimals, it's you, not understanding floating-point and that some numbers can't be represented exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia

If you want to see the correct number of digits, convert it to a string with the correct/wanted accuracy.
question about decima of marketinfo() - MQL4 programming forum (2016)

2. You used NormalizeDouble, It's use is usually wrong, as it is in your case.

1. Floating point has a infinite number of decimals, it's your not understanding floating point and that some numbers can't be represented exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia, the free encyclopedia

2. Print out your values to the precision you want with DoubleToString - Conversion Functions - MQL4 Reference.

3. SL/TP (stops) need to be normalized to tick size (not Point) — code fails on non-currencies.
On 5Digit Broker Stops are only allowed to be placed on full pip values. How to find out in mql? - MQL4 programming forum (2011)

And abide by the limits Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial and that requires understanding floating point equality Can price != price ? - MQL4 programming forum (2012)

4. Open price for pending orders need to be adjusted. On Currencies, Point == TickSize, so you will get the same answer, but it won't work on non-currencies. So do it right.
Trailing Bar Entry EA - MQL4 programming forum (2013)
Bid/Ask: (No Need) to use NormalizeDouble in OrderSend - MQL4 programming forum (2012)

5. Lot size must also be adjusted to a multiple of LotStep and check against min and max. If that is not a power of 1/10 then NormalizeDouble is wrong.
Do it right. (2013)

6. MathRound() and NormalizeDouble() are rounding in a different way. Make it explicit.
MT4:NormalizeDouble - MQL5 programming forum (2017)
How to Normalize - Expert Advisors and Automated Trading - MQL5 programming forum (2017)

7. Prices you get from the terminal are already correct (normalized).

8. PIP, Point, or Tick are all different in general.
What is a TICK? - MQL4 programming forum (2014)

William Roeder #:

Floating-point has an infinite number of decimals, it's you, not understanding floating-point and that some numbers can't be represented exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia

` string FinalSLPrice(double stopLossPrice){return DoubleToStr(stopLossPrice, Digits);  }`