MQL5 function which calculates position size by risk and SL

Poker_player  

Have tried searching and implementing but cannot find correct example. Its weird because it should be needed for lot of people and should exist somewhere.


Can you give a link or code for that?


So far I have done by examples this


 double calculateLotSizeForPips(double slPips, double maxRiskPerTradePercent){          //Calculate the size of the position size 
      double LotSize=0;
      //We get the value of a tick
       //double nTickValue=MarketInfo(Symbol(),MODE_TICKVALUE); // not used
      double nTickValue = SYMBOL_TRADE_TICK_VALUE;
      
           
      
      //If the digits are 3 or 5 we normalize multiplying by 10
      /*if(_Digits==3 || _Digits==5){
         nTickValue=nTickValue*10;
      }*/
      
      float balance = AccountInfoDouble(ACCOUNT_BALANCE);
      
      //We apply the formula to calculate the position size and assign the value to the variable
      LotSize=(balance*maxRiskPerTradePercent/100)/(slPips*nTickValue);
      //LotSize=MathRound(LotSize/MarketInfo(Symbol(),MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP); // not used
      
      double volumeStep = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
      LotSize=MathRound(LotSize/volumeStep)*volumeStep;
      return LotSize;
   }

But it works bad. Testing on USDJPY pair, usd account.

I do not know why in the example was when digits are 3 or 5 - multiply by ten , but it make my position 10 times smaller.

So for 10k account, when I put to formula it is:

Risk 2 percent, pips 4, tick value 26

10000*0.02/(4*26) = 1.92

Code with volume step is not changing the result.

But it is wrong. 

It loses about 80 usd. 2 % from 10k is 200. 

Backtest shows it has lost about 75

its more or less what the function calculated. But it is not 200. 

Reason: