From 6aeea1c5c75f567121793d176e61177b543a18a1 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Wed, 20 Nov 2024 06:48:56 +0330 Subject: [PATCH] Add Support for Risk Per Balance on Each Trade ... --- Experts/x-saherelm.x-121.smc.ea.mq5 | 4 +- X121SMCEA/Experts/x-121.smc.expert.class.mq5 | 60 +++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/Experts/x-saherelm.x-121.smc.ea.mq5 b/Experts/x-saherelm.x-121.smc.ea.mq5 index 9e887987..a49ca626 100644 --- a/Experts/x-saherelm.x-121.smc.ea.mq5 +++ b/Experts/x-saherelm.x-121.smc.ea.mq5 @@ -48,6 +48,7 @@ input bool eaUseDynamicVolume = false; // Use Dynamic Volume input double eaDynamicVolumeStep = 0.01; // Increase Volume Step input double eaDynamicVolumeBalanceFactor = 200; // Balance Factor for Generate Dynamic Volume input double eaVolume = 0.05; // Static Volume +input double eaRiskPercentPerBalance = 0.25; // Risk Percent Per Balance on Each Trade // // Signalling ... @@ -142,6 +143,7 @@ int OnInit() eaExpert.Volume(eaVolume); eaExpert.UseDynamicVolume(eaUseDynamicVolume); eaExpert.DynamicVolumeStep(eaDynamicVolumeStep); + eaExpert.RiskPercentPerBalance(eaRiskPercentPerBalance); eaExpert.DynamicVolumeBalanceFactor(eaDynamicVolumeBalanceFactor); // @@ -248,7 +250,7 @@ void OnStopLossTriggered(const XDeal &deal) */ void OnTakeProfitTriggered(const XDeal &deal) { - eaExpert.HandleOnTakeProfitTriggered(deal); + eaExpert.HandleOnTakeProfitTriggered(deal); } /** diff --git a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 b/X121SMCEA/Experts/x-121.smc.expert.class.mq5 index f7e437d8..f48dd521 100644 --- a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 +++ b/X121SMCEA/Experts/x-121.smc.expert.class.mq5 @@ -21,9 +21,9 @@ // // Imports ... -#include "../Libraries/x-121.smc.lib.mq5" #include "../../Classes/x-saherelm.x-expert.class.mq5" #include "../Classes/x-121.smc.x-tradehandler.class.mq5" +#include "../Libraries/x-121.smc.lib.mq5" #include "../Strategy/x-121.smc.test.strategy.class.mq5" // @@ -127,6 +127,33 @@ class XC121SMCExpert : public XCBaseExpert mDynamicVolumeBalanceFactor = value; } + /** + * Get Risk Percent Per Balance in Each Trade ... + * + * @return ( double ) + */ + double RiskPercentPerBalance() + { + return mRiskPercentPerBalance; + } + + /** + * Set Risk Percent Per Balance in Each Trade ... + * + * @param value: Double + */ + void RiskPercentPerBalance(double value) + { + // + if (value < 0) + { + value = 0; + } + + // + mRiskPercentPerBalance = value; + } + /** * Get Static Volume ... * @@ -799,6 +826,36 @@ class XC121SMCExpert : public XCBaseExpert signal.volume = Volume(); } } + else if (RiskPercentPerBalance() > 0) + { + // + double riskPercent = RiskPercentPerBalance(); + + // + double balance = mTrader.mAccount.GetBalance(); + double riskAmountPerBalance = (riskPercent * balance) / 100; + + // + double risk = signal.GetRisk(); + double points = GetPoints(signal.symbol); + double riskInPoints = risk / points; + + // + double volume = mTrader.mAccount.CalculateVolume( + signal.symbol, + riskAmountPerBalance, + riskInPoints // + ); + + // + if (volume > 0) + { + volume = NormalizeVolume(volume, signal.symbol); + } + + // + signal.volume = volume; + } else { signal.volume = Volume(); @@ -906,6 +963,7 @@ class XC121SMCExpert : public XCBaseExpert double mDynamicVolumeStep; // Increase Volume Step ... double mDynamicVolumeBalanceFactor; // Balance Factor for Generate Dynamic Volume ... double mVolume; // Static Volume ... + double mRiskPercentPerBalance; // Risk Percent Per Balance in Each Trade ... // };