diff --git a/Classes/x-saherelm.x-trade-manager.class.mq5 b/Classes/x-saherelm.x-trade-manager.class.mq5 index 114b2e5b..ca7691d7 100644 --- a/Classes/x-saherelm.x-trade-manager.class.mq5 +++ b/Classes/x-saherelm.x-trade-manager.class.mq5 @@ -285,6 +285,27 @@ class XCTradeManager : public XCBase ? iParts[5] : ""; iRestrictionsDescriptor = EscapeString(iRestrictionsDescriptor); + + // + XSymbolTradeConfig iConfig; + + // + // Initialize Config ... + has = iConfig.Init( + iSymbol, + iPeriod, + iSessionsDescriptor, + iMaxAllowedSpread, + iMaxAllowedPositions, + iRestrictionsDescriptor // + ); + if (has) { + AddOrUpdateSymbolConfiguration(iConfig); + } + + // + // Cleanup Resources ... + iConfig.Clean(); } // diff --git a/Experts/x-saherelm.xom1.ea.mq5 b/Experts/x-saherelm.xom1.ea.mq5 index bb5ac6ba..9c0d1eeb 100644 --- a/Experts/x-saherelm.xom1.ea.mq5 +++ b/Experts/x-saherelm.xom1.ea.mq5 @@ -37,26 +37,33 @@ input string eaLogSuffix = ""; // Log Suffix // // Symbols -// [Symbol|period|(ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)] -input string eaSymbolConfiguration; // Symbol Configurations +// [ +// Symbol| +// period| +// (ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)| +// maxAllowedSpread| +// maxAllowedPosition| +// ( +// restrictionsPeriod, +// maxAllowedTPs, +// maxAllowedSLs, +// maxAllowedTrades, +// closeAllOpenTradesAt +// ) +// ] +// +// +// [XAUUSDb|M5|(ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)|25.0|5|(Per_Day,0,2,0)] +input string eaSymbolConfiguration = "[XAUUSDb|M5|(ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00)|25.0|5|(XTRADE_RESTRICATION_DAILY,0,2,0)]"; // Symbol Configurations // // Management ... -// eaSessions => (ST_04:00_08:30),(TL_10:30_12:00),(NY_16:00_20:00) input group "Management"; -input bool eaAllowGuards = false; // Allow Guards -input bool eaAllowTrade = true; // Allow Trade on Signals -input bool eaAllowLongs = true; // Allow Long Trades -input bool eaAllowShorts = true; // Allow Short Trades -input string eaSessions = ""; // Active Sessions -input ENUM_XTRADE_RESTRICTION_PERIOD eaRestrictionsPeriod = XTRADE_RESTRICATION_NONE; // Restrictions Period -input int eaMaxAllowedTPs = 0; // Max Allowed TP(s) in Restrictions Period -input int eaMaxAllowedSLs = 0; // Max Allowed SL(s) in Restrictions Period -input int eaMaxAllowedTrades = 0; // Max Allowed Trades in Restrictions Period -input int eaMaxAllowedPositions = 5; // Max Allowed Same Time Trades -input double eaMaxAllowedSpread = 25; // Max Allowed Spread For Trade -input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade -input string eaCloseAllOpenTradesAt = ""; // Close All Open Trades per Day At Specified Time +input bool eaAllowGuards = false; // Allow Guards +input bool eaAllowTrade = true; // Allow Trade on Signals +input bool eaAllowLongs = true; // Allow Long Trades +input bool eaAllowShorts = true; // Allow Short Trades +input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade // // Volume ... @@ -155,15 +162,7 @@ int OnInit() eaExpert.eaAllowTrade = eaAllowTrade; eaExpert.eaAllowLongs = eaAllowLongs; eaExpert.eaAllowShorts = eaAllowShorts; - eaExpert.eaSessions = eaSessions; - eaExpert.eaRestrictionsPeriod = eaRestrictionsPeriod; - eaExpert.eaMaxAllowedTPs = eaMaxAllowedTPs; - eaExpert.eaMaxAllowedSLs = eaMaxAllowedSLs; - eaExpert.eaMaxAllowedTrades = eaMaxAllowedTrades; - eaExpert.eaMaxAllowedPositions = eaMaxAllowedPositions; - eaExpert.eaMaxAllowedSpread = eaMaxAllowedSpread; eaExpert.eaMaxAllowedDrawdownFactor = eaMaxAllowedDrawdownFactor; - eaExpert.eaCloseAllOpenTradesAt = eaCloseAllOpenTradesAt; // // Volume ... diff --git a/Libraries/x-saherelm.x-trade.lib.mq5 b/Libraries/x-saherelm.x-trade.lib.mq5 index 253bd555..4751c896 100644 --- a/Libraries/x-saherelm.x-trade.lib.mq5 +++ b/Libraries/x-saherelm.x-trade.lib.mq5 @@ -318,7 +318,61 @@ enum ENUM_XTRADE_RESTRICTION_PERIOD // string ToXString(ENUM_XTRADE_RESTRICTION_PERIOD value) { - return EnumToString(value); + // + string result = NULL; + + // + result = EnumToString(value); + + // + return result; +} + +// +ENUM_XTRADE_RESTRICTION_PERIOD ToXRestrictionPeriod(string value) +{ + // + ENUM_XTRADE_RESTRICTION_PERIOD result = XTRADE_RESTRICATION_NONE; + + // + if (!IsSpecifiedValid(value)) + { + return result; + } + + // + // None ... + if (value == ToXString(XTRADE_RESTRICATION_NONE)) + { + result = XTRADE_RESTRICATION_NONE; + } + // + // Per Hour ... + else if (value == ToXString(XTRADE_RESTRICATION_HOURLY)) + { + result = XTRADE_RESTRICATION_HOURLY; + } + // + // Per Day ... + else if (value == ToXString(XTRADE_RESTRICATION_DAILY)) + { + result = XTRADE_RESTRICATION_DAILY; + } + // + // Per Week ... + else if (value == ToXString(XTRADE_RESTRICATION_WEEKLY)) + { + result = XTRADE_RESTRICATION_WEEKLY; + } + // + // Per Month ... + else if (value == ToXString(XTRADE_RESTRICATION_MONTHLY)) + { + result = XTRADE_RESTRICATION_MONTHLY; + } + + // + return result; } /** @@ -2873,10 +2927,7 @@ struct XSymbolTradeConfig * @param _sessionsDescriptor: Sessions Description * @param _maxAllowedSpread: Max Allowed Spread for Open Trade * @param _maxAllowedPositions: Max Allowed Same Time Position - * @param _closeAllOpenTradesAt: Close All Open Trades - * @param _maxAllowedTPs: Max Allowed TPs in Restrictions Period - * @param _maxAllowedSLs: Max Allowed SLs in Restrictions Period - * @param _restrictionsPeriod: Restrictions Period + * @param _restrictionsDescriptor: Restrictions Descriptor * * @return ( bool ) */ @@ -2887,10 +2938,6 @@ struct XSymbolTradeConfig double _maxAllowedSpread = 25, int _maxAllowedPositions = 5, string _restrictionsDescriptor = NULL // - // string _closeAllOpenTradesAt = NULL, - // int _maxAllowedTPs = 0, - // int _maxAllowedSLs = 0, - // ENUM_XTRADE_RESTRICTION_PERIOD _restrictionsPeriod = XTRADE_RESTRICATION_NONE // ) { // @@ -2907,12 +2954,6 @@ struct XSymbolTradeConfig maxAllowedSpread = _maxAllowedSpread; maxAllowedPositions = _maxAllowedPositions; - // - // maxAllowedTPs = _maxAllowedTPs; - // maxAllowedSLs = _maxAllowedSLs; - // restrictionsPeriod = _restrictionsPeriod; - // closeAllOpenTradesAt = _closeAllOpenTradesAt; - // // Parse Sessions ... ParseSessions(_sessionsDescriptor); @@ -2922,6 +2963,7 @@ struct XSymbolTradeConfig ParseRestrictions(_restrictionsDescriptor); // + // Check Validation ... result = IsValid(); // @@ -3011,6 +3053,7 @@ struct XSymbolTradeConfig void ParseSessions(string descriptor) { // + // Validate ... if (!IsSpecifiedValid(descriptor)) { return; @@ -3098,8 +3141,98 @@ struct XSymbolTradeConfig // // Parse Restrictions ... - void ParseRestrictions(string descriptor) { - + void ParseRestrictions(string descriptor) + { + // + // Validate ... + if (!IsSpecifiedValid(descriptor)) + { + return; + } + + // + // Extract Content ... + descriptor = ExtractString(descriptor); + if (!IsSpecifiedValid(descriptor)) + { + return; + } + + // + int count = 0; + bool has = false; + string iRestrictionsParts[]; + + // + // Extract Parts ... + count = SplitContent( + iRestrictionsParts, + descriptor, + "," // + ); + has = IsValidSize(count); + if (!has) + { + // + // Default Restrictions ... + ApplyDefaultRestrictions(); + return; + } + + // + // Try To Extract Required Parts ... + bool hasRestrictionsPeriod = count >= 1; + bool hasMaxAllowedTPs = count >= 2; + bool hasMaxAllowedSLs = count >= 3; + bool hasMaxAllowedTrades = count >= 4; + bool hasCloseAllOpenTradesAt = count >= 5; + + // + // Restrictions Period ... + restrictionsPeriod = + hasRestrictionsPeriod + ? ToXRestrictionPeriod(Trim(iRestrictionsParts[0])) + : XTRADE_RESTRICATION_NONE; + + // + // Max Allowed TPs ... + maxAllowedTPs = + hasMaxAllowedTPs + ? (int)(Trim(iRestrictionsParts[1])) + : 0; + + // + // Max Allowed SLs ... + maxAllowedSLs = + hasMaxAllowedSLs + ? (int)(Trim(iRestrictionsParts[2])) + : 0; + + // + // Max Allowed Trades ... + maxAllowedTrades = + hasMaxAllowedTrades + ? (int)(Trim(iRestrictionsParts[3])) + : 0; + + // + // Close All Open Trades At ... + closeAllOpenTradesAt = + hasCloseAllOpenTradesAt + ? Trim(iRestrictionsParts[4]) + : NULL; + } + + // + // Apply Default Restrictions ... + void ApplyDefaultRestrictions() + { + // + maxAllowedTPs = 0; + maxAllowedSLs = 0; + maxAllowedTrades = 0; + closeAllOpenTradesAt = NULL; + restrictionsPeriod = XTRADE_RESTRICATION_NONE; } // diff --git a/XOM1EA/Classes/xom1ea.expert.class.mq5 b/XOM1EA/Classes/xom1ea.expert.class.mq5 index 915cca56..6d1e43ac 100644 --- a/XOM1EA/Classes/xom1ea.expert.class.mq5 +++ b/XOM1EA/Classes/xom1ea.expert.class.mq5 @@ -58,15 +58,7 @@ class XCXOM1EAExpert : public XCBase bool eaAllowTrade; // Allow Trade on Signals bool eaAllowLongs; // Allow Long Trades bool eaAllowShorts; // Allow Short Trades - string eaSessions; // Active Sessions - ENUM_XTRADE_RESTRICTION_PERIOD eaRestrictionsPeriod; // Restrictions Period - int eaMaxAllowedTPs; // Max Allowed TP(s) in Restrictions Period - int eaMaxAllowedSLs; // Max Allowed SL(s) in Restrictions Period - int eaMaxAllowedTrades; // Max Allowed Trades in Restrictions Period - int eaMaxAllowedPositions; // Max Allowed Same Time Trades - double eaMaxAllowedSpread; // Max Allowed Spread For Trade double eaMaxAllowedDrawdownFactor; // Max Allowed DrawDown for Trade - string eaCloseAllOpenTradesAt; // Close All Open Trades per Day At Specified Time // // Volume ... @@ -375,8 +367,8 @@ class XCXOM1EAExpert : public XCBase eaTrade = new XCTrade( eaSlippage, eaMagicNumber, - eaMaxAllowedSpread, - eaMaxAllowedPositions, + 0, + 0, eaMaxAllowedDrawdownFactor // ); @@ -551,7 +543,7 @@ class XCXOM1EAExpert : public XCBase eaTradeManager.SetSymbolConfigurations(eaSymbolConfiguration); count = eaTradeManager.FillSymbolConfigurations(symbolConfigurations); has = IsValidSize(count); - + // // Here we Apply Symbols,Periods and Configs ...