Calculating Lot size
double TickPrice = MarketInfo(Symbol(),MODE_TICKVALUE);
double PointValuePerLot() { // Value in account currency of a Point of Symbol. /* In tester I had a sale: open=1.35883 close=1.35736 (0.00147) * gain$=97.32/6.62 lots/147 points=$0.10/point or $1.00/pip. * IBFX demo/mini EURUSD TICKVALUE=0.1 MAXLOT=50 LOTSIZE=10,000 * IBFX demo/standard EURUSD TICKVALUE=1.0 MAXLOT=50 LOTSIZE=100,000 * $1.00/point or $10.00/pip. * * https://www.mql5.com/en/forum/127584 CB: MODE_TICKSIZE will usually return the * same value as MODE_POINT (or Point for the current symbol), however, an * example of where to use MODE_TICKSIZE would be as part of a ratio with * MODE_TICKVALUE when performing money management calculations which need * to take account of the pair and the account currency. The reason I use * this ratio is that although TV and TS may constantly be returned as * something like 7.00 and 0.00001 respectively, I've seen this * (intermittently) change to 14.00 and 0.00002 respectively (just example * tick values to illustrate). */ return( MarketInfo(Symbol(), MODE_TICKVALUE) / MarketInfo(Symbol(), MODE_TICKSIZE) ); // Not Point. }
return (NormalizeDouble(LotSize,2));
This assumes LotStep == 0.01.double minLot = MarketInfo(Symbol(), MODE_MINLOT), LotStep = MarketInfo(Symbol(), MODE_LOTSTEP), perLotPerPoint = PointValuePerLot(), maxLossPerLot = (risk+Slippage.Pips*pips2dbl) * perLotPerPoint, size = maxRisk / maxLossPerLot; // Must still round to LotStep. /*---- Compute lot size based on account balance and MM mode*/} /* The broker doesn't care about the at.risk/account balance. They care * about margin. Margin used=lots used*marginPerLot and that must be less * than free margin available. Using the lesser of size vs * AccountFreeMargin / MODE_MARGINREQUIRED should have been sufficient, but * the tester was generating error 134 even when marginFree should have been * OK. So I also use AccountFreeMarginCheck < 0 which agrees with the * tester. Reported at https://www.mql5.com/en/forum/128506 * * Second problem, after opening the new order, if free margin then drops to * zero we get a margin call. In the tester, the test stops with: "EA: * stopped because of Stop Out" So I make sure that the free margin * after is larger then the equity risk so I never get a margin call. */ EA.status = "SL>AE"; // Assume size < minLot while (true){ // Adjust for broker, test for margin, combine with TEF... size = MathFloor(MathMax(0.,size)/LotStep)*LotStep; at.risk.new = size * maxLossPerLot; // Export for Comment if (size < minLot){ /*at.risk.new=0;*/ return(0); } double AFMC = AccountFreeMarginCheck(Symbol(), op.code, size), eRisk = at.risk.equity + risk*size*perLotPerPoint; if (AFMC*0.99 <= eRisk){ size *= 0.95; EA.status = "Free Margin"; continue; } // Prevent margin call if new trade goes against us. break; }
Hi Roeder,
i just saw your response. I will study more calmly later. Its very
interesting, cause im having the exactly problem of STOP OUT as you
said.
I will response later.
thanks a lot!
NIERO
at.risk.equity += Direction( OrderType() ) * (OrderClosePrice()-OrderStopLoss())*perPoint;Summed for all open orders.
If I know the account balance, the dollar amount I am willing to risk, and the stop loss in pips, how do I calculate the order size in lots? For example:
Account balance ($USD): 1,000.00
Amount of risk (%): 0.02
Total dollar risk ($USD): 1,000 * 0.02 = 20.00
Stop loss (pips): 50
Dollar risk per pip ($USD): 20.00 / 50 = 0.40
Order size (lots): ?
Thank you.
- deltatangoxray: Dollar risk per pip ($USD): 20.00 / 50 = 0.40Dollar risk per pip is $10/lot ($1/point on a 5 digit broker) for a pair ending with USD, on a USD currency account. Period. The Dollar risk total is 50 pips * $10/lot * lotsize. $20.00/500=0.04 lots.
- In code
- 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.
- Account Balance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerlot + CommissionPerLot) (Note OOP-OSL includes the SPREAD)
- Do NOT use TickValue by itself - DeltaPerlot
- You must normalize lots properly
and check against min and max.
- You must also check FreeMargin to avoid stop out
- Use a GUI: Indicators: Money Manager Graphic Tool - MQL5.community traders' Forum - Page 5 'Money Manager Graphic Tool' indicator by 'takycard'
Hi guys,
Im new here, i've read many articles about some estrategies and money management.
Well, i have studied some about lots calculation (exponential and others), then i just think in some strategy that could be calculate using some relation of Volume (ATR), risk per trade and tick value.
#extern variables
The TradeAtRisk variable is used by another function to calc SL price. This represent the quantity of money that i accepted to loss for each order.
extern double TradeAtRisk = 2.0;#functionThe result maybe like this:
Thanks
Daniel Niero