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
+153 -1
View File
@@ -94962,8 +94962,15 @@ private:
// //
// Model Provider Descriptor ... // Model Provider Descriptor ...
struct X5ProvierDescriptor struct X5ProviderDescriptor
{ {
//
string symbol; // Trading Symbol
ENUM_TIMEFRAMES period; // Trading Timeframe
bool allowLong = true; // Allow Long Signals
bool allowShort = true; // Allow Short Signals
ENUM_X5_SIGNAL_PROVIDERS signallers[]; // Allowed Signal Providers
// //
X5ProviderInputs inputs; X5ProviderInputs inputs;
XSCX5Provider *provider; XSCX5Provider *provider;
@@ -94975,6 +94982,127 @@ struct X5ProvierDescriptor
// //
// Tools ... // Tools ...
//
bool Init()
{
//
bool result = false;
//
result = this.Init(
this.symbol,
this.period,
this.signallers,
this.allowLong,
this.allowShort //
);
//
return result;
}
//
bool Init(
ENUM_X5_SIGNAL_PROVIDERS &mSignallers[], // Allowed Signal Providers
bool mAllowLong = true, // Allow Long Signals
bool mAllowShort = true // Allow Short Signals
)
{
//
bool result = false;
//
result = this.Init(
this.symbol,
this.period,
mSignallers,
mAllowLong,
mAllowShort //
);
//
return result;
}
//
bool Init(
string mSymbol, // Trading Symbol
ENUM_TIMEFRAMES mPeriod, // Trading Timeframe
ENUM_X5_SIGNAL_PROVIDERS &mSignallers[], // Allowed Signal Providers
bool mAllowLong = true, // Allow Long Signals
bool mAllowShort = true // Allow Short Signals
)
{
//
bool result = false;
//
result =
//
inputs.IsValid() &&
IsValid(mSymbol) &&
IsValid(mPeriod) &&
(allowLong || allowShort) &&
ArraySize(mSignallers) > 0
//
;
if (!result)
{
return result;
}
//
this.symbol = mSymbol;
this.period = mPeriod;
this.allowLong = mAllowLong;
this.allowShort = mAllowShort;
Copy(
this.signallers,
mSignallers //
);
//
// Instantiate Provider ...
provider = new XSCX5Provider(
this.symbol,
this.period //
);
//
// Set Long/Short State ...
//
provider
.SetSignalTypeState(
POSITION_TYPE_BUY,
this.allowLong //
);
//
provider
.SetSignalTypeState(
POSITION_TYPE_SELL,
this.allowShort //
);
//
// Enable Required Signallers ...
provider
.SetSignalProviderStates(
this.signallers,
true //
);
//
// Now Must to Initialize Provider ...
result = provider.Init(
this.inputs //
);
//
return result;
}
// //
// Cleanup ... // Cleanup ...
void Clean() void Clean()
@@ -94984,6 +95112,30 @@ struct X5ProvierDescriptor
conditions.Clear(); conditions.Clear();
} }
//
// Validate ...
bool IsValid(bool validateInputs = true)
{
//
bool result = false;
//
result =
//
IsValid(symbol) &&
IsValid(period) &&
(validateInputs
? inputs.IsValid()
: true) &&
(allowLong || allowShort) &&
ArraySize(signallers) > 0
//
;
//
return result;
}
// //
// Check Signal ... // Check Signal ...
bool HasSignal(int barIndex = 0) bool HasSignal(int barIndex = 0)
+259
View File
@@ -0,0 +1,259 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCX5EA
// Description: provides all X5 EA requirements ...
// - X5 Provider;
//
//
// 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 "../Classes/x-saherelm.xea.class.mq5"
#include "../Classes/x-saherelm.x5.provider.class.mq5"
//
// Define On Signal Event Handler Type Specified for X5 ...
typedef void (*TX5OnSignal)(X5ProviderDescriptor &descriptor);
//
// Class Definition ...
class XSCX5EA : XSCBaseEA
{
//
// Public ...
public:
//
// Props ...
//
// Constructors ...
XSCX5EA(
//
// XTrade Class Requirements ...
int slippage, // Specify Slippage
ulong magicNumber, // Specify Magic Number
int manageInterval, // Manager Check Intervals Seconds
double maxAllowedSpread, // Max Allowed Spred for Opening Trades
int maxAllowedPositions, // Max Allowed Positions
double maxAllowedDrawdownFactor, // Max Allowed Drawdown Factor
//
// Position Management ...
bool allowLong = true, // Allow Long Trades
bool allowShort = true, // Allow Short Trades
double minProfitPerTrade = 0, // Min Profit Per Trade based On Volume Factor (Hedge)
double minProfitPerVolumeFactor = 0, // Min Volume Factor for Calculating Profit (Hedge)
//
// Event Handlers ...
TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler
TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler
TOnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler
TOnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler
TOnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler
TOnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler
//
TOnSignal onSignalHandler = NULL, // On Signal Event Handler
//
// Log Handler ...
bool enableAlerts = true, // Enable Alerts
bool logAlerts = true, // Log Alerts
bool terminalAlerts = false, // Terminal Alerts
bool mailAlerts = false, // Mail Alerts
bool pushAlerts = false // Push Alerts
) : XSCBaseEA(slippage,
magicNumber,
manageInterval,
maxAllowedSpread,
maxAllowedPositions,
maxAllowedDrawdownFactor,
allowLong,
allowShort,
minProfitPerTrade,
minProfitPerVolumeFactor,
onStopLossTriggered,
onTakeProfitTriggered,
onDealsChangedHandler,
onOrdersChangedHandler,
onPositionsChangedHandler,
onTradeStateChangedHandler,
enableAlerts,
logAlerts,
terminalAlerts,
mailAlerts,
pushAlerts //
)
{
}
//
// Deconstructor ...
~XSCX5EA() {}
//
// Properties Getter(s) / Setter(s) ...
//
// Add X5 Specified Signal Event Handler ...
void AddOnSignalEventHandler(TX5OnSignal listener)
{
//
Add(
listener,
mX5OnSignalEventHandlers
//
);
}
//
// Add Specified X5 Provider ...
bool AddProvider(X5ProviderDescriptor &descriptor)
{
//
bool result = false;
//
// Validate Inputs ...
result = descriptor.Init();
if (!result)
{
return result;
}
//
AddRef(
descriptor,
mDescriptors //
);
//
return result;
}
//
// Overrides ...
//
// Customize Token ...
string GetToken() override
{
return GetSpecificToken(this);
}
//
string GetTag() override
{
return this.GetToken();
}
//
// Check Provider for any Guards ...
bool CheckForGuard(XGuard &guards[]) override
{
//
// TODO: Implement this ...
return false;
}
//
// Request Provider to Collect all
// Potentially Signals and then
// filters theme here and passed them
// for Executing ...
int RequestForSignal(
XSignal &signals[] // Holds Signals ...
) override
{
//
// TODO: Implement this ...
return 0;
}
//
// Handl Management Actions ...
// if returns true, it is going to prevent for processing forward ...
bool HandleStateManagement() override
{
//
// TODO: Implement this ...
return false;
}
//
// Request for Support Signals using Guard ...
bool RequestForSupport(
XSignal &support, // Holds Support Signal, if Provided
string provider, // Positions Provided by Specific Provider
string symbol, // Trading Symbol
ENUM_POSITION_TYPE type, // Trading Type
ENUM_TIMEFRAMES period // Specified Time Frame
) override
{
//
// TODO: Implement this ...
return false;
}
//
// Tools ...
//
// Protected ...
protected:
//
// Tools ...
//
void NotifyX5OnSignalEventHandlers(X5ProviderDescriptor &descriptor)
{
//
int listenersCount = ArraySize(mX5OnSignalEventHandlers);
if (listenersCount <= 0)
{
return;
}
//
for (int i = 0; i < listenersCount; i++)
{
//
TX5OnSignal iListener = mX5OnSignalEventHandlers[i];
//
iListener(descriptor);
}
}
//
// Private ...
private:
//
// Props ...
//
// Collection of Signal Event Listeners ...
TX5OnSignal mX5OnSignalEventHandlers[];
//
// a Collection of X5 Provider Descriptors ...
X5ProviderDescriptor mDescriptors[];
//
// Tools ...
};
//
// Tools ...
+138 -36
View File
@@ -25,6 +25,10 @@
#include "../Classes/x-saherelm.xalert.class.mq5" #include "../Classes/x-saherelm.xalert.class.mq5"
#include "../Classes/x-saherelm.xtrade.class.mq5" #include "../Classes/x-saherelm.xtrade.class.mq5"
//
// Define On Signal Event Handler Type ...
typedef void (*TOnSignal)(XSignal &signals[]);
// //
// Class Definition ... // Class Definition ...
@@ -153,7 +157,12 @@ public:
// //
// Deconstractor ... // Deconstractor ...
~XSCBaseEA() {} ~XSCBaseEA()
{
//
delete mTrader;
delete mAlert;
}
// //
// Properties Getter(s) / Setter(s) ... // Properties Getter(s) / Setter(s) ...
@@ -330,6 +339,18 @@ public:
mAlert.SetTerminalAlerts(value); mAlert.SetTerminalAlerts(value);
} }
//
// Event Listeners ...
void AddOnSignalEventHandler(TOnSignal listener)
{
//
Add(
listener,
mOnSignalEventHandlers
//
);
}
// //
// Overrides ... // Overrides ...
@@ -364,6 +385,10 @@ public:
// OnTick Handler ... // OnTick Handler ...
virtual void OnTick() virtual void OnTick()
{ {
//
// Check Trade Events ...
OnTrade();
// //
// First Check For Any Guard Actions ... // First Check For Any Guard Actions ...
// then Handle Guards if Provided ... // then Handle Guards if Provided ...
@@ -387,43 +412,15 @@ public:
// Second Check For Signals ... // Second Check For Signals ...
// then Execute Signals if Provided ... // then Execute Signals if Provided ...
XSignal signals[]; XSignal signals[];
int signalsCount = CheckForSignal(signals); int signalsCount = RequestForSignal(signals);
if (signalsCount <= 0) if (signalsCount <= 0)
{ {
return; return;
} }
// //
// Try to Execute Signals ... // Execute Signals ...
ENUM_X_SIGNAL_EXECUTION_RESULT reasons[]; HandleSignalsExecution(signals);
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);
}
} }
// //
@@ -542,7 +539,7 @@ public:
// When a Guard Notified to Do Support Signal ... // When a Guard Notified to Do Support Signal ...
// this Method Calls For Retrieve Support Signal ... // this Method Calls For Retrieve Support Signal ...
// if it's Provided, Execute it ... // if it's Provided, Execute it ...
virtual bool CheckForSupport( virtual bool RequestForSupport(
XSignal &support, // Holds Support Signal, if Provided XSignal &support, // Holds Support Signal, if Provided
string provider, // Positions Provided by Specific Provider string provider, // Positions Provided by Specific Provider
string symbol, // Trading Symbol string symbol, // Trading Symbol
@@ -566,19 +563,120 @@ public:
// on our Strategy for Trading ... // on our Strategy for Trading ...
// and if a Good Entry founded ... // and if a Good Entry founded ...
// model it as an XSignal struct and passed it to result ... // model it as an XSignal struct and passed it to result ...
virtual int CheckForSignal( virtual int RequestForSignal(
XSignal &signals[] // Holds Signals ... XSignal &signals[] // Holds Signals ...
) )
{ {
return 0; 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 ...
protected: protected:
// //
// Props ... // 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 ... // Position Management ...
@@ -1037,7 +1135,7 @@ protected:
{ {
// //
XSignal support; XSignal support;
bool hasSupport = CheckForSupport( bool hasSupport = RequestForSupport(
support, support,
provider, provider,
symbol, symbol,
@@ -1134,6 +1232,10 @@ private:
// Check in Test Mode or not ... // Check in Test Mode or not ...
bool mIsInTestMode; bool mIsInTestMode;
//
// Signal Event Listeners ...
TOnSignal mOnSignalEventHandlers[];
// //
// Position Management ... // Position Management ...
bool mAllowLong; // Allow Long Trades bool mAllowLong; // Allow Long Trades
@@ -1149,6 +1251,6 @@ private:
TOnOrdersChanged mOnOrdersChangedHandler; TOnOrdersChanged mOnOrdersChangedHandler;
TOnPositionsChanged mOnPositionsChangedHandler; TOnPositionsChanged mOnPositionsChangedHandler;
TOnTradeStateChanged mOnTradeStateChangedHandler; TOnTradeStateChanged mOnTradeStateChangedHandler;
} };
// //
+3 -3
View File
@@ -47,7 +47,7 @@ MqlTick x5EATick;
XSignal signal; XSignal signal;
// //
X5ProvierDescriptor mProviderDescriptors[]; X5ProviderDescriptor mProviderDescriptors[];
// //
// Event Handlers ... // Event Handlers ...
@@ -197,7 +197,7 @@ bool InitialProviders()
{ {
// //
// Define Structure ... // Define Structure ...
X5ProvierDescriptor iDescriptor; X5ProviderDescriptor iDescriptor;
// //
// Set Inputs to Default ... // Set Inputs to Default ...
@@ -286,7 +286,7 @@ void ProcessProvidersTick()
for (int i = 0; i < descriptorsCount; i++) for (int i = 0; i < descriptorsCount; i++)
{ {
// //
X5ProvierDescriptor iDescriptor = mProviderDescriptors[i]; X5ProviderDescriptor iDescriptor = mProviderDescriptors[i];
// //
bool iHasSignal = iDescriptor.HasSignal(0); bool iHasSignal = iDescriptor.HasSignal(0);