From ec9d0838d16b2b154614e900e1d8716264cf32f8 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 1 Jun 2025 19:29:28 +0330 Subject: [PATCH] add support for restrictions report and save ... --- ...5.ny.best.set => XAUUSDb.2025.ny.best.set} | Bin Experts/x-saherelm.x121.xcatb.ea.mq5 | 12 +- XCATBEA/Classes/xcatbea.expert.class.mq5 | 12 +- .../Classes/xcatbea.x-trade.manager.class.mq5 | 180 ++++++++++++++++++ 4 files changed, 196 insertions(+), 8 deletions(-) rename Documents/XCATBEAInputs/{2025.ny.best.set => XAUUSDb.2025.ny.best.set} (100%) diff --git a/Documents/XCATBEAInputs/2025.ny.best.set b/Documents/XCATBEAInputs/XAUUSDb.2025.ny.best.set similarity index 100% rename from Documents/XCATBEAInputs/2025.ny.best.set rename to Documents/XCATBEAInputs/XAUUSDb.2025.ny.best.set diff --git a/Experts/x-saherelm.x121.xcatb.ea.mq5 b/Experts/x-saherelm.x121.xcatb.ea.mq5 index 42b68f5c..50664765 100644 --- a/Experts/x-saherelm.x121.xcatb.ea.mq5 +++ b/Experts/x-saherelm.x121.xcatb.ea.mq5 @@ -146,16 +146,18 @@ input bool eaReportNewDays = true; // Report New Days input bool eaReportNewHours = false; // Report New Hours input bool eaReportTrades = true; // Report Trades input bool eaReportSignals = true; // Report Signals +input bool eaReportRestrictions = true; // Report Restrictions input bool eaReportProtector = true; // Report Protector Actions input bool eaReportAfterTradesBalance = true; // Report Balance after a Trade Finished // // Collector ... input group "Collector"; -input bool eaSaveTrades = false; // Save Trades -input bool eaSaveSignals = false; // Save Signals -input bool eaSaveWins = false; // Save Winning Conditions -input bool eaSaveLosts = false; // Save Lost Conditions +input bool eaSaveTrades = false; // Save Trades +input bool eaSaveSignals = false; // Save Signals +input bool eaSaveWins = false; // Save Winning Conditions +input bool eaSaveLosts = false; // Save Lost Conditions +input bool eaSaveRestrictions = false; // Save Restriction Reports // // Variables ... @@ -306,6 +308,7 @@ int OnInit() eaExpert.eaReportNewHours = eaReportNewHours; eaExpert.eaReportProtector = eaReportProtector; eaExpert.eaReportNewMonths = eaReportNewMonths; + eaExpert.eaReportRestrictions = eaReportRestrictions; eaExpert.eaReportAfterTradesBalance = eaReportAfterTradesBalance; // @@ -314,6 +317,7 @@ int OnInit() eaExpert.eaSaveLosts = eaSaveLosts; eaExpert.eaSaveTrades = eaSaveTrades; eaExpert.eaSaveSignals = eaSaveSignals; + eaExpert.eaSaveRestrictions = eaSaveRestrictions; // // Attach Event Handlers ... diff --git a/XCATBEA/Classes/xcatbea.expert.class.mq5 b/XCATBEA/Classes/xcatbea.expert.class.mq5 index 73e2d4c4..eed7c4c0 100644 --- a/XCATBEA/Classes/xcatbea.expert.class.mq5 +++ b/XCATBEA/Classes/xcatbea.expert.class.mq5 @@ -147,14 +147,16 @@ class XCXCATBEAExpert : public XCBase bool eaReportTrades; // Report Trades bool eaReportSignals; // Report Signals bool eaReportProtector; // Report Protector Actions + bool eaReportRestrictions; // Report Restrictions bool eaReportAfterTradesBalance; // Report Balance after a Trade Finished // // Collector ... - bool eaSaveTrades; // Save Trades - bool eaSaveSignals; // Save Signals - bool eaSaveWins; // Save Winning Conditions - bool eaSaveLosts; // Save Lost Conditions + bool eaSaveTrades; // Save Trades + bool eaSaveSignals; // Save Signals + bool eaSaveWins; // Save Winning Conditions + bool eaSaveLosts; // Save Lost Conditions + bool eaSaveRestrictions; // Save Restriction Reports // // Trade Event Handlers ... @@ -305,6 +307,7 @@ class XCXCATBEAExpert : public XCBase eaTradeManager.SaveLosts(eaSaveLosts); eaTradeManager.SaveTrades(eaSaveTrades); eaTradeManager.SaveSignals(eaSaveSignals); + eaTradeManager.SaveRestrictions(eaSaveRestrictions); // // Enable Force Close At ... @@ -317,6 +320,7 @@ class XCXCATBEAExpert : public XCBase eaReportTrades, eaReportSignals, eaReportProtector, + eaReportRestrictions, eaReportAfterTradesBalance // ); diff --git a/XCATBEA/Classes/xcatbea.x-trade.manager.class.mq5 b/XCATBEA/Classes/xcatbea.x-trade.manager.class.mq5 index 3218d86a..0128f71a 100644 --- a/XCATBEA/Classes/xcatbea.x-trade.manager.class.mq5 +++ b/XCATBEA/Classes/xcatbea.x-trade.manager.class.mq5 @@ -98,11 +98,18 @@ struct XCATBEASymbolInfo int losses; // All Loosing Trades int profits; // All Winning Trades + // + datetime managedStart; // Managed Start Time + // int managedSLs; // Managed SL(s) int managedTPs; // Managed TP(s) int managedTrades; // Managed Trades + // + double managedBalance; // Managed Start Balance + double managedProfits; // Managed Profit(s) + // // Constructor ... XCATBEASymbolInfo() @@ -131,11 +138,18 @@ struct XCATBEASymbolInfo losses = 0; profits = 0; + // + managedStart = NULL; + // managedSLs = 0; managedTPs = 0; managedTrades = 0; + // + managedBalance = 0; + managedProfits = 0; + // ZeroMemory(this); } @@ -168,6 +182,41 @@ struct XCATBEASymbolInfo // return result; } + + // + string GetRestrictionDescription( + ENUM_XCATBEA_TRADE_RESTRICTION_PERIOD period // + ) + { + // + string result = NULL; + + // + if (!IsValid() && + period != XCATBEA_TRADE_RESTRICATION_NONE) + { + return result; + } + + // + result += + "-------------------" + "\n" + + "Restrictions: " + "\n" + + "-------------------" + "\n" + + "Symbol: " + ToString(symbol) + "\n" + + "Period: " + ToString(period) + "\n" + + "Start: " + ToFormatString(managedStart) + "\n" + + "Balance: " + ToString(managedBalance) + "\n" + + "-------------------" + "\n" + + "Trades: " + ToString(managedTrades) + "\n" + + "SL: " + ToString(managedSLs) + "\n" + + "TP: " + ToString(managedTPs) + "\n" + + "Profit: " + ToString(managedProfits) + "\n" + + ""; + + // + return result; + } }; // @@ -819,6 +868,18 @@ class XCXCATBEATradeManager : public XCBaseAlert mSaveLosts = value; } + // + bool SaveRestrictions() + { + return mSaveRestrictions; + } + + // + void SaveRestrictions(bool value) + { + mSaveRestrictions = value; + } + // void SetForceCloseTradesAt( string _forceCloseAt // @@ -908,6 +969,7 @@ class XCXCATBEATradeManager : public XCBaseAlert bool _reportTrades, bool _reportSignals, bool _reportProtector, + bool _reportRestrictions, bool _reportAfterTradesBalance // ) { @@ -915,6 +977,7 @@ class XCXCATBEATradeManager : public XCBaseAlert reportTrades = _reportTrades; reportSignals = _reportSignals; reportProtector = _reportProtector; + reportRestrictions = _reportRestrictions; reportAfterTradesBalance = _reportAfterTradesBalance; } @@ -1603,6 +1666,18 @@ class XCXCATBEATradeManager : public XCBaseAlert iSymbolInfo.shorts = 1; } + // + // Fill Balance for Restrications ... + bool hasRestrictions = HasRestrictions(); + if (hasRestrictions) + { + // + // Read Balance ... + double balance = trader.mAccount.GetBalance(); + iSymbolInfo.managedBalance = balance; + iSymbolInfo.managedStart = TimeCurrent(); + } + // AddOrUpdateSymbolInfo(iSymbolInfo); @@ -1730,6 +1805,7 @@ class XCXCATBEATradeManager : public XCBaseAlert iSymbolInfo.profits = 1; iSymbolInfo.managedTPs = 1; iSymbolInfo.symbol = trades[idx].signal.symbol; + iSymbolInfo.managedProfits = trades[idx].profit; // AddOrUpdateSymbolInfo(iSymbolInfo); @@ -1804,6 +1880,7 @@ class XCXCATBEATradeManager : public XCBaseAlert iSymbolInfo.managedSLs = 1; } iSymbolInfo.symbol = trades[idx].signal.symbol; + iSymbolInfo.managedProfits = trades[idx].profit; // AddOrUpdateSymbolInfo(iSymbolInfo); @@ -1886,6 +1963,7 @@ class XCXCATBEATradeManager : public XCBaseAlert iSymbolInfo.managedSLs = 1; } iSymbolInfo.symbol = trades[idx].signal.symbol; + iSymbolInfo.managedProfits = trades[idx].profit; // AddOrUpdateSymbolInfo(iSymbolInfo); @@ -2207,6 +2285,34 @@ class XCXCATBEATradeManager : public XCBaseAlert return result; } + // + string GetRestrictionsFilePath(string symbol) + { + // + string result = NULL; + + // + if (!IsValid(symbol)) + { + return result; + } + + // + string mPath = collector.Path(); + + // + result = + // + mPath + "\\" + + "Restrictions" + "\\" + + symbol + "\\" + ".x121.log" + // + ; + + // + return result; + } + // void HandleReportBalance(string prefix = NULL) { @@ -2418,6 +2524,46 @@ class XCXCATBEATradeManager : public XCBaseAlert return result; } + // + bool SaveRestrictions(XCATBEASymbolInfo &info) + { + // + bool result = false; + + // + if (!mSaveRestrictions) + { + return result; + } + + // + result = info.IsValid(); + if (!result) + { + return result; + } + + // + string filePath = GetRestrictionsFilePath(info.symbol); + result = IsValid(filePath); + if (!result) + { + return result; + } + + // + string content = info.GetRestrictionDescription(restrictionsPeriod); + + // + result = collector.Append( + filePath, + content // + ); + + // + return result; + } + // // Symbol Info ... @@ -2536,6 +2682,7 @@ class XCXCATBEATradeManager : public XCBaseAlert symbols[index].managedSLs += item.managedSLs; symbols[index].managedTPs += item.managedTPs; symbols[index].managedTrades += item.managedTrades; + symbols[index].managedProfits += item.managedProfits; // // Handle Remove on Managed SL based On Managed TP ... @@ -2573,14 +2720,41 @@ class XCXCATBEATradeManager : public XCBaseAlert // string prefix = "Protector: "; + // + datetime start = TimeCurrent(); + double balance = trader.mAccount.GetBalance(); + bool hasRestrictions = HasRestrictions(); + if (!hasRestrictions) + { + // + balance = 0; + start = NULL; + } + // int count = ArraySize(symbols); for (int i = 0; i < count; i++) { + // + XCATBEASymbolInfo iInfo = symbols[i]; + if (reportRestrictions) + { + // + string message = iInfo.GetRestrictionDescription(restrictionsPeriod); + SendAlert(message); + } + SaveRestrictions(iInfo); + // symbols[i].managedSLs = 0; symbols[i].managedTPs = 0; symbols[i].managedTrades = 0; + symbols[i].managedProfits = 0; + symbols[i].managedStart = start; + symbols[i].managedBalance = balance; + + // + iInfo.Clean(); } // @@ -2748,17 +2922,23 @@ class XCXCATBEATradeManager : public XCBaseAlert int maxAllowedSLs; int maxAllowedTrades; ENUM_XCATBEA_TRADE_RESTRICTION_PERIOD restrictionsPeriod; + bool HasRestrictions() + { + return restrictionsPeriod != XCATBEA_TRADE_RESTRICATION_NONE; + } // bool mSaveWins; bool mSaveLosts; bool mSaveTrades; bool mSaveSignals; + bool mSaveRestrictions; // bool reportTrades; bool reportSignals; bool reportProtector; + bool reportRestrictions; bool reportAfterTradesBalance; //