/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Expert Advisor // ---------------------------------------- // Name: X121EA // Description: this is an expert controller // advisors which provides a mechanism for use them ... // // NOTE: about provider instancing in multi asset state: // you can provide configurations using this: // // EURUSDb,USDCHFb|M5|0.01|X786,X92|true // EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true // EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true // // or make the instance use this: // // XPV(EURUSDb|M15|0.01|X92|true)XPV(GBPUSDb|M5|0.02|X786|false) // // if leave Configuration string blank this will used default config // and One asset mode enabled ... // // 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 X121EA" #property strict // // START Definitions ... // // #define ShortName "X121EA" // // END Definitions ... // // // START Inputs ... // // // EA ... input group "Common"; input bool xEAEnable = true; // Enable EA input int xEASlippage = 10; // Slippgae input ulong xEAMagicNumber = 1604056; // Magic Number // // Providers ... input group "Providers"; input string xEAProvidersConfiguration = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb,XAUUSDb|M5,M15|0.01|X786|true"; // Providers Configuration input string xEADefaultSignalProviders = "XTEST"; // Default Allowed Signal Providers // // Signals ... input group "Signals"; input bool xEAEnableLongs = true; // Enable Long Trades input bool xEAEnableShorts = true; // Enable Short Trades // // Risk Management ... input group "Risk Management"; input double xEAMaxAllowedSpread = 10; // Max Allowed Spread to Execute Signal input int xEAMaxOpenPositions = 15; // Max Allowed Open Trades input double xEAMinRiskAmountPerTrade = 0.001; // Min Risk Amount Per Trade input double xEAMaxAllowedDrawDownFactor = 0.01; // Max Allowed Drawdown Factor input double xEAMinProfitPerTrade = 0.5; // Min Acceptable Profit Per Trade input double xEAMinProfitPerVolumeFactor = 0.01; // Min Acceptable Profit Volume Factor Per Trade input bool xEAUseRiskAmountAsStaticVolume = true; // Use Provided Risk Amount as Static Volume // input group "EQM"; input int xEAMinAgeForDoSupport = 35; // Minimum Age For Supporting In Drawdown Positions when there isn't Equity input int xEAMinAgeForUpdateSupports = 35; // Minimum Age For Update Untriggered Support Orders // // Alerts ... input group "Alerts"; input bool xEAEnableAlerts = true; // Enable Events Alert input bool xEAEnableHourlyAlerts = false; // Send Alert on each new Hour input bool xEAEnableDailyAlerts = false; // Send Alert on each new Day input bool xEAEnableWeeklyAlerts = false; // Send Alert on each new Week input bool xEAEnableMonthlyAlerts = false; // Send Alert on each new Month // // END Inputs ... // // // START Including Providers ... // // // Logger Library ... #include "../Libraries/x-saherelm.log.lib.mq5" #include "../Classes/x-saherelm.x121.xea.class.mq5" #include "../Libraries/x-saherelm.seriallizer.lib.mq5" // // END Including Providers ... // // // START Global Definitions: Variables, Properties and etc ... // // XSCX121EA *mX121EA; // // END Global Definitions: Variables, Properties and etc ... // // // START Event Handlers ... // // // Initialization ... int OnInit() { // logTag = ShortName; drawPrefix = logTag; alertPrefix = logTag; // // Validate Inputs ... if (!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } // bool isInit = InitEAInstance(); if (!isInit) { 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 // // De Initialize XEA Providers ... delete mX121EA; } // // On Tick Handler ... void OnTick() { // // Prevent Going Forward if user Disable it ... if (xEAEnable) { mX121EA.OnTick(); } } // // Handle Trade Events ... void OnTrade() { mX121EA.OnTrade(); } // // Handle Signal Event ... void OnSignalConditionsRecieved(X121MarketConditions &info) { } // // Handle StopLoss Event ... void OnStopLossTriggered(const XDeal &deal) { } // // Handle TakeProfit Event ... void OnTakeProfitTriggered(const XDeal &deal) { } // // Handle Deals Changed Event ... void OnDealsChangedHandler(int count) { } // // Handle Order Changed Event ... void OnOrdersChangedHandler(int count) { } // // Handle Position Changed Event ... void OnPositionsChangedHandler(int count) { } // // Handle Trade State Changed ... void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) { } // // END Event Handlers ... // // // START Functions ... // // // Validate Input Args for Initialization ... bool ValidateInputs() { // bool result = true; // // Validate Args ... result = // xEASlippage > 0 && xEAMagicNumber > 0 && xEAMinRiskAmountPerTrade > 0 && StringLen(xEADefaultSignalProviders) > 0 // // TODO: add new validations here ... // ; // // Validate Providers ... if (result) { // string providers[]; SplitContent( providers, xEADefaultSignalProviders); // int providersCount = ArraySize(providers); if (providersCount <= 0) { // result = false; return result; } // string allProviders[]; GetAllProviders(allProviders); // bool hasError = false; for (int i = 0; i < providersCount; i++) { // string iProvider = providers[i]; if (!Contains(iProvider, allProviders)) { // hasError = true; break; } } // if (hasError) { // result = false; return result; } } // // Logging State ... string message = "Validation of (" + logTag + ") Inputs " + (result ? "Succeeded" : "Failed") + " ..."; LogMessage(message); // return result; } // // Initialize X121EA Class Instances ... bool InitEAInstance() { // bool result = false; // X121SignalProvider providers[]; // // Try to Extract Configs ... int configsCount = ExtractProviderConfigurations( providers, xEAProvidersConfiguration, xEADefaultSignalProviders, xEAMinRiskAmountPerTrade, xEAUseRiskAmountAsStaticVolume); // mX121EA = new XSCX121EA( _Symbol, _Period, xEAMagicNumber, xEASlippage, xEAMaxAllowedSpread, xEAMaxOpenPositions, xEAMinProfitPerTrade, xEAMinProfitPerVolumeFactor, xEAMaxAllowedDrawDownFactor, OnStopLossTriggered, OnTakeProfitTriggered, OnDealsChangedHandler, OnOrdersChangedHandler, OnPositionsChangedHandler, OnTradeStateChangedHandler, // xEAMinAgeForDoSupport, xEAMinAgeForUpdateSupports, OnSignalConditionsRecieved); // mX121EA.EnableLongs(xEAEnableLongs); mX121EA.EnableShorts(xEAEnableShorts); // // Attach Providers to EA Instance ... int providersCount = ArraySize(providers); int addedProviders = mX121EA.AddProviders(providers); result = addedProviders == providersCount; // return result; } // // END Functions ... //