Double value doesn't show Normalize digits

 

Hello Everyone i used a normalize function for a double value but it doesn't show fixed digits in results. 

sometime it shows 2 digits value such as 1.10  that is correct. but sometime it shows me 1.100000000000

Can you help me to understand how to fix it and why it giving this issue. because it can make problem when the expert advisor try to send order. i noticed if the lotsize value or price double value is not Normalized then the EA generate execution or wrong value error.

Example: 

// Lotsize is already normalized in OnInit function when the Expert start first run

void LotsCalc() {
               int LotsDigit; double MinLots; double MaxLots; double AcFrMar;
               AcFrMar  = AccountFreeMargin();
               if(MarketInfo(Symbol(),MODE_MINLOT) == 0.1) 
               {
                LotsDigit = 1;
               }else 
               if(MarketInfo(Symbol(),MODE_MINLOT) == 0.01 && GetLastError()!=4051) 
                  {
                  LotsDigit = 2;
                   MinLots = NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),LotsDigit);
                   MaxLots = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),LotsDigit);
                   AcFrMar = NormalizeDouble(AccountFreeMargin(),2);
                  LotSize = NormalizeDouble((AcFrMar*(LotPercent/100))/1000,2);
                  }
               if(LotSize > MaxLots){ LotSize = NormalizeDouble(MaxLots,2);}
               if(LotSize < MinLots) { LotSize = NormalizeDouble(MinLots,2); }
}

here i attached a photo too.


 
Ali Raza:

Hello Everyone i used a normalize function for a double value but it doesn't show fixed digits in results. 

sometime it shows 2 digits value such as 1.10  that is correct. but sometime it shows me 1.100000000000

Can you help me to understand how to fix it and why it giving this issue. because it can make problem when the expert advisor try to send order. i noticed if the lotsize value or price double value is not Normalized then the EA generate execution or wrong value error.

Example: 

here i attached a photo too.


When you want to Print() or Comment() doubles, you need to convert them using DoubleToString(). Normalizing them is not enough.

As for Trade Operations, it is better to use a little Math to create a "Custom Made Function" to Normalize instead of NormalizeDouble().

For LotSizes, Normalize to SYMBOL_VOLUME_STEP without using NormalizeDouble().
For Prices, Normalize to MODE_TICKSIZE without using NormalizeDouble(). 

Cheers!

DoubleToString - Conversion Functions - MQL4 Reference
DoubleToString - Conversion Functions - MQL4 Reference
  • docs.mql4.com
DoubleToString - Conversion Functions - MQL4 Reference
 

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.
              (MT4 2013) (MT5 2022)

  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)

 
Thanks for everyone. i think i have to learn more about these complications and issues. 
 

https://www.mql5.com/en/forum/367839/page5#comment_27658321

Bug in NormalizeDouble().

Better, use this precise function:

double RoundVolume(double pVolume, string pSymbol = NULL);

It is found in MathUtils library. https://www.mql5.com/en/code/20822

MT5/mql5 reported and confirmed bugs.
MT5/mql5 reported and confirmed bugs.
  • 2022.02.08
  • www.mql5.com
I will use this topic to post reported bugs to Metaquotes in a centralized place. Please DON'T POST here without contacting me in private firstly...
Reason: