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
Stop out is a different matter. AFMC just tells you if you have enough margin to open the order. As the trades go against you AccountEquity and AccountFreeMargin drop.
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'
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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