Last Changes ...

This commit is contained in:
2025-09-09 16:49:16 +03:30
parent 43f26fa3e0
commit 62af2237e4
6 changed files with 610 additions and 188 deletions
+75 -2
View File
@@ -48,6 +48,10 @@ class XCXOM1EAExpert : public XCBase
int eaSlippage; // Slippgae
string eaLogSuffix; // Log Suffix
//
// Symbol Configurations ...
string eaSymbolConfiguration; // Symbol Configurations ...
//
// Management ...
bool eaAllowGuards; // Allow Guards
@@ -94,7 +98,7 @@ class XCXOM1EAExpert : public XCBase
bool eaReportProtector; // Report Protector Actions
bool eaReportRestrictions; // Report Restrictions
bool eaReportAfterTradesBalance; // Report Balance after a Trade Finished
//
// Collector ...
bool eaSaveTrades; // Save Trades
@@ -117,6 +121,25 @@ class XCXOM1EAExpert : public XCBase
//
// Tools / Actions / Handlers ...
//
// Signal Event Handlers ...
//
void AddOnSignalEventHandler(TOnSignal handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOnSignalEventHandlers //
);
}
//
// Trade Event Handlers ...
@@ -463,7 +486,7 @@ class XCXOM1EAExpert : public XCBase
eaTrade.AddOnTradeStateChangedEventHandler(mTradeStateChangedEventHandlers[i]);
}
}
//
// Postion Partially Close Event Handlers ...
count = ArraySize(mOnPartialCloseEventHandlers);
@@ -536,6 +559,28 @@ class XCXOM1EAExpert : public XCBase
eaMaxAllowedTrades //
);
//
// Parse Symbols ...
string symbols[];
ENUM_TIMEFRAMES periods[];
if (!IsSpecifiedValid(eaSymbolConfiguration))
{
//
Add(
_Symbol,
symbols //
);
//
Add(
_Period,
periods //
);
}
else
{
}
//
// Here we Apply Symbols,Periods and Configs ...
@@ -552,7 +597,12 @@ class XCXOM1EAExpert : public XCBase
//
// Make Instance Signaller Class ...
//
XCXOM1SignallerBase *iDZoneSignaller = NULL;
//
// Define Signaller ...
iDZoneSignaller = new XCXOM1SignallerBase(
"XDZN",
"XAUUSDb",
@@ -561,6 +611,19 @@ class XCXOM1EAExpert : public XCBase
iDZoneSignallerConfig);
if (iDZoneSignaller != NULL)
{
//
// Attach Signaller OnSignal Event Handlers ...
count = ArraySize(mOnSignalEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
iDZoneSignaller.AddOnSignalEventHandler(mOnSignalEventHandlers[i]);
}
}
//
// Register Signaller ...
Add(
@@ -671,6 +734,13 @@ class XCXOM1EAExpert : public XCBase
{
}
//
// Signal Event Handler ...
void HandleOnSignalTriggered(XSignal &signal)
{
eaTradeManager.HandleSignal(signal);
}
//
// Trade Event Handlers ...
@@ -870,6 +940,9 @@ class XCXOM1EAExpert : public XCBase
TOnPositionsChanged mPositionsChangedEventHandlers[];
TOnTradeStateChanged mTradeStateChangedEventHandlers[];
//
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
//
XCXOM1SignallerBase *eaSignallers[]; // All Registered Signallers ...
};
+132 -14
View File
@@ -145,6 +145,44 @@ class XCXOM1SignallerBase
ZeroMemory(mHelper);
}
//
// Signal Event Handlers ...
//
void AddOnSignalEventHandler(TOnSignal handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOnSignalEventHandlers //
);
}
//
void NotifyOnSignalEvent(XSignal &signal)
{
//
int count = ArraySize(mOnSignalEventHandlers);
bool has = IsValidSize(count) && signal.IsValid();
if (!has)
{
return;
}
//
// Calling Event Handlers ...
for (int i = 0; i < count; i++)
{
mOnSignalEventHandlers[i](signal);
}
}
//
// Actions ...
@@ -329,7 +367,7 @@ class XCXOM1SignallerBase
iDir,
iReason,
iConditions.bars[pIdx].time, // From ...
iConditions.bars[cIdx].time // To
iConditions.bars[zIdx].time // To
);
if (has)
{
@@ -339,6 +377,10 @@ class XCXOM1SignallerBase
iZone,
zones //
);
//
// Prepare Signal ...
PrepareSignal(iZone);
}
//
@@ -379,6 +421,10 @@ class XCXOM1SignallerBase
double iUpper = GetMax(iValues);
double iLower = GetMin(iValues);
//
double iZoneUpper = MathMax(iFibUpper, iFibLower);
double iZoneLower = MathMin(iFibUpper, iFibLower);
//
has = isFastCrossedOverSlow || isFastCrossedUnderSlow;
@@ -386,10 +432,6 @@ class XCXOM1SignallerBase
// Validate Cross Between Zone ...
if (has)
{
//
double iZoneUpper = MathMax(iFibUpper, iFibLower);
double iZoneLower = MathMin(iFibUpper, iFibLower);
//
// Validate MA Place ...
has = iFast >= iZoneLower &&
@@ -471,13 +513,13 @@ class XCXOM1SignallerBase
symbol,
period,
name, // Signaller Name ...
iUpper,
iLower,
iZoneUpper,
iZoneLower,
iPrice,
iDir,
iReason,
iConditions.bars[pIdx].time, // From ...
iConditions.bars[cIdx].time // To
iConditions.bars[zIdx].time // To
);
if (has)
{
@@ -487,6 +529,10 @@ class XCXOM1SignallerBase
iZone,
zones //
);
//
// Prepare Signal ...
PrepareSignal(iZone);
}
//
@@ -518,6 +564,9 @@ class XCXOM1SignallerBase
//
XCXOM1Helper *mHelper; // Indicator Helper ...
//
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
//
int mProcessedTicksCount; // Prcoessed Ticks Count ...
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
@@ -551,12 +600,12 @@ class XCXOM1SignallerBase
// zones[i].UpdateByBarIndex(barIndex);
//
drawer.DrawZone(
zones[i],
true, // Draw Price ...
true, // Draw Middle ...
true // Draw From ...
);
// drawer.DrawZone(
// zones[i],
// true, // Draw Price ...
// true, // Draw Middle ...
// true // Draw From ...
// );
}
}
@@ -588,6 +637,75 @@ class XCXOM1SignallerBase
//
}
}
/**
* Converts iZone to Signal and Notify Signal ...
*
* @param iZone: XOM1Zone
*/
void PrepareSignal(XOM1Zone &zone)
{
//
// Validate Zone ...
if (!zone.IsValid())
{
return;
}
//
// Create Signal ...
XSignal signal;
//
signal.time = zone.to;
signal.provider = name;
signal.symbol = zone.symbol;
signal.period = zone.period;
signal.mode = X_ORDER_MODE_MARKET;
signal.conditions = "XConditions";
signal.comment = ToXString(zone.reason);
signal.type = zone.IsBullish()
? POSITION_TYPE_BUY
: POSITION_TYPE_SELL;
//
// Get Entry ...
signal.entry = GetXEntry(zone.symbol, zone.dir);
//
// Calculate SL ...
double providedSL = zone.IsBullish()
? zone.lower
: zone.upper;
signal.sl = providedSL;
//
// Calculate Risk ...
double risk = MathAbs(signal.entry - signal.sl);
//
// Calculate Reward ...
double r2r = 2;
double reward = risk * r2r;
//
// Calculate TP ...
double providedTP = zone.IsBullish()
? signal.entry + reward
: signal.entry - reward;
signal.tp = providedTP;
//
// Calculate Targets ...
// TODO: Handle this ...
//
// Set Min Volume ...
signal.volume = 0.01;
//
NotifyOnSignalEvent(signal);
}
};
//