/////////////////////////////////////////////////////// // // 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) // ////////////////////////////////////////////////////// // // 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 "../X121SMCEA/Experts/x-121.smc.expert.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"; // Trading Symbols // // Volume ... input group "Volume"; input double eaR2R = 3.0; // Risk to Reward Ratio 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 bool eaDynamicRiskManagement = false; // Dynamic Risk Management input double eaRiskPercentPerBalance = 0; // Risk Percent Per Balance on Each Trade // // 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 = true; // Report New Days input bool eaReportNewHours = false; // Report New Hours // // Define Local Variables ... XC121SMCExpert eaExpert; // // 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; } // // Configure EA Expert Class ... // eaExpert.OnSignalEventListener = OnSignalRecieved; eaExpert.OnDealsChangedEventListener = OnDealsChanged; eaExpert.OnOrdersChangedEventListener = OnOrdersChanged; eaExpert.OnPositionSLEventListener = OnStopLossTriggered; eaExpert.OnPositionTPEventListener = OnTakeProfitTriggered; eaExpert.OnPositionsChangedEventListener = OnPositionsChanged; eaExpert.OnPositionForceCloseEventListener = OnPositionForceClosed; // eaExpert.MagicNumber(eaMagicNumber); eaExpert.Slippage(eaSlippage); eaExpert.TagPrefix(eaLogSuffix); // eaExpert.SetSymbol(_Symbol); eaExpert.SetPeriod(_Period); eaExpert.Symbols(eaSymbols); eaExpert.MultiSymbol(eaMultiSymbol); // eaExpert.AllowLong(eaAllowLong); eaExpert.AllowShort(eaAllowShort); // eaExpert.SetAlertEnableAlerts(eaEnableAlerts); eaExpert.SetAlertLogAlerts(eaLogAlerts); eaExpert.SetAlertMailAlerts(eaMailAlerts); eaExpert.SetAlertPushAlerts(eaPushAlerts); eaExpert.SetAlertTerminalAlerts(eaTerminalAlerts); // eaExpert.ReportNewMonths(eaReportNewMonths); eaExpert.ReportNewWeeks(eaReportNewWeeks); eaExpert.ReportNewDays(eaReportNewDays); eaExpert.ReportNewHours(eaReportNewHours); // eaExpert.R2R(eaR2R); eaExpert.Volume(eaVolume); eaExpert.UseDynamicVolume(eaUseDynamicVolume); eaExpert.DynamicVolumeStep(eaDynamicVolumeStep); eaExpert.DynamicRiskManagement(eaDynamicRiskManagement); eaExpert.RiskPercentPerBalance(eaRiskPercentPerBalance); eaExpert.DynamicVolumeBalanceFactor(eaDynamicVolumeBalanceFactor); // bool isInited = eaExpert.HandleOnInit(); if (!isInited) { return INIT_FAILED; } // // 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 ... eaExpert.HandleOnDeInit(); } // // On Tick Handler ... void OnTick() { eaExpert.HandleOnTick(); } // // Handle On Trade Event ... void OnTrade() { eaExpert.HandleOnTrade(); } // // On Timer ... void OnTimer() { eaExpert.HandleOnTimer(); } // // Chart Event Handler ... void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam // ) { eaExpert.HandleOnChartEvent(id, lparam, dparam, sparam); } // // Event Listeners ... /** * Do What we Want by Specific Signal ... * * @param signal: XSignal instance ... * @param conditions: XStrategyConditions instance ... */ void OnSignalRecieved( XSignal &signal, X121SMCStrategyConditions &conditions // ) { // eaExpert.HandleOnSignalRecieved( signal, conditions // ); } /** * Handle StopLoss Triggered Positions ... * * @param deal: XDeal instance ... */ void OnStopLossTriggered(const XDeal &deal) { eaExpert.HandleOnStopLossTriggered(deal); } /** * Handle Take Profit Triggered Positions ... * * @param deal: XDeal instance ... */ void OnTakeProfitTriggered(const XDeal &deal) { eaExpert.HandleOnTakeProfitTriggered(deal); } /** * Handle Force Close a Position ... * * @param ticket: ULONG ... * @param position: XPosition instance ... * @param comment: String ... */ void OnPositionForceClosed( const ulong ticket, const XPosition &position, const string comment // ) { // eaExpert.HandleOnPositionForceClosed( ticket, position, comment // ); } /** * Handle Deals Changes ... * * @param count: Integer, Number of Changes ... */ void OnDealsChanged(int count) { eaExpert.HandleOnDealsChanged(count); } /** * Handle Orders Changes ... * * @param count: Integer, Number of Changes ... */ void OnOrdersChanged(int count) { eaExpert.HandleOnOrdersChanged(count); } /** * Handle Positions Changes ... * * @param count: Integer, Number of Changes ... */ void OnPositionsChanged(int count) { eaExpert.HandleOnPositionsChanged(count); } // // 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(); } //