diff --git a/Experts/x-saherelm.x-121.smc.ea.mq5 b/Experts/x-saherelm.x-121.smc.ea.mq5 index 4358f1c5..5318a0db 100644 --- a/Experts/x-saherelm.x-121.smc.ea.mq5 +++ b/Experts/x-saherelm.x-121.smc.ea.mq5 @@ -46,7 +46,6 @@ input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb"; // Trading Symbols input group "Signalling"; input bool eaAllowLong = true; // Allow Long Signals input bool eaAllowShort = true; // Allow Short Signals -input bool eaAllowTrade = true; // Allow Open Trade On Signals input int eaMaxAllowedLongs = 5; // Max Allowed Long Signals input int eaMaxAllowedShorts = 5; // Max Allowed Short Signals input bool eaUseMaxAllowedSignalsPerSymbol = true; // Use Max Allowed Signal Types Per Symbol @@ -55,6 +54,14 @@ input int eaDelaysBetweenTwoSignalsInBar = 100; // Delay between two input double eaMaxAllowedSpread = 25; // Max Allowed Spread for Signalling input int eaMinRequiredVerificationForSpreadPass = 20; // Minimum Spread Verification for Signalling +// +// Trade ... +input group "Trade"; +input bool eaAllowTrade = true; // Allow Open Trade On Signals +input string eaStartTradeAt = "0:0"; // Enable Trade on Signals on Time +input string eaStopTradeAt = "0:0"; // Enable Trade on Signals on Time +input string eaCloseAllTradesAt = "0:0"; // Enable Close All Trades on Signals on Time + // // Risk Management ... input group "Risk Management"; @@ -153,7 +160,6 @@ int OnInit() // Signalling ... eaExpert.AllowLong(eaAllowLong); eaExpert.AllowShort(eaAllowShort); - eaExpert.AllowTrade(eaAllowTrade); eaExpert.MaxAllowedLongs(eaMaxAllowedLongs); eaExpert.MaxAllowedShorts(eaMaxAllowedShorts); eaExpert.UseMaxAllowedSignalsPerSymbol(eaUseMaxAllowedSignalsPerSymbol); @@ -162,6 +168,13 @@ int OnInit() eaExpert.MaxAllowedSpread(eaMaxAllowedSpread); eaExpert.MinRequiredVerificationForSpreadPass(eaMinRequiredVerificationForSpreadPass); + // + // Trade ... + eaExpert.AllowTrade(eaAllowTrade); + eaExpert.StartTradeAt(eaStartTradeAt); + eaExpert.StopTradeAt(eaStopTradeAt); + eaExpert.CloseAllTradesAt(eaCloseAllTradesAt); + // // Risk Management ... eaExpert.R2R(eaR2R); diff --git a/Libraries/x-saherelm.common.lib.mq5 b/Libraries/x-saherelm.common.lib.mq5 index 71fbf439..0978b2d3 100644 --- a/Libraries/x-saherelm.common.lib.mq5 +++ b/Libraries/x-saherelm.common.lib.mq5 @@ -5778,6 +5778,74 @@ string ToFormatString( return result; } +/** + * Converts an String Represetation of Time (00:00) to Date Time .. + * + * @param value: String ... + * + * @return ( datetime ) + */ +datetime ParseDateTimeFromTimeString(string value) +{ + // + datetime result = NULL; + + // + if (!IsValid(value)) + { + return result; + } + + // + // Check Signalling Time ... + MqlDateTime cTime; + bool isTimeRecieved = TimeCurrent(cTime); + if (!isTimeRecieved) + { + return result; + } + + // + // Split ... + string parts[]; + int partsCount = SplitContent( + parts, + value, + ":" + // + ); + if (!IsValidSize(partsCount)) + { + return result; + } + + // + int hour = 0; + int minute = 0; + if (partsCount >= 1) + { + hour = (int)(parts[0]); + } + if (partsCount >= 2) + { + minute = (int)(parts[1]); + } + + // + cTime.day_of_week = 0; + cTime.day_of_year = 0; + + // + cTime.hour = hour; + cTime.min = minute; + + // + result = StructToTime(cTime); + + // + return result; +} + // // Check Specific Time in Range of another Time ... bool IsTimeInRange( @@ -5791,7 +5859,7 @@ bool IsTimeInRange( // // Normallize Current Time ... - NormalizeTime(currentTime); + currentTime = NormalizeTime(currentTime); // result = !IsValid(startTime) && @@ -5821,6 +5889,42 @@ bool IsTimeInRange( // return result; } +bool IsTimeInRange( + datetime currentTime, + string startTime, + string endTime // +) +{ + // + bool result = false; + + // + result = IsValid(startTime) && + IsValid(endTime); + if (!result) + { + // + // Here Since there isnot provide any + // data source we pass result as true ... + result = true; + return result; + } + + // + // Converts String Representation to Time ... + datetime st = ParseDateTimeFromTimeString(startTime); + datetime et = ParseDateTimeFromTimeString(endTime); + + // + result = IsTimeInRange( + currentTime, + st, + et // + ); + + // + return result; +} // // Bar Times ... diff --git a/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 b/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 index 3f6ec205..e4735a2f 100644 --- a/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 +++ b/X121SMCEA/Classes/x-121.smc.x-tradehandler.class.mq5 @@ -3311,6 +3311,79 @@ class XC121SMCTradeHandler : public XCBaseAlert return result; } + /** + * Force Close Specified Positions ... + * + * @param symbol: String ... + * @param provider: String ... + * @param period: ENUM_TIMEFRAMES member ... + * @param type: ENUM_X_POSITION_TYPES member ... + * + * @return ( bool ) + */ + bool ForceClose( + string symbol = NULL, + string provider = NULL, + ENUM_TIMEFRAMES period = NULL, + ENUM_X_POSITION_TYPES type = NULL // + ) + { + // + bool result = false; + + // + XPosition positions[]; + int count = mTrader.GetPositions( + positions, + symbol, + provider, + period, + type // + ); + result = IsValidSize(count); + if (!result) + { + return result; + } + + // + datetime cTime = TimeCurrent(); + + // + string comment = "Force Close (" + ToString(count) + ") Positions At: " + ToFormatString(cTime) + "..."; + int closedPositionsCount = mTrader.Close( + positions, + comment // + ); + result = IsValidSize(closedPositionsCount); + if (result) + { + // + // Finish Positions and Clear Data ... + for (int i = 0; i < ArraySize(positions); i++) + { + // + XPosition iPosition = positions[i]; + Finish( + iPosition.ticket, + iPosition, + comment // + ); + } + + // + ResetProtections(); + + // + string message = "Force Close (" + ToString(count) + ") Positions At: " + + ToFormatString(cTime) + " Successfully ..."; + Alert(message); + } + + // + return result; + } + // // Timing Actions ... diff --git a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 b/X121SMCEA/Experts/x-121.smc.expert.class.mq5 index aa9f2aaa..8a13f172 100644 --- a/X121SMCEA/Experts/x-121.smc.expert.class.mq5 +++ b/X121SMCEA/Experts/x-121.smc.expert.class.mq5 @@ -165,28 +165,6 @@ class XC121SMCExpert : public XCBaseExpert ReConfigure(); } - /** - * Get Allow Open Trade On Signals State ... - * - * @return ( bool ) - */ - bool AllowTrade() - { - return mAllowTrade; - } - - /** - * Set Allow Open Trade On Signals State ... - * - * @param value: Boolean ... - */ - void AllowTrade(bool value) - { - // - mAllowTrade = value; - ReConfigure(); - } - /** * Get Use Max Allowed Signal Types Per Symbol State ... * @@ -329,6 +307,89 @@ class XC121SMCExpert : public XCBaseExpert ReConfigure(); } + // + // Trade ... + + /** + * Get Allow Open Trade On Signals State ... + * + * @return ( bool ) + */ + bool AllowTrade() + { + return mAllowTrade; + } + + /** + * Set Allow Open Trade On Signals State ... + * + * @param value: Boolean ... + */ + void AllowTrade(bool value) + { + mAllowTrade = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StartTradeAt() + { + return mStartTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StartTradeAt(string value) + { + mStartTradeAt = value; + } + + /** + * Get Enable Trade on Signals on Time ... + * + * @return ( string ) + */ + string StopTradeAt() + { + return mStopTradeAt; + } + + /** + * Set Enable Trade on Signals on Time ... + * + * @param value: String ... + */ + void StopTradeAt(string value) + { + mStopTradeAt = value; + } + + /** + * Get Enable Close All Trades on Signals on Time ... + * + * @return ( string ) + */ + string CloseAllTradesAt() + { + return mCloseAllTradesAt; + } + + /** + * Set Enable Close All Trades on Signals on Time ... + * + * @param value: String ... + */ + void CloseAllTradesAt(string value) + { + mCloseAllTradesAt = value; + } + // // Risk Management Props ... @@ -782,7 +843,13 @@ class XC121SMCExpert : public XCBaseExpert if (mAlertRawSignals) { // - string msg = "Raw " + (IsLong(signal.type) ? "Long" : "Short") + " Signal Recieved: (" + signal.provider + "," + signal.symbol + "," + ToString(signal.period) + ") ..."; + string msg = "Raw " + (IsLong(signal.type) ? "Long" : "Short") + + " Signal Recieved: (" + signal.provider + "," + + signal.symbol + "," + + ToString(signal.period) + + ") ..."; + + // Alert(msg); } @@ -833,14 +900,27 @@ class XC121SMCExpert : public XCBaseExpert if (allowTrade) { // - // Execute Signal Using Trade Handler ... - ENUM_X_SIGNAL_EXECUTION_RESULT state; - bool isExecuted = mTradeHandler.ExecuteSignal( - signal, - conditions, - state, - false // ignore Policies ... + string startTime = StartTradeAt(); + string endTime = StopTradeAt(); + bool isTimePassed = IsTimeInRange( + TimeCurrent(), + startTime, + endTime // ); + + // + if (isTimePassed) + { + // + // Execute Signal Using Trade Handler ... + ENUM_X_SIGNAL_EXECUTION_RESULT state; + bool isExecuted = mTradeHandler.ExecuteSignal( + signal, + conditions, + state, + false // ignore Policies ... + ); + } } else { @@ -869,14 +949,14 @@ class XC121SMCExpert : public XCBaseExpert signal, signalObject // ); - DrawX121SMCStrategyConditions( - conditions, - objects, - eaDrawer, - true, // draw Market Structure ... - true, // Draw Price Zones ... - true // Draw Decision Zones ... - ); + // DrawX121SMCStrategyConditions( + // conditions, + // objects, + // eaDrawer, + // true, // draw Market Structure ... + // true, // Draw Price Zones ... + // true // Draw Decision Zones ... + // ); // Add( @@ -1243,6 +1323,19 @@ class XC121SMCExpert : public XCBaseExpert */ void HandleStrategiesOnTick() override { + // + // Check Force Close ... + string forceCloseTimeStr = CloseAllTradesAt(); + datetime forceCloseTime = ParseDateTimeFromTimeString(forceCloseTimeStr); + bool canForceClose = IsTimeInRange( + TimeCurrent(), + forceCloseTime // + ); + if (canForceClose) + { + mTradeHandler.ForceClose(); + } + // // Update Positions Data ... mTradeHandler.UpdateData(); @@ -1645,7 +1738,6 @@ class XC121SMCExpert : public XCBaseExpert // Signalling Props ... bool mAllowLong; // Allow Long Signals ... bool mAllowShort; // Allow Short Signals ... - bool mAllowTrade; // Allow Open Trade On Signals ... int mMaxAllowedLongs; // Max Allowed Long Signals ... int mMaxAllowedShorts; // Max Allowed Short Signals ... bool mUseMaxAllowedSignalsPerSymbol; // Use Max Allowed Signal Types Per Symbol ... @@ -1654,6 +1746,13 @@ class XC121SMCExpert : public XCBaseExpert double mMaxAllowedSpread; // Max Allowed Spread for Signalling ... int mMinRequiredVerificationForSpreadPass; // Minimum Spread Verification for Signalling ... + // + // Trade ... + bool mAllowTrade; // Allow Open Trade On Signals ... + string mStartTradeAt; // Enable Trade on Signals on Time ... + string mStopTradeAt; // Enable Trade on Signals on Time ... + string mCloseAllTradesAt; // Enable Close All Trades on Signals on Time ... + // // Risk Management Props ... double mR2R; // Signallers Risk to Reward Ratio ...