-
Risk depends on your initial stop loss, lot
size, and the value of the pair. It does not depend on margin and leverage.
- 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.
- AccountBalance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot + CommissionPerLot) (Note OOP-OSL includes the spread, and DeltaPerLot is usually around $10/pip but it takes account of the exchange rates of the pair vs. your account currency.)
- Do NOT use TickValue by itself - DeltaPerLot
and verify that MODE_TICKVALUE is returning a value in your deposit currency, as promised by the documentation, or
whether it is returning a value in the instrument's base currency.
MODE_TICKVALUE is not reliable on non-fx instruments with many brokers - MQL4 programming forum 2017.10.10
Is there an universal solution for Tick value? - Currency Pairs - General - MQL5 programming forum 2018.02.11
Lot value calculation off by a factor of 100 - MQL5 programming forum 2019.07.19 - You must normalize lots properly and check against min and max.
- You must also check FreeMargin to avoid stop out
Most pairs are worth about $10 per PIP. A $5 risk with a (very small) 5 PIP SL is $5/$10/5 or 0.1 Lots maximum.
- Search for a GUI/Trade Assistant EA like mine (for MT 4): 'Money Manager Graphic Tool' indicator by 'takycard' - Risk Management - Articles, Library comments - MQL5 programming forum - Page 6 #55
Never risk more than a small percentage of your account, certainly less than 2% per trade, 6% total to the account.
- Risk depends on your initial stop loss, lot size, and the value of the pair. It does not depend on margin and leverage.
- 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.
- AccountBalance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot + CommissionPerLot) (Note OOP-OSL includes the spread, and DeltaPerLot is usually around $10/pip but it takes account of the exchange rates of the pair vs. your account currency.)
- Do NOT use TickValue by itself - DeltaPerLot
and verify that MODE_TICKVALUE is returning a value in your deposit currency, as promised by the documentation, or
whether it is returning a value in the instrument's base currency.
MODE_TICKVALUE is not reliable on non-fx instruments with many brokers - MQL4 programming forum 2017.10.10
Is there an universal solution for Tick value? - Currency Pairs - General - MQL5 programming forum 2018.02.11
Lot value calculation off by a factor of 100 - MQL5 programming forum 2019.07.19 - You must normalize lots properly and check against min and max.
- You must also check FreeMargin to avoid stop out
Most pairs are worth about $10 per PIP. A $5 risk with a (very small) 5 PIP SL is $5/$10/5 or 0.1 Lots maximum.
- Search for a GUI/Trade Assistant EA like mine (for MT 4): 'Money Manager Graphic Tool' indicator by 'takycard' - Risk Management - Articles, Library comments - MQL5 programming forum - Page 6 #55
Hi William,
Is this still the best way to calculate lotsize? Asking as this is from a very old thread that you posted on.
I am busy pulling it apart and learning from your code.
Just asking if you still approve of this old reply of yours. To make sure I am not trying to learn something outdated?
Thanks so much!
//++++ These are adjusted for 5 digit brokers. double pips2points, // slippage 3 pips 3=points 30=points pips2dbl; // Stoploss 15 pips 0.0015 0.00150 int Digits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips) int init(){ if (Digits == 5 || Digits == 3){ // Adjust for five (5) digit brokers. pips2dbl = Point*10; pips2points = 10; Digits.pips = 1; } else { pips2dbl = Point; pips2points = 1; Digits.pips = 0; } // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl ... //+------------------------------------------------------------------+ //| Lot size computation. | //+------------------------------------------------------------------+ double LotSize(double SLpoints){ /*double TSSF.value, TEF.value; // Import from ComputeTSSF //double at.risk; // Export to init/start/OpenNew */ /* This function computes the lot size for a trade. * Explicit inputs are SL relative to bid/ask (E.G. SL=30*points,) * Implicit inputs are the MM mode, the MM multiplier, count currently * filled orders by all EA's vs this EA/pair/period count and history. * Implicit inputs are all used to reduce available balance the maximum * dollar risk allowed. StopLoss determines the maximum dollar risk possible * per lot. Lots=maxRisk/maxRiskPerLot **************************************************************************/ /*++++ Compute lot size based on account balance and MM mode*/{ double ab = AccountBalance(); switch(Money.Management.F0M1G2){ case MMMODE_FIXED: at.risk = Money.Management.Multiplier; break; case MMMODE_MODERATE: // See https://www.mql5.com/en/articles/1526 Fallacies, Part 1: Money // Management is Secondary and Not Very Important. // %used/trade= at.risk = MathSqrt(Money.Management.Multiplier * ab)/ab; // ~const rate. at.risk = MathSqrt(Money.Management.Multiplier * ab * MathPow( 1 - at.risk, OrdersTotal() )); break; case MMMODE_GEOMETRICAL: at.risk = Money.Management.Multiplier * ab * MathPow(1 - Money.Management.Multiplier, OrdersTotal()); break; } double maxLossPerLot = SLpoints * PointValuePerLot(), /* Number of lots wanted = at.risk / maxLossPerLot rounded/truncated to /* nearest lotStep size. /* /* However, 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. */ marginFree = AccountFreeMargin()*0.95, // Allow some slack marginPerLot = MarketInfo( Symbol(), MODE_MARGINREQUIRED ), // So I use, the lesser of either. size = MathMin(marginFree / marginPerLot, at.risk / maxLossPerLot); /*---- Compute lot size based on account balance and MM mode*/} /*++++ Combine TSSF and trade size*/{ double minLot = MarketInfo(Symbol(), MODE_MINLOT); if (size < minLot){ // Multiple orders -> no free margin // [risk=9.48USD/40.80, margin=10.62/1334.48, MMM=1x1, ExtraOO=0] // 0.23 0.007 Print( "LotSize(SL=", DoubleToStr(SLpoints/pips2dbl, Digits.pips), ")=", size, " [risk=", at.risk, AccountCurrency(), "/", maxLossPerLot, ", margin=", marginFree, "/", marginPerLot, ", MMM=", Money.Management.F0M1G2,"x", Money.Management.Multiplier, ", ExtraOO=", OrdersTotal(), "]" ); return(0.0); // Risk limit. } if (!TSSF.Enable01) double adjFactTSSF = 1; else adjFactTSSF = MathMin(1,TSSF.value); if (!TEF.Enable01) double adjFactTEF = 1; else adjFactTEF = MathMin(1,TEF.value); double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); size = MathMax( minLot , MathFloor(size*adjFactTSSF*adjFactTEF/ LotStep)*LotStep ); /*---- Combine TSSF and trade size*/} at.risk = size * maxLossPerLot; // Export for Comment return(size); } // LotSize double PointValuePerLot() { // Value in the 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://forum.mql4.com/33975 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. }
No product is being discussed. That is code I posted. Why is there NO Complete EA within the Code-Base? - MQL4 programming forum 2011.08.20 It has not been adjusted for Build 600 +.
Yes
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I know this is a basic question, but I am struggling to find a way to open a trade with a fixed risk percentage.
As an example, I would like a trade to open with a risk of 2%. this way I can tell the EA to place a stoploss without stretching my risk.
If price hites my stoploss I want to close with 2% loss.
I have been trying to do this for the past 2 days. Is there anywhere I can find a code snippet that has this logic?
My code is attached and is not functional yet.
Busy trying to make an EA that opens trades based on price hitting the High/Low of the Bollinger bands.
Any advice/help would be much appreciated!
Thank you! :)
Edited as I realised my questions logic was flawed.