This commit is contained in:
2025-09-12 21:42:36 +03:30
parent 94539b2b5d
commit 46f02ebec2
2 changed files with 402 additions and 238 deletions
+100 -38
View File
@@ -560,65 +560,90 @@ class XCXOM1EAExpert : public XCBase
if (has)
{
//
// Configure Indicator ...
XOM1Inputs iDZoneOMInputs;
iDZoneOMInputs.Default();
iDZoneOMInputs.showFiboZone = true;
// XFIMA ...
//
// Configure Signaller ...
XOM1SignallerConfig iDZoneSignallerConfig;
iDZoneSignallerConfig.processAllTicks = false;
XOM1Inputs iFIMAOMInputs;
iFIMAOMInputs.Default();
iFIMAOMInputs.showFiboZone = true;
//
XCXOM1SignallerBase *iDZoneSignaller = NULL;
XOM1SignallerConfig iFIMASignallerConfig;
iFIMASignallerConfig.processAllTicks = false;
//
XCXOM1SignallerBase *iFIMASignaller = NULL;
//
// iMAC5020 ...
//
XOM1Inputs iMAC5020OMINputs;
iMAC5020OMINputs.Default();
iMAC5020OMINputs.showPV = false;
iMAC5020OMINputs.showSAR = false;
iMAC5020OMINputs.maFastLength = 20;
iMAC5020OMINputs.maSlowLength = 50;
iMAC5020OMINputs.showFiboZone = false;
//
XOM1SignallerConfig iMAC5020SignallerConfig;
iMAC5020SignallerConfig.processAllTicks = false;
//
XCXIMAC5020Signaller *iMAC5020Signaller = NULL;
//
// Configure Signallers ...
for (int i = 0; i < count; i++)
{
//
// Define Signaller ...
iDZoneSignaller = new XCXOM1SignallerBase(
"XDZN",
// Register XFIMA Signaller ...
// iFIMASignaller = new XCXOM1FIMASignaller(
// "XDZN",
// symbolConfigurations[i].symbol,
// symbolConfigurations[i].period,
// iFIMAOMInputs,
// iFIMASignallerConfig //
// );
// if (iFIMASignaller != NULL)
// {
// //
// // Register Signaller ...
// XCXOM1SignallerBase *signaller = iFIMASignaller;
// RegisterSignaller(signaller);
// ZeroMemory(signaller);
// }
//
// Register XIMAC5020 Signaller ...
iMAC5020Signaller = new XCXIMAC5020Signaller(
"XIMAC5020",
symbolConfigurations[i].symbol,
symbolConfigurations[i].period,
iDZoneOMInputs,
iDZoneSignallerConfig //
iMAC5020OMINputs,
iMAC5020SignallerConfig //
);
if (iDZoneSignaller != NULL)
if (iMAC5020Signaller != 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]);
}
}
//
// Attach Can Analyse Event Handler ...
iDZoneSignaller.canAnalyseEventListener = canAnalyseEventHandler;
//
// Register Signaller ...
Add(
iDZoneSignaller,
eaSignallers //
);
XCXOM1SignallerBase *signaller = iMAC5020Signaller;
RegisterSignaller(signaller);
ZeroMemory(signaller);
}
}
//
// Cleanup Resources ...
iDZoneOMInputs.Clean();
iDZoneSignallerConfig.Clean();
ZeroMemory(iDZoneSignaller);
//
iFIMAOMInputs.Clean();
iMAC5020OMINputs.Clean();
ZeroMemory(iFIMASignaller);
iFIMASignallerConfig.Clean();
ZeroMemory(iMAC5020Signaller);
iMAC5020SignallerConfig.Clean();
}
SpecifiedClean(symbolConfigurations);
@@ -1004,6 +1029,43 @@ class XCXOM1EAExpert : public XCBase
}
}
/**
* Register Signaller ...
*/
void RegisterSignaller(XCXOM1SignallerBase *signaller)
{
//
// Validate Signaller ...
if (signaller == NULL)
{
return;
}
//
// Attach Signaller OnSignal Event Handlers if Exists ...
int count = ArraySize(mOnSignalEventHandlers);
bool has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
signaller.AddOnSignalEventHandler(mOnSignalEventHandlers[i]);
}
}
//
// Attach Can Analyse Event Handler ...
signaller.canAnalyseEventListener = canAnalyseEventHandler;
//
// Register Signaller ...
Add(
signaller,
eaSignallers //
);
}
//
// Private ...
private:
+302 -200
View File
@@ -192,7 +192,275 @@ class XCXOM1SignallerBase
*
* @param barIndex: int
*/
void ProcessTick(int barIndex = 0)
virtual void ProcessTick(int barIndex = 0)
{
}
/**
* Check Guards Based on MarketConditions ...
*
* @param guards: XGuard[]
* @param barIndex: int
*
* @return ( int )
*/
int CheckForGuard(
XGuard &guards[],
int barIndex = 0 //
)
{
//
int result = 0;
//
SpecifiedClean(guards);
//
result = ArraySize(guards);
//
return result;
}
//
// Virtuals ...
//
// Protected ...
protected:
//
// Props ...
//
XCXOM1Helper *mHelper; // Indicator Helper ...
//
int mProcessedTicksCount; // Prcoessed Ticks Count ...
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
/**
* Check Permissions for Analysing Market ...
*
* @param _symbol: Symbol ...
* @param _period: Period ...
* @param time: Specified Date Time ...
*
* @return ( bool )
*/
bool CanAnalyse(
string _symbol,
ENUM_TIMEFRAMES _period,
datetime time //
)
{
//
bool result = false;
//
if (canAnalyseEventListener != NULL)
{
//
result = canAnalyseEventListener(
_symbol,
_period,
time //
);
}
else
{
result = true;
}
//
return result;
}
/**
* Handle New Bar's Process ...
*
* @param barIndex: int
*/
void ProcessNewBar(int barIndex = 0)
{
//
// Normalize Bar Index ...
if (barIndex < 0)
{
barIndex = 0;
}
//
// Try to Update Zone's Lifetime ...
int count = ArraySize(zones);
bool has = count > 0;
if (has)
{
//
// Loop through Zones ...
for (int i = 0; i < count; i++)
{
//
// Update Lifetime by Bar Index ...
// zones[i].UpdateByBarIndex(barIndex);
//
// drawer.DrawZone(
// zones[i],
// true, // Draw Price ...
// true, // Draw Middle ...
// true // Draw From ...
// );
}
}
//
// Check XOMZones Validations ...
}
/**
* Process Exists Zones ...
* Detect a Zone for trigger ...
*
* @param barIndex: int
*/
void ProcessZones(int barIndex = 0)
{
//
// Check Zones Exists ...
int count = ArraySize(zones);
bool has = IsValidSize(count);
if (!has)
{
return;
}
//
// Loop Through Zones ...
for (int i = 0; i < count; i++)
{
//
}
}
/**
* 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);
}
//
// Private ...
private:
//
// Props ...
//
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
};
//
class XCXOM1FIMASignaller : public XCXOM1SignallerBase
{
//
// Public ...
public:
//
//
// Constructor ...
XCXOM1FIMASignaller(
string _name, // Name ...
string _symbol, // Symbol ...
ENUM_TIMEFRAMES _period, // Period ...
XOM1Inputs &_inputs, // Indicator Inputs ...
XOM1SignallerConfig &_config // Config ...
) : XCXOM1SignallerBase(_name,
_symbol,
_period,
_inputs,
_config //
)
{
}
//
// Deconstructor ...
~XCXOM1FIMASignaller()
{
}
//
// Overrides ...
/**
* Handle Ticks Process ...
*
* @param barIndex: int
*/
virtual void ProcessTick(int barIndex = 0)
{
//
// Normalize Bar Index ...
@@ -557,219 +825,53 @@ class XCXOM1SignallerBase
iBar.Clean();
iConditions.Clean();
}
};
/**
* Check Guards Based on MarketConditions ...
*
* @param guards: XGuard[]
* @param barIndex: int
*
* @return ( int )
*/
int CheckForGuard(
XGuard &guards[],
int barIndex = 0 //
)
//
class XCXIMAC5020Signaller : public XCXOM1SignallerBase
{
//
// Public ...
public:
//
//
// Constructor ...
XCXIMAC5020Signaller(
string _name, // Name ...
string _symbol, // Symbol ...
ENUM_TIMEFRAMES _period, // Period ...
XOM1Inputs &_inputs, // Indicator Inputs ...
XOM1SignallerConfig &_config // Config ...
) : XCXOM1SignallerBase(_name,
_symbol,
_period,
_inputs,
_config //
)
{
//
int result = 0;
//
SpecifiedClean(guards);
//
result = ArraySize(guards);
//
return result;
}
//
// Virtuals ...
//
// Protected ...
protected:
//
// Private ...
private:
//
// Props ...
//
XCXOM1Helper *mHelper; // Indicator Helper ...
//
TOnSignal mOnSignalEventHandlers[]; // Signal Recieved Event Handlers ...
//
int mProcessedTicksCount; // Prcoessed Ticks Count ...
datetime mLastCheckedBarTime; // Last Checked Bar Time ...
//
bool CanAnalyse(
string _symbol,
ENUM_TIMEFRAMES _period,
datetime time //
)
// Deconstructor ...
~XCXIMAC5020Signaller()
{
//
bool result = false;
//
if (canAnalyseEventListener != NULL)
{
//
result = canAnalyseEventListener(
_symbol,
_period,
time //
);
}
else
{
result = true;
}
//
return result;
}
//
// Overrides ...
/**
* Handle New Bar's Process ...
* Handle Ticks Process ...
*
* @param barIndex: int
*/
void ProcessNewBar(int barIndex = 0)
virtual void ProcessTick(int barIndex = 0)
{
//
// Normalize Bar Index ...
if (barIndex < 0)
{
barIndex = 0;
}
//
// Try to Update Zone's Lifetime ...
int count = ArraySize(zones);
bool has = count > 0;
if (has)
{
//
// Loop through Zones ...
for (int i = 0; i < count; i++)
{
//
// Update Lifetime by Bar Index ...
// zones[i].UpdateByBarIndex(barIndex);
//
// drawer.DrawZone(
// zones[i],
// true, // Draw Price ...
// true, // Draw Middle ...
// true // Draw From ...
// );
}
}
//
// Check XOMZones Validations ...
}
/**
* Process Exists Zones ...
* Detect a Zone for trigger ...
*
* @param barIndex: int
*/
void ProcessZones(int barIndex = 0)
{
//
// Check Zones Exists ...
int count = ArraySize(zones);
bool has = IsValidSize(count);
if (!has)
{
return;
}
//
// Loop Through Zones ...
for (int i = 0; i < count; i++)
{
//
}
}
/**
* 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);
}
};
//
// Extensions ...
//