Normalizedouble

 

Below is a section of my code 

// count open positions
   int cntBuy, cntSell;
   if(!CountOpenPositions(cntBuy,cntSell)){return;}
   
   // check for buy positions
   if (cntBuy==0 && bufferRSI[1]>=(100-RSI_Level) && bufferRSI[0]<(100-RSI_Level) && currentTick.ask>bufferMA[0]){
     
     if(Close_by_Opposite){if(!ClosePositions(2)){return;}}
     double sl = Stop_LOSS==0 ? 0 : currentTick.bid - Stop_LOSS * _Point;
     double tp = TAKE_PROFIT==0 ? 0 : currentTick.bid + TAKE_PROFIT * _Point;
     if(!NormalizePrice(sl)){return;}
     if(!NormalizePrice(tp)){return;} 
     
     
     trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot_Size,currentTick.ask,sl,tp," ");
      
   }
   
   // check for sell positions
   if (cntSell==0 && bufferRSI[1]<=RSI_Level && bufferRSI[0]>RSI_Level && currentTick.bid<bufferMA[0]){
   
     
     if(Close_by_Opposite){if(!ClosePositions(1)){return;}}
     double sl = Stop_LOSS==0 ? 0 : currentTick.ask + Stop_LOSS * _Point;
     double tp = TAKE_PROFIT==0 ? 0 : currentTick.ask - TAKE_PROFIT * _Point;
     if(!NormalizePrice(sl)){return;}
     if(!NormalizePrice(tp)){return;} 
     
     trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lot_Size,currentTick.bid,sl,tp," ");
      
   }

I do understand that normalizedouble should go in the section sl & tp defined 

double sl = Stop_LOSS==0 ? 0 : currentTick.bid - Stop_LOSS * _Point;
     double tp = TAKE_PROFIT==0 ? 0 : currentTick.bid + TAKE_PROFIT * _Point;

But when I try to write it as the following 

double sl = Stop_LOSS==0 ? 0 :NormalizeDouble(( currentTick.bid - Stop_LOSS) * _Point),_Digits;
     

I am getting errors so I wanted to ask on the forum if someone could help me write it correctly, because I have tried searching on the forum and some of the other post by other professionals who have helped other people in the past are a little confusing to understand the post.  

 
Ricks creations: I do understand that normalizedouble should go in the section sl & tp defined

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)

 

Forum on trading, automated trading systems and testing trading strategies

But when I try to write it as the following 

double sl = Stop_LOSS==0 ? 0 :NormalizeDouble(( currentTick.bid - Stop_LOSS) * _Point),_Digits;
     

I am getting errors so I wanted to ask on the forum if someone could help me write it correctly, because I have tried searching on the forum and some of the other post by other professionals who have helped other people in the past are a little confusing to understand the post.  

Correct code:

double sl = Stop_LOSS==0 ? 0 : NormalizeDouble((currentTick.bid - Stop_LOSS * _Point), _Digits);
Reason: