Last Works on XSDT Pivot Detector ...
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user