Attach CheckForGuard Event Handler for Signallers to Handle Guards ...

This commit is contained in:
2025-09-11 15:19:56 +03:30
parent 5eaeb13087
commit 94539b2b5d
7 changed files with 321 additions and 196 deletions
+1 -196
View File
@@ -24,202 +24,7 @@
// Imports ... // Imports ...
#include "../Classes/x-saherelm.x-alert.class.mq5" #include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5" #include "../Classes/x-saherelm.x-trade.class.mq5"
#include "../Libraries/x-saherelm.x-guard.lib.mq5"
//
// Enumeration ...
//
// Guard Actions ...
enum ENUM_X_GUARD_ACTIONS
{
X_GUARD_ACTION_NONE, // Nothing to Do
X_GUARD_ACTION_CLOSE, // Close Specified Position
X_GUARD_ACTION_CLOSE_ALL, // Close All Positions
X_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions
X_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position
X_GUARD_ACTION_CLOSE_IN_LOSTS, // Close All In Lost Position
X_GUARD_ACTION_CLOSE_IN_PROFITS, // Close All In Profit Position
X_GUARD_ACTION_CLOSE_IN_LOST_LONGS, // Close All In Lost Long Position
X_GUARD_ACTION_CLOSE_IN_PROFIT_LONGS, // Close All In Profit Long Position
X_GUARD_ACTION_CLOSE_IN_LOST_SHORTS, // Close All In Lost Short Position
X_GUARD_ACTION_CLOSE_IN_PROFITS_SHORT, // Close All In Profit Short Position
X_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position
X_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position
X_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position
X_GUARD_ACTION_HEDGE, // Hedge Specified Positions
};
//
// Definitions ...
//
// Model a Guard Action ...
struct XGuard
{
//
// Props ...
ENUM_X_GUARD_ACTIONS action;
datetime time;
//
string symbol;
string provider;
ENUM_TIMEFRAMES period;
//
// Specified Position ...
ulong ticket;
//
// Partial Close ...
double volumeMultiplier;
//
// SL Trial ...
double sl;
//
// TP Trial ...
double tp;
//
bool force;
//
// Constructor ...
XGuard()
{
Clean();
}
//
// Tools ...
/**
* Cleanup ...
*/
void Clean()
{
//
time = NULL;
action = X_GUARD_ACTION_NONE;
//
symbol = NULL;
period = NULL;
provider = NULL;
//
ticket = 0;
//
volumeMultiplier = 0;
//
sl = 0;
tp = 0;
//
force = false;
//
ZeroMemory(this);
}
/**
* Validate ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
IsSpecifiedValid(time) &&
IsSpecifiedValid(symbol) &&
IsSpecifiedValid(period) &&
IsSpecifiedValid(action) &&
IsSpecifiedValid(provider)
//
;
if (!result)
{
return result;
}
//
// Validate Model Based On Specified Guard Actions ...
//
return result;
}
};
//
// an Event Type for Notify Guard Triggered ...
typedef void (*TOnGuarded)(
ENUM_X_GUARD_ACTIONS guard,
XPosition &positions[]);
//
// Extensions ...
//
bool IsValid(ENUM_X_GUARD_ACTIONS item)
{
//
bool result = false;
//
result = item != X_GUARD_ACTION_NONE;
//
return result;
}
bool IsSpecifiedValid(ENUM_X_GUARD_ACTIONS item)
{
return IsValid(item);
}
/**
* Add Guard to Collection ...
*
* @param guard: XGuard instance ...
* @param guards: XGuard instance Collection ...
*
* @return ( int )
*/
int AddGuard(
XGuard &guard,
XGuard &guards[] //
)
{
//
int result = 0;
//
if (!guard.IsValid())
{
return result;
}
//
AddRef(
guard,
guards //
);
//
result = ArraySize(guards);
//
return result;
}
// //
// Implementation ... // Implementation ...
@@ -47,6 +47,9 @@ class XCTradeManager : public XCBase
// //
XCPOIDrawer *drawer; XCPOIDrawer *drawer;
//
TCheckForGuard checkForGuardEventListener;
// //
// Constructor ... // Constructor ...
XCTradeManager( XCTradeManager(
@@ -1679,6 +1682,10 @@ class XCTradeManager : public XCBase
// //
// Check For Guards ... // Check For Guards ...
if (checkForGuardEventListener != NULL)
{
result = checkForGuardEventListener(dest);
}
// //
result = ArraySize(dest); result = ArraySize(dest);
+12
View File
@@ -213,6 +213,7 @@ int OnInit()
eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged); eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged);
eaExpert.canAnalyseEventHandler = CanAnalyseEventTriggered; eaExpert.canAnalyseEventHandler = CanAnalyseEventTriggered;
eaExpert.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); eaExpert.AddOnTakeProfitEventHandler(OnTakeProfitTriggered);
eaExpert.checkForGuardEventHandler = CheckForGuardTriggered;
eaExpert.AddOnModifyPositionEventHandler(OnPositionModified); eaExpert.AddOnModifyPositionEventHandler(OnPositionModified);
eaExpert.AddOnPositionsChangedEventHandler(OnPositionsChanged); eaExpert.AddOnPositionsChangedEventHandler(OnPositionsChanged);
eaExpert.AddOnTradeStateChangedEventHandler(OnTradeStateChanged); eaExpert.AddOnTradeStateChangedEventHandler(OnTradeStateChanged);
@@ -317,6 +318,17 @@ bool CanAnalyseEventTriggered(
); );
} }
/**
* Check For Guard Event Handler ...
*
* @param guards: XGuard[]
*
* @return ( int )
*/
int CheckForGuardTriggered(XGuard &guards[]) {
return eaExpert.CheckForGuardTriggered(guards);
}
/** /**
* Handle Guard Events ... * Handle Guard Events ...
* *
+214
View File
@@ -0,0 +1,214 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Seriallize Library
// ---------------------------------------
// Name: XGuardLib
// Description: All models related to Guard ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Imports ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Enumeration ...
//
// Guard Actions ...
enum ENUM_X_GUARD_ACTIONS
{
X_GUARD_ACTION_NONE, // Nothing to Do
X_GUARD_ACTION_CLOSE, // Close Specified Position
X_GUARD_ACTION_CLOSE_ALL, // Close All Positions
X_GUARD_ACTION_CLOSE_LONGS, // Close All Long Positions
X_GUARD_ACTION_CLOSE_SHORTS, // Close All Short Position
X_GUARD_ACTION_CLOSE_IN_LOSTS, // Close All In Lost Position
X_GUARD_ACTION_CLOSE_IN_PROFITS, // Close All In Profit Position
X_GUARD_ACTION_CLOSE_IN_LOST_LONGS, // Close All In Lost Long Position
X_GUARD_ACTION_CLOSE_IN_PROFIT_LONGS, // Close All In Profit Long Position
X_GUARD_ACTION_CLOSE_IN_LOST_SHORTS, // Close All In Lost Short Position
X_GUARD_ACTION_CLOSE_IN_PROFITS_SHORT, // Close All In Profit Short Position
X_GUARD_ACTION_PARTIAL_CLOSE, // Partial Close Specified Position
X_GUARD_ACTION_TRAIL_STOP, // Trail Stop of Specified Position
X_GUARD_ACTION_TRAIL_TARGET, // Trail Target of Specified Position
X_GUARD_ACTION_HEDGE, // Hedge Specified Positions
};
//
// Definitions ...
//
// Model a Guard Action ...
struct XGuard
{
//
// Props ...
ENUM_X_GUARD_ACTIONS action;
datetime time;
//
string symbol;
string provider;
ENUM_TIMEFRAMES period;
//
// Specified Position ...
ulong ticket;
//
// Partial Close ...
double volumeMultiplier;
//
// SL Trial ...
double sl;
//
// TP Trial ...
double tp;
//
bool force;
//
// Constructor ...
XGuard()
{
Clean();
}
//
// Tools ...
/**
* Cleanup ...
*/
void Clean()
{
//
time = NULL;
action = X_GUARD_ACTION_NONE;
//
symbol = NULL;
period = NULL;
provider = NULL;
//
ticket = 0;
//
volumeMultiplier = 0;
//
sl = 0;
tp = 0;
//
force = false;
//
ZeroMemory(this);
}
/**
* Validate ...
*
* @return ( bool )
*/
bool IsValid()
{
//
bool result = false;
//
result =
//
IsSpecifiedValid(time) &&
IsSpecifiedValid(symbol) &&
IsSpecifiedValid(period) &&
IsSpecifiedValid(action) &&
IsSpecifiedValid(provider)
//
;
if (!result)
{
return result;
}
//
// Validate Model Based On Specified Guard Actions ...
//
return result;
}
};
//
// Extensions ...
//
bool IsValid(ENUM_X_GUARD_ACTIONS item)
{
//
bool result = false;
//
result = item != X_GUARD_ACTION_NONE;
//
return result;
}
bool IsSpecifiedValid(ENUM_X_GUARD_ACTIONS item)
{
return IsValid(item);
}
/**
* Add Guard to Collection ...
*
* @param guard: XGuard instance ...
* @param guards: XGuard instance Collection ...
*
* @return ( int )
*/
int AddGuard(
XGuard &guard,
XGuard &guards[] //
)
{
//
int result = 0;
//
if (!guard.IsValid())
{
return result;
}
//
AddRef(
guard,
guards //
);
//
result = ArraySize(guards);
//
return result;
}
+10
View File
@@ -22,6 +22,7 @@
// //
// Imports ... // Imports ...
#include "../Libraries/x-saherelm.common.lib.mq5" #include "../Libraries/x-saherelm.common.lib.mq5"
#include "../Libraries/x-saherelm.x-guard.lib.mq5"
#include <Trade/Trade.mqh> #include <Trade/Trade.mqh>
// //
@@ -3752,6 +3753,15 @@ typedef bool (*TCanAnalyse)(
datetime _time // datetime _time //
); );
//
// an Event Type for Notify Guard Triggered ...
typedef void (*TOnGuarded)(
ENUM_X_GUARD_ACTIONS guard,
XPosition &positions[]);
//
typedef int (*TCheckForGuard)(XGuard &guards[]);
// //
typedef void (*TOnDealsChanged)(int count); typedef void (*TOnDealsChanged)(int count);
+51
View File
@@ -116,6 +116,7 @@ class XCXOM1EAExpert : public XCBase
// //
TOnGuarded onGuardedEventHandler; TOnGuarded onGuardedEventHandler;
TCanAnalyse canAnalyseEventHandler; TCanAnalyse canAnalyseEventHandler;
TCheckForGuard checkForGuardEventHandler;
// //
// Signal Event Handlers ... // Signal Event Handlers ...
@@ -519,6 +520,10 @@ class XCXOM1EAExpert : public XCBase
// //
// Configuring Trade Manager ... // Configuring Trade Manager ...
//
// Attache Check For Guard Event Listener ...
eaTradeManager.checkForGuardEventListener = checkForGuardEventHandler;
// //
eaTradeManager.SaveWins(eaSaveWins); eaTradeManager.SaveWins(eaSaveWins);
eaTradeManager.SaveLosts(eaSaveLosts); eaTradeManager.SaveLosts(eaSaveLosts);
@@ -742,6 +747,52 @@ class XCXOM1EAExpert : public XCBase
eaTradeManager.HandleSignal(signal); eaTradeManager.HandleSignal(signal);
} }
/**
* Check For Guard Event Handler ...
*
* @param guards: XGuard[]
*
* @return ( int )
*/
int CheckForGuardTriggered(XGuard &guards[])
{
//
int result = 0;
//
if (!HasChild(eaSignallers))
{
return result;
}
//
int count = ArraySize(eaSignallers);
for (int i = 0; i < count; i++)
{
//
XGuard iGuards[];
int iGuardsCount = eaSignallers[i].CheckForGuard(iGuards);
if (IsValidSize(iGuardsCount))
{
//
Copy(
iGuards,
guards,
false //
);
}
//
SpecifiedClean(iGuards);
}
//
result = ArraySize(guards);
//
return result;
}
/** /**
* Handle Guard Events ... * Handle Guard Events ...
* *
+26
View File
@@ -558,6 +558,32 @@ class XCXOM1SignallerBase
iConditions.Clean(); iConditions.Clean();
} }
/**
* Check Guards Based on MarketConditions ...
*
* @param guards: XGuard[]
* @param barIndex: int
*
* @return ( int )
*/
int CheckForGuard(
XGuard &guards[],
int barIndex = 0 //
)
{
//
int result = 0;
//
SpecifiedClean(guards);
//
result = ArraySize(guards);
//
return result;
}
// //
// Virtuals ... // Virtuals ...