last works ...
This commit is contained in:
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user