/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Expert Advisor // ------------------------------------------------- // Name: XBaseEA // Description: Session Detector Test Expert Advisor ... // // 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 icon "../Images/SaherElm_Logo_Color.ico" #property description "SaherElm Session Detector Test Expert Advisor" #property strict // #region Imports ... #include "../Classes/x-saherelm.pivot-detector.class.mq5" #include "../Classes/x-saherelm.session-detector.class.mq5" #include "../Classes/x-saherelm.x-poi.drawer.class.mq5" // #endregion // #region Global Variables ... #define ShortName "XPivotDetectorTestEA" XCAlert *eaAlert; XCPOIDrawer *eaDrawer; CArrayObj eaDrawnObjects; XCPivotDetector *eaPivotDetector; XCSessionDetector *eaSessionDetector; // // Last Processing Pivots Time ... datetime eaLastPivotProcessing = NULL; // #endregion // #region Global Event Handlers ... /** * Initialize EA Process ... * * @return ( int ) */ int OnInit() { // bool result = true; // result = InitializeRequirements(); if (!result) { return INIT_FAILED; } // return INIT_SUCCEEDED; } /** * De Initialize Expert ... * * @param reason: int, DeInitialization 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 * */ void OnDeinit(const int reason) { // // Destroy Timer ... // If Initialized ... // // Cleanup Resources ... ZeroMemory(eaAlert); ZeroMemory(eaDrawer); ZeroMemory(eaPivotDetector); ZeroMemory(eaSessionDetector); } /** * Handle Tick for Processing ... */ void OnTick() { // // Perform Session Detector Process ... eaSessionDetector.Process(); // // Process Pivot Detector ... HandleProcessPviots(); } /** * Handle On Chart Event Processing ... * @param id: int, Specified Event ID ... * @param lparam: long, type event parameter * @param dparam: double, type event parameter * @param sparam: string, type event parameter */ void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam // ) { } // #endregion // #region Custom Actions ... /** * Initial Requirements of EA ... * * @return ( bool ) */ bool InitializeRequirements() { // bool result = false; // eaDrawer = new XCPOIDrawer(); // // Initialize Alert ... eaAlert = new XCAlert( ShortName, true, // Enable Alert ... true, // Log Alert ... false, // Terminal Alert ... false, // Mail Alert ... false, // Push Alerts ... false // Save Alerts ... ); result = eaAlert != NULL; if (!result) { return result; } // // Initialize Session Detector ... eaSessionDetector = new XCSessionDetector( eaAlert, // Alert ... true, // Use Server Time ... 0 // Timezone Offset ... ); // // Register Event Handlers ... eaSessionDetector.AddOnSessionEndHandler(OnSessionEndHandler); eaSessionDetector.AddOnOverlapEndHandler(OnOverlapEndHandler); eaSessionDetector.AddOnSessionStartHandler(OnSessionStartHandler); eaSessionDetector.AddOnOverlapStartHandler(OnOverlapStartHandler); eaSessionDetector.AddOnSessionStateChangeHandler(OnSessionStateChangeHandler); // result = eaSessionDetector != NULL; if (!result) { return result; } // // Initialize Pivot Detector ... eaPivotDetector = new XCPivotDetector( eaAlert // Alert ... ); // // Register Event Handlers ... eaPivotDetector.AddOnPeakBreakedHandler(OnPeakBreakedHandler); eaPivotDetector.AddOnValeBreakedHandler(OnValeBreakedHandler); eaPivotDetector.AddOnPeakDetectedHandler(OnPeakDetectedHandler); eaPivotDetector.AddOnValeDetectedHandler(OnValeDetectedHandler); // result = eaPivotDetector != NULL; if (!result) { return result; } // return result; } /** * Process Pivots ... */ void HandleProcessPviots() { // // Initialize Pivot Processing Bar ... XOHCL bar; bool has = bar.Init( _Symbol, PERIOD_H4, 1 // Last Completed 4H Bar ... ); if (!has) { return; } // // Validate Passing Bar ... has = !IsXValid(eaLastPivotProcessing) || bar.time > eaLastPivotProcessing; if (!has) { return; } // eaPivotDetector.Process( bar, // XOHCL Bar ... 2, // Pivot Approvation Length ... 20 // Loopback ... ); // // Handle Draw Pivots ... XBoxZone tmps[]; CArrayObj *objects; FillNotExists( tmps, // Dest ... eaPivotDetector.peaks, // Source ... false // Force Clean ... ); FillNotExists( tmps, // Dest ... eaPivotDetector.vales, // Source ... false // Force Clean ... ); if (HasChild(tmps)) { eaDrawer.DrawBoxes( tmps, // Boxes ... objects, // Objects to Hold ... false // Ignore Type Name ... ); } XClean(tmps); AddObjects(objects, eaDrawnObjects); if (eaDrawnObjects.Total() > 0) { DebugBreak(); } } // #endregion // #region Custom Event Handlers ... // #region Pivot Detector Event Handlers ... /** * Calls when a Peak Breaked ... * * @param box: XBoxZone instance ... */ void OnPeakBreakedHandler(XBoxZone &box) { // DebugBreak(); } /** * Calls when a Vale Breaked ... * * @param box: XBoxZone instance ... */ void OnValeBreakedHandler(XBoxZone &box) { // DebugBreak(); } /** * Calls when a New Peak Detected ... * * @param box: XBoxZone instance ... */ void OnPeakDetectedHandler(XBoxZone &box) { // DebugBreak(); } /** * Calls when a New Vale Detected ... * * @param box: XBoxZone instance ... */ void OnValeDetectedHandler(XBoxZone &box) { // DebugBreak(); } // #endregion // #region Session Detector Event Handlers ... /** * Handle Session Start Event ... * * @param session: ENUM_X_SESSION_TYPE * @param startTime: datetime */ void OnSessionStartHandler( ENUM_X_SESSION_TYPE session, datetime startTime // ) { // Print("Session Started: ", EnumToString(session), " at ", TimeToString(startTime)); // // // // Custom Testing ... // if (session == X_SESSION_NEWYORK) // { // DebugBreak(); // } } /** * Handle Session End Event ... * * @param session: ENUM_X_SESSION_TYPE * @param startTime: datetime */ void OnSessionEndHandler( ENUM_X_SESSION_TYPE session, datetime startTime // ) { // Print("Session Ended: ", EnumToString(session), " at ", TimeToString(startTime)); // // // // Custom Testing ... // if (session == X_SESSION_NEWYORK) // { // DebugBreak(); // } } /** * Handle Overlap Start Event ... * * @param session: ENUM_X_SESSION_OVERLAP_TYPE * @param startTime: datetime */ void OnOverlapStartHandler( ENUM_X_SESSION_OVERLAP_TYPE overlap, datetime startTime // ) { // Print("Overlap Started: ", EnumToString(overlap), " at ", TimeToString(startTime)); // // // // Custom Testing ... // if (overlap == X_OVERLAP_LONDON_NEWYORK) // { // DebugBreak(); // } } /** * Handle Overlap End Event ... * * @param session: ENUM_X_SESSION_OVERLAP_TYPE * @param startTime: datetime */ void OnOverlapEndHandler( ENUM_X_SESSION_OVERLAP_TYPE overlap, datetime startTime // ) { // Print("Overlap Ended: ", EnumToString(overlap), " at ", TimeToString(startTime)); // // // // Custom Testing ... // if (overlap == X_OVERLAP_LONDON_NEWYORK) // { // DebugBreak(); // } } /** * Handle Session State Change Event ... * * @param session: ENUM_X_SESSION_TYPE * @param state: ENUM_X_SESSION_STATE */ void OnSessionStateChangeHandler( ENUM_X_SESSION_TYPE session, ENUM_X_SESSION_STATE state // ) { // Print("Session State Changed: ", EnumToString(session), " State: ", EnumToString(state)); } // #endregion // #endregion