diff --git a/Classes/x-saherelm.x-poi.drawer.class.mq5 b/Classes/x-saherelm.x-poi.drawer.class.mq5 index f622ae20..3b9888a1 100644 --- a/Classes/x-saherelm.x-poi.drawer.class.mq5 +++ b/Classes/x-saherelm.x-poi.drawer.class.mq5 @@ -1503,6 +1503,73 @@ class XCPOIDrawer : public XCBase XClean(tmps); } + void DrawTrendLine( + string name, + double fromPrice, + datetime fromTime, + double toPrice, + datetime toTime, + XPOIDrawConfig &config, + color clr = CLR_NONE // + ) + { + // + // Validate ... + bool has = + IsXValid(name) && + IsXValid(toTime) && + IsXValid(fromTime) && + NotEmptyZero(toPrice) && + NotEmptyZero(fromPrice) && + fromTime < toTime; + if (!has) + { + return; + } + + // + ENUM_X_DIRECTION trendDir = + fromPrice > toPrice + ? X_DIRECTION_BEARISH + : fromPrice < toPrice + ? X_DIRECTION_BULLISH + : X_DIRECTION_NONE; + color clrTrend = + (clr != CLR_NONE) + ? clr + : IsXBullish(trendDir) + ? config.bullishColor + : config.bearishColor; + + // + CChartObjectTrend *object; + has = DrawTrendLine( + fromPrice, + fromTime, + toPrice, + toTime, + object, + name, + config.trendRayRight, + config.trendRayLeft // + ); + if (has) + { + // + // Apply Style ... + object.Color(clr); + object.Width(config.trendWidth); + object.Style(config.trendStyle); + + // + // Save Object ... + drawnObjects.Add(object); + } + + // + ZeroMemory(object); + } + /** * Draw Specified Pattern info ... * @@ -2452,114 +2519,6 @@ class XCPOIDrawer : public XCBase } } - // - // Quarters ... - has = config.drawQuarterZones && - analysis.IsQuarterReady(); - if (has) - { - // - // Draw Majors ... - has = config.drawQuarterMajors; - if (has) - { - // - // Support ... - has = analysis.HasMajorSupport(); - if (has) - { - // - analysis.majorSupport.to = cTime; - DrawZone( - analysis.majorSupport, - config.quarterMajorsDrawConfig // - ); - } - - // - // Resistance ... - has = analysis.HasMajorResistance(); - if (has) - { - // - analysis.majorResistance.to = cTime; - DrawZone( - analysis.majorResistance, - config.quarterMajorsDrawConfig // - ); - } - } - - // - // Draw Minors ... - if (config.drawQuarterMinors) - { - // - // Support ... - has = analysis.HasMinorSupport(); - if (has) - { - // - analysis.minorSupport.to = cTime; - DrawZone( - analysis.minorSupport, - config.quarterMinorsDrawConfig // - ); - } - - // - // Resistance ... - has = analysis.HasMinorResistance(); - if (has) - { - // - analysis.minorResistance.to = cTime; - DrawZone( - analysis.minorResistance, - config.quarterMinorsDrawConfig // - ); - } - } - - // - // Draw Quarter ... - if (config.drawQuarter && - analysis.quarter > 0) - { - // - double quarter = analysis.quarter; - - // - datetime quarterFrom = MathMin(analysis.majorResistance.from, - analysis.majorSupport.from); - datetime quarterTo = cTime; - string quarterName = "XQuarter_" + ToXString(quarter) + "_" + ToXString(TimeToSeconds(quarterFrom)); - - // - CChartObjectTrend *iObj; - has = DrawTrendLine( - quarter, - quarterFrom, - quarter, - quarterTo, - iObj, - quarterName, - false, // Ray Right ... - false // Ray Left ... - ); - if (has) - { - // - iObj.Width(config.quarterWidth); - iObj.Color(config.quarterColor); - iObj.Style(config.quarterStyle); - - // - drawnObjects.Add(iObj); - } - } - } - // // Cleanup Resources ... patternBar.Clean(); diff --git a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 index fd1afedc..98ad2a02 100644 --- a/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 +++ b/Libraries/x-saherelm.x-pivot.analysis.lib.mq5 @@ -1312,15 +1312,6 @@ struct XPatternAnalysis ENUM_X_BAR_PATTERN patterns[]; // All Bars Exists Patterns ... ENUM_X_DIRECTION patternsDir[]; // Each Exists Patterns Directions ... - // - // Quarter Analysis ... - double quarter; // Premium Discount Verifier ... - XBoxZone majorSupport; // Major Support Zone ... - XBoxZone minorSupport; // Minor Support Zone ... - XBoxZone majorResistance; // Major Resistance Zone ... - XBoxZone minorResistance; // Minor Resistance Zone ... - ENUM_X_DETECTOR_ZONE_ACTION quarterActions[]; // Specified Quarter Actions based on Time ... - // // Constructor ... XPatternAnalysis() @@ -1347,14 +1338,6 @@ struct XPatternAnalysis resistance.Clean(); XClean(patternsDir); - // - quarter = 0; - XClean(quarterActions); - majorSupport.Clean(); - minorSupport.Clean(); - majorResistance.Clean(); - minorResistance.Clean(); - // ZeroMemory(this); } @@ -1377,120 +1360,6 @@ struct XPatternAnalysis return result; } - // - // Quarter Actions ... - - /** - * Check Has Major Support or not ... - * - * @return ( bool ) - */ - bool HasMajorSupport() - { - return IsValid() && - majorSupport.IsValid(); - } - - /** - * Check Has Minor Support or not ... - * - * @return ( bool ) - */ - bool HasMinorSupport() - { - return IsValid() && - IsQuarterReady() && - minorSupport.IsValid(); - } - - /** - * Check Has Major Resistance or not ... - * - * @return ( bool ) - */ - bool HasMajorResistance() - { - return IsValid() && - majorResistance.IsValid(); - } - - /** - * Check Has Minor Resistance or not ... - * - * @return ( bool ) - */ - bool HasMinorResistance() - { - return IsValid() && - IsQuarterReady() && - minorResistance.IsValid(); - } - - /** - * Check Zones Quarter Initialized ... - * - * @return ( bool ) - */ - bool IsQuarterReady() - { - // - return IsValid() && - HasMajorSupport() && - HasMajorResistance() && - quarter > 0; - } - - /** - * Check Has Quarter Actions ... - * - * @return ( bool ) - */ - bool HasQuarterActions() - { - return HasChild(quarterActions); - } - - /** - * Check Contains Specified Quarter Actions or not ... - * - * @param value: ENUM_X_DETECTOR_ZONE_ACTION, Specified Action ... - * - * @return ( bool ) - */ - bool HasQuarterAction(ENUM_X_DETECTOR_ZONE_ACTION value) - { - // - bool result = false; - - // - result = IsXValid(value) && - HasQuarterActions() && - Contains(value, quarterActions); - - // - return result; - } - - /** - * Check Minor Support Retested or not ... - * - * @return ( bool ) - */ - bool IsMinorSupportRetested() - { - return HasQuarterAction(X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED); - } - - /** - * Check Minor Resistance Retested or not ... - * - * @return ( bool ) - */ - bool IsMinorResistanceRetested() - { - return HasQuarterAction(X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED); - } - // // Pattern Actions ... @@ -2884,18 +2753,6 @@ struct XPatternAnalysisDrawConfig // // Props ... - // - // Quarters ... - bool drawQuarterZones; // Draw Quarters ... - bool drawQuarterMajors; // Draw Quarter Majors ... - bool drawQuarterMinors; // Draw Quarter Minors ... - bool drawQuarter; // Draw Quarter Trend Line ... - - // - int quarterWidth; - color quarterColor; - ENUM_LINE_STYLE quarterStyle; - // // Patterns ... @@ -2906,8 +2763,6 @@ struct XPatternAnalysisDrawConfig // XPOIDrawConfig drawConfig; - XPOIDrawConfig quarterMajorsDrawConfig; - XPOIDrawConfig quarterMinorsDrawConfig; // // Constructor ... @@ -2932,10 +2787,6 @@ struct XPatternAnalysisDrawConfig XClean(allowedDraws); XClean(allowedDrawZones); XClean(allowedDrawPivots); - - // - quarterMajorsDrawConfig.Clean(); - quarterMinorsDrawConfig.Clean(); } /** @@ -2946,19 +2797,10 @@ struct XPatternAnalysisDrawConfig // // Drawing Configs ... drawConfig.Default(); - quarterMajorsDrawConfig.Default(); - quarterMinorsDrawConfig.Default(); - ConfigureQuarterDraws(); // Full(); - // - drawQuarter = true; - drawQuarterZones = true; - drawQuarterMajors = true; - drawQuarterMinors = true; - // // Remove Unused From Zones ... Remove(X_BAR_PATTERN_PINNED, allowedDrawZones); @@ -2983,12 +2825,6 @@ struct XPatternAnalysisDrawConfig XClean(allowedDraws); XClean(allowedDrawZones); XClean(allowedDrawPivots); - - // - drawQuarter = false; - drawQuarterZones = false; - drawQuarterMajors = false; - drawQuarterMinors = false; } /** @@ -2996,12 +2832,6 @@ struct XPatternAnalysisDrawConfig */ void Full() { - // - drawQuarter = true; - drawQuarterZones = true; - drawQuarterMajors = true; - drawQuarterMinors = true; - // GetAllBarPatters(allowedDraws); GetAllBarPatters(allowedDrawZones); @@ -3074,43 +2904,6 @@ struct XPatternAnalysisDrawConfig // return result; } - - // - // Drawer Configs ... - - /** - * PreConfigure Default Drawer Configs of Quarters ... - */ - void ConfigureQuarterDraws() - { - // - // Quarter ... - quarterWidth = 2; - quarterStyle = STYLE_DOT; - quarterColor = clrYellow; - - // - // Majors ... - - // - quarterMajorsDrawConfig.Default(); - quarterMajorsDrawConfig = drawConfig; - - // - quarterMajorsDrawConfig.zonesWidth = 3; - quarterMajorsDrawConfig.bearishColor = clrRed; - quarterMajorsDrawConfig.bullishColor = clrLime; - - // - // Minors ... - - // - quarterMinorsDrawConfig.Default(); - quarterMinorsDrawConfig = drawConfig; - - // - quarterMinorsDrawConfig.zonesStyle = STYLE_DASH; - } }; // diff --git a/Libraries/x-saherelm.x-poi.lib.mq5 b/Libraries/x-saherelm.x-poi.lib.mq5 index 79eb33f1..c5723bd6 100644 --- a/Libraries/x-saherelm.x-poi.lib.mq5 +++ b/Libraries/x-saherelm.x-poi.lib.mq5 @@ -307,121 +307,6 @@ int GetAllBarPatters(ENUM_X_BAR_PATTERN &dest[]) return ArraySize(dest); } -/** - * Quarter Zones Actions ... - **/ -enum ENUM_X_DETECTOR_ZONE_ACTION -{ - X_DETECTOR_ZONE_ACTION_NONE = 0, - // - // Support ... - X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED = 1, - X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED = 2, - X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED = 3, - X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED = 4, - X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED = 5, - X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED = 6, - // - // Resistance ... - X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED = 7, - X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED = 8, - X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED = 9, - X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED = 10, - X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED = 11, - X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED = 12, -}; - -/** - * Validate an ENUM member ... - * - * @param value: ENUM_X_DETECTOR_ZONE_ACTION ... - * - * @return ( bool ) - */ -bool IsXValid(ENUM_X_DETECTOR_ZONE_ACTION value) -{ - return value != X_DETECTOR_ZONE_ACTION_NONE; -} - -/** - * Converts a Pattern ENUM to String Representation ... - * - * @param value: ENUM_X_DETECTOR_ZONE_ACTION, member ... - * - * @return ( string ) - */ -string ToXString(ENUM_X_DETECTOR_ZONE_ACTION value) -{ - // - string result = NULL; - - // - if (!IsXValid(value)) - { - return result; - } - - // - switch (value) - { - // - case X_DETECTOR_ZONE_ACTION_NONE: - result = "NONE"; - break; - // - case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED: - result = "MAJOR_SUPPORT_DETECTED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED: - result = "MAJOR_SUPPORT_BREAKED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED: - result = "MINOR_SUPPORT_DETECTED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED: - result = "MINOR_SUPPORT_REFINED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED: - result = "MINOR_SUPPORT_BREAKED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED: - result = "MINOR_SUPPORT_RETESTED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED: - result = "MAJOR_RESISTANCE_DETECTED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED: - result = "MAJOR_RESISTANCE_BREAKED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED: - result = "MINOR_RESISTANCE_DETECTED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED: - result = "MINOR_RESISTANCE_REFINED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED: - result = "MINOR_RESISTANCE_BREAKED"; - break; - // - case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED: - result = "MINOR_RESISTANCE_RETESTED"; - break; - } - - // - return result; -} - // // Structures ... @@ -1718,6 +1603,9 @@ struct XDirectionShift } }; +/** + * Configure Draws ... + **/ struct XPOIDrawConfig { // @@ -1726,6 +1614,7 @@ struct XPOIDrawConfig // color bullishColor; color bearishColor; + color neuturalColor; // int arrowsWidth; @@ -1741,6 +1630,12 @@ struct XPOIDrawConfig bool ignoreZonesAt; ENUM_LINE_STYLE zonesStyle; + // + int trendWidth; + bool trendRayLeft; + bool trendRayRight; + ENUM_LINE_STYLE trendStyle; + // // Constructor ... XPOIDrawConfig() @@ -1759,6 +1654,7 @@ struct XPOIDrawConfig // bullishColor = CLR_NONE; bearishColor = CLR_NONE; + neuturalColor = CLR_NONE; // arrowsWidth = 0; @@ -1773,6 +1669,12 @@ struct XPOIDrawConfig zonesFill = false; ignoreZonesAt = true; zonesStyle = STYLE_SOLID; + + // + trendWidth = 0; + trendRayLeft = false; + trendRayRight = false; + trendStyle = STYLE_DOT; } /** @@ -1783,6 +1685,7 @@ struct XPOIDrawConfig // bullishColor = clrAqua; bearishColor = clrMagenta; + neuturalColor = clrGray; // arrowsWidth = 1; @@ -1797,6 +1700,12 @@ struct XPOIDrawConfig zonesFill = true; ignoreZonesAt = true; zonesStyle = STYLE_SOLID; + + // + trendWidth = 2; + trendRayLeft = false; + trendRayRight = true; + trendStyle = STYLE_DOT; } // diff --git a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 index 31e07443..5416d306 100644 --- a/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 +++ b/XFIMAEA/Classes/x-saherelm.xfima.signaller.class.mq5 @@ -1693,12 +1693,19 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller return result; } + // + // Validation Flags ... + bool validateBarInsideZone = true; + bool validateByBarPatterns = true; + bool validateByBarInsideATRBand = true; + // // Define Requirements ... // XOHCL pBar; XOHCL p2Bar; + XOHCL p3Bar; bool isBullish = false; bool isBearish = false; @@ -1707,11 +1714,14 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller result = bar.GetPreviousBar(pBar); result = result && pBar.GetPreviousBar(p2Bar); + result = result && + p2Bar.GetPreviousBar(p3Bar); if (!result) { // pBar.Clean(); p2Bar.Clean(); + p3Bar.Clean(); // return result; @@ -1720,11 +1730,20 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller // // Do ... + // + // Retrieve pBar Patterns ... + XPatternAnalysis pBarPatterns; + poiDetector.AnalyseBarPatterns( + pBar, + pBarPatterns, + structureConfig.barsAnalysisConfig // + ); + // // Detecting OrderFlow ... XBoxZone orderFlow[]; bool hasOrderFlow = poiDetector.HasOrderFlow( - pBar, + p3Bar, dir, orderFlow, structureConfig.orderFlowValidation, @@ -1736,6 +1755,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller structureConfig.loopback // ); + // + double atrBandMiddle = EMPTY_VALUE; + // isBullish = hasOrderFlow && IsXBullish(dir); @@ -1745,11 +1767,157 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller IsXBearish(dir); // - result = isBullish || - isBearish; - if (result) { + // Summarize Result ... + result = isBullish || isBearish; + + // + // Force Price of p2Bar is Inside Order Flow ... + if (result && validateBarInsideZone) + { // + double orderFlowUpper = 0; + double orderFlowLower = 0; + + // + int idx = GetHighest(orderFlow); + if (IsValidIndex(idx)) + { + orderFlowUpper = orderFlow[idx].upper; + } + idx = GetLowest(orderFlow); + if (IsValidIndex(idx)) + { + orderFlowLower = orderFlow[idx].lower; + } + + // + result = NotEmptyZero(orderFlowUpper) && + NotEmptyZero(orderFlowLower) && + orderFlowUpper > orderFlowLower && + (isBullish + ? p2Bar.low < orderFlowUpper + : p2Bar.high > orderFlowLower); + } + + // + // Force PBar Has Pattern ... + if (result && validateByBarPatterns) + { + // + // Analyse Bar Patterns ... + result = pBarPatterns.IsValid(); + + // + // Bullish ... + bool isPBarHasBullishPatterns = + // (bar.close > pBar.low || + // bar.open > pBar.low) && + ( + // + pBarPatterns.IsPinned(X_DIRECTION_BULLISH) || + pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) || + pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) || + pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) || + pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH) + // + ); + + // + // Bearish ... + bool isPBarHasBearishPatterns = + // (bar.close < pBar.high || + // bar.open < pBar.high) && + ( + // + pBarPatterns.IsPinned(X_DIRECTION_BEARISH) || + pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) || + pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) || + pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) || + pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH) + // + ); + + // + isBullish = + isBullish && + isPBarHasBullishPatterns && + !isPBarHasBearishPatterns; + + // + isBearish = + isBearish && + isPBarHasBearishPatterns && + !isPBarHasBullishPatterns; + + // + // Summarize Result ... + result = isBullish || isBearish; + } + + // + // Force P2Bar Place Checking based on ATR Band ... + if (result && validateByBarInsideATRBand) + { + // + double atrBandUpper = fimaHelper.GetATRBandUpper(p2Bar.Index()); + double atrBandLower = fimaHelper.GetATRBandLower(p2Bar.Index()); + + // + atrBandMiddle = atrBandLower + ((atrBandUpper - atrBandLower) / 2); + + // + isBullish = + isBullish && + NotEmptyZero(atrBandMiddle) && + p2Bar.low < atrBandMiddle; + + // + isBearish = + isBearish && + NotEmptyZero(atrBandMiddle) && + p2Bar.high > atrBandMiddle; + + // + // Summarize Result ... + result = isBullish || isBearish; + } + + // + if (result) + { + // + UpdateToTime(orderFlow, bar.time); poiDrawer.DrawZones(orderFlow, structureDrawConfig.drawConfig); + poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig); + + // + // Draw ATR Band Middle ... + if (NotEmptyZero(atrBandMiddle)) + { + // + XPOIDrawConfig iConfig = structureDrawConfig.drawConfig; + iConfig.trendRayLeft = false; + iConfig.trendRayRight = false; + + // + datetime to = bar.time; + datetime from = p2Bar.BeforeOn(); + string trendName = "ATRBandMiddle_" + ToXString(TimeToSeconds(p2Bar.time)); + poiDrawer.DrawTrendLine( + trendName, + atrBandMiddle, + from, + atrBandMiddle, + to, + iConfig, + clrYellow // + ); + + // + iConfig.Clean(); + } + + // Print("OrderFlow ..."); } @@ -1823,6 +1991,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller } pBar.Clean(); p2Bar.Clean(); + p3Bar.Clean(); + XClean(orderFlow); + pBarPatterns.Clean(); // return result; diff --git a/XFIMAEA/Libraries/x-saherelm.xfima.lib.mq5 b/XFIMAEA/Libraries/x-saherelm.xfima.lib.mq5 index 2aca77f4..00d7994a 100644 --- a/XFIMAEA/Libraries/x-saherelm.xfima.lib.mq5 +++ b/XFIMAEA/Libraries/x-saherelm.xfima.lib.mq5 @@ -334,7 +334,7 @@ struct XFIMAMarketStructureConfig // Tools ... /** - * This function fulfills the will of the developer + * This function fulfills the will of the developer */ void Clean() { @@ -468,7 +468,7 @@ struct XFIMAMarketStructureDrawerConfig // Tools ... /** - * This function fulfills the will of the developer + * This function fulfills the will of the developer */ void Clean() { @@ -574,7 +574,6 @@ struct XFIMAMarketStructureDrawerConfig { // barAnalysisDrawConfig.drawConfig = drawConfig; - barAnalysisDrawConfig.ConfigureQuarterDraws(); pivotAnalysisDrawConfig.drawConfig = drawConfig; }