last works ...

This commit is contained in:
2024-05-21 06:48:09 +03:30
parent 08abedf8cf
commit cb1d2d5717
4 changed files with 553 additions and 40 deletions
+138 -36
View File
@@ -25,6 +25,10 @@
#include "../Classes/x-saherelm.xalert.class.mq5"
#include "../Classes/x-saherelm.xtrade.class.mq5"
//
// Define On Signal Event Handler Type ...
typedef void (*TOnSignal)(XSignal &signals[]);
//
// Class Definition ...
@@ -153,7 +157,12 @@ public:
//
// Deconstractor ...
~XSCBaseEA() {}
~XSCBaseEA()
{
//
delete mTrader;
delete mAlert;
}
//
// Properties Getter(s) / Setter(s) ...
@@ -330,6 +339,18 @@ public:
mAlert.SetTerminalAlerts(value);
}
//
// Event Listeners ...
void AddOnSignalEventHandler(TOnSignal listener)
{
//
Add(
listener,
mOnSignalEventHandlers
//
);
}
//
// Overrides ...
@@ -364,6 +385,10 @@ public:
// OnTick Handler ...
virtual void OnTick()
{
//
// Check Trade Events ...
OnTrade();
//
// First Check For Any Guard Actions ...
// then Handle Guards if Provided ...
@@ -387,43 +412,15 @@ public:
// Second Check For Signals ...
// then Execute Signals if Provided ...
XSignal signals[];
int signalsCount = CheckForSignal(signals);
int signalsCount = RequestForSignal(signals);
if (signalsCount <= 0)
{
return;
}
//
// Try to Execute Signals ...
ENUM_X_SIGNAL_EXECUTION_RESULT reasons[];
int executedSignalsCount = mTrader.ExecuteSignals(
signals,
reasons);
//
string message = NULL;
if (executedSignalsCount == 0)
{
message = "(" + ToString(signalsCount) + ") Signals Execution Failed ...";
}
else if (executedSignalsCount < signalsCount)
{
//
int diff = signalsCount - executedSignalsCount;
//
message = "Failed to Execute (" + ToString(diff) + ") Signals ...";
}
else if (executedSignalsCount == signalsCount)
{
message = "(" + ToString(executedSignalsCount) + ") Signals Executed Successfully ...";
}
//
if (IsValid(message))
{
mAlert.Alert(message);
}
// Execute Signals ...
HandleSignalsExecution(signals);
}
//
@@ -542,7 +539,7 @@ public:
// When a Guard Notified to Do Support Signal ...
// this Method Calls For Retrieve Support Signal ...
// if it's Provided, Execute it ...
virtual bool CheckForSupport(
virtual bool RequestForSupport(
XSignal &support, // Holds Support Signal, if Provided
string provider, // Positions Provided by Specific Provider
string symbol, // Trading Symbol
@@ -566,19 +563,120 @@ public:
// on our Strategy for Trading ...
// and if a Good Entry founded ...
// model it as an XSignal struct and passed it to result ...
virtual int CheckForSignal(
virtual int RequestForSignal(
XSignal &signals[] // Holds Signals ...
)
{
return 0;
}
//
// Execute Provided Signals ...
virtual void HandleSignalsExecution(XSignal &signals[])
{
//
int signalsCount = ArraySize(signals);
if (signalsCount <= 0)
{
return;
}
//
// Filter Signals Based on their Types ...
XSignal filteredSignals[];
//
// Try to Filter Signals ...
for (int i = 0; i < signalsCount; i++)
{
//
XSignal iSignal = signals[i];
//
bool isLong = IsLong(iSignal.type);
//
if ((isLong && !GetAllowLong()) || (!isLong && !GetAllowShort()))
{
continue;
}
//
AddRef(
iSignal,
filteredSignals //
);
}
//
int filteredSignalsCount = ArraySize(filteredSignals);
if (filteredSignalsCount <= 0) {
return;
}
//
// Try to Execute Signals ...
ENUM_X_SIGNAL_EXECUTION_RESULT reasons[];
int executedSignalsCount = mTrader.ExecuteSignals(
filteredSignals,
reasons
//
);
//
string message = NULL;
if (executedSignalsCount == 0)
{
message = "(" + ToString(filteredSignals) + ") Signals Execution Failed ...";
}
else if (executedSignalsCount < filteredSignalsCount)
{
//
int diff = filteredSignalsCount - executedSignalsCount;
//
message = "Failed to Execute (" + ToString(diff) + ") Signals ...";
}
else if (executedSignalsCount == filteredSignalsCount)
{
message = "(" + ToString(executedSignalsCount) + ") Signals Executed Successfully ...";
}
//
if (IsValid(message))
{
mAlert.Alert(message);
}
}
//
// Protected ...
protected:
//
// Props ...
//
// Signal Event Listeners ...
void NotifyOnSignalEventHandlers(XSignal &signals[])
{
//
int listenersCount = ArraySize(mOnSignalEventHandlers);
if (listenersCount <= 0)
{
return;
}
//
for (int i = 0; i < listenersCount; i++)
{
//
TOnSignal iListener = mOnSignalEventHandlers[i];
//
iListener(signals);
}
}
//
// Position Management ...
@@ -1037,7 +1135,7 @@ protected:
{
//
XSignal support;
bool hasSupport = CheckForSupport(
bool hasSupport = RequestForSupport(
support,
provider,
symbol,
@@ -1134,6 +1232,10 @@ private:
// Check in Test Mode or not ...
bool mIsInTestMode;
//
// Signal Event Listeners ...
TOnSignal mOnSignalEventHandlers[];
//
// Position Management ...
bool mAllowLong; // Allow Long Trades
@@ -1149,6 +1251,6 @@ private:
TOnOrdersChanged mOnOrdersChangedHandler;
TOnPositionsChanged mOnPositionsChangedHandler;
TOnTradeStateChanged mOnTradeStateChangedHandler;
}
};
//