This commit is contained in:
2024-06-12 09:45:57 +03:30
parent 6da0c05cdf
commit a34d471d6e
6 changed files with 690 additions and 37 deletions
+311 -4
View File
@@ -27,7 +27,7 @@
//
// Define On Signal Event Handler Type ...
typedef void (*TOnSignal)(XSignal &signals[]);
typedef void (*TOnSignal)(XSignal &signal);
//
// Tokens ...
@@ -1703,8 +1703,12 @@ public:
ulong magicNumber, // Specify Magic Number
//
// Event Handlers ...
TOnSignal onSignal = NULL, // On Signal Recieved Event Handler
TOnModify onModifyPosition = NULL, // On Modify Position Event Handler
TOnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler
TOnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler
TOnForceClose onForceClosePosition = NULL, // On Force Close Position Event Handler
TOnPartialClose onPartialClosePosition = NULL, // On Partial Close Position 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
@@ -1723,15 +1727,42 @@ public:
//
// Set Event Handlers ...
mOnSignal = onSignal;
mOnModifyPosition = onModifyPosition;
mOnStopLossTriggered = onStopLossTriggered;
mOnForceClosePosition = onForceClosePosition;
mOnTakeProfitTriggered = onTakeProfitTriggered;
mOnDealsChangedHandler = onDealsChangedHandler;
mOnPartialClosePosition = onPartialClosePosition;
mOnOrdersChangedHandler = onOrdersChangedHandler;
mOnPositionsChangedHandler = onPositionsChangedHandler;
mOnTradeStateChangedHandler = onTradeStateChangedHandler;
//
// Add Event Listeners to XTrade Class if they Provided ...
if (mOnSignal != NULL)
{
AddOnSignalEventHandler(mOnSignal);
}
//
if (mOnModifyPosition != NULL)
{
mTrader.AddOnModifyPositionEventHandler(mOnModifyPosition);
}
//
if (mOnForceClosePosition != NULL)
{
mTrader.AddOnForceClosePositionEventHandler(mOnForceClosePosition);
}
//
if (mOnPartialClosePosition != NULL)
{
mTrader.AddOnPartialClosePositionEventHandler(mOnPartialClosePosition);
}
//
if (mOnStopLossTriggered != NULL)
{
mTrader.AddOnStopLossEventHandler(mOnStopLossTriggered);
@@ -1793,6 +1824,16 @@ public:
return mTrader.GetMagicNumber();
}
//
void AddOnSignalEventHandler(TOnSignal handler)
{
//
Add(
handler,
mOnSignalEventHandlers //
);
}
//
// Overrides ...
@@ -1874,6 +1915,36 @@ public:
HandleSignalsExecution(signals);
}
//
// Calls when a Position Modified ...
virtual void OnPositionModified(
const ulong ticket,
const double profit,
const string comment //
)
{
}
//
// Calls when a Position Closed ...
virtual void OnPositionClosed(
const ulong ticket,
const XPosition &position,
const string comment //
)
{
}
//
// Calls when a Position Partially Closed ...
virtual void OnPositionPartialyClosed(
const ulong ticket,
const double profit,
const string comment //
)
{
}
//
// Handle StopLoss Event ...
virtual void OnStopLossTriggered(const XDeal &deal) {}
@@ -2065,6 +2136,14 @@ public:
return;
}
//
// Notify Signal Event Handlers for Reciving New Signal ...
for (int i = 0; i < managedSignalsCount; i++)
{
//
NotifyOnSignalEventHandlers(signals[i]);
}
//
// Try to Execute Signals ...
XSignal notExecuteds[];
@@ -2154,9 +2233,233 @@ protected:
//
// Tools ...
//
// Since we need to Calls Some Event Handlers on
// - Modified;
// - Closed;
// - Partial Closed;
// events ...
// we have to implement thouse Methods here and use them ...
//
// Modify ...
bool Modify(
ulong ticket, // position ticket
double sl = 0, // stop loss price
double tp = 0, // take profit
string comment = NULL // comment
)
{
//
bool result = false;
//
result = mTrader.Modify(
ticket,
sl,
tp,
comment //
);
//
if (result)
{
//
XPosition position;
result = mTrader.GetPosition(
ticket,
position //
);
if (result)
{
//
OnPositionModified(
ticket,
position.profit,
comment //
);
//
string message = "Position " + ToString(ticket) + " Modified Successfully ...";
//
Alert(message);
}
}
//
return result;
}
//
// Close ...
bool Close(
ulong ticket,
string comment //
)
{
//
bool result = false;
//
XPosition position;
result = mTrader.GetPosition(
ticket,
position //
);
//
result = mTrader.Close(
ticket,
comment //
);
//
if (result)
{
//
OnPositionClosed(
ticket,
position,
comment //
);
//
string message = "Position " + ToString(ticket) + " Closed Successfully ...";
//
Alert(message);
}
//
return result;
}
//
// Close ...
int Close(
XPosition &positions[],
string comment //
)
{
//
int result = 0;
//
int count = ArraySize(positions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
bool isClosed = Close(
positions[i].ticket,
comment //
);
//
if (isClosed)
{
result++;
}
}
//
return result;
}
//
// Partial Close ...
bool PartialClose(
ulong ticket,
double volume,
string comment //
)
{
//
bool result = false;
//
XPosition position;
result = mTrader.GetPosition(
ticket,
position //
);
if (!result)
{
return result;
}
//
result = mTrader.ClosePartial(
ticket,
volume,
comment //
);
//
if (result)
{
//
OnPositionPartialyClosed(
ticket,
position.profit,
comment //
);
}
//
return result;
}
//
// Partial Close ...
int PartialClose(
XPosition &positions[],
double volume,
string comment //
)
{
//
int result = 0;
//
int count = ArraySize(positions);
if (!IsValidSize(count))
{
return result;
}
//
for (int i = 0; i < count; i++)
{
//
bool isClosed = PartialClose(
positions[i].ticket,
volume,
comment //
);
//
if (isClosed)
{
result++;
}
}
//
return result;
}
//
// Signal Event Listeners ...
void NotifyOnSignalEventHandlers(XSignal &signals[])
//
void NotifyOnSignalEventHandlers(XSignal &signal)
{
//
int listenersCount = ArraySize(mOnSignalEventHandlers);
@@ -2172,7 +2475,7 @@ protected:
TOnSignal iListener = mOnSignalEventHandlers[i];
//
iListener(signals);
iListener(signal);
}
}
@@ -3126,9 +3429,13 @@ private:
//
// Event Handlers ...
TOnSignal mOnSignal;
TOnModify mOnModifyPosition;
TOnStopLoss mOnStopLossTriggered;
TOnTakeProfit mOnTakeProfitTriggered;
TOnForceClose mOnForceClosePosition;
TOnDealsChanged mOnDealsChangedHandler;
TOnPartialClose mOnPartialClosePosition;
TOnOrdersChanged mOnOrdersChangedHandler;
TOnPositionsChanged mOnPositionsChangedHandler;
TOnTradeStateChanged mOnTradeStateChangedHandler;