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()
   {// Buying Opportunities
      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

    See also The == operand. - MQL4 programming forum (2013)

    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

      See also The == operand. - MQL4 programming forum (2013)

    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

See also The == operand. - MQL4 programming forum (2013)

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)

Much appreciated William!  All returned values are now correct. For anyone else facing the same issue, this is the code I used:


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