/////////////////////////////////////////////////////// // // SaherElm IT Center XTest MQL5 Expert Advisor // ------------------------------------------------- // Name: X121SMCEA // Description: an Exper Advisor which used Panels // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // //////////////////////////////////////////////////////x // // Global Properties ... #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://saherelm.ir" #property version "1.00" #property description "SaherElm X121SMCEA" #property strict // #define ShortName "X121SMCEA" // // Imports ... #include "../Classes/x-saherelm.xalert.class.mq5" #include "../Classes/x-saherelm.xtrade.class.mq5" #include "../Helpers/x-saherelm.xcc.helper.mq5" #include "../Helpers/x-saherelm.xct.helper.mq5" #include "../X121SMCEA/Classes/x-121.smc.ea.panel.class.mq5" #include "../X121SMCEA/Strategy/x-121.smc.strategy.class.mq5" // // Inputs ... // // Common ... input group "Common"; input long eaMagicNumber = 78692110; // Magic Number input int eaSlippage = 10; // Slippgae input string eaLogSuffix = ""; // Log Suffix // // Symbols ... input group "Symbols"; input bool eaMultiSymbol = false; // Use Multi Symbol input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,DowJones30,XAUUSDb"; // Trading Symbols // // Signalling ... input group "Signalling"; input bool eaAllowLong = true; // Allow Long Signals input bool eaAllowShort = true; // Allow Short Signals // // Alert ... // Here we Provider All Requirements for // Configuring Alert Provider ... input group "Alert"; input bool eAEnableAlerts = true; // Enable Alerts input bool eALogAlerts = true; // Log Alerts input bool eAMailAlerts = false; // Mail Alerts input bool eAPushAlerts = false; // Push Alerts input bool eATerminalAlerts = false; // Terminal Alerts // // Time Report ... input group "Reports"; input bool eaReportNewMonths = false; // Report New Month input bool eaReportNewWeeks = false; // Report New Weeks input bool eaReportNewDays = false; // Report New Days input bool eaReportNewHours = false; // Report New Hours // // Define Local Variables ... // string eaLogTag; // EA Log Prefix ... XSCAlert *eaAlert; // Alert Provider for Expert Adviser ... XSCTrade *eaTrader; // Trader of Expert Adviser ... XTimeTracker eaTimeTracker; // Time Tracker for Providing Reports ... XSCXCTHelper *eaCTHelper; // Bar Timer Indicator Helper class ... XSCXCCHelper *eaCCHelper; // Chart Styler Indicator Helper Class ... X121CAppDialog eaMainWindow; // EA Main Dialog ... XCX121SMCStrategy *eaStrategies[]; // Registere Strategies in EA ... // // Signalling Controller Conditions ... bool eaDisableSignalling; bool eaAllowLongSignalling; bool eaAllowShortSignalling; // // Event Handlers ... // // Initialization ... int OnInit() { // // Validate Inputs and Required Parameters // for EA to Works fine ... if (!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } // // Initialize Timer ... if (!InitTimer()) { return INIT_FAILED; } // // Initial Controller Conditions ... InitControllerConditions(); // // Initialize all Requirements ... if (!InitEA()) { return INIT_FAILED; } // // Initialize all GUI Objects and Classes ... if (!InitGUI()) { return INIT_FAILED; } // // Alert Initialization ... string msg = "Initialized Successfully ..."; eaAlert.Alert(msg); // // Init Succeed ... return INIT_SUCCEEDED; } // // DeInitialization ... void OnDeinit(const int reason) { // // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function // REASON_REMOVE 1 Program removed from a chart // REASON_RECOMPILE 2 Program recompiled // REASON_CHARTCHANGE 3 A symbol or a chart period is changed // REASON_CHARTCLOSE 4 Chart closed // REASON_PARAMETERS 5 Inputs changed by a user // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings // REASON_TEMPLATE 7 Another chart template applied // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value // REASON_CLOSE 9 Terminal closed // // Destroy Timer ... DestroyTimer(); // // Destroy all GUI Requirements ... DestroyGUI(); // // Alert De Initialization Succeeded ... string msg = "De Initialized Successfully ..."; eaAlert.Alert(msg); // // Destroy all EA Requirements ... DestroyEA(); } // // On Tick Handler ... void OnTick() { // UpdateGUI(); HandleReportTime(); UpdatePositionsState(); HandleStrategiesOnTick(); } // // Handle On Trade Event ... void OnTrade() { eaTrader.HandleOnTrade(); } // // On Timer ... void OnTimer() { // // TODO: Implement Time Based Functionalities ... } // // Chart Event Handler ... void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam // ) { // // Apply Chart Event on Main Window ... eaMainWindow.ChartEvent(id, lparam, dparam, sparam); // // Handle OnClick Event ... if (id == CHARTEVENT_OBJECT_CLICK) { HandleOnClickEvent(sparam); } } // // Custom Event Handlers ... /** * Handle StopLoss Triggered Positions ... * * @param deal: XDeal ... */ void OnStopLossTriggered(const XDeal &deal) { // HandleReportBalance(); } /** * Handle Take Profit Triggered Positions ... * * @param deal: XDeal ... */ void OnTakeProfitTriggered(const XDeal &deal) { // HandleReportBalance(); } /** * Handle Force Close a Position ... * * @param ticket: Position Ticket ... * @param position: XPosition ... * @param comment: Closing Comment ... */ void OnPositionForceClosed( const ulong ticket, const XPosition &position, const string comment // ) { // HandleReportBalance(); } /** * Do What we Want by Specific Signal ... * * @param signal: XSignal instance ... * @param conditions: XStrategyConditions instance ... */ void OnSignalRecieved( XSignal &signal, X121SMCStrategyConditions &conditions // ) { // // TODO: Implement this ... } // // Custom Functions ... /** * Validate all Inputs of Expert Adviser ... * * @return ( bool ) */ bool ValidateInputs() { // bool result = false; // string errMessage = ""; // bool isCommonValid = ( // eaSlippage > 0 && eaMagicNumber > 0 // ); if (!isCommonValid) { // errMessage += "common configurations error;" + "\n"; } // result = // // Common ... isCommonValid && // // Otere ... true // ; // if (!result) { // // Since here Logger not Initiallized, we Use Raw Print Command ... Print(ShortName + " Errors: \n", errMessage); } // return result; } /** * Initialize Timer ... * * @return ( bool ) */ bool InitTimer() { // bool result = false; // // TODO: Initialize Timer if necessary ... // result = EventSetTimer(1); // result = EventSetMillisecondTimer(100); result = true; // return result; } /** * Destroy Timer ... */ void DestroyTimer() { // // TODO: Use This ... // EventKillTimer(); } /** * Initialize all Requirements for Working Fine ... * * @return ( bool ) */ bool InitEA() { // bool result = false; // // Locally Apply Changes on Prefix ... eaLogTag = ShortName + ">" + eaLogSuffix; // // Bar Timer ... XCTInputs ctInputs; ctInputs.Default(); // Default Configurations ... eaCTHelper = new XSCXCTHelper(); result = eaCTHelper.Init( _Symbol, _Period, ctInputs // ); if (!result) { return result; } // // Bar Styles ... XCCInputs ccInputs; ccInputs.Default(); // Default Configurations ... eaCCHelper = new XSCXCCHelper(); result = eaCCHelper.Init( _Symbol, _Period, ccInputs // ); if (!result) { return result; } // // Create Instance of Alert Class and Configure it ... eaAlert = new XSCAlert(); eaAlert.SetPrefix(eaLogTag); eaAlert.SetLogAlerts(eALogAlerts); eaAlert.SetMailAlerts(eAMailAlerts); eaAlert.SetPushAlerts(eAPushAlerts); eaAlert.SetEnableAlerts(eAEnableAlerts); eaAlert.SetTerminalAlerts(eATerminalAlerts); // // Create Trader Instance and Configure it ... eaTrader = new XSCTrade( eaSlippage, eaMagicNumber // ); eaTrader.AddOnStopLossEventHandler(OnStopLossTriggered); eaTrader.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); eaTrader.AddOnForceClosePositionEventHandler(OnPositionForceClosed); // // Symbols Parsing ... // // Parsers ... XSymbolParser _symbolParser; // // Single Symbol ... if (!eaMultiSymbol) { // // Register Strategy ... // // Create Class Instance ... XCX121SMCStrategy *iX121SMCStrategy; iX121SMCStrategy = new XCX121SMCStrategy( _Symbol, _Period // ); // ConfigureStrategy(iX121SMCStrategy); RegisterStrategy(iX121SMCStrategy); } // // Multi Symbol ... else { // // Parse Symbols ... string symbols[]; int symbolsCount = SplitContent( symbols, eaSymbols // ); result = IsValidSize(symbolsCount); if (!result) { return result; } // for (int i = 0; i < symbolsCount; i++) { // // Select Symbol ... string iSymbol = symbols[i]; // // Register Strategy Based On Symbol ... // // Parse Symbol ... bool isEURUSD = _symbolParser.IsEURUSD(_Symbol); bool isGBPUSD = _symbolParser.IsGBPUSD(_Symbol); bool isEURGBP = _symbolParser.IsEURGBP(_Symbol); bool isUSDCHF = _symbolParser.IsUSDCHF(_Symbol); bool isEURCHF = _symbolParser.IsEURCHF(_Symbol); bool isUSDJPY = _symbolParser.IsUSDJPY(_Symbol); bool isEURJPY = _symbolParser.IsEURJPY(_Symbol); bool isUSDCAD = _symbolParser.IsUSDCAD(_Symbol); bool isEURCAD = _symbolParser.IsEURCAD(_Symbol); bool isAUDUSD = _symbolParser.IsAUDUSD(_Symbol); bool isEURAUD = _symbolParser.IsEURAUD(_Symbol); bool isNZDUSD = _symbolParser.IsNZDUSD(_Symbol); bool isEURNZD = _symbolParser.IsEURNZD(_Symbol); // // Check Symbol Can Register or not ... bool canRegisterStrategy = true; // if (canRegisterStrategy) { // // Create Class Instance ... XCX121SMCStrategy *iX121SMCStrategy; iX121SMCStrategy = new XCX121SMCStrategy( iSymbol, _Period // ); // // Register Strategy ... ConfigureStrategy(iX121SMCStrategy); RegisterStrategy(iX121SMCStrategy); } } } // return result; } /** * Destroy all Initialized EA Requirements ... */ void DestroyEA() { // delete eaCTHelper; delete eaCCHelper; // delete eaAlert; } /** * Initialize all GUI Requirements for EA ... * * @return ( bool ) */ bool InitGUI() { // bool result = false; // // Initialize Application Main Window ... result = eaMainWindow.Create( ChartID(), ShortName, // Dialog Name ... 0, // SubWindow ... 10, // X1 ... 35, // Y1 ... 300, // X2 ... 200 // Y2 ... ); // // Try To Run Main Window ... if (result) { // eaMainWindow.Configure(); eaMainWindow.Run(); } // return result; } /** * Update GUI based on Each Ticks ... */ void UpdateGUI() { // // TODO: Implement this ... } /** * Destroy all Initialized GUi Requirements ... */ void DestroyGUI() { // eaMainWindow.Destroy(); } // // Others ... /** * Update Positions States ... */ void UpdatePositionsState() { // // TODO: Implement this ... } /** * Handle On Click Event for GUI Components ... * * @param name: Object Name ... */ void HandleOnClickEvent(string name) { // if (!IsValid(name)) { return; } // bool isClicked = false; // // TODO: Implement Chart Objects On Click ... // if (isClicked) { UpdateGUI(); } } /** * Report Account Balance ... */ void HandleReportBalance() { // if (!IsRunningOnTestMode()) { return; } // string msg = "Balance: " + ToString(eaTrader.mAccount.GetBalance()); eaAlert.Log(msg); } /** * Time Reporting based on Inputs ... */ void HandleReportTime() { // // Monthly Report .... if (eaReportNewMonths && eaTimeTracker.IsNewMonth()) { // string msg = "New Month ..."; // eaAlert.Alert(msg); } // // Weekly Report .... if (eaReportNewWeeks && eaTimeTracker.IsNewWeek()) { // string msg = "New Week ..."; // eaAlert.Alert(msg); } // // Daily Report .... if (eaReportNewDays && eaTimeTracker.IsNewDay()) { // string msg = "New Day ..."; // eaAlert.Alert(msg); } // // Hourly Report .... if (eaReportNewHours && eaTimeTracker.IsNewHour()) { // string msg = "New Hour ..."; // eaAlert.Alert(msg); } } /** * Initial EA Controller Conditions ... */ void InitControllerConditions() { // // Signalling Conditions ... eaAllowLongSignalling = eaAllowLong; eaAllowShortSignalling = eaAllowShort; // eaDisableSignalling = !eaAllowLongSignalling && !eaAllowShortSignalling; } // /** * Configure Startegy ... */ void ConfigureStrategy(XCX121SMCStrategy *&strategy) { // if (strategy == NULL) { return; } // // Configure Alerts ... strategy.SetAlertPrefix(eaLogTag); strategy.SetAlertLogAlerts(eALogAlerts); strategy.SetAlertMailAlerts(eAMailAlerts); strategy.SetAlertPushAlerts(eAPushAlerts); strategy.SetAlertEnableAlerts(eAEnableAlerts); strategy.SetAlertTerminalAlerts(eATerminalAlerts); // // Confiugre Signalling ... // strategy.AllowLong(eaAllowLongSignalling); strategy.AllowShort(eaAllowShortSignalling); // if (eaDisableSignalling) { strategy.Disable(); } else { strategy.Enable(); } // } /** * Register an Strategy in EA ... * * @param strategy: XCX121SMCStrategy instance ... */ void RegisterStrategy(XCX121SMCStrategy *strategy) { // if (strategy == NULL) { return; } // ArrayResize( eaStrategies, ArraySize(eaStrategies) + 1 // ); // eaStrategies[ArraySize(eaStrategies) - 1] = strategy; } /** * Re Configure All Registered Strategies ... */ void ReConfigureAllStrategies() { // int count = ArraySize(eaStrategies); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // ConfigureStrategy(eaStrategies[i]); } } /** * Call all Registered Strategies On Tick ... */ void HandleStrategiesOnTick() { // int count = ArraySize(eaStrategies); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // // Call Tick Handler Function ... eaStrategies[i].HandleTick(); } } //