diff --git a/Classes/x-saherelm.x-chart-objects.class.mq5 b/Classes/x-saherelm.x-chart-objects.class.mq5 index a5c3989e..94691405 100644 --- a/Classes/x-saherelm.x-chart-objects.class.mq5 +++ b/Classes/x-saherelm.x-chart-objects.class.mq5 @@ -44,6 +44,8 @@ enum ENUM_XCHARTOBJECTS X_RESISTANCE_ZONE, X_SUPPLY_ZONE, X_DEMAND_ZONE, + X_BULLISH_ORDERBLOCK, + X_BEARISH_ORDERBLOCK, }; enum ENUM_X_CHART_IDS @@ -912,3 +914,71 @@ class XCDemandZoneObject : public XCZoneObject }; // +// Bullish Order Block ... + +class XCBullishOrderBlockObject : public XCZoneObject +{ + // + public: + // + + // + // Constructors ... + void XCBullishOrderBlockObject() + { + } + + // + // Deconstructors ... + void ~XCBullishOrderBlockObject() + { + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BULLISH_ORDERBLOCK; + } + + // +}; + +// +// Bearish Order Block ... + +class XCBearishOrderBlockObject : public XCZoneObject +{ + // + public: + // + + // + // Constructors ... + void XCBearishOrderBlockObject() + { + } + + // + // Deconstructors ... + void ~XCBearishOrderBlockObject() + { + } + + /** + * Retrieve Object Type ... + * + * @return ( ENUM_XCHARTOBJECTS ) + */ + virtual ENUM_XCHARTOBJECTS Type() + { + return X_BEARISH_ORDERBLOCK; + } + + // +}; + +// diff --git a/Classes/x-saherelm.x-poi.class.mq5 b/Classes/x-saherelm.x-poi.class.mq5 index d6c8285b..0c33c2d4 100644 --- a/Classes/x-saherelm.x-poi.class.mq5 +++ b/Classes/x-saherelm.x-poi.class.mq5 @@ -1478,6 +1478,243 @@ class XCPOI : public XSCBaseAlert mDemandZonePeriod = value; } + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + + /** + * Get Draw Bullish Order Blocks State ... + * + * @return ( bool ) + */ + bool AllowDrawBullishOrderBlocks() + { + return mAllowDrawBullishOrderBlocks; + } + + /** + * Set Draw Bullish Order Blocks State ... + * + * @param value: Boolean ... + */ + void AllowDrawBullishOrderBlocks(bool value) + { + mAllowDrawBullishOrderBlocks = value; + } + + /** + * Get Bullish Order Block Width ... + * + * @return ( int ) + */ + int BullishOrderBlockWidth() + { + return mBullishOrderBlockWidth; + } + + /** + * Set Bullish Order Block Width ... + * + * @param value: Integer ... + */ + void BullishOrderBlockWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBullishOrderBlockWidth = value; + } + + /** + * Get Bullish Order Block Color ... + * + * @return ( color ) + */ + color BullishOrderBlockColor() + { + return mBullishOrderBlockColor; + } + + /** + * Set Bullish Order Block Color ... + * + * @param value: Color ... + */ + void BullishOrderBlockColor(color value) + { + mBullishOrderBlockColor = value; + } + + /** + * Get Bullish Order Block Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BullishOrderBlockStyle() + { + return mBullishOrderBlockStyle; + } + + /** + * Set Bullish Order Block Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BullishOrderBlockStyle(ENUM_LINE_STYLE value) + { + mBullishOrderBlockStyle = value; + } + + /** + * Get Minimum Required Same Bars for Bullish Order Blocks ... + * + * @return ( int ) + */ + int RequiredBarsForBullishOrderBlock() + { + return mRequiredBarsForBullishOrderBlock; + } + + /** + * Set Minimum Required Same Bars for Bullish Order Blocks ... + * + * @param value: Integer ... + */ + void RequiredBarsForBullishOrderBlock(int value) + { + // + if (value < 3) + { + value = 3; + } + + // + mRequiredBarsForBullishOrderBlock = value; + } + + // + // Bearish Order Blocks ... + + /** + * Get Draw Bearish Order Blocks State ... + * + * @return ( bool ) + */ + bool AllowDrawBearishOrderBlocks() + { + return mAllowDrawBearishOrderBlocks; + } + + /** + * Set Draw Bearish Order Blocks State ... + * + * @param value: Boolean ... + */ + void AllowDrawBearishOrderBlocks(bool value) + { + mAllowDrawBearishOrderBlocks = value; + } + + /** + * Get Bearish Order Block Width ... + * + * @return ( int ) + */ + int BearishOrderBlockWidth() + { + return mBearishOrderBlockWidth; + } + + /** + * Set Bearish Order Block Width ... + * + * @param value: Integer ... + */ + void BearishOrderBlockWidth(int value) + { + // + if (value < 1) + { + value = 1; + } + + // + mBearishOrderBlockWidth = value; + } + + /** + * Get Bearish Order Block Color ... + * + * @return ( color ) + */ + color BearishOrderBlockColor() + { + return mBearishOrderBlockColor; + } + + /** + * Set Bearish Order Block Color ... + * + * @param value: Color ... + */ + void BearishOrderBlockColor(color value) + { + mBearishOrderBlockColor = value; + } + + /** + * Get Bearish Order Block Style ... + * + * @return ( ENUM_LINE_STYLE ) + */ + ENUM_LINE_STYLE BearishOrderBlockStyle() + { + return mBearishOrderBlockStyle; + } + + /** + * Set Bearish Order Block Style ... + * + * @param value: ENUM_LINE_STYLE member ... + */ + void BearishOrderBlockStyle(ENUM_LINE_STYLE value) + { + mBearishOrderBlockStyle = value; + } + + /** + * Get Minimum Required Same Bars for Bearish Order Blocks ... + * + * @return ( int ) + */ + int RequiredBarsForBearishOrderBlock() + { + return mRequiredBarsForBearishOrderBlock; + } + + /** + * Set Minimum Required Same Bars for Bearish Order Blocks ... + * + * @param value: Integer ... + */ + void RequiredBarsForBearishOrderBlock(int value) + { + // + if (value < 3) + { + value = 3; + } + + // + mRequiredBarsForBearishOrderBlock = value; + } + // // Actions ... @@ -1581,12 +1818,13 @@ class XCPOI : public XSCBaseAlert if (zBar.time == mTradingDays[tradingDayIDX].to) { // + ENUM_XPOI_EVENTS event = X_TRADE_DAY_LAST_BAR; Add( - X_TRADE_DAY_LAST_BAR, + event, state // ); - OnTradingDayEvent(X_TRADE_DAY_LAST_BAR); - NotifyTradingDayEventListeners(X_TRADE_DAY_LAST_BAR); + OnTradingDayEvent(event); + NotifyTradingDayEventListeners(event); } } else @@ -1707,17 +1945,18 @@ class XCPOI : public XSCBaseAlert if (zBar.time == lastBarTime) { // + ENUM_XPOI_EVENTS event = X_SESSION_LAST_BAR; Add( - X_SESSION_LAST_BAR, + event, state // ); OnMarketSessionEvent( iMarketSession.session, - X_SESSION_LAST_BAR // + event // ); NotifyMarketSessionEventListeners( iMarketSession.session, - X_SESSION_LAST_BAR // + event // ); } } @@ -1746,12 +1985,13 @@ class XCPOI : public XSCBaseAlert DrawSwingHighs(); // + ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED; Add( - X_SWING_HIGH_DETECTED, + event, state // ); - OnSwingHighEvent(X_SWING_HIGH_DETECTED, pBar); - NotifySwingHighEventListeners(X_SWING_HIGH_DETECTED, pBar); + OnSwingHighEvent(event, pBar); + NotifySwingHighEventListeners(event, pBar); } // @@ -1773,12 +2013,13 @@ class XCPOI : public XSCBaseAlert DrawSwingLows(); // + ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED; Add( - X_SWING_LOW_DETECTED, + event, state // ); - OnSwingLowEvent(X_SWING_LOW_DETECTED, pBar); - NotifySwingLowEventListeners(X_SWING_LOW_DETECTED, pBar); + OnSwingLowEvent(event, pBar); + NotifySwingLowEventListeners(event, pBar); } // @@ -1812,12 +2053,13 @@ class XCPOI : public XSCBaseAlert DrawMomentumBars(); // + ENUM_XPOI_EVENTS event = X_MOMENTUM_BAR_DETECTED; Add( - X_MOMENTUM_BAR_DETECTED, + event, state // ); - OnMomentumBarEvent(X_MOMENTUM_BAR_DETECTED, cBar); - NotifyMomentumBarEventListeners(X_MOMENTUM_BAR_DETECTED, cBar); + OnMomentumBarEvent(event, cBar); + NotifyMomentumBarEventListeners(event, cBar); } // @@ -1859,12 +2101,13 @@ class XCPOI : public XSCBaseAlert DrawRejectionBars(); // + ENUM_XPOI_EVENTS event = X_REJECTION_BAR_DETECTED; Add( - X_REJECTION_BAR_DETECTED, + event, state // ); - OnRejectionBarEvent(X_REJECTION_BAR_DETECTED, iRBar); - NotifyRejectionBarEventListeners(X_REJECTION_BAR_DETECTED, iRBar); + OnRejectionBarEvent(event, iRBar); + NotifyRejectionBarEventListeners(event, iRBar); } } @@ -1895,12 +2138,13 @@ class XCPOI : public XSCBaseAlert DrawSupportZones(); // + ENUM_XPOI_EVENTS event = X_SUPPORT_ZONE_DETECTED; Add( - X_SUPPORT_ZONE_DETECTED, + event, state // ); - OnSupportZoneEvent(X_SUPPORT_ZONE_DETECTED, support); - NotifySupportZoneEventListeners(X_SUPPORT_ZONE_DETECTED, support); + OnSupportZoneEvent(event, support); + NotifySupportZoneEventListeners(event, support); } } @@ -1928,12 +2172,13 @@ class XCPOI : public XSCBaseAlert DrawResistanceZones(); // + ENUM_XPOI_EVENTS event = X_RESISTANCE_ZONE_DETECTED; Add( - X_RESISTANCE_ZONE_DETECTED, + event, state // ); - OnResistanceZoneEvent(X_RESISTANCE_ZONE_DETECTED, resistance); - NotifyResistanceZoneEventListeners(X_RESISTANCE_ZONE_DETECTED, resistance); + OnResistanceZoneEvent(event, resistance); + NotifyResistanceZoneEventListeners(event, resistance); } } @@ -2050,17 +2295,16 @@ class XCPOI : public XSCBaseAlert // supplyZonesCount = ArraySize(mSupplyZones); - - // DrawSupplyZones(); // + ENUM_XPOI_EVENTS event = X_SUPPLY_ZONE_DETECTED; Add( - X_SUPPLY_ZONE_DETECTED, + event, state // ); - OnSupplyZoneEvent(X_SUPPLY_ZONE_DETECTED, zone); - NotifySupplyZoneEventListeners(X_SUPPLY_ZONE_DETECTED, zone); + OnSupplyZoneEvent(event, zone); + NotifySupplyZoneEventListeners(event, zone); } } } @@ -2177,23 +2421,101 @@ class XCPOI : public XSCBaseAlert // demandZonesCount = ArraySize(mDemandZones); - - // DrawDemandZones(); // + ENUM_XPOI_EVENTS event = X_DEMAND_ZONE_DETECTED; Add( - X_DEMAND_ZONE_DETECTED, + event, state // ); - OnDemandZoneEvent(X_DEMAND_ZONE_DETECTED, zone); - NotifyDemandZoneEventListeners(X_DEMAND_ZONE_DETECTED, zone); + OnDemandZoneEvent(event, zone); + NotifyDemandZoneEventListeners(event, zone); } } } } } + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + + // + XOHCL bullOB; + int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); + bool hasBullOB = cBar.HasBullishOrderBlock( + bullOB, + RequiredBarsForBullishOrderBlock() // + ); + if (hasBullOB) + { + // + XZone obZone; + bool isAdded = AddOrderBlock( + obZone, // Dest ... + bullOB, + cBar.time, + X_POI_BULLISH_ORDERBLOCK, + mBullishOrderBlocks // + ); + if (isAdded) + { + // + bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); + DrawBullishOrderBlocks(); + + // + ENUM_XPOI_EVENTS event = X_BULLISH_ORDERBLOCK_DETECTED; + Add( + event, + state // + ); + OnBullishOrderBlockEvent(event, obZone); + NotifyBullishOrderBlockEventListeners(event, obZone); + } + } + + // + // Bearish Order Blocks ... + + // + int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks); + XOHCL bearOB; + bool hasBearOB = cBar.HasBearishOrderBlock( + bearOB, + RequiredBarsForBearishOrderBlock() // + ); + if (hasBearOB) + { + // + XZone zone; + bool isAdded = AddOrderBlock( + zone, // + bearOB, + cBar.time, + X_POI_BEARISH_ORDERBLOCK, + mBearishOrderBlocks // + ); + if (isAdded) + { + // + bullishOrderBlocksCount = ArraySize(mBearishOrderBlocks); + DrawBearishOrderBlocks(); + + // + ENUM_XPOI_EVENTS event = X_BEARISH_ORDERBLOCK_DETECTED; + Add( + event, + state // + ); + OnBullishOrderBlockEvent(event, zone); + NotifyBullishOrderBlockEventListeners(event, zone); + } + } + // // ... @@ -2212,33 +2534,7 @@ class XCPOI : public XSCBaseAlert */ void EnableDrawPOIs() { - // - bool state = true; - - // - AllowDrawSwingLows(state); - AllowDrawSwingHighs(state); - AllowDrawTradingDays(state); - AllowDrawSupplyZones(state); - AllowDrawDemandZones(state); - AllowDrawSupportZones(state); - AllowDrawMomentumBars(state); - AllowDrawRejectionBars(state); - AllowDrawMarketSessions(state); - AllowDrawResistanceZones(state); - - // - // Sessions ... - int sessionsCount = ArraySize(mSessions); - if (IsValidSize(sessionsCount)) - { - // - for (int i = 0; i < sessionsCount; i++) - { - // - mSessions[i].allowDraw = state; - } - } + ChangePOIsDrawState(true); } /** @@ -2246,9 +2542,16 @@ class XCPOI : public XSCBaseAlert */ void DisableDrawPOIs() { - // - bool state = false; + ChangePOIsDrawState(false); + } + /** + * Set Drawing State of all POIs ... + * + * @param state: Boolean ... + */ + void ChangePOIsDrawState(bool state) + { // AllowDrawSwingLows(state); AllowDrawSwingHighs(state); @@ -2260,6 +2563,8 @@ class XCPOI : public XSCBaseAlert AllowDrawRejectionBars(state); AllowDrawMarketSessions(state); AllowDrawResistanceZones(state); + AllowDrawBullishOrderBlocks(state); + AllowDrawBearishOrderBlocks(state); // // Sessions ... @@ -2442,6 +2747,23 @@ class XCPOI : public XSCBaseAlert DemandZoneStyle(STYLE_DASH); DemandZonePeriod(GetHindMostPeriod(Period())); + // + // Order Blocks ... + + // + // Bullish Order Block ... + BullishOrderBlockWidth(1); + BullishOrderBlockColor(clrAqua); + BullishOrderBlockStyle(STYLE_DASHDOT); + RequiredBarsForBullishOrderBlock(3); + + // + // Bearish Order Block ... + BearishOrderBlockWidth(1); + BearishOrderBlockColor(clrMagenta); + BearishOrderBlockStyle(STYLE_DASHDOT); + RequiredBarsForBearishOrderBlock(3); + // } @@ -2769,14 +3091,77 @@ class XCPOI : public XSCBaseAlert * * @param listener: TXZoneEventHandler instance ... */ - // void AddDemandZoneEventListener(TXZoneEventHandler listener) - // { - // // - // Add( - // listener, - // mDemandZoneEventListeners // - // ); - // } + void AddDemandZoneEventListener(TXZoneEventHandler listener) + { + // + Add( + listener, + mDemandZoneEventListeners // + ); + } + + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + + /** + * Calls When new Bullish Order Block Event ... + * + * @param event: ENUM_XPOI_EVENTS member ... + * @param zone: XZone instance ... + */ + virtual void OnBullishOrderBlockEvent( + ENUM_XPOI_EVENTS event, + XZone &zone // + ) + { + } + + /** + * Register an Event Listener for New Bullish Order Block Event ... + * + * @param listener: TXZoneEventHandler instance ... + */ + void AddBullishOrderBlockEventListener(TXZoneEventHandler listener) + { + // + Add( + listener, + mBullishOrderBlockEventListeners // + ); + } + + // + // Bearish Order Blocks ... + + /** + * Calls When new Bearish Order Block Event ... + * + * @param event: ENUM_XPOI_EVENTS member ... + * @param zone: XZone instance ... + */ + virtual void OnBearishOrderBlockEvent( + ENUM_XPOI_EVENTS event, + XZone &zone // + ) + { + } + + /** + * Register an Event Listener for New Bearish Order Block Event ... + * + * @param listener: TXZoneEventHandler instance ... + */ + void AddBearishOrderBlockEventListener(TXZoneEventHandler listener) + { + // + Add( + listener, + mBearishOrderBlockEventListeners // + ); + } // protected: @@ -3342,6 +3727,67 @@ class XCPOI : public XSCBaseAlert } } + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); + if (bullishOrderBlocksCount < requiredPOIs) + { + // + XOHCL ob; + bool hasOB = cBar.HasBullishOrderBlock( + ob, + RequiredBarsForBullishOrderBlock() // + ); + if (hasOB) + { + // + XZone zone; + bool isAdded = AddOrderBlock( + zone, // + ob, + cBar.time, + X_POI_BULLISH_ORDERBLOCK, + mBullishOrderBlocks // + ); + if (isAdded) + { + bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); + } + } + } + + // + // Bearish Order Blocks ... + int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks); + if (bearishOrderBlocksCount < requiredPOIs) + { + // + XOHCL ob; + bool hasOB = cBar.HasBearishOrderBlock( + ob, + RequiredBarsForBearishOrderBlock() // + ); + if (hasOB) + { + // + XZone zone; + bool isAdded = AddOrderBlock( + zone, // + ob, + cBar.time, + X_POI_BEARISH_ORDERBLOCK, + mBearishOrderBlocks // + ); + if (isAdded) + { + bullishOrderBlocksCount = ArraySize(mBearishOrderBlocks); + } + } + } + // // Detect Required Conditions for Loop ... // @@ -3375,7 +3821,11 @@ class XCPOI : public XSCBaseAlert // // Supply and Demand Zones ... supplyZonesCount < requiredPOIs || - demandZonesCount < requiredPOIs + demandZonesCount < requiredPOIs || + // + // Order Blocks ... + bullishOrderBlocksCount < requiredPOIs || + bearishOrderBlocksCount < requiredPOIs // ; if (canContinue) @@ -3543,6 +3993,35 @@ class XCPOI : public XSCBaseAlert ); Clean(tmpZones); + // + // Order Blocks ... + + // + Copy( + mBullishOrderBlocks, + tmpZones // + ); + Clean(mBullishOrderBlocks); + ArrayReverse(tmpZones); + Copy( + tmpZones, + mBullishOrderBlocks // + ); + Clean(tmpZones); + + // + Copy( + mBearishOrderBlocks, + tmpZones // + ); + Clean(mBearishOrderBlocks); + ArrayReverse(tmpZones); + Copy( + tmpZones, + mBearishOrderBlocks // + ); + Clean(tmpZones); + // // ... @@ -3582,6 +4061,10 @@ class XCPOI : public XSCBaseAlert // DestroySupplyZones(); DestroyDemandZones(); + + // + DestroyBullishOrderBlocks(); + DestroyBearishOrderBlocks(); } /** @@ -3664,6 +4147,22 @@ class XCPOI : public XSCBaseAlert Clean(mDemandZones); } + /** + * Destroy Bullish Order Blocks ... + */ + void DestroyBullishOrderBlocks() + { + Clean(mBullishOrderBlocks); + } + + /** + * Destroy Bearish Order Blocks ... + */ + void DestroyBearishOrderBlocks() + { + Clean(mBearishOrderBlocks); + } + // // Draw Actions ... @@ -3695,6 +4194,10 @@ class XCPOI : public XSCBaseAlert // DrawSupplyZones(); DrawDemandZones(); + + // + DrawBullishOrderBlocks(); + DrawBearishOrderBlocks(); } /** @@ -4107,6 +4610,88 @@ class XCPOI : public XSCBaseAlert } } + /** + * Draw Bullish Order Blocks ... + */ + void DrawBullishOrderBlocks() + { + // + bool allow = AllowDrawBullishOrderBlocks(); + if (!allow) + { + return; + } + + // + int count = ArraySize(mBullishOrderBlocks); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + XZone iBullishOB = mBullishOrderBlocks[i]; + + // + string iName = iBullishOB.GetTag(); + int iIDX = HasObject( + iName, + mBullishOrderBlockObjects // + ); + if (IsValidIndex(iIDX)) + { + continue; + } + + // + CreateBullishOrderBlockObject(iBullishOB, iName); + } + } + + /** + * Draw Bearish Order Blocks ... + */ + void DrawBearishOrderBlocks() + { + // + bool allow = AllowDrawBearishOrderBlocks(); + if (!allow) + { + return; + } + + // + int count = ArraySize(mBearishOrderBlocks); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + XZone iBearishOB = mBearishOrderBlocks[i]; + + // + string iName = iBearishOB.GetTag(); + int iIDX = HasObject( + iName, + mBearishOrderBlockObjects // + ); + if (IsValidIndex(iIDX)) + { + continue; + } + + // + CreateBearishOrderBlockObject(iBearishOB, iName); + } + } + // /** @@ -4125,6 +4710,8 @@ class XCPOI : public XSCBaseAlert DestroyMarketSessionObjects(); DestroyResistanceZoneObjects(); DestroyTradingTradingDayObjects(); + DestroyBullishOrderBlockObjects(); + DestroyBearishOrderBlockObjects(); } /** @@ -4207,6 +4794,22 @@ class XCPOI : public XSCBaseAlert mDemandZoneObjects.Clear(); } + /** + * Destroy Bullish Order Block Drawn Objects ... + */ + void DestroyBullishOrderBlockObjects() + { + mBullishOrderBlockObjects.Clear(); + } + + /** + * Destroy Bearish Order Block Drawn Objects ... + */ + void DestroyBearishOrderBlockObjects() + { + mBearishOrderBlockObjects.Clear(); + } + // // ... @@ -4616,6 +5219,81 @@ class XCPOI : public XSCBaseAlert } } + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + + /** + * Notify New Bullish Order Block Event Handlers ... + * + * @param event: ENUM_XPOI_EVENTS member ... + * @param bar: XZone instance ... + */ + void NotifyBullishOrderBlockEventListeners( + ENUM_XPOI_EVENTS event, + XZone &zone // + ) + { + // + if (!zone.IsValid()) + { + return; + } + + // + int count = ArraySize(mBullishOrderBlockEventListeners); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TXZoneEventHandler iListener = mBullishOrderBlockEventListeners[i]; + iListener(event, zone); + } + } + + // + // Bearish Order Blocks ... + + /** + * Notify New Bearish Order Block Event Handlers ... + * + * @param event: ENUM_XPOI_EVENTS member ... + * @param bar: XZone instance ... + */ + void NotifyBearishOrderBlockEventListeners( + ENUM_XPOI_EVENTS event, + XZone &zone // + ) + { + // + if (!zone.IsValid()) + { + return; + } + + // + int count = ArraySize(mBearishOrderBlockEventListeners); + if (!IsValidSize(count)) + { + return; + } + + // + for (int i = 0; i < count; i++) + { + // + TXZoneEventHandler iListener = mBearishOrderBlockEventListeners[i]; + iListener(event, zone); + } + } + /** * Destroy all Registered Event Listeners ... */ @@ -4632,6 +5310,8 @@ class XCPOI : public XSCBaseAlert Clean(mRejectionBarEventListeners); Clean(mMarketSessionEventListeners); Clean(mResistanceZoneEventListeners); + Clean(mBullishOrderBlockEventListeners); + Clean(mBearishOrderBlockEventListeners); } // @@ -5126,6 +5806,75 @@ class XCPOI : public XSCBaseAlert return result; } + /** + * Add Specific Order Block to List ... + * + * @param ob: XOHCL ... + * @param endTime: Datetime ... + * @param type: ENUM_X_POI member ... + * @param list: XZone instance Collection ... + * + * @return ( bool ) + */ + bool AddOrderBlock( + XZone &zone, + XOHCL &ob, + datetime endTime, + ENUM_XPOIS type, + XZone &list[] // + ) + { + // + bool result = false; + + // + result = type == X_POI_BULLISH_ORDERBLOCK || + type == X_POI_BEARISH_ORDERBLOCK; + if (!result) + { + return result; + } + + // + NormalizeTime(endTime); + + // + datetime startTime = (datetime)((int)ob.time - (PeriodSeconds(Period()) * 2)); + + // + result = zone.Init( + ob.high, + ob.low, + ToString(type), + startTime, + endTime // + ); + if (!result) + { + return result; + } + + // + int idx = FindZoneIndex( + zone, + list // + ); + result = !IsValidIndex(idx); + if (!result) + { + return result; + } + + // + AddRef( + zone, + list // + ); + + // + return result; + } + // private: // @@ -5145,6 +5894,12 @@ class XCPOI : public XSCBaseAlert // XBarTracker mBarTracker; // Market Bar Tracker ... + // + // POI Props ... + + // + // Trading Days ... + // bool mAllowDrawTradingDays; // Draw Trading Days ... color mTradingDaysStartColor; // Trading Days Start Color ... @@ -5200,7 +5955,9 @@ class XCPOI : public XSCBaseAlert } // - // Configure Sessions ... + // Market Sessions ... + + // bool mAllowDrawMarketSessions; // Draw Market Sessions ... int mSessionOpenHours; // How many Hours a Session is Open XSession mSessions[]; // Forex Sessions @@ -5262,11 +6019,12 @@ class XCPOI : public XSCBaseAlert } // - // POI Holders ... + // Swing High and Low(s) ... // // Swing Highs ... + // bool mAllowDrawSwingHighs; // Draw Swing Highs ... char mSwingHighArrowCode; // Swing High Arrow Code ... color mSwingHighColor; // Swing High Color ... @@ -5323,6 +6081,7 @@ class XCPOI : public XSCBaseAlert // // Swing Lows ... + // bool mAllowDrawSwingLows; // Draw Swing Lows ... char mSwingLowArrowCode; // Swing Low Arrow Code ... color mSwingLowColor; // Swing Low Color ... @@ -5377,8 +6136,9 @@ class XCPOI : public XSCBaseAlert } // - // Momentum Bar ... + // Momentum Bars ... + // bool mAllowDrawMomentumBars; // Draw Momentum Bars ... int mMomentumBarPercent; // Momentum Bar Percent ... double mMomentumBarSharpRatio; // Momentum Bar Sharp Ratio ... @@ -5456,7 +6216,9 @@ class XCPOI : public XSCBaseAlert } // - // Rejection Bar .... + // Rejection Bars .... + + // bool mAllowDrawRejectionBars; // Draw Rejection Bars ... int mRejectionBarPercent; // Rejection Bar Percent ... double mRejectionBarSharpRatio; // Rejection Bar Sharp Ratio ... @@ -5534,7 +6296,12 @@ class XCPOI : public XSCBaseAlert } // - // Support Zone ... + // Support and Resistance Zones ... + + // + // Support Zones ... + + // bool mAllowDrawSupportZones; // Draw Support Zone ... int mSupportZoneLoopBack; // Support Zone Loopback ... int mSupportZoneWidth; // Support Zone Width ... @@ -5602,7 +6369,9 @@ class XCPOI : public XSCBaseAlert } // - // Resistance Zone ... + // Resistance Zones ... + + // bool mAllowDrawResistanceZones; // Draw Resistance Zone ... int mResistanceZoneLoopBack; // Resistance Zone Loopback ... int mResistanceZoneWidth; // Resistance Zone Width ... @@ -5670,7 +6439,12 @@ class XCPOI : public XSCBaseAlert } // - // Supply Zone ... + // Supply and Demand Zones ... + + // + // Supply Zones ... + + // bool mAllowDrawSupplyZones; // Draw Supply Zone ... int mSupplyZoneWidth; // Supply Zone Width ... color mSupplyZoneColor; // Supply Zone Color ... @@ -5725,7 +6499,9 @@ class XCPOI : public XSCBaseAlert } // - // Demand Zone ... + // Demand Zones ... + + // bool mAllowDrawDemandZones; // Draw Demand Zone ... int mDemandZoneWidth; // Demand Zone Width ... color mDemandZoneColor; // Demand Zone Color ... @@ -5779,6 +6555,123 @@ class XCPOI : public XSCBaseAlert mDemandZoneObjects.Add(iObj); } + // + // Order Blocks ... + + // + // Bullish Order Blocks ... + + // + bool mAllowDrawBullishOrderBlocks; // Draw Bullish Order Blocks ... + int mBullishOrderBlockWidth; // Bullish Order Block Width ... + color mBullishOrderBlockColor; // Bullish Order Block Color ... + ENUM_LINE_STYLE mBullishOrderBlockStyle; // Bullish Order Block Style ... + int mRequiredBarsForBullishOrderBlock; // Minimum Required Same Bars for Bullish Order Blocks ... + XZone mBullishOrderBlocks[]; // Bullish Order Blocks ... + CArrayObj mBullishOrderBlockObjects; // Bullish Order Block Objects ... + TXZoneEventHandler mBullishOrderBlockEventListeners[]; // Bullish Order Block Event Listeners ... + + /** + * Create an Object to Represent Bullish Order Block on Chart ... + + * @param bar: XZone instance ... + * @param name: String ... + */ + void CreateBullishOrderBlockObject( + XZone &zone, + string name // + ) + { + // + if (!zone.IsValid() || + !IsValid(name)) + { + return; + } + + // + XCBullishOrderBlockObject *iObj; + iObj = new XCBullishOrderBlockObject(); + bool isCreated = iObj.CreateByZone( + ChartID(), + name, + Window(), + zone, + NULL, // Object Prefix ... + true // Force Draw Rect ... + ); + if (!isCreated) + { + return; + } + + // + // Configure Object ... + iObj.ZoneColor(BullishOrderBlockColor()); + iObj.ZoneStyle(BullishOrderBlockStyle()); + iObj.ZoneWidth(BullishOrderBlockWidth()); + + // + mBullishOrderBlockObjects.Add(iObj); + } + + // + // Bearish Order Blocks ... + + // + bool mAllowDrawBearishOrderBlocks; // Draw Bearish Order Blocks ... + int mBearishOrderBlockWidth; // Bearish Order Block Width ... + color mBearishOrderBlockColor; // Bearish Order Block Color ... + ENUM_LINE_STYLE mBearishOrderBlockStyle; // Bearish Order Block Style ... + int mRequiredBarsForBearishOrderBlock; // Minimum Required Same Bars for Bearish Order Blocks ... + XZone mBearishOrderBlocks[]; // Bearish Order Blocks ... + CArrayObj mBearishOrderBlockObjects; // Bearish Order Block Objects ... + TXZoneEventHandler mBearishOrderBlockEventListeners[]; // Bearish Order Block Event Listeners ... + + /** + * Create an Object to Represent Bearish Order Block on Chart ... + + * @param bar: XZone instance ... + * @param name: String ... + */ + void CreateBearishOrderBlockObject( + XZone &zone, + string name // + ) + { + // + if (!zone.IsValid() || + !IsValid(name)) + { + return; + } + + // + XCBearishOrderBlockObject *iObj; + iObj = new XCBearishOrderBlockObject(); + bool isCreated = iObj.CreateByZone( + ChartID(), + name, + Window(), + zone, + NULL, // Object Prefix ... + true // Force Draw Rect ... + ); + if (!isCreated) + { + return; + } + + // + // Configure Object ... + iObj.ZoneColor(BearishOrderBlockColor()); + iObj.ZoneStyle(BearishOrderBlockStyle()); + iObj.ZoneWidth(BearishOrderBlockWidth()); + + // + mBearishOrderBlockObjects.Add(iObj); + } + // };