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) if (has)
{ {
// //
// Configure Indicator ... // XFIMA ...
XOM1Inputs iDZoneOMInputs;
iDZoneOMInputs.Default();
iDZoneOMInputs.showFiboZone = true;
// //
// Configure Signaller ... XOM1Inputs iFIMAOMInputs;
XOM1SignallerConfig iDZoneSignallerConfig; iFIMAOMInputs.Default();
iDZoneSignallerConfig.processAllTicks = false; 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 ... // Configure Signallers ...
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
// //
// Define Signaller ... // Register XFIMA Signaller ...
iDZoneSignaller = new XCXOM1SignallerBase( // iFIMASignaller = new XCXOM1FIMASignaller(
"XDZN", // "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].symbol,
symbolConfigurations[i].period, symbolConfigurations[i].period,
iDZoneOMInputs, iMAC5020OMINputs,
iDZoneSignallerConfig // 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 ... // Register Signaller ...
Add( XCXOM1SignallerBase *signaller = iMAC5020Signaller;
iDZoneSignaller, RegisterSignaller(signaller);
eaSignallers // ZeroMemory(signaller);
);
} }
} }
// //
// Cleanup Resources ... // Cleanup Resources ...
iDZoneOMInputs.Clean();
iDZoneSignallerConfig.Clean(); //
ZeroMemory(iDZoneSignaller); iFIMAOMInputs.Clean();
iMAC5020OMINputs.Clean();
ZeroMemory(iFIMASignaller);
iFIMASignallerConfig.Clean();
ZeroMemory(iMAC5020Signaller);
iMAC5020SignallerConfig.Clean();
} }
SpecifiedClean(symbolConfigurations); 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 ...
private: private:
+302 -200
View File
@@ -192,7 +192,275 @@ class XCXOM1SignallerBase
* *
* @param barIndex: int * @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 ... // Normalize Bar Index ...
@@ -557,219 +825,53 @@ class XCXOM1SignallerBase
iBar.Clean(); iBar.Clean();
iConditions.Clean(); iConditions.Clean();
} }
};
/** //
* Check Guards Based on MarketConditions ... class XCXIMAC5020Signaller : public XCXOM1SignallerBase
* {
* @param guards: XGuard[] //
* @param barIndex: int // Public ...
* public:
* @return ( int ) //
*/
int CheckForGuard( //
XGuard &guards[], // Constructor ...
int barIndex = 0 // 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 ... // Deconstructor ...
~XCXIMAC5020Signaller()
//
// 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 //
)
{ {
//
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 * @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 ...
//