Last Works on XSDT Pivot Detector ...

This commit is contained in:
2026-08-14 03:30:03 +03:30
parent d50eef35bc
commit 9d23e2cba1
3 changed files with 1381 additions and 0 deletions
@@ -0,0 +1,414 @@
///////////////////////////////////////////////////////
//
// 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