# Again and again, Risk per Trade and MM

34

Hi,

I see so many different Moneymanagement calculation and some of them are very complicated.

So, is this right, as I wanted to calculate the lotsize:

`NormalizeDouble(AccountBalance()*(RiskOfBalance/100.0)/(StopLossPrice/pips2dbl*MarketInfo(Symbol(),MODE_TICKVALUE)),LotDigit);`

Lot's of thanks!!

16080

1. Do NOT use NormalizeDouble, EVER. For ANY Reason. It's a kludge, don't use it. It's use is always wrong
2. StopLossPrice/pips2dbl is wrong. How can price (in pips) * tickvalue have meaning.
3. AccountBalance * percent = Risk = ( OrderOpenPrice - OrderStopLoss )*DIR * DeltaPerLot * lotsize. Solve for lotsize and normalize properly. You place the stop where it needs to be - where the reason for the trade is no longer valid. E.g. trading a support bounce the stop goes below the support. Note that OrderOpenPrice - OrderStopLoss includes the spread.
34

Hi WHRoeder,

thanks für your tipps! Have I understood everything correctly?

```double  DeltaValuePerLot(string pair=""){
if (pair == "") pair = Symbol();
return(  MarketInfo(pair, MODE_TICKVALUE)
/ MarketInfo(pair, MODE_TICKSIZE) ); // Not Point.
}
double NormalizeLots(double lots, string pair=""){
if (pair == "") pair = Symbol();
double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
minLot       = MarketInfo(pair, MODE_MINLOT);
lots            = MathRound(lots/ls) * ls;
if (lots < minLot) lots = 0;    // or minLot
return(lots);
}

lotsize = NormalizeLots((AccountBalance * percent) / (( OrderStopLoss - OrderOpenPrice ) * DeltaPerLot))
else
lotsize = NormalizeLots((AccountBalance * percent) / (( OrderOpenPrice - OrderStopLoss ) * DeltaPerLot))
```
241

apfel:

Hi WHRoeder,

thanks für your tipps! Have I understood everything correctly?

```//+------------------------------------------------------------------+
//|                                                         SIZE.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property version   "1.00"
//#property strict
#property show_inputs
extern double Risk       = 5.0;           // The risk of the position as a percentage of the balance.
extern color Clr_Line    = DarkGray;      // Color line.
extern color Clr_Text    = DarkGray;      // Color text.
extern int Shift_X_axis  = 1087;          // The offset of the text horizontally in pixels.
extern int Shift_Y_axis  = 10;            // The offset of the text vertically in pixels.
extern int Density_lines = 20;            // The density of lines.
extern int Distance=150;                  // Adjusting the distance between characters.
string symb;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
string symbol=Symbol();
double lotstep=MarketInfo(symbol,MODE_LOTSTEP);
int digit=(int)MarketInfo(symbol,MODE_DIGITS);
double tick=MarketInfo(symbol,MODE_TICKSIZE);
double pt=MarketInfo(symbol,MODE_TICKVALUE);
double ar=0.25*(High[1]-Low[1]+High[2]-Low[2]+High[3]-Low[3]+High[4]-Low[4]);
ObjectSet("LINE",OBJPROP_COLOR,Clr_Line);
ObjectSet("LINE",OBJPROP_RAY,0);
ObjectSet("LINE",OBJPROP_BACK,1);
string text;
string name[]={"SIZE OF POSITION","RISK FROM BALANCE","RISK IN CURRENCY","PRICE_1","PRICE_2","SIZE","PERCENTAGE","CURRENCY","UP","DOWN","LINE"};
int i,y;
int e=0;
int d=0;
double z[13],dis,x,size;

for(i=0; i<10; i++)
{
if(i==5)
{
e=0;
d=Distance;
}
ObjectCreate(name[i],OBJ_LABEL,0,0,0,0,0,0,0);
ObjectSet(name[i],OBJPROP_XDISTANCE,Shift_X_axis+d);
ObjectSet(name[i],OBJPROP_YDISTANCE,5+e*Density_lines);
e++;
}
//----

z[8]=ObjectGet("LINE",OBJPROP_PRICE1);
z[9]=ObjectGet("LINE",OBJPROP_PRICE2);
//----
if(tick>0)dis=MathAbs(z[8]-z[9])/tick;
x=100*dis*pt*lotstep;
if(x>0)y=MathFloor(Risk*AccountBalance()/x);
size=lotstep*y;
z[5]=size;
z[6]=Risk;
if(Risk==0) size=lotstep;
z[7]=dis*pt*size;
//----
for(i=0; i<10; i++)
{
text=name[i];
if(i>4 && i<8) text=DoubleToStr(z[i],2);
if(i>7) text=DoubleToStr(z[i],digit);
ObjectSetText(name[i],text,10,"Arial",Clr_Text);
}

}
//+------------------------------------------------------------------+```
16080

apfel: thanks für your tipps! Have I understood everything correctly?
1. ```(OrderDIR == OP_BUY)
lotsize = NormalizeLots((AccountBalance * percent) / (( OrderStopLoss - OrderOpenPrice```
If it's a buy the SL is below the OP so OSL - OOP would be negative. Those are backwards.
2. ```z[8]=ObjectGet("LINE",OBJPROP_PRICE1);
z[9]=ObjectGet("LINE",OBJPROP_PRICE2);
if(tick>0)dis=MathAbs(z[8]-z[9])/tick;```
Your prices from "LINE" are bid prices. On a buy the OOP includes the spread, on a sell the SL includes the spread. dis must include the spread.