diff --git a/XOM1EA/Classes/xom1ea.expert.class.mq5 b/XOM1EA/Classes/xom1ea.expert.class.mq5 index cdfe58b0..38544267 100644 --- a/XOM1EA/Classes/xom1ea.expert.class.mq5 +++ b/XOM1EA/Classes/xom1ea.expert.class.mq5 @@ -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: diff --git a/XOM1EA/Classes/xom1ea.signaller.class.mq5 b/XOM1EA/Classes/xom1ea.signaller.class.mq5 index fecf04dc..0fc24ab1 100644 --- a/XOM1EA/Classes/xom1ea.signaller.class.mq5 +++ b/XOM1EA/Classes/xom1ea.signaller.class.mq5 @@ -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 ... + // \ No newline at end of file