/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // -------------------------------------- // Name: XPOI // Description: Provides Point of Interests ... // - Swing Highs; // - Swing Lows; // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // Imports ... // #include "../Classes/x-saherelm.x-poi.drawer.class.mq5" #include "../Classes/x-saherelm.xalert.class.mq5" // #include // // Implementation ... // class XCPOI : public XSCBaseAlert { // public: // // // Constructors ... /** * Create an Instance ... * * @param symbol: String ... * @param period: ENUM_TIMEFRAMES member ... */ void XCPOI( string symbol, ENUM_TIMEFRAMES period // ) { // // Attach Required Properties ... mSymbol = symbol; mPeriod = period; // // Initialize Bar Tracker ... mBarTracker.Init( mSymbol, mPeriod // ); // mDrawer = new XCPOIDrawer(); // // Apply Default Configurations ... ApplyDefaultConfig(); } // // Deconstructor ... void ~XCPOI() { // DestroyPOIs(); DestroyObjects(); DestroySessions(); DestroyEventListeners(); // delete mDrawer; } // // Getter(s) / Setter(s) ... /** * Get Chart ID ... * * @return ( long ) */ long ChartIdentification() { return mChartIdentification; } /** * Set Chart ID ... * * @param value: Long */ void ChartIdentification(long value) { // if (value < 0) { value = 0; } // mChartIdentification = value; if (mDrawer != NULL) { mDrawer.ChartIdentification(value); } } /** * Get Sub SubWindowIdentification Number ... * * @return ( int ) */ int SubWindowIdentification() { return mSubWindowIdentification; } /** * Get Sub SubWindowIdentification Number ... * * @param value: Integer ... */ void SubWindowIdentification(int value) { // if (value < 0) { value = 0; } // mSubWindowIdentification = value; if (mDrawer != NULL) { mDrawer.SubWindowIdentification(value); } } /** * Get Max Number of POIs which holds ... * * @return ( int ) */ int MaxNumberOfPOIs() { return mMaxNumberOfPOIs; } /** * Set Max Number of POIs which holds ... * 0 => Infinity ... * * @param value: Integer ... */ void MaxNumberOfPOIs(int value) { // if (value < 0) { value = 0; } // mMaxNumberOfPOIs = value; } /** * Get Number of POI(s) which must Find at Initializations ... * * @return ( int ) */ int MaxNumberOfRequiredPOIs() { return mMaxNumberOfRequiredPOIs; } /** * Set Number of POI(s) which must Find at Initializations ... * 2 is Default ... * * @param value: Integer ... */ void MaxNumberOfRequiredPOIs(int value) { // if (value < 2) { value = 2; } // mMaxNumberOfRequiredPOIs = value; } /** * Check Is Locked or not ... * * @return ( bool ) */ bool IsLocked() { return mLock; } // // POI(s) Configs ... // // Trading Days ... /** * Get Detect Trading Days State ... * * @return ( bool ) */ bool AllowTradingDays() { return mAllowTradingDays; } /** * Set Detect Trading Days State ... * * @param value: Boolean ... */ void AllowTradingDays(bool value) { mAllowTradingDays = value; } /** * Get Draw Trading Days State ... * * @return ( bool ) */ bool AllowDrawTradingDays() { return mAllowDrawTradingDays; } /** * Set Draw Trading Days State ... * * @param value: Boolean ... */ void AllowDrawTradingDays(bool value) { mAllowDrawTradingDays = value; } /** * Get Trading Days Start Color ... * * @return ( color ) */ color TradingDaysStartColor() { return mTradingDaysStartColor; } /** * Set Trading Days Start Color ... * * @param value: Argument 1 */ void TradingDaysStartColor(color value) { mTradingDaysStartColor = value; } /** * Get Trading Days Start Style ... * * @return ( ENUM_LINE_STYLE ) */ ENUM_LINE_STYLE TradingDaysStartStyle() { return mTradingDaysStartStyle; } /** * Set Trading Days Start Style ... * * @param value: ENUM_LINE_STYLE member ... */ void TradingDaysStartStyle(ENUM_LINE_STYLE value) { mTradingDaysStartStyle = value; } /** * Get Trading Days End Color ... * * @return ( color ) */ color TradingDaysEndColor() { return mTradingDaysEndColor; } /** * Set Trading Days End Color ... * * @param value: Argument 1 */ void TradingDaysEndColor(color value) { mTradingDaysEndColor = value; } /** * Get Trading Days End Style ... * * @return ( ENUM_LINE_STYLE ) */ ENUM_LINE_STYLE TradingDaysEndStyle() { return mTradingDaysEndStyle; } /** * Set Trading Days End Style ... * * @param value: ENUM_LINE_STYLE member ... */ void TradingDaysEndStyle(ENUM_LINE_STYLE value) { mTradingDaysEndStyle = value; } // // Sessions ... /** * Get Detect Market Sessions State ... * * @return ( bool ) */ bool AllowMarketSessions() { return mAllowMarketSessions; } /** * Set Detect Market Sessions State ... * * @param value: Boolean ... */ void AllowMarketSessions(bool value) { mAllowMarketSessions = value; } /** * Get Draw Market Sessions State ... * * @return ( bool ) */ bool AllowDrawMarketSessions() { return mAllowDrawMarketSessions; } /** * Set Draw Market Sessions State ... * * @param value: Boolean ... */ void AllowDrawMarketSessions(bool value) { mAllowDrawMarketSessions = value; } /** * Get Session Working Hors ... * * @return ( int ) */ int SessionOpenHours() { return mSessionOpenHours; } /** * Set Session Working Hors ... * * @param value: Integer ... */ void SessionOpenHours(int value) { // if (value <= 0) { value = 9; } // mSessionOpenHours = value; } // // Swing High ... /** * Get Detect Swing Highs State ... * * @return ( bool ) */ bool AllowSwingHighs() { return mAllowSwingHighs; } /** * Set Detect Swing Highs State ... * * @param value: Boolean */ void AllowSwingHighs(bool value) { mAllowSwingHighs = value; } /** * Get Draw Swing Highs State ... * * @return ( bool ) */ bool AllowDrawSwingHighs() { return mAllowDrawSwingHighs; } /** * Set Draw Swing Highs State ... * * @param value: Boolean */ void AllowDrawSwingHighs(bool value) { mAllowDrawSwingHighs = value; } /** * Get Threshold Required for Swing High Detection ... * * @return ( double ) */ double SwingHighThreshold() { return mSwingHighThreshold; } /** * Set Threshold Required for Swing High Detection ... * * @param value: Double ... */ void SwingHighThreshold(double value) { // if (value < 0) { value = 0; } // mSwingHighThreshold = value; } // // Swing Low ... /** * Get Detect Swing Lows State ... * * @return ( bool ) */ bool AllowSwingLows() { return mAllowSwingLows; } /** * Set Detect Swing Lows State ... * * @param value: Boolean ... */ void AllowSwingLows(bool value) { mAllowSwingLows = value; } /** * Get Draw Swing Lows State ... * * @return ( bool ) */ bool AllowDrawSwingLows() { return mAllowDrawSwingLows; } /** * Set Draw Swing Lows State ... * * @param value: Boolean */ void AllowDrawSwingLows(bool value) { mAllowDrawSwingLows = value; } /** * Get Threshold Required for Swing Low Detection ... * * @return ( double ) */ double SwingLowThreshold() { return mSwingLowThreshold; } /** * Set Threshold Required for Swing Low Detection ... * * @param value: Double ... */ void SwingLowThreshold(double value) { // if (value < 0) { value = 0; } // mSwingLowThreshold = value; } // // Momentum Bars ... /** * Get Detect Momentum Bars State ... * * @return ( bool ) */ bool AllowMomentumBars() { return mAllowMomentumBars; } /** * Set Detect Momentum Bars State ... * * @param value: Boolean ... */ void AllowMomentumBars(bool value) { mAllowMomentumBars = value; } /** * Get Draw Momentum Bars State ... * * @return ( bool ) */ bool AllowDrawMomentumBars() { return mAllowDrawMomentumBars; } /** * Set Draw Momentum Bars State ... * * @param value: Boolean */ void AllowDrawMomentumBars(bool value) { mAllowDrawMomentumBars = value; } /** * Get Momentum Bar Percent ... * * @return ( int ) */ int MomentumBarPercent() { return mMomentumBarPercent; } /** * Set Momentum Bar Percent ... * * @param value: Integer */ void MomentumBarPercent(int value) { // if (value < 0) { value = 0; } // mMomentumBarPercent = value; } /** * Get Momentum Bar Sharp Ratio ... * * @return ( double ) */ double MomentumBarSharpRatio() { return mMomentumBarSharpRatio; } /** * Set Momentum Bar Sharp Ratio ... * * @param value: Double ... */ void MomentumBarSharpRatio(double value) { // if (value < 0) { value = 0; } // mMomentumBarSharpRatio = value; } /** * Get Momentum Bar Loopback ... * * @return ( int ) */ int MomentumBarLoopBack() { return mMomentumBarLoopBack; } /** * Set Momentum Bar Loopback ... * * @param value: Integer ... */ void MomentumBarLoopBack(int value) { // if (value < 0) { value = 0; } // mMomentumBarLoopBack = value; } // // Rejection Bars ... /** * Get Detect Rejection Bars State ... * * @return ( bool ) */ bool AllowRejectionBars() { return mAllowRejectionBars; } /** * Set Detect Rejection Bars State ... * * @param value: Boolean ... */ void AllowRejectionBars(bool value) { mAllowRejectionBars = value; } /** * Get Draw Rejection Bars State ... * * @return ( bool ) */ bool AllowDrawRejectionBars() { return mAllowDrawRejectionBars; } /** * Set Draw Rejection Bars State ... * * @param value: Boolean ... */ void AllowDrawRejectionBars(bool value) { mAllowDrawRejectionBars = value; } /** * Get Rejection Bar Percent ... * * @return ( int ) */ int RejectionBarPercent() { return mRejectionBarPercent; } /** * Set Rejection Bar Percent ... * * @param value: Integer */ void RejectionBarPercent(int value) { mRejectionBarPercent = value; } /** * Get Rejection Bar Sharp Ratio ... * * @return ( double ) */ double RejectionBarSharpRatio() { return mRejectionBarSharpRatio; } /** * Set Rejection Bar Sharp Ratio ... * * @param value: Double ... */ void RejectionBarSharpRatio(double value) { mRejectionBarSharpRatio = value; } /** * Get Rejection Bar Loopback ... * * @return ( int ) */ int RejectionBarLoopBack() { return mRejectionBarLoopBack; } /** * Set Rejection Bar Loopback ... * * @param value: Integer ... */ void RejectionBarLoopBack(int value) { mRejectionBarLoopBack = value; } // // Support Zone ... /** * Get Detect Support Zone State ... * * @return ( bool ) */ bool AllowSupportZones() { return mAllowSupportZones; } /** * Set Detect Support Zone State ... * * @param value: Boolean ... */ void AllowSupportZones(bool value) { mAllowSupportZones = value; } /** * Get Draw Support Zone State ... * * @return ( bool ) */ bool AllowDrawSupportZones() { return mAllowDrawSupportZones; } /** * Set Draw Support Zone State ... * * @param value: Boolean ... */ void AllowDrawSupportZones(bool value) { mAllowDrawSupportZones = value; } /** * Get Support Zone Loopback ... * * @return ( int ) */ int SupportZoneLoopBack() { return mSupportZoneLoopBack; } /** * Set Support Zone Loopback ... * * @param value: Integer ... */ void SupportZoneLoopBack(int value) { // if (value < 10) { value = 10; } // mSupportZoneLoopBack = value; } /** * Get Support Zone Price Type ... * * @return ( ENUM_LINE_STYLE ) */ ENUM_X_PRICE SupportZonePriceType() { return mSupportZonePriceType; } /** * Set Support Zone Price Type ... * * @param value: ENUM_X_PRICE member ... */ void SupportZonePriceType(ENUM_X_PRICE value) { mSupportZonePriceType = value; } // // Resistance Zone ... /** * Get Detect Resistance Zone State ... * * @return ( bool ) */ bool AllowResistanceZones() { return mAllowResistanceZones; } /** * Set Detect Resistance Zone State ... * * @param value: Boolean ... */ void AllowResistanceZones(bool value) { mAllowResistanceZones = value; } /** * Get Draw Resistance Zone State ... * * @return ( bool ) */ bool AllowDrawResistanceZones() { return mAllowDrawResistanceZones; } /** * Set Draw Resistance Zone State ... * * @param value: Boolean ... */ void AllowDrawResistanceZones(bool value) { mAllowDrawResistanceZones = value; } /** * Get Resistance Zone Loopback ... * * @return ( int ) */ int ResistanceZoneLoopBack() { return mResistanceZoneLoopBack; } /** * Set Resistance Zone Loopback ... * * @param value: Integer ... */ void ResistanceZoneLoopBack(int value) { // if (value < 10) { value = 10; } // mResistanceZoneLoopBack = value; } /** * Get Resistance Zone Price Type ... * * @return ( ENUM_LINE_STYLE ) */ ENUM_X_PRICE ResistanceZonePriceType() { return mResistanceZonePriceType; } /** * Set Resistance Zone Price Type ... * * @param value: ENUM_X_PRICE member ... */ void ResistanceZonePriceType(ENUM_X_PRICE value) { mResistanceZonePriceType = value; } // // Supply Zone ... /** * Get Detect Supply Zone State ... * * @return ( bool ) */ bool AllowSupplyZones() { return mAllowSupplyZones; } /** * Set Detect Supply Zone State ... * * @param value: Boolean ... */ void AllowSupplyZones(bool value) { mAllowSupplyZones = value; } /** * Get Draw Supply Zone State ... * * @return ( bool ) */ bool AllowDrawSupplyZones() { return mAllowDrawSupplyZones; } /** * Set Draw Supply Zone State ... * * @param value: Boolean ... */ void AllowDrawSupplyZones(bool value) { mAllowDrawSupplyZones = value; } /** * Get Supply Zone Detecting Period ... * * @return ( ENUM_TIMEFRAMES ) ... */ ENUM_TIMEFRAMES SupplyZonePeriod() { return mSupplyZonePeriod; } /** * Set Supply Zone Detecting Period ... * * @param value: ENUM_TIMEFRAMES member ... */ void SupplyZonePeriod(ENUM_TIMEFRAMES value) { mSupplyZonePeriod = value; } // // Demand Zone ... /** * Get Detect Demand Zone State ... * * @return ( bool ) */ bool AllowDemandZones() { return mAllowDemandZones; } /** * Set Detect Demand Zone State ... * * @param value: Boolean ... */ void AllowDemandZones(bool value) { mAllowDemandZones = value; } /** * Get Draw Demand Zone State ... * * @return ( bool ) */ bool AllowDrawDemandZones() { return mAllowDrawDemandZones; } /** * Set Draw Demand Zone State ... * * @param value: Boolean ... */ void AllowDrawDemandZones(bool value) { mAllowDrawDemandZones = value; } /** * Get Demand Zone Detecting Period ... * * @return ( ENUM_TIMEFRAMES ) ... */ ENUM_TIMEFRAMES DemandZonePeriod() { return mDemandZonePeriod; } /** * Set Demand Zone Detecting Period ... * * @param value: ENUM_TIMEFRAMES member ... */ void DemandZonePeriod(ENUM_TIMEFRAMES value) { mDemandZonePeriod = value; } // // Order Blocks ... // // Bullish Order Blocks ... /** * Get Detect Bullish Order Blocks State ... * * @return ( bool ) */ bool AllowBullishOrderBlocks() { return mAllowBullishOrderBlocks; } /** * Set Detect Bullish Order Blocks State ... * * @param value: Boolean ... */ void AllowBullishOrderBlocks(bool value) { mAllowBullishOrderBlocks = value; } /** * 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 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 Detect Bearish Order Blocks State ... * * @return ( bool ) */ bool AllowBearishOrderBlocks() { return mAllowBearishOrderBlocks; } /** * Set Detect Bearish Order Blocks State ... * * @param value: Boolean ... */ void AllowBearishOrderBlocks(bool value) { mAllowBearishOrderBlocks = value; } /** * 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 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; } // // Fair Value Gaps ... // // Bullis FVGs ... /** * Get Detect Bullish Fair Value Gaps State ... * * @return ( bool ) */ bool AllowBullishFVGs() { return mAllowBullishFVGs; } /** * Set Detect Bullish Fair Value Gaps State ... * * @param value: Boolean ... */ void AllowBullishFVGs(bool value) { mAllowBullishFVGs = value; } /** * Get Draw Bullish Fair Value Gaps ... * * @return ( bool ) */ bool AllowDrawBullishFVGs() { return mAllowDrawBullishFVGs; } /** * Set Draw Bullish Fair Value Gaps ... * * @param value: Boolean ... */ void AllowDrawBullishFVGs(bool value) { mAllowDrawBullishFVGs = value; } /** * Get Bullish FVG Force Middle Bar Check ... * * @return ( bool ) */ bool BullishFVGForceMiddleBarCheck() { return mBullishFVGForceMiddleBarCheck; } /** * Set Bullish FVG Force Middle Bar Check ... * * @param value: Boolean ... */ void BullishFVGForceMiddleBarCheck(bool value) { mBullishFVGForceMiddleBarCheck = value; } /** * Get Bullish FVG Force Check Last Bar Direction ... * * @return ( bool ) */ bool BullishFVGForceCheckLastBarDirection() { return mBullishFVGForceCheckLastBarDirection; } /** * Set Bullish FVG Force Check Last Bar Direction ... * * @param value: Boolean ... */ void BullishFVGForceCheckLastBarDirection(bool value) { mBullishFVGForceCheckLastBarDirection = value; } // // Bearish FVGs ... /** * Get Detect Bearish Fair Value Gaps State ... * * @return ( bool ) */ bool AllowBearishFVGs() { return mAllowBearishFVGs; } /** * Set Detect Bearish Fair Value Gaps State ... * * @param value: Boolean ... */ void AllowBearishFVGs(bool value) { mAllowBearishFVGs = value; } /** * Get Draw Bearish Fair Value Gaps ... * * @return ( bool ) */ bool AllowDrawBearishFVGs() { return mAllowDrawBearishFVGs; } /** * Set Draw Bearish Fair Value Gaps ... * * @param value: Boolean ... */ void AllowDrawBearishFVGs(bool value) { mAllowDrawBearishFVGs = value; } /** * Get Bearish FVG Force Middle Bar Check ... * * @return ( bool ) */ bool BearishFVGForceMiddleBarCheck() { return mBearishFVGForceMiddleBarCheck; } /** * Set Bearish FVG Force Middle Bar Check ... * * @param value: Boolean ... */ void BearishFVGForceMiddleBarCheck(bool value) { mBearishFVGForceMiddleBarCheck = value; } /** * Get Bearish FVG Force Check Last Bar Direction ... * * @return ( bool ) */ bool BearishFVGForceCheckLastBarDirection() { return mBearishFVGForceCheckLastBarDirection; } /** * Set Bearish FVG Force Check Last Bar Direction ... * * @param value: Boolean ... */ void BearishFVGForceCheckLastBarDirection(bool value) { mBearishFVGForceCheckLastBarDirection = value; } // // Actions ... /** * Initialize POI Detector ... */ void Init() { // // Detect Previous POI(s) ... DetectRequiredPOIs(); } /** * Update POI(s) ... * * @param state: an Array Refrence of ENUM_XPOI_EVENTS members ... */ int Update( ENUM_XPOI_EVENTS &state[] // ) { // int result = 0; // Clean(state); // // Check Bar Tracker if Waits ... if (!mBarTracker.IsNewBar()) { return result; } // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; // datetime cTime = TimeCurrent(); // XOHCL zBar; bool isInited = zBar.Init( mSymbol, mPeriod, zIndex // ); if (!isInited) { return result; } // XOHCL cBar; isInited = cBar.Init( mSymbol, mPeriod, cIndex // ); if (!isInited) { return result; } // XOHCL pBar; isInited = pBar.Init( mSymbol, mPeriod, pIndex // ); if (!isInited) { return result; } // XOHCL zDayBar; isInited = zDayBar.Init( mSymbol, PERIOD_D1, zIndex // ); if (!isInited) { return result; } // // Trading Days ... // bool allowTradingDays = AllowTradingDays(); int tradingDaysCount = ArraySize(mTradingDays); if (allowTradingDays) { // int tradingDayIDX = HasTradeDay(zDayBar.time); if (IsValidIndex(tradingDayIDX)) { // if (zBar.time == mTradingDays[tradingDayIDX].to) { // ENUM_XPOI_EVENTS event = X_TRADE_DAY_LAST_BAR; Add( event, state // ); OnTradingDayEvent(event); NotifyTradingDayEventListeners(event); } } else { // // there isn't any Trading Day ... // create one ... // XTradeDay tradeDay; tradeDay.from = zDayBar.time; tradeDay.to = zDayBar.GetLastBarTimeOfPeriod(mPeriod); // AddRef( tradeDay, mTradingDays // ); // DrawTradingDays(); // // Notfy Day Started ... if (zBar.time == zDayBar.time) { // Add( X_TRADE_DAY_FIRST_BAR, state // ); OnTradingDayEvent(X_TRADE_DAY_FIRST_BAR); NotifyTradingDayEventListeners(X_TRADE_DAY_FIRST_BAR); } } } // // Market Session ... // bool allowMarketSessions = AllowMarketSessions(); int marketSessionsCount = ArraySize(mMarketSessions); if (allowMarketSessions) { // int sessionsCount = ArraySize(mSessions); bool isSessionFound = false; if (IsValidSize(sessionsCount)) { // for (int i = 0; i < sessionsCount; i++) { // XSession iSession = mSessions[i]; int marketSessionIDX = HasMarketSessionByStartTime( iSession.session, zBar.time // ); // if (!IsValidIndex(marketSessionIDX)) { // datetime zTimeGMT = GetUTCTime(zBar.time); string zTimeString = GetTimeString(zTimeGMT); // bool isStarted = iSession.start == zTimeString; // if (isStarted) { // XMarketSession iMarketSession; iMarketSession.session = iSession.session; iMarketSession.from = zBar.time; // int iSessionWorkingHoure = SessionOpenHours(); int iSessionWorkingSeconds = iSessionWorkingHoure * 60 * 60; iMarketSession.to = (datetime)((int)zBar.time + iSessionWorkingSeconds); // isSessionFound = AddRef( iMarketSession, mMarketSessions // ); // marketSessionsCount = ArraySize(mMarketSessions); // DrawMarketSessions(); // Add( X_SESSION_FIRST_BAR, state // ); OnMarketSessionEvent( iMarketSession.session, X_SESSION_FIRST_BAR // ); NotifyMarketSessionEventListeners( iMarketSession.session, X_SESSION_FIRST_BAR // ); } } // // Check End Time for Last Bar ... for (int i = 0; i < marketSessionsCount; i++) { // XMarketSession iMarketSession = mMarketSessions[i]; // // Calculate Last Bar Time ... datetime endTime = iMarketSession.to; datetime lastBarTime = (datetime)((int)endTime - PeriodSeconds(mPeriod)); if (zBar.time == lastBarTime) { // ENUM_XPOI_EVENTS event = X_SESSION_LAST_BAR; Add( event, state // ); OnMarketSessionEvent( iMarketSession.session, event // ); NotifyMarketSessionEventListeners( iMarketSession.session, event // ); } } } } } // // Swing Highs and Lows ... // // Swing Highs ... // bool allowSwingHighs = AllowSwingHighs(); int swingHighsCount = ArraySize(mSwingHighs); if (allowSwingHighs) { // bool isSingHigh = pBar.IsSimpleSwingHigh(SwingHighThreshold()); if (isSingHigh) { // bool isAdded = AddBar( X_POI_SWING_HIGH, pBar, mSwingHighs // ); // if (isAdded) { // swingHighsCount = ArraySize(mSwingHighs); DrawSwingHighs(); // ENUM_XPOI_EVENTS event = X_SWING_HIGH_DETECTED; Add( event, state // ); OnSwingHighEvent(event, pBar); NotifySwingHighEventListeners(event, pBar); } } } // // Swing Lows ... // bool allowSwingLows = AllowSwingLows(); int swingLowsCount = ArraySize(mSwingLows); if (allowSwingLows) { // bool isSingLow = pBar.IsSimpleSwingLow(SwingLowThreshold()); if (isSingLow) { // bool isAdded = AddBar( X_POI_SWING_LOW, pBar, mSwingLows // ); // if (isAdded) { // swingLowsCount = ArraySize(mSwingLows); DrawSwingLows(); // ENUM_XPOI_EVENTS event = X_SWING_LOW_DETECTED; Add( event, state // ); OnSwingLowEvent(event, pBar); NotifySwingLowEventListeners(event, pBar); } } } // // Momentum Bars ... // bool allowMomentumBars = AllowMomentumBars(); int momentumBarsCount = ArraySize(mMomentumBars); if (allowMomentumBars) { // bool isStrongBar = cBar.IsStrong(MomentumBarPercent()); bool isSharpBullish = cBar.IsSharpBullish( MomentumBarLoopBack(), MomentumBarSharpRatio() // ); bool isSharpBearish = cBar.IsSharpBearish( MomentumBarLoopBack(), MomentumBarSharpRatio() // ); bool isMomentumBar = isStrongBar && (isSharpBearish || isSharpBullish); if (isMomentumBar) { // bool isAdded = AddBar( X_POI_MOMENTUM_BAR, cBar, mMomentumBars // ); // if (isAdded) { // momentumBarsCount = ArraySize(mMomentumBars); DrawMomentumBars(); // ENUM_XPOI_EVENTS event = X_MOMENTUM_BAR_DETECTED; Add( event, state // ); OnMomentumBarEvent(event, cBar); NotifyMomentumBarEventListeners(event, cBar); } } } // // Rejection Bars ... // bool allowRejectionBars = AllowRejectionBars(); int rejectionBarsCount = ArraySize(mRejectionBars); if (allowRejectionBars) { // int rejectionBarLoopBackBarIndex = RejectionBarLoopBack() + 1; XOHCL iRBar; bool isIRBarInited = iRBar.Init( mSymbol, mPeriod, rejectionBarLoopBackBarIndex // ); if (isIRBarInited) { // bool isRejectionBar = iRBar.HasStrongLowShadow( RejectionBarPercent(), RejectionBarLoopBack(), RejectionBarSharpRatio() // ) || iRBar.HasStrongHighShadow( RejectionBarPercent(), RejectionBarLoopBack(), RejectionBarSharpRatio() // ); if (isRejectionBar) { // bool isAdded = AddBar( X_POI_REJECTION_BAR, iRBar, mRejectionBars // ); // if (isAdded) { // rejectionBarsCount = ArraySize(mRejectionBars); DrawRejectionBars(); // ENUM_XPOI_EVENTS event = X_REJECTION_BAR_DETECTED; Add( event, state // ); OnRejectionBarEvent(event, iRBar); NotifyRejectionBarEventListeners(event, iRBar); } } } } // // Support and Resistance Zones ... // // Support Zones ... // bool allowSupportZones = AllowSupportZones(); int supportZonesCount = ArraySize(mSupportZones); if (allowSupportZones) { // XOHCL support; bool hasSupport = cBar.HasSupport( support, SupportZonePriceType(), SupportZoneLoopBack() // ); if (hasSupport) { // bool isAdded = AddBar( X_POI_SUPPORT_ZONE, support, mSupportZones // ); // if (isAdded) { // supportZonesCount = ArraySize(mSupportZones); DrawSupportZones(); // ENUM_XPOI_EVENTS event = X_SUPPORT_ZONE_DETECTED; Add( event, state // ); OnSupportZoneEvent(event, support); NotifySupportZoneEventListeners(event, support); } } } // // Resistance Zone ... // bool allowResistanceZones = AllowResistanceZones(); int resistanceZonesCount = ArraySize(mResistanceZones); if (allowResistanceZones) { // XOHCL resistance; bool hasResistance = cBar.HasResistance( resistance, ResistanceZonePriceType(), ResistanceZoneLoopBack() // ); if (hasResistance) { // bool isAdded = AddBar( X_POI_RESISTANCE_ZONE, resistance, mResistanceZones // ); // if (isAdded) { // resistanceZonesCount = ArraySize(mResistanceZones); DrawResistanceZones(); // ENUM_XPOI_EVENTS event = X_RESISTANCE_ZONE_DETECTED; Add( event, state // ); OnResistanceZoneEvent(event, resistance); NotifyResistanceZoneEventListeners(event, resistance); } } } // // Supply and Demand Zones ... // // Supply Zones ... // bool allowSupplyZones = AllowSupplyZones(); int supplyZonesCount = ArraySize(mSupplyZones); if (allowSupplyZones) { // datetime endTime = cBar.time; XOHCL cSupplyBar; bool isSupplyBarInited = cSupplyBar.Init( mSymbol, SupplyZonePeriod(), 0 // ); if (isSupplyBarInited) { // datetime lastSupplyBarTime = cSupplyBar .GetLastBarTimeOfPeriod(mPeriod); if (zBar.time == lastSupplyBarTime) { // datetime startTime = cSupplyBar.time; int cSupplyZonePeriodIndex = iBarShift( mSymbol, mPeriod, cSupplyBar.time // ); // // Find Swings ... XOHCL swings[]; for (int i = 0; i < cSupplyZonePeriodIndex; i++) { // XOHCL iBar; bool isIBarInited = iBar.Init( mSymbol, mPeriod, i // ); if (!isIBarInited) { continue; } // // Check is Bar Swing or not ... bool isSwing = iBar.IsSimpleSwingHigh(); if (!isSwing) { continue; } // AddRef( iBar, swings // ); } // // Select Max Swing for Supply Zone ... XOHCL selectedSwing; int swingsCount = ArraySize(swings); if (IsValidSize(swingsCount)) { // for (int i = 0; i < swingsCount; i++) { // XOHCL iSwing = swings[i]; if (!selectedSwing.IsValid() || selectedSwing.high < iSwing.high) { selectedSwing = iSwing; } } } // // Check Swing ... if (selectedSwing.IsValid()) { // XZone zone; bool isInited = zone.Init( selectedSwing.high, selectedSwing.low, ToString(X_POI_SUPPLY_ZONE) + "_" + ToString(SupplyZonePeriod()), startTime, endTime // ); if (isInited) { // int zoneIDX = FindZoneIndex( zone, mSupplyZones // ); // if (!IsValidIndex(zoneIDX)) { // AddRef( zone, mSupplyZones // ); // supplyZonesCount = ArraySize(mSupplyZones); DrawSupplyZones(); // ENUM_XPOI_EVENTS event = X_SUPPLY_ZONE_DETECTED; Add( event, state // ); OnSupplyZoneEvent(event, zone); NotifySupplyZoneEventListeners(event, zone); } } } } } } // // Demand Zones ... // bool allowDemandZones = AllowDemandZones(); int demandZonesCount = ArraySize(mDemandZones); if (allowDemandZones) { // datetime endTime = cBar.time; XOHCL cDemandBar; bool isDemandBarInited = cDemandBar.Init( mSymbol, DemandZonePeriod(), 0 // ); if (isDemandBarInited) { // datetime lastDemandBarTime = cDemandBar .GetLastBarTimeOfPeriod(mPeriod); if (zBar.time == lastDemandBarTime) { // datetime startTime = cDemandBar.time; int cDemandZonePeriodIndex = iBarShift( mSymbol, mPeriod, cDemandBar.time // ); // // Find Swings ... XOHCL swings[]; for (int i = 0; i < cDemandZonePeriodIndex; i++) { // XOHCL iBar; bool isIBarInited = iBar.Init( mSymbol, mPeriod, i // ); if (!isIBarInited) { continue; } // // Check is Bar Swing or not ... bool isSwing = iBar.IsSimpleSwingLow(); if (!isSwing) { continue; } // AddRef( iBar, swings // ); } // // Select Max Swing for Supply Zone ... XOHCL selectedSwing; int swingsCount = ArraySize(swings); if (IsValidSize(swingsCount)) { // for (int i = 0; i < swingsCount; i++) { // XOHCL iSwing = swings[i]; if (!selectedSwing.IsValid() || selectedSwing.low > iSwing.low) { selectedSwing = iSwing; } } } // // Check Swing ... if (selectedSwing.IsValid()) { // XZone zone; bool isInited = zone.Init( selectedSwing.high, selectedSwing.low, ToString(X_POI_DEMAND_ZONE) + "_" + ToString(SupplyZonePeriod()), startTime, endTime // ); if (isInited) { // int zoneIDX = FindZoneIndex( zone, mDemandZones // ); // if (!IsValidIndex(zoneIDX)) { // AddRef( zone, mDemandZones // ); // demandZonesCount = ArraySize(mDemandZones); DrawDemandZones(); // ENUM_XPOI_EVENTS event = X_DEMAND_ZONE_DETECTED; Add( event, state // ); OnDemandZoneEvent(event, zone); NotifyDemandZoneEventListeners(event, zone); } } } } } } // // Order Blocks ... // // Bullish Order Blocks ... // bool allowBullishOrderBlocks = AllowBullishOrderBlocks(); int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); if (allowBullishOrderBlocks) { // XOHCL bullOB; bool hasBullOB = cBar.HasBullishOrderBlock( bullOB, RequiredBarsForBullishOrderBlock() // ); if (hasBullOB) { // XZone obZone; bool isAdded = AddZone( 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 ... // bool allowBearishOrderBlocks = AllowBearishOrderBlocks(); int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks); if (allowBearishOrderBlocks) { // XOHCL bearOB; bool hasBearOB = cBar.HasBearishOrderBlock( bearOB, RequiredBarsForBearishOrderBlock() // ); if (hasBearOB) { // XZone zone; bool isAdded = AddZone( 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); } } } // // Fair Value Gaps ... double upper; double lower; datetime start; datetime end; // // Bullish FVGs ... bool allowBullishFVGs = AllowBullishFVGs(); int bullishFVGsCount = ArraySize(mBullishFVGs); if (allowBullishFVGs) { // bool hasBullishFVG = cBar.HasBullishFVG( upper, lower, start, end, BullishFVGForceMiddleBarCheck(), BullishFVGForceCheckLastBarDirection() // ); if (hasBullishFVG) { // XZone zone; bool isAdded = AddZone( zone, upper, lower, start, end, X_POI_BULLISH_FVG, mBullishFVGs // ); if (isAdded) { // bullishFVGsCount = ArraySize(mBullishFVGs); DrawBullishFVGs(); // ENUM_XPOI_EVENTS event = X_BULLISH_FVG_DETECTED; Add( event, state // ); OnBullishFVGEvent(event, zone); NotifyBullishFVGEventListeners(event, zone); } } } // // Bearish FVGs ... bool allowBearishFVGs = AllowBearishFVGs(); int bearishFVGsCount = ArraySize(mBearishFVGs); if (allowBearishFVGs) { // bool hasBearishFVG = cBar.HasBearishFVG( upper, lower, start, end, BearishFVGForceMiddleBarCheck(), BearishFVGForceCheckLastBarDirection() // ); if (hasBearishFVG) { // XZone zone; bool isAdded = AddZone( zone, upper, lower, start, end, X_POI_BEARISH_FVG, mBearishFVGs // ); if (isAdded) { // bearishFVGsCount = ArraySize(mBearishFVGs); DrawBearishFVGs(); // ENUM_XPOI_EVENTS event = X_BEARISH_FVG_DETECTED; Add( event, state // ); OnBearishFVGEvent(event, zone); NotifyBearishFVGEventListeners(event, zone); } } } // // ... // CleanupUnusedPOIs(); // mBarTracker.Waits(); // result = ArraySize(state); // return result; } /** * Enable All POIs Detection ... */ void EnablePOIs() { ChangePOIsState(true); } /** * Disable All POIs Detection ... */ void DisablePOIs() { ChangePOIsState(false); } /** * Set All POIs Detection States ... * * @param state: Argument 1 */ void ChangePOIsState(bool state) { // AllowSwingLows(state); AllowSwingHighs(state); AllowTradingDays(state); AllowSupplyZones(state); AllowDemandZones(state); AllowBullishFVGs(state); AllowBearishFVGs(state); AllowMomentumBars(state); AllowSupportZones(state); AllowRejectionBars(state); AllowMarketSessions(state); AllowResistanceZones(state); AllowBullishOrderBlocks(state); AllowBearishOrderBlocks(state); } /** * Enable Draw All POI(s) ... */ void EnableDrawPOIs() { ChangePOIsDrawState(true); } /** * Disable Draw All POI(s) ... */ void DisableDrawPOIs() { ChangePOIsDrawState(false); } /** * Set Drawing State of all POIs ... * * @param state: Boolean ... */ void ChangePOIsDrawState(bool state) { // AllowDrawSwingLows(state); AllowDrawSwingHighs(state); AllowDrawTradingDays(state); AllowDrawSupplyZones(state); AllowDrawBullishFVGs(state); AllowDrawBearishFVGs(state); AllowDrawDemandZones(state); AllowDrawSupportZones(state); AllowDrawMomentumBars(state); AllowDrawRejectionBars(state); AllowDrawMarketSessions(state); AllowDrawResistanceZones(state); AllowDrawBullishOrderBlocks(state); AllowDrawBearishOrderBlocks(state); // // Sessions ... int sessionsCount = ArraySize(mSessions); if (IsValidSize(sessionsCount)) { // for (int i = 0; i < sessionsCount; i++) { // mSessions[i].allowDraw = state; } } } // // Retrievers ... /** * Get Current State of POIs ... * * @param state: XPOIState instance ... */ void GetState( XPOIState &state // ) { // state.Clean(); // state.symbol = mSymbol; state.period = mPeriod; state.reportedAt = TimeCurrent(); // state.FillTradingDays(mTradingDays); state.FillMarketSessions(mMarketSessions); // state.FillMomentumBars(mMomentumBars); state.FillRejectionBars(mRejectionBars); // state.FillSwingHighs(mSwingHighs); state.FillSwingLows(mSwingLows); // state.FillSupportZones(mSupportZones); state.FillResistanceZones(mResistanceZones); // state.FillSupplyZones(mSupplyZones); state.FillDemandZones(mDemandZones); // state.FillBullishOrderBlocks(mBullishOrderBlocks); state.FillBearishOrderBlocks(mBearishOrderBlocks); // state.FillBullishFVGs(mBullishFVGs); state.FillBearishFVGs(mBearishFVGs); } // // Virtual Actions ... /** * Apply Default Configurations ... */ virtual void ApplyDefaultConfig() { // // Common ... // ChartIdentification(0); SubWindowIdentification(0); mDrawer.ChartIdentification(0); mDrawer.SubWindowIdentification(0); // MaxNumberOfPOIs(10); MaxNumberOfRequiredPOIs(2); // EnablePOIs(); EnableDrawPOIs(); // // Trading Days ... TradingDaysStartColor(clrYellow); TradingDaysStartStyle(STYLE_DASHDOT); TradingDaysEndColor(clrGray); TradingDaysEndStyle(STYLE_DASHDOT); // // Sessions ... // // SYDNEY ... // Start: (UTC) 21:00 // End: (UTC) 06:00 XSession mSyndeySession; mSyndeySession.Init( X_SYDNEY, "20:00", // Start ... "05:00" // End Next Day ... ); mSyndeySession.startColor = clrFireBrick; mSyndeySession.endColor = clrFireBrick; mSyndeySession.allowDraw = true; AddSession(mSyndeySession); // // TOKYO ... // Start: (UTC) 12:00 // End: (UTC) 09:00 XSession mTokyoSession; mTokyoSession.Init( X_TOKYO, "00:00", // Start ... "09:00" // End Next Day ... ); mTokyoSession.startColor = clrBlueViolet; mTokyoSession.endColor = clrBlueViolet; mTokyoSession.allowDraw = true; AddSession(mTokyoSession); // // LONDON ... // Start: (UTC) 07:00 // End: (UTC) 16:00 XSession mLondonSession; mLondonSession.Init( X_LONDON, "07:00", // Start ... "16:00" // End ... ); mLondonSession.startColor = clrLime; mLondonSession.endColor = clrLime; mLondonSession.allowDraw = true; AddSession(mLondonSession); // // NEWYORK ... // Start: (UTC) 13:00 // End: (UTC) 22:00 XSession mNewYorkSession; mNewYorkSession.Init( X_NEW_YORK, "12:00", // Start ... "21:00" // End ... ); mNewYorkSession.startColor = clrAqua; mNewYorkSession.endColor = clrAqua; mNewYorkSession.allowDraw = true; AddSession(mNewYorkSession); // SessionOpenHours(9); // // Swing High and Low (s) ... // // Swing Highs ... SwingHighThreshold(3); mDrawer.SwingHighWidth(5); mDrawer.SwingHighArrow(108); mDrawer.SwingHighColor(clrMagenta); // // Swing Lows ... SwingLowThreshold(3); mDrawer.SwingLowWidth(5); mDrawer.SwingLowArrow(108); mDrawer.SwingLowColor(clrAqua); // // Momentum Bars ... MomentumBarPercent(55); MomentumBarLoopBack(3); MomentumBarSharpRatio(1.2); mDrawer.BullishMomentumBarWidth(5); mDrawer.BearishMomentumBarWidth(5); mDrawer.BullishMomentumBarArrow(225); mDrawer.BearishMomentumBarArrow(226); mDrawer.BullishMomentumBarColor(clrAqua); mDrawer.BearishMomentumBarColor(clrMagenta); // // Rejection Bars ... RejectionBarPercent(55); RejectionBarLoopBack(5); RejectionBarSharpRatio(1.5); mDrawer.BullishRejectionBarWidth(5); mDrawer.BearishRejectionBarWidth(5); mDrawer.BullishRejectionBarArrow(217); mDrawer.BearishRejectionBarArrow(218); mDrawer.BullishRejectionBarColor(clrAqua); mDrawer.BearishRejectionBarColor(clrMagenta); // // Support and Resistance Zones ... // // Support Zones ... SupportZoneLoopBack(52); SupportZonePriceType(X_PRICE_CLOSE); mDrawer.SupportZoneWidth(1); mDrawer.SupportZoneColor(clrLime); mDrawer.SupportZoneStyle(STYLE_DOT); // // Resistance Zones ... ResistanceZoneLoopBack(52); ResistanceZonePriceType(X_PRICE_CLOSE); mDrawer.ResistanceZoneWidth(1); mDrawer.ResistanceZoneColor(clrRed); mDrawer.ResistanceZoneStyle(STYLE_DOT); // // Supply and Deman Zones ... // // Supply Zones ... SupplyZonePeriod(GetHindMostPeriod(mPeriod)); mDrawer.SupplyZoneWidth(1); mDrawer.SupplyZoneColor(clrDarkRed); mDrawer.SupplyZoneStyle(STYLE_DASH); // // Demand Zones ... DemandZonePeriod(GetHindMostPeriod(mPeriod)); mDrawer.DemandZoneWidth(1); mDrawer.DemandZoneColor(clrDarkGreen); mDrawer.DemandZoneStyle(STYLE_DASH); // // Order Blocks ... // // Bullish Order Block ... RequiredBarsForBullishOrderBlock(3); mDrawer.BullishOrderBlockWidth(1); mDrawer.BullishOrderBlockColor(clrAqua); mDrawer.BullishOrderBlockStyle(STYLE_DASHDOT); // // Bearish Order Block ... RequiredBarsForBearishOrderBlock(3); mDrawer.BearishOrderBlockWidth(1); mDrawer.BearishOrderBlockColor(clrMagenta); mDrawer.BearishOrderBlockStyle(STYLE_DASHDOT); // // Fair Value Gaps ... // // Bullish FVGs ... BullishFVGForceMiddleBarCheck(true); BullishFVGForceCheckLastBarDirection(true); mDrawer.BullishFVGWidth(1); mDrawer.BullishFVGColor(clrAqua); mDrawer.BullishFVGStyle(STYLE_DASHDOTDOT); // // Bearish FVGs ... BearishFVGForceMiddleBarCheck(true); BearishFVGForceCheckLastBarDirection(true); mDrawer.BearishFVGWidth(1); mDrawer.BearishFVGColor(clrMagenta); mDrawer.BearishFVGStyle(STYLE_DASHDOTDOT); // } // // Session Configurations ... /** * Add Sepcific Session to Supported Sessions ... * * @param session: XSession instance ... */ void AddSession(XSession &session) { // if (!session.IsValid()) { return; } // AddRef( session, mSessions // ); } // // Event Listeners ... // // Trading Days ... /** * Calls When new Trading Day Event Happens ... * * @param event: ENUM_XPOI_EVENTS member ... */ virtual void OnTradingDayEvent( ENUM_XPOI_EVENTS event // ) { } /** * Register an Event Listener for New Trading Day Events ... * * @param listener: TXPOIEventHandler instance ... */ void AddTradingDayEventListener(TXPOIEventHandler listener) { // Add( listener, mTradingDayEventListeners // ); } // // Market Sessions ... /** * Calls When new Market Session Event Happens ... * * @param session: ENUM_XSESSION member ... * @param event: ENUM_XPOI_EVENTS member ... */ virtual void OnMarketSessionEvent( ENUM_XSESSION session, ENUM_XPOI_EVENTS event // ) { } /** * Register an Event Listener for New Market Session Events ... * * @param listener: TXSessionEventHandler instance ... */ void AddMarketSessionEventListener(TXSessionEventHandler listener) { // Add( listener, mMarketSessionEventListeners // ); } // // Swings ... // // Swing Highs ... /** * Calls When new Swing High Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnSwingHighEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Swing High Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddSwingHighEventListener(TXOHCLEventHandler listener) { // Add( listener, mSwingHighEventListeners // ); } // // Swing Lows ... /** * Calls When new Swing Low Detected ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnSwingLowEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Swing Low Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddSwingLowEventListener(TXOHCLEventHandler listener) { // Add( listener, mSwingLowEventListeners // ); } // // Momentum Bar ... /** * Calls When new Momentum Bar Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnMomentumBarEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Momentum Bar Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddMomentumBarEventListener(TXOHCLEventHandler listener) { // Add( listener, mMomentumBarEventListeners // ); } // // Rejection Bar ... /** * Calls When new Rejection Bar Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnRejectionBarEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Rejection Bar Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddRejectionBarEventListener(TXOHCLEventHandler listener) { // Add( listener, mRejectionBarEventListeners // ); } // // Support and Resistance Zones ... // // Support Zones ... /** * Calls When new Support Zone Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnSupportZoneEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Support Zone Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddSupportZoneEventListener(TXOHCLEventHandler listener) { // Add( listener, mSupportZoneEventListeners // ); } // // Resistance Zones ... /** * Calls When new Resistance Zone Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ virtual void OnResistanceZoneEvent( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { } /** * Register an Event Listener for New Resistance Zone Event ... * * @param listener: TXOHCLEventHandler instance ... */ void AddResistanceZoneEventListener(TXOHCLEventHandler listener) { // Add( listener, mResistanceZoneEventListeners // ); } // // Supply and Demand Zones ... // // Supply Zones ... /** * Calls When new Supply Zone Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param zone: XZone instance ... */ virtual void OnSupplyZoneEvent( ENUM_XPOI_EVENTS event, XZone &zone // ) { } /** * Register an Event Listener for New Supply Zone Event ... * * @param listener: TXZoneEventHandler instance ... */ void AddSupplyZoneEventListener(TXZoneEventHandler listener) { // Add( listener, mSupplyZoneEventListeners // ); } // // Demand Zones ... /** * Calls When new Demand Zone Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param zone: XZone instance ... */ virtual void OnDemandZoneEvent( ENUM_XPOI_EVENTS event, XZone &zone // ) { } /** * Register an Event Listener for New Demand Zone Event ... * * @param listener: TXZoneEventHandler instance ... */ 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 // ); } // // Fai Value Gaps ... // // Bullish FVGs ... /** * Calls When new Bullish FVG Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param zone: XZone instance ... */ virtual void OnBullishFVGEvent( ENUM_XPOI_EVENTS event, XZone &zone // ) { } /** * Register an Event Listener for New Bullish FVG Event ... * * @param listener: TXZoneEventHandler instance ... */ void AddBullishFVGEventListener(TXZoneEventHandler listener) { // Add( listener, mBullishFVGEventListeners // ); } // // Bearish FVGs ... /** * Calls When new Bearish FVG Event ... * * @param event: ENUM_XPOI_EVENTS member ... * @param zone: XZone instance ... */ virtual void OnBearishFVGEvent( ENUM_XPOI_EVENTS event, XZone &zone // ) { } /** * Register an Event Listener for New Bearish FVG Event ... * * @param listener: TXZoneEventHandler instance ... */ void AddBearishFVGEventListener(TXZoneEventHandler listener) { // Add( listener, mBearishFVGEventListeners // ); } // protected: // // // Actions ... /** * Lock ... */ void Lock() { mLock = true; } /** * Unlock ... */ void Unlock() { mLock = false; } /** * Detect Required POI(s) ... * * @param barIndex: Integer Start bar index ... * 0 is Default ... */ void DetectRequiredPOIs(int barIndex = 0) { // // Validate Reuired POI(s) ... int requiredPOIs = MaxNumberOfRequiredPOIs(); if (requiredPOIs <= 0) { return; } // Lock(); // // Normalize Bar Index ... if (barIndex < 0) { barIndex = 0; } // bool canContinue = true; while (canContinue) { // // Define Index of Bars ... int zIndex = barIndex; int cIndex = zIndex + 1; // datetime cTime = TimeCurrent(); // XOHCL zBar; bool isRetrieved = mBarTracker.GetBar(zBar, zIndex); if (!isRetrieved) { break; } // XOHCL cBar; isRetrieved = mBarTracker.GetBar(cBar, cIndex); if (!isRetrieved) { break; } // // Detect POI(s) based On Current Bar ... // // Trade Days ... bool allowTradingDays = AllowTradingDays(); int daysCount = ArraySize(mTradingDays); if (allowTradingDays && daysCount < requiredPOIs) { // XOHCL zDayBar; isRetrieved = zDayBar.Init( mSymbol, PERIOD_D1, zIndex // ); if (!isRetrieved) { break; } // XOHCL cDayBar; isRetrieved = cDayBar.Init( mSymbol, PERIOD_D1, cIndex // ); if (!isRetrieved) { break; } // XTradeDay tradeDay; tradeDay.from = zDayBar.time; // datetime lastBarTime = zDayBar.GetLastBarTimeOfPeriod(mPeriod); tradeDay.to = lastBarTime; // int idx = HasTradeDay(tradeDay.from); if (!IsValidIndex(idx)) { // AddRef( tradeDay, mTradingDays // ); // daysCount = ArraySize(mTradingDays); } } // // Market Sessions ... int sessionsCount = ArraySize(mSessions); bool allowMarketSessions = AllowMarketSessions(); int marketSessionsCount = ArraySize(mMarketSessions); if (allowMarketSessions && IsValidSize(sessionsCount) && marketSessionsCount < sessionsCount * requiredPOIs) { // for (int i = 0; i < sessionsCount; i++) { // XSession iSession = mSessions[i]; int iCount = CountMarketSessions(iSession.session); if (iCount >= requiredPOIs) { continue; } // datetime zTimeGMT = GetUTCTime(zBar.time); string zTimeString = GetTimeString(zTimeGMT); // bool isStarted = iSession.start == zTimeString; bool isEnded = iSession.end == zTimeString; // // Detect Sessions Based on Time ... // Since All Session Close Times Related to Current Date and // in Required POIs we Moving Back from Current Date ... if (isEnded && iCount < requiredPOIs) { // // Check Market Session Doesnt Exists by End Time ... int iIDX = HasMarketSessionByEndTime( iSession.session, zBar.time // ); if (!IsValidIndex(iIDX)) { // XMarketSession iMarketSession; iMarketSession.session = iSession.session; iMarketSession.to = zBar.time; // int iSessionWorkingHoure = SessionOpenHours(); int iSessionWorkingSeconds = iSessionWorkingHoure * 60 * 60; iMarketSession.from = (datetime)((int)zBar.time - iSessionWorkingSeconds); // AddRef( iMarketSession, mMarketSessions // ); // marketSessionsCount = ArraySize(mMarketSessions); } } // } } // // Swning Highs and Lows ... // // Swing Highs ... bool allowSwingHighs = AllowSwingHighs(); int swingHighsCount = ArraySize(mSwingHighs); if (allowSwingHighs && swingHighsCount < requiredPOIs) { // bool isSwingHigh = cBar.IsSimpleSwingHigh(SwingHighThreshold()); if (isSwingHigh) { // bool isAdded = AddBar( X_POI_SWING_HIGH, cBar, mSwingHighs // ); // if (isAdded) { swingHighsCount = ArraySize(mSwingHighs); } } } // // Swing Lows ... bool allowSwingLows = AllowSwingLows(); int swingLowsCount = ArraySize(mSwingLows); if (allowSwingLows && swingLowsCount < requiredPOIs) { // bool isSwingLow = cBar.IsSimpleSwingLow(SwingLowThreshold()); if (isSwingLow) { // bool isAdded = AddBar( X_POI_SWING_LOW, cBar, mSwingLows // ); // if (isAdded) { swingLowsCount = ArraySize(mSwingLows); } } } // // Momentum Bars ... bool allowMomentumBars = AllowMomentumBars(); int momentumBarsCount = ArraySize(mMomentumBars); if (allowMomentumBars && momentumBarsCount < requiredPOIs) { // bool isStrongBar = cBar.IsStrong(MomentumBarPercent()); // // Bullish ... bool isSharpBullish = cBar.IsSharpBullish( MomentumBarLoopBack(), MomentumBarSharpRatio() // ); // // Bearish ... bool isSharpBearish = cBar.IsSharpBearish( MomentumBarLoopBack(), MomentumBarSharpRatio() // ); // bool isMomentumBar = isStrongBar && (isSharpBearish || isSharpBullish); if (isMomentumBar) { // bool isAdded = AddBar( X_POI_MOMENTUM_BAR, cBar, mMomentumBars // ); // if (isAdded) { momentumBarsCount = ArraySize(mMomentumBars); } } } // // Rejection Bars ... bool allowRejectionBars = AllowRejectionBars(); int rejectionBarsCount = ArraySize(mRejectionBars); if (allowRejectionBars && rejectionBarsCount < requiredPOIs) { // bool isRejectionBar = cBar.HasStrongLowShadow( RejectionBarPercent(), RejectionBarLoopBack(), RejectionBarSharpRatio() // ) || cBar.HasStrongHighShadow( RejectionBarPercent(), RejectionBarLoopBack(), RejectionBarSharpRatio() // ); // if (isRejectionBar) { // bool isAdded = AddBar( X_POI_REJECTION_BAR, cBar, mRejectionBars // ); // if (isAdded) { rejectionBarsCount = ArraySize(mRejectionBars); } } } // // Support nad Resistance Zones ... // // Support Zones ... bool allowSupportZones = AllowSupportZones(); int supportZonesCount = ArraySize(mSupportZones); if (allowSupportZones && supportZonesCount < requiredPOIs) { // XOHCL support; bool hasSupport = cBar.HasSupport( support, SupportZonePriceType(), SupportZoneLoopBack() // ); // if (hasSupport) { // bool isAdded = AddBar( X_POI_SUPPORT_ZONE, support, mSupportZones // ); // if (isAdded) { supportZonesCount = ArraySize(mSupportZones); } } } // // Resistance Zones ... bool allowResistanceZones = AllowResistanceZones(); int resistanceZonesCount = ArraySize(mResistanceZones); if (allowResistanceZones && resistanceZonesCount < requiredPOIs) { // XOHCL resistance; bool hasResistance = cBar.HasResistance( resistance, ResistanceZonePriceType(), ResistanceZoneLoopBack() // ); // if (hasResistance) { // bool isAdded = AddBar( X_POI_RESISTANCE_ZONE, resistance, mResistanceZones // ); // if (isAdded) { resistanceZonesCount = ArraySize(mResistanceZones); } } } // // Supply and Demand Zones ... // // Supply Zones ... bool allowSupplyZones = AllowSupplyZones(); int supplyZonesCount = ArraySize(mSupplyZones); if (allowSupplyZones && supplyZonesCount < requiredPOIs) { // datetime endTime = cBar.time; // datetime cSupplyZoneStartTime = iTime( mSymbol, SupplyZonePeriod(), supplyZonesCount + 1 // ); datetime startTime = cSupplyZoneStartTime; // int cSupplyZoneStartIndex = iBarShift( mSymbol, mPeriod, cSupplyZoneStartTime // ); // XOHCL swings[]; for (int i = 0; i < cSupplyZoneStartIndex; i++) { // XOHCL iBar; bool isIBarInited = iBar.Init( mSymbol, mPeriod, i // ); if (!isIBarInited) { continue; } // // Check is Bar Swing or not ... bool isSwing = iBar.IsSimpleSwingHigh(); if (!isSwing) { continue; } // AddRef( iBar, swings // ); } // XOHCL selectedSwing; int swingsCount = ArraySize(swings); if (IsValidSize(swingsCount)) { // for (int i = 0; i < swingsCount; i++) { // XOHCL iSwing = swings[i]; if (!selectedSwing.IsValid() || selectedSwing.high < iSwing.high) { selectedSwing = iSwing; } } } // if (selectedSwing.IsValid()) { // XZone zone; bool isInited = zone.Init( selectedSwing.high, selectedSwing.low, ToString(X_POI_SUPPLY_ZONE) + "_" + ToString(SupplyZonePeriod()), startTime, endTime // ); if (isInited) { // AddRef( zone, mSupplyZones // ); // supplyZonesCount = ArraySize(mSupplyZones); } } } // // Demand Zones ... bool allowDemandZones = AllowDemandZones(); int demandZonesCount = ArraySize(mDemandZones); if (allowDemandZones && demandZonesCount < requiredPOIs) { // datetime endTime = cBar.time; // datetime cDemandZoneStartTime = iTime( mSymbol, DemandZonePeriod(), demandZonesCount + 1 // ); datetime startTime = cDemandZoneStartTime; // int cDemandZoneStartIndex = iBarShift( mSymbol, mPeriod, cDemandZoneStartTime // ); // XOHCL swings[]; for (int i = 0; i < cDemandZoneStartIndex; i++) { // XOHCL iBar; bool isIBarInited = iBar.Init( mSymbol, mPeriod, i // ); if (!isIBarInited) { continue; } // // Check is Bar Swing or not ... bool isSwing = iBar.IsSimpleSwingLow(); if (!isSwing) { continue; } // AddRef( iBar, swings // ); } // XOHCL selectedSwing; int swingsCount = ArraySize(swings); if (IsValidSize(swingsCount)) { // for (int i = 0; i < swingsCount; i++) { // XOHCL iSwing = swings[i]; if (!selectedSwing.IsValid() || selectedSwing.low > iSwing.low) { selectedSwing = iSwing; } } } // if (selectedSwing.IsValid()) { // XZone zone; bool isInited = zone.Init( selectedSwing.high, selectedSwing.low, ToString(X_POI_DEMAND_ZONE) + "_" + ToString(DemandZonePeriod()), startTime, endTime // ); if (isInited) { // AddRef( zone, mDemandZones // ); // demandZonesCount = ArraySize(mDemandZones); } } } // // Order Blocks ... // // Bullish Order Blocks ... bool allowBullishOrderBlocks = AllowBullishOrderBlocks(); int bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); if (allowBullishOrderBlocks && bullishOrderBlocksCount < requiredPOIs) { // XOHCL ob; bool hasOB = cBar.HasBullishOrderBlock( ob, RequiredBarsForBullishOrderBlock() // ); if (hasOB) { // XZone zone; bool isAdded = AddZone( zone, // ob, cBar.time, X_POI_BULLISH_ORDERBLOCK, mBullishOrderBlocks // ); if (isAdded) { bullishOrderBlocksCount = ArraySize(mBullishOrderBlocks); } } } // // Bearish Order Blocks ... bool allowBearishOrderBlocks = AllowBearishOrderBlocks(); int bearishOrderBlocksCount = ArraySize(mBearishOrderBlocks); if (allowBearishOrderBlocks && bearishOrderBlocksCount < requiredPOIs) { // XOHCL ob; bool hasOB = cBar.HasBearishOrderBlock( ob, RequiredBarsForBearishOrderBlock() // ); if (hasOB) { // XZone zone; bool isAdded = AddZone( zone, // ob, cBar.time, X_POI_BEARISH_ORDERBLOCK, mBearishOrderBlocks // ); if (isAdded) { bullishOrderBlocksCount = ArraySize(mBearishOrderBlocks); } } } // // Fair Value Gaps ... // // Bullish FVGs ... bool allowBullishFVGs = AllowBullishFVGs(); int bullishFVGsCount = ArraySize(mBullishFVGs); if (allowBullishFVGs && bullishFVGsCount < requiredPOIs) { // double upper; double lower; datetime start; datetime end; bool hasBullishFVG = cBar.HasBullishFVG( upper, lower, start, end, BullishFVGForceMiddleBarCheck(), BullishFVGForceCheckLastBarDirection() // ); if (hasBullishFVG) { // XZone zone; bool isAdded = AddZone( zone, upper, lower, start, end, X_POI_BULLISH_FVG, mBullishFVGs // ); if (isAdded) { bullishFVGsCount = ArraySize(mBullishFVGs); } } } // // Bearish FVGs ... bool allowBearishFVGs = AllowBearishFVGs(); int bearishFVGsCount = ArraySize(mBearishFVGs); if (allowBearishFVGs && bearishFVGsCount < requiredPOIs) { // double upper; double lower; datetime start; datetime end; bool hasBearishFVG = cBar.HasBearishFVG( upper, lower, start, end, BearishFVGForceMiddleBarCheck(), BearishFVGForceCheckLastBarDirection() // ); if (hasBearishFVG) { // XZone zone; bool isAdded = AddZone( zone, upper, lower, start, end, X_POI_BEARISH_FVG, mBearishFVGs // ); if (isAdded) { bearishFVGsCount = ArraySize(mBearishFVGs); } } } // // Detect Required Conditions for Loop ... // // // Market Sessions Requirements ... bool isNeedMoreMarketSessions = (!IsValidSize(sessionsCount) ? true : marketSessionsCount < (sessionsCount * requiredPOIs)); canContinue = // // Trade Days ... (allowTradingDays && daysCount < requiredPOIs) || // // Market Sessions ... (allowMarketSessions && isNeedMoreMarketSessions) || // // Swing High and Low (s) ... (allowSwingHighs && swingHighsCount < requiredPOIs) || (allowSwingLows && swingLowsCount < requiredPOIs) || // // Momentum Bars ... (allowMomentumBars && momentumBarsCount < requiredPOIs) || // // Rejection Bars ... (allowRejectionBars && rejectionBarsCount < requiredPOIs) || // // Support and Resistance Zones ... (allowSupportZones && supportZonesCount < requiredPOIs) || (allowResistanceZones && resistanceZonesCount < requiredPOIs) || // // Supply and Demand Zones ... (allowSupplyZones && supplyZonesCount < requiredPOIs) || (allowDemandZones && demandZonesCount < requiredPOIs) || // // Order Blocks ... (allowBullishOrderBlocks && bullishOrderBlocksCount < requiredPOIs) || (allowBearishOrderBlocks && bearishOrderBlocksCount < requiredPOIs) || // // Fair Value Gaps ... (allowBullishFVGs && bullishFVGsCount < requiredPOIs) || (allowBearishFVGs && bearishFVGsCount < requiredPOIs) // ; if (canContinue) { barIndex++; } } // // int errorArr[]; // if (canContinue) // { // // // int t = errorArr[5]; // } // // Complete Calculations ... // // Reverse Trading Days ... XTradeDay tmpDays[]; Copy( mTradingDays, tmpDays // ); Clean(mTradingDays); ArrayReverse(tmpDays); Copy( tmpDays, mTradingDays // ); Clean(tmpDays); // // Reverse Market Sessions ... XMarketSession tmpSessions[]; Copy( mMarketSessions, tmpSessions // ); Clean(mMarketSessions); ArrayReverse(tmpSessions); Copy( tmpSessions, mMarketSessions // ); // XOHCL tmpBars[]; // // Reverse Swing Highs ... Copy( mSwingHighs, tmpBars // ); Clean(mSwingHighs); ArrayReverse(tmpBars); Copy( tmpBars, mSwingHighs // ); Clean(tmpBars); // // Reverse Swing Lows ... Copy( mSwingLows, tmpBars // ); Clean(mSwingLows); ArrayReverse(tmpBars); Copy( tmpBars, mSwingLows // ); Clean(tmpBars); // // Reverse Momentum Bars ... Copy( mMomentumBars, tmpBars // ); Clean(mMomentumBars); ArrayReverse(tmpBars); Copy( tmpBars, mMomentumBars // ); Clean(tmpBars); // // Reverse Rejection Bars ... Copy( mRejectionBars, tmpBars // ); Clean(mRejectionBars); ArrayReverse(tmpBars); Copy( tmpBars, mRejectionBars // ); Clean(tmpBars); // // Reverse Support Zones ... Copy( mSupportZones, tmpBars // ); Clean(mSupportZones); ArrayReverse(tmpBars); Copy( tmpBars, mSupportZones // ); Clean(tmpBars); // // Reverse Resistance Zones ... Copy( mResistanceZones, tmpBars // ); Clean(mResistanceZones); ArrayReverse(tmpBars); Copy( tmpBars, mResistanceZones // ); Clean(tmpBars); // XZone tmpZones[]; // // Supply and Demand Zones ... // Copy( mSupplyZones, tmpZones // ); Clean(mSupplyZones); ArrayReverse(tmpZones); Copy( tmpZones, mSupplyZones // ); Clean(tmpZones); // Copy( mDemandZones, tmpZones // ); Clean(mDemandZones); ArrayReverse(tmpZones); Copy( tmpZones, mDemandZones // ); 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); // // Fair Value Gaps ... // Copy( mBullishFVGs, tmpZones // ); Clean(mBullishFVGs); ArrayReverse(tmpZones); Copy( tmpZones, mBullishFVGs // ); Clean(tmpZones); // Copy( mBearishFVGs, tmpZones // ); Clean(mBearishFVGs); ArrayReverse(tmpZones); Copy( tmpZones, mBearishFVGs // ); Clean(tmpZones); // // ... // Unlock(); DrawPOIs(); } // // Destroy POIs ... /** * Destroy All POI(s) ... */ void DestroyPOIs() { // // Trading Days ... DestroyTradingDays(); // // Market Sessions ... DestroyMarketSessions(); // // Momentum Bars ... DestroyMomentumBars(); // // Rejection Bars ... DestroyRejectionBars(); // // Swing High and Zone (s) ... DestroySwingHighs(); DestroySwingLows(); // // Support and Resistance Zones ... DestroySupportZones(); DestroyResistanceZones(); // // Supply and Demand Zones ... DestroySupplyZones(); DestroyDemandZones(); // // Order Blocks ... DestroyBullishOrderBlocks(); DestroyBearishOrderBlocks(); // // Fai Value Gaps ... DestroyBullishFVGs(); DestroyBearishFVGs(); } /** * Destroy Trading Days ... */ void DestroyTradingDays() { Clean(mTradingDays); } /** * Destroy Swing Highs ... */ void DestroySwingHighs() { Clean(mSwingHighs); } /** * Destroy Swing Lows ... */ void DestroySwingLows() { Clean(mSwingLows); } /** * Destroy Momentum Bars ... */ void DestroyMomentumBars() { Clean(mMomentumBars); } /** * Destroy Rejection Bars ... */ void DestroyRejectionBars() { Clean(mRejectionBars); } /** * Destroy Market Sessions ... */ void DestroyMarketSessions() { Clean(mMarketSessions); } /** * Destroy Support Zones ... */ void DestroySupportZones() { Clean(mSupportZones); } /** * Destroy Resistance Zones ... */ void DestroyResistanceZones() { Clean(mResistanceZones); } /** * Destroy Supply Zones ... */ void DestroySupplyZones() { Clean(mSupplyZones); } /** * Destroy Demand Zones ... */ void DestroyDemandZones() { Clean(mDemandZones); } /** * Destroy Bullish Order Blocks ... */ void DestroyBullishOrderBlocks() { Clean(mBullishOrderBlocks); } /** * Destroy Bearish Order Blocks ... */ void DestroyBearishOrderBlocks() { Clean(mBearishOrderBlocks); } /** * Destroy Bullish FVGs ... */ void DestroyBullishFVGs() { Clean(mBullishFVGs); } /** * Destroy Bearish FVGs ... */ void DestroyBearishFVGs() { Clean(mBearishFVGs); } // // Draw Actions ... /** * Draw All POI(s) ... */ void DrawPOIs() { // // Trading Days ... DrawTradingDays(); // // Market Sessions ... DrawMarketSessions(); // // Momentum Bars ... DrawMomentumBars(); // // Rejection Bars ... DrawRejectionBars(); // // Swing High and Low (s) ... DrawSwingHighs(); DrawSwingLows(); // // Support and Resistance (s) ... DrawSupportZones(); DrawResistanceZones(); // // Supply and Demand Zones ... DrawSupplyZones(); DrawDemandZones(); // // Order Blocks ... DrawBullishOrderBlocks(); DrawBearishOrderBlocks(); // // Fair Value Gaps ... DrawBullishFVGs(); DrawBearishFVGs(); } /** * Draw Trading Days ... */ void DrawTradingDays() { // bool allow = AllowDrawTradingDays(); if (!allow) { return; } // int count = ArraySize(mTradingDays); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XTradeDay iDay = mTradingDays[i]; // string iName = iDay.GetTag(); int iIDX = HasTradingDayObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // CreateTradingDayObject(iDay, iName); } } /** * Check a Trading Day is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasTradingDayObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mTradingDayObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCBaseObject *)mTradingDayObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Swing Highs ... */ void DrawSwingHighs() { // bool allow = AllowDrawSwingHighs(); if (!allow) { return; } // int count = ArraySize(mSwingHighs); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iSwing = mSwingHighs[i]; // string iName = iSwing.GetTag(ToString(X_POI_SWING_HIGH)); int iIDX = HasSwingHighObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawSwingHighs(); if (allow) { // XCSwingHighObject *iObj; bool isCreated = mDrawer.CreateSwingHigh(iSwing, iObj); if (isCreated) { mSwingHighObjects.Add(iObj); } } } } /** * Check a Swing High is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasSwingHighObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mSwingHighObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((CChartObjectArrow *)mSwingHighObjects.At(i)).Name(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Swing Lows ... */ void DrawSwingLows() { // bool allow = AllowDrawSwingLows(); if (!allow) { return; } // int count = ArraySize(mSwingLows); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iSwing = mSwingLows[i]; // string iName = iSwing.GetTag(ToString(X_POI_SWING_LOW)); int iIDX = HasSwingLowObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawSwingLows(); if (allow) { // XCSwingLowObject *iObj; bool isCreated = mDrawer.CreateSwingLow(iSwing, iObj); if (isCreated) { mSwingLowObjects.Add(iObj); } } } } /** * Check a Swing Low is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasSwingLowObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mSwingLowObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((CChartObjectArrow *)mSwingLowObjects.At(i)).Name(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Momentum Bars ... */ void DrawMomentumBars() { // bool allow = AllowDrawMomentumBars(); if (!allow) { return; } // int count = ArraySize(mMomentumBars); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iBar = mMomentumBars[i]; // string iName = iBar.GetTag(ToString(X_POI_MOMENTUM_BAR)); int iIDX = HasMomentumBarObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawMomentumBars(); if (allow) { // bool isBullish = iBar.IsBullish(); if (isBullish) { // XCBullishMomentumBarObject *iObj; bool isCreated = mDrawer.CreateBullishMomentumBar(iBar, iObj); if (isCreated) { mMomentumBarObjects.Add(iObj); } } else { // XCBearishMomentumBarObject *iObj; bool isCreated = mDrawer.CreateBearishMomentumBar(iBar, iObj); if (isCreated) { mMomentumBarObjects.Add(iObj); } } } } } /** * Check a Momentum Bar is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasMomentumBarObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mMomentumBarObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((CChartObjectArrow *)mMomentumBarObjects.At(i)).Name(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Rejection Bars ... */ void DrawRejectionBars() { // bool allow = AllowDrawRejectionBars(); if (!allow) { return; } // int count = ArraySize(mRejectionBars); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iBar = mRejectionBars[i]; // string iName = iBar.GetTag(ToString(X_POI_REJECTION_BAR)); int iIDX = HasRejectionBarObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawRejectionBars(); if (allow) { // bool isBullish = iBar.GetLowShadow() > iBar.GetHighShadow(); if (isBullish) { // XCBullishRejectionBarObject *iObj; bool isCreated = mDrawer.CreateBullishRejectionBar(iBar, iObj); if (isCreated) { mRejectionBarObjects.Add(iObj); } } else { // XCBearishRejectionBarObject *iObj; bool isCreated = mDrawer.CreateBearishRejectionBar(iBar, iObj); if (isCreated) { mRejectionBarObjects.Add(iObj); } } } } } /** * Check a Rejection Bar is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasRejectionBarObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mRejectionBarObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((CChartObjectArrow *)mRejectionBarObjects.At(i)).Name(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Market Sessions ... */ void DrawMarketSessions() { // bool allow = AllowDrawMarketSessions(); if (!allow) { return; } // int count = ArraySize(mMarketSessions); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XMarketSession iMarketSession = mMarketSessions[i]; // string iName = iMarketSession.GetTag(); int iIDX = HasMarketessionObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // // CreateMarketSessionObject(iMarketSession, iName); } } /** * Check a Market Session is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasMarketessionObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mMarketSessionObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCMarketSessionObject *)mMarketSessionObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Support Zones ... */ void DrawSupportZones() { // bool allow = AllowDrawSupportZones(); if (!allow) { return; } // int count = ArraySize(mSupportZones); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iSupportZone = mSupportZones[i]; // string iName = iSupportZone.GetTag(ToString(X_POI_SUPPORT_ZONE)); int iIDX = HasSupportZoneObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawSupportZones(); if (allow) { // XCSupportZoneObject *iObj; bool isCreated = mDrawer.CreateSupportZone(iSupportZone, iObj); if (isCreated) { mSupportZoneObjects.Add(iObj); } } } } /** * Check a Suport Zone is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasSupportZoneObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mSupportZoneObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCSupportZoneObject *)mSupportZoneObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Resistance Zones ... */ void DrawResistanceZones() { // bool allow = AllowDrawResistanceZones(); if (!allow) { return; } // int count = ArraySize(mResistanceZones); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XOHCL iResistanceZone = mResistanceZones[i]; // string iName = iResistanceZone.GetTag(ToString(X_POI_RESISTANCE_ZONE)); int iIDX = HasResistanceZoneObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawResistanceZones(); if (allow) { // XCResistanceZoneObject *iObj; bool isCreated = mDrawer.CreateResistanceZone(iResistanceZone, iObj); if (isCreated) { mResistanceZoneObjects.Add(iObj); } } } } /** * Check a Resistance Zone is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasResistanceZoneObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mResistanceZoneObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCResistanceZoneObject *)mResistanceZoneObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Supply Zones ... */ void DrawSupplyZones() { // bool allow = AllowDrawSupplyZones(); if (!allow) { return; } // int count = ArraySize(mSupplyZones); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XZone iSupplyZone = mSupplyZones[i]; // string iName = iSupplyZone.GetTag(); int iIDX = HasSupplyZoneObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawSupplyZones(); if (allow) { // XCSupplyZoneObject *iObj; bool isCreated = mDrawer.CreateSupplyZone(iSupplyZone, iObj); if (isCreated) { mSupplyZoneObjects.Add(iObj); } } } } /** * Check a Supply Zone is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasSupplyZoneObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mSupplyZoneObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCSupplyZoneObject *)mSupplyZoneObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Demand Zones ... */ void DrawDemandZones() { // bool allow = AllowDrawDemandZones(); if (!allow) { return; } // int count = ArraySize(mDemandZones); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XZone iDemandZone = mDemandZones[i]; // string iName = iDemandZone.GetTag(); int iIDX = HasDemandZoneObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawDemandZones(); if (allow) { // XCDemandZoneObject *iObj; bool isCreated = mDrawer.CreateDemandZone(iDemandZone, iObj); if (isCreated) { mDemandZoneObjects.Add(iObj); } } } } /** * Check a Demand Zone is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasDemandZoneObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mDemandZoneObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCDemandZoneObject *)mDemandZoneObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * 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 = HasBullishOrderBlockObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawBullishOrderBlocks(); if (allow) { // XCBullishOrderBlockObject *iObj; bool isCreated = mDrawer.CreateBullishOrderBlock(iBullishOB, iObj); if (isCreated) { mBullishOrderBlockObjects.Add(iObj); } } } } /** * Check a Bullish Order Block is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasBullishOrderBlockObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mBullishOrderBlockObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCBullishOrderBlockObject *)mBullishOrderBlockObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * 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 = HasBearishOrderBlockObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawBearishOrderBlocks(); if (allow) { // XCBearishOrderBlockObject *iObj; bool isCreated = mDrawer.CreateBearishOrderBlock(iBearishOB, iObj); if (isCreated) { mBearishOrderBlockObjects.Add(iObj); } } } } /** * Check a Bearish Order Block is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasBearishOrderBlockObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mBearishOrderBlockObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCBearishOrderBlockObject *)mBearishOrderBlockObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Bullish FVGs ... */ void DrawBullishFVGs() { // bool allow = AllowDrawBullishFVGs(); if (!allow) { return; } // int count = ArraySize(mBullishFVGs); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XZone iFVG = mBullishFVGs[i]; // string iName = iFVG.GetTag(); int iIDX = HasBullishFVGObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawBullishFVGs(); if (allow) { // XCBullishFVGObject *iObj; bool isCreated = mDrawer.CreateBullishFVG(iFVG, iObj); if (isCreated) { mBullishFVGObjects.Add(iObj); } } } } /** * Check a Bullish FVG is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasBullishFVGObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mBullishFVGObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCBullishFVGObject *)mBullishFVGObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } /** * Draw Bearish FVGs ... */ void DrawBearishFVGs() { // bool allow = AllowDrawBearishFVGs(); if (!allow) { return; } // int count = ArraySize(mBearishFVGs); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // XZone iFVG = mBearishFVGs[i]; // string iName = iFVG.GetTag(); int iIDX = HasBearishFVGObject( iName // ); if (IsValidIndex(iIDX)) { continue; } // bool allow = AllowDrawBearishFVGs(); if (allow) { // XCBearishFVGObject *iObj; bool isCreated = mDrawer.CreateBearishFVG(iFVG, iObj); if (isCreated) { mBearishFVGObjects.Add(iObj); } } } } /** * Check a Bearish FVG is Drawn Before or not ... * * @param name: String ... * * @return ( int ) */ int HasBearishFVGObject( string name // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = mBearishFVGObjects.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // string objName = ((XCBearishFVGObject *)mBearishFVGObjects.At(i)).ObjName(); if (objName == name) { // result = i; break; } } // return result; } // /** * Clean All Drawn Objects ... */ void DestroyObjects() { // // Trading Days ... DestroyTradingTradingDayObjects(); // // Market Sessions ... DestroyMarketSessionObjects(); // // Momentum Bars ... DestroyMomentumBarObjects(); // // Rejection Bars ... DestroyRejectionBarObjects(); // // Swing High and Low (s) ... DestroySwingLowObjects(); DestroySwingHighObjects(); // // Support and Resistanc (s) ... DestroySupportZoneObjects(); DestroyResistanceZoneObjects(); // // Supply and Demand Zones .. DestroySupplyZoneObjects(); DestroyDemandZoneObjects(); // // Order Blocks ... DestroyBullishOrderBlockObjects(); DestroyBearishOrderBlockObjects(); // // Fair Value Gaps ... DestroyBullishFVGObjects(); DestroyBearishFVGObjects(); } /** * Clean Swing Highs Drawn Objects ... */ void DestroySwingHighObjects() { mSwingHighObjects.Clear(); } /** * Clean Swing Lows Drawn Objects ... */ void DestroySwingLowObjects() { mSwingLowObjects.Clear(); } /** * Clean Momentum Bars Drawn Objects ... */ void DestroyMomentumBarObjects() { mMomentumBarObjects.Clear(); } /** * Clean Rejection Bars Drawn Objects ... */ void DestroyRejectionBarObjects() { mRejectionBarObjects.Clear(); } /** * Clean Trading Day Drawn Objects ... */ void DestroyTradingTradingDayObjects() { mTradingDayObjects.Clear(); } /** * Destroy Market Sessions Drawn Objects ... */ void DestroyMarketSessionObjects() { mMarketSessionObjects.Clear(); } /** * Destroy Support Zone Drawn Objects ... */ void DestroySupportZoneObjects() { mSupportZoneObjects.Clear(); } /** * Destroy Resistance Zone Drawn Objects ... */ void DestroyResistanceZoneObjects() { mResistanceZoneObjects.Clear(); } /** * Destroy Supply Zone Drawn Objects ... */ void DestroySupplyZoneObjects() { mSupplyZoneObjects.Clear(); } /** * Destroy Demand Zone Drawn Objects ... */ void DestroyDemandZoneObjects() { mDemandZoneObjects.Clear(); } /** * Destroy Bullish Order Block Drawn Objects ... */ void DestroyBullishOrderBlockObjects() { mBullishOrderBlockObjects.Clear(); } /** * Destroy Bearish Order Block Drawn Objects ... */ void DestroyBearishOrderBlockObjects() { mBearishOrderBlockObjects.Clear(); } /** * Destroy Bullish FVG Drawn Objects ... */ void DestroyBullishFVGObjects() { mBullishFVGObjects.Clear(); } /** * Destroy Bearish FVG Drawn Objects ... */ void DestroyBearishFVGObjects() { mBearishFVGObjects.Clear(); } // // ... /** * Detect an Object Exists in Array or not ... * * @param name: String ... * @param array: CArrayObj instance ... * * @return ( int ): index of Object ... */ int HasObject( string name, CArrayObj &array // ) { // int result = -1; // if (!IsValid(name)) { return result; } // int count = array.Total(); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // // XCBaseObject *iObj = ((XCBaseObject *)array.At(i)); // string objName = iObj.ObjName(); // if (objName == name) // { // // // result = i; // break; // } } // return result; } // // Event Handler Notifiers ... // // Trading Days ... /** * Notify New Trading Day Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... */ void NotifyTradingDayEventListeners( ENUM_XPOI_EVENTS event // ) { // int count = ArraySize(mTradingDayEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXPOIEventHandler iListener = mTradingDayEventListeners[i]; iListener(event); } } // // Market Sessions ... /** * Notify New Market Session Event Handlers ... * * @param session: ENUM_XSESSION member ... * @param event: ENUM_XPOI_EVENTS member ... */ void NotifyMarketSessionEventListeners( ENUM_XSESSION session, ENUM_XPOI_EVENTS event // ) { // int count = ArraySize(mMarketSessionEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXSessionEventHandler iListener = mMarketSessionEventListeners[i]; iListener(session, event); } } // // Swings ... // // Swing Highs ... /** * Notify New Swing High Point Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifySwingHighEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mSwingHighEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mSwingHighEventListeners[i]; iListener(event, bar); } } // // Swing Lows ... /** * Notify New Swing Low Point Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifySwingLowEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mSwingLowEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mSwingLowEventListeners[i]; iListener(event, bar); } } // // Momentum Bars ... /** * Notify New Momentum Bar Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifyMomentumBarEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mMomentumBarEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mMomentumBarEventListeners[i]; iListener(event, bar); } } // // Rejection Bars ... /** * Notify New Rejection Bar Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifyRejectionBarEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mRejectionBarEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mRejectionBarEventListeners[i]; iListener(event, bar); } } // // Support and Resistance Zones ... // // Support Zones ... /** * Notify New Support Zone Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifySupportZoneEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mSupportZoneEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mSupportZoneEventListeners[i]; iListener(event, bar); } } // // Resistance Zones ... /** * Notify New Resistance Zone Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XOHCL instance ... */ void NotifyResistanceZoneEventListeners( ENUM_XPOI_EVENTS event, XOHCL &bar // ) { // if (!bar.IsValid()) { return; } // int count = ArraySize(mResistanceZoneEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXOHCLEventHandler iListener = mResistanceZoneEventListeners[i]; iListener(event, bar); } } // // Supply and Demand Zones ... // // Supply Zones ... /** * Notify New Supply Zone Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XZone instance ... */ void NotifySupplyZoneEventListeners( ENUM_XPOI_EVENTS event, XZone &zone // ) { // if (!zone.IsValid()) { return; } // int count = ArraySize(mSupplyZoneEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXZoneEventHandler iListener = mSupplyZoneEventListeners[i]; iListener(event, zone); } } // // Demand Zones ... /** * Notify New Demand Zone Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XZone instance ... */ void NotifyDemandZoneEventListeners( ENUM_XPOI_EVENTS event, XZone &zone // ) { // if (!zone.IsValid()) { return; } // int count = ArraySize(mDemandZoneEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXZoneEventHandler iListener = mDemandZoneEventListeners[i]; iListener(event, zone); } } // // 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); } } // // Fair Value Gaps ... /** * Notify New Bullish FVG Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XZone instance ... */ void NotifyBullishFVGEventListeners( ENUM_XPOI_EVENTS event, XZone &zone // ) { // if (!zone.IsValid()) { return; } // int count = ArraySize(mBullishFVGEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXZoneEventHandler iListener = mBullishFVGEventListeners[i]; iListener(event, zone); } } /** * Notify New Bearish FVG Event Handlers ... * * @param event: ENUM_XPOI_EVENTS member ... * @param bar: XZone instance ... */ void NotifyBearishFVGEventListeners( ENUM_XPOI_EVENTS event, XZone &zone // ) { // if (!zone.IsValid()) { return; } // int count = ArraySize(mBearishFVGEventListeners); if (!IsValidSize(count)) { return; } // for (int i = 0; i < count; i++) { // TXZoneEventHandler iListener = mBearishFVGEventListeners[i]; iListener(event, zone); } } /** * Destroy all Registered Event Listeners ... */ void DestroyEventListeners() { // // Trading Days ... Clean(mTradingDayEventListeners); // // Market Sessions ... Clean(mMarketSessionEventListeners); // // Momentum Bars ... Clean(mMomentumBarEventListeners); // // Rejection Bars ... Clean(mRejectionBarEventListeners); // // Swing High and Low (s) ... Clean(mSwingLowEventListeners); Clean(mSwingHighEventListeners); // // Support and Resistance Zones ... Clean(mSupportZoneEventListeners); Clean(mResistanceZoneEventListeners); // // Supply and Demand Zones ... Clean(mSupplyZoneEventListeners); Clean(mDemandZoneEventListeners); // // Order Blocks ... Clean(mBullishOrderBlockEventListeners); Clean(mBearishOrderBlockEventListeners); // // Fair Value Gaps ... Clean(mBullishFVGEventListeners); Clean(mBearishFVGEventListeners); } // // ... // // // Session ... /** * Find Specific Session Index ... * * @param session: ENUM_XSESSION member ... * * @return ( int ) */ int FindSession(ENUM_XSESSION session) { // int result = -1; // int count = ArraySize(mSessions); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XSession iSession = mSessions[i]; // if (iSession.session == session) { // result = i; break; } } // return result; } /** * Destroy Sessions ... */ void DestroySessions() { Clean(mSessions); } /** * Find Specified Trade Day based on Start Time ... * * @param start: DateTime ... * * @return ( int ) */ int HasTradeDay(datetime start) { // int result = -1; // if (!IsValid(start)) { return result; } // int count = ArraySize(mTradingDays); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XTradeDay iDay = mTradingDays[i]; // if (iDay.from == start) { // result = i; break; } } // return result; } /** * Find Specified Trade Day based on End Time ... * * @param start: DateTime ... * * @return ( int ) */ int HasTradeDayBayEndTime(datetime end) { // int result = -1; // if (!IsValid(end)) { return result; } // int count = ArraySize(mTradingDays); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XTradeDay iDay = mTradingDays[i]; // if (iDay.to == end) { // result = i; break; } } // return result; } // /** * Find Market Session by Providing Start Time ... * * @param session: ENUM_XSESSION member ... * @param start: DateTime ... * * @return ( int ) */ int HasMarketSessionByStartTime( ENUM_XSESSION session, datetime start // ) { // int result = -1; // if (!IsValid(start)) { return result; } // int count = ArraySize(mMarketSessions); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XMarketSession iMarketSession = mMarketSessions[i]; // if (iMarketSession.session == session && iMarketSession.from == start) { // result = i; break; } } // return result; } /** * Find Market Session by Providing Start Time ... * * @param session: ENUM_XSESSION member ... * @param end: DateTime ... * * @return ( int ) */ int HasMarketSessionByEndTime( ENUM_XSESSION session, datetime end // ) { // int result = -1; // if (!IsValid(end)) { return result; } // int count = ArraySize(mMarketSessions); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XMarketSession iMarketSession = mMarketSessions[i]; // if (iMarketSession.session == session && iMarketSession.to == end) { // result = i; break; } } // return result; } /** * Count Specified Market Sessions ... * * @param session: ENUM_XSESSION member ... * * @return ( int ) */ int CountMarketSessions(ENUM_XSESSION session) { // int result = 0; // int count = ArraySize(mMarketSessions); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XMarketSession iMarketSession = mMarketSessions[i]; // if (iMarketSession.session == session) { result++; } } // return result; } // int FindBarIndex( ENUM_XPOIS type, XOHCL &bar, XOHCL &list[] // ) { // int result = -1; // bool isValidType = type == X_POI_SWING_LOW || type == X_POI_SWING_HIGH || type == X_POI_SUPPORT_ZONE || type == X_POI_MOMENTUM_BAR || type == X_POI_REJECTION_BAR || type == X_POI_RESISTANCE_ZONE; if (!isValidType) { return result; } // int count = ArraySize(list); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XOHCL iBar = list[i]; // bool isSameLow = bar.low == iBar.low; // bool isSameHigh = bar.high == iBar.high; // bool isSameUp = bar.GetUp() == iBar.GetUp(); // bool isSameDown = bar.GetDown() == iBar.GetDown(); // // Check Conditions Based On Type ... bool canBreak = false; if (type == X_POI_SWING_LOW || type == X_POI_SWING_HIGH || type == X_POI_MOMENTUM_BAR || type == X_POI_REJECTION_BAR) { // canBreak = isSameUp && isSameLow && isSameHigh && isSameDown; } else if (type == X_POI_SUPPORT_ZONE) { // canBreak = isSameLow && isSameDown; } else if (type == X_POI_RESISTANCE_ZONE) { // canBreak = isSameUp && isSameHigh; } // if (canBreak) { // result = i; break; } } // return result; } // bool AddBar( ENUM_XPOIS type, XOHCL &bar, XOHCL &list[] // ) { // bool result = false; // result = bar.IsValid(); if (!result) { return result; } // result = type == X_POI_SWING_LOW || type == X_POI_SWING_HIGH || type == X_POI_SUPPORT_ZONE || type == X_POI_MOMENTUM_BAR || type == X_POI_REJECTION_BAR || type == X_POI_RESISTANCE_ZONE; if (!result) { return result; } // int idx = FindBarIndex( type, bar, list // ); result = !IsValidIndex(idx); if (!result) { return result; } // AddRef( bar, list // ); // return result; } // /** * Find Specified Zone Index ... * * @param zone: XZone instance * @param list: XZone Collection ... * * @return ( int ) */ int FindZoneIndex( XZone &zone, XZone &list[] // ) { // int result = -1; // int count = ArraySize(list); if (!IsValidSize(count)) { return result; } // for (int i = 0; i < count; i++) { // XZone iZone = list[i]; // if (iZone.upper == zone.upper && iZone.lower == zone.lower) { // result = i; break; } } // return result; } /** * Add Specific Zone to List ... * * @param ob: XOHCL ... * @param endTime: Datetime ... * @param type: ENUM_X_POI member ... * @param list: XZone instance Collection ... * * @return ( bool ) */ bool AddZone( XZone &zone, XOHCL &ob, datetime endTime, ENUM_XPOIS type, XZone &list[] // ) { // bool result = false; // result = type == X_POI_SUPPORT_ZONE || type == X_POI_RESISTANCE_ZONE || type == X_POI_BULLISH_ORDERBLOCK || type == X_POI_BEARISH_ORDERBLOCK; if (!result) { return result; } // NormalizeTime(endTime); // datetime startTime = (datetime)((int)ob.time - (PeriodSeconds(mPeriod) * 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; } /** * Initiate and Add Specific Zone to List ... * * @param zone: XZone instance ... * @param upper: Double ... * @param lower: Double ... * @param start: DateTime ... * @param end: DateTime ... * @param type: ENUM_XPOIS member ... * @param list: XZone instance Collection ... * * @return ( bool ) */ bool AddZone( XZone &zone, double upper, double lower, datetime start, datetime end, ENUM_XPOIS type, XZone &list[] // ) { // bool result = false; // result = zone.Init( upper, lower, ToString(type), start, end // ); if (!result) { return result; } // int idx = FindZoneIndex( zone, list // ); result = !IsValidIndex(idx); if (!result) { return result; } // AddRef( zone, list // ); // return result; } /** * Cleanup Unused Objects ... */ void CleanupUnusedPOIs() { // int maxAllowed = MaxNumberOfPOIs(); if (!IsValidSize(maxAllowed)) { return; } // int tradingDaysCount = ArraySize(mTradingDays); int marketSessionsCount = ArraySize(mMarketSessions); int swingHighsCount = ArraySize(mSwingHighs); int swingLowsCount = ArraySize(mSwingLows); int momentumBarsCount = ArraySize(mMomentumBars); int rejectionBarsCount = ArraySize(mRejectionBars); int supportZonesCount = ArraySize(mSupportZones); int resistanceZonesCount = ArraySize(mResistanceZones); int supplyZonesCount = ArraySize(mSupplyZones); int demandZonesCount = ArraySize(mDemandZones); int bullishOBsCount = ArraySize(mBullishOrderBlocks); int bearishOBsCount = ArraySize(mBearishOrderBlocks); int bullishFVGsCount = ArraySize(mBullishFVGs); int bearishFVGsCount = ArraySize(mBearishFVGs); // int from = 0; int requiredPOIs = MaxNumberOfRequiredPOIs(); int count = maxAllowed - requiredPOIs; int to = count - 1; // // Trading Days ... if (tradingDaysCount >= maxAllowed) { // ArrayRemove( mTradingDays, from, count // ); // mTradingDayObjects.DeleteRange( from, to // ); } // // Market Sessions ... if (marketSessionsCount >= maxAllowed) { // ArrayRemove( mMarketSessions, from, count // ); // mMarketSessionObjects.DeleteRange( from, to // ); } // // Momentum Bars ... if (momentumBarsCount >= maxAllowed) { // ArrayRemove( mMomentumBars, from, count // ); // mMomentumBarObjects.DeleteRange( from, to // ); } // // Rejection Bars ... if (rejectionBarsCount >= maxAllowed) { // ArrayRemove( mRejectionBars, from, count // ); // mRejectionBarObjects.DeleteRange( from, to // ); } // // Swing High and Low (s) ... // // Swing Highs ... if (swingHighsCount >= maxAllowed) { // ArrayRemove( mSwingHighs, from, count // ); // mSwingHighObjects.DeleteRange( from, to // ); } // // Swing Lows ... if (swingLowsCount >= maxAllowed) { // ArrayRemove( mSwingLows, from, count // ); // mSwingLowObjects.DeleteRange( from, to // ); } // // Support and Resistance Zones ... // // Support Zones ... if (supportZonesCount >= maxAllowed) { // ArrayRemove( mSupportZones, from, count // ); // mSupportZoneObjects.DeleteRange( from, to // ); } // // Resistance Zones ... if (resistanceZonesCount >= maxAllowed) { // ArrayRemove( mResistanceZones, from, count // ); // mResistanceZoneObjects.DeleteRange( from, to // ); } // // Supply and Demand Zones ... // // Supply Zones ... if (supplyZonesCount >= maxAllowed) { // ArrayRemove( mSupplyZones, from, count // ); // mSupplyZoneObjects.DeleteRange( from, to // ); } // // Demand Zones ... if (demandZonesCount >= maxAllowed) { // ArrayRemove( mDemandZones, from, count // ); // mDemandZoneObjects.DeleteRange( from, to // ); } // // Order Blocks ... // // Bullish Order Blocks ... if (bullishOBsCount >= maxAllowed) { // ArrayRemove( mBullishOrderBlocks, from, count // ); // mBullishOrderBlockObjects.DeleteRange( from, to // ); } // // Bearish Order Blocks ... if (bearishOBsCount >= maxAllowed) { // ArrayRemove( mBearishOrderBlocks, from, count // ); // mBearishOrderBlockObjects.DeleteRange( from, to // ); } // // Fair Vakue Gaps ... // // Bullish FVGs ... if (bullishFVGsCount >= maxAllowed) { // ArrayRemove( mBullishFVGs, from, count // ); // mBullishFVGObjects.DeleteRange( from, to // ); } // // Bearish FVGs ... if (bearishFVGsCount >= maxAllowed) { // ArrayRemove( mBearishFVGs, from, count // ); // mBearishFVGObjects.DeleteRange( from, to // ); } // } // private: // // // Props ... // bool mLock; // Lock State ... string mSymbol; // Market Symbol ... ENUM_TIMEFRAMES mPeriod; // Market Period ... long mChartIdentification; // Chart ID ... int mSubWindowIdentification; // SubWindowIdentification ID ... int mMaxNumberOfPOIs; // Max Allowed Number of POI(s) which Can Holds ... int mMaxNumberOfRequiredPOIs; // Max Allowed Number of POI(s) which Must Find at Initializion Time ... // XBarTracker mBarTracker; // Market Bar Tracker ... // XCPOIDrawer *mDrawer; // POI Drawer ... // // POI Props ... // // Trading Days ... // bool mAllowTradingDays; // Detect Trading Days ... bool mAllowDrawTradingDays; // Draw Trading Days ... color mTradingDaysStartColor; // Trading Days Start Color ... ENUM_LINE_STYLE mTradingDaysStartStyle; // Trading Days Start Style ... color mTradingDaysEndColor; // Trading Days End Color ... ENUM_LINE_STYLE mTradingDaysEndStyle; // Trading Days End Style ... XTradeDay mTradingDays[]; // Trading Days ... CArrayObj mTradingDayObjects; // Trading Day Chart Objects ... TXPOIEventHandler mTradingDayEventListeners[]; // Trading Day Event Listeners ... /** * Create an Object to Represent Trading Day on Chart ... * * @param day: XTradeDay instance ... * @param name: String ... */ void CreateTradingDayObject( XTradeDay &day, string name // ) { // if (!day.IsValid() || !IsValid(name)) { return; } // XCTardeDayObject *iObj; iObj = new XCTardeDayObject(); bool isCreated = iObj.CreateByDay( ChartIdentification(), name, SubWindowIdentification(), day // ); if (!isCreated) { return; } // iObj.FromColor(TradingDaysStartColor()); iObj.FromStyle(TradingDaysStartStyle()); // iObj.ToColor(TradingDaysEndColor()); iObj.ToStyle(TradingDaysEndStyle()); // mTradingDayObjects.Add(iObj); } // // Market Sessions ... // bool mAllowMarketSessions; // Detect Market Sessions ... bool mAllowDrawMarketSessions; // Draw Market Sessions ... int mSessionOpenHours; // How many Hours a Session is Open XSession mSessions[]; // Forex Sessions XMarketSession mMarketSessions[]; // Founded Market Sessions ... CArrayObj mMarketSessionObjects; // Founded Market Session Chart Ojects ... TXSessionEventHandler mMarketSessionEventListeners[]; // Market Sessions Event Listeners ... /** * Create an Object to Represent Market Session on Chart ... * * @param session: XMarketSession instance ... * @param name: String ... */ void CreateMarketSessionObject( XMarketSession &session, string name // ) { // if (!session.IsValid() || !IsValid(name)) { return; } // // Find XSession Instance ... int sessionIDX = FindSession(session.session); if (!IsValidIndex(sessionIDX) || !mSessions[sessionIDX].allowDraw) { return; } // XCMarketSessionObject *iObj; iObj = new XCMarketSessionObject(); bool isCreated = iObj.CreateByMarketSession( ChartIdentification(), name, SubWindowIdentification(), session // ); if (!isCreated) { return; } // iObj.FromColor(mSessions[sessionIDX].startColor); iObj.FromStyle(mSessions[sessionIDX].startStyle); // iObj.ToColor(mSessions[sessionIDX].endColor); iObj.ToStyle(mSessions[sessionIDX].endStyle); // mMarketSessionObjects.Add(iObj); } // // Swing High and Low(s) ... // // Swing Highs ... // bool mAllowSwingHighs; // Detect Swing Highs ... bool mAllowDrawSwingHighs; // Draw Swing Highs ... double mSwingHighThreshold; // Threshold Required for Swing High Detection ... XOHCL mSwingHighs[]; // Swing Highs ... CArrayObj mSwingHighObjects; // Swing High Chart Objects ... TXOHCLEventHandler mSwingHighEventListeners[]; // Swing High Event Listeners ... // // Swing Lows ... // bool mAllowSwingLows; // Detect Swing Lows ... bool mAllowDrawSwingLows; // Draw Swing Lows ... double mSwingLowThreshold; // Threshold Required for Swing Low Detection ... XOHCL mSwingLows[]; // Swing Lows ... CArrayObj mSwingLowObjects; // Swing Low Chart Objects ... TXOHCLEventHandler mSwingLowEventListeners[]; // Swing Low Event Listeners ... // // Momentum Bars ... // bool mAllowMomentumBars; // Detect Momentum Bars ... bool mAllowDrawMomentumBars; // Draw Momentum Bars ... int mMomentumBarPercent; // Momentum Bar Percent ... double mMomentumBarSharpRatio; // Momentum Bar Sharp Ratio ... int mMomentumBarLoopBack; // Momentum Bar Loopback ... XOHCL mMomentumBars[]; // Momentum Bars ... CArrayObj mMomentumBarObjects; // Momentm Bar Chart Objects ... TXOHCLEventHandler mMomentumBarEventListeners[]; // Momentum Bars Event Listeners ... // // Rejection Bars .... // bool mAllowRejectionBars; // Detect Rejection Bars ... bool mAllowDrawRejectionBars; // Draw Rejection Bars ... int mRejectionBarPercent; // Rejection Bar Percent ... double mRejectionBarSharpRatio; // Rejection Bar Sharp Ratio ... int mRejectionBarLoopBack; // Rejection Bar Loopback ... XOHCL mRejectionBars[]; // Rejection Bars ... CArrayObj mRejectionBarObjects; // Rejection Bar Chart Objects ... TXOHCLEventHandler mRejectionBarEventListeners[]; // Rejection Bars Event Listeners ... // // Support and Resistance Zones ... // // Support Zones ... // bool mAllowSupportZones; // Detect Support Zone ... bool mAllowDrawSupportZones; // Draw Support Zone ... int mSupportZoneLoopBack; // Support Zone Loopback ... ENUM_X_PRICE mSupportZonePriceType; // Support Zone Price Type ... XOHCL mSupportZones[]; // Support Zones ... CArrayObj mSupportZoneObjects; // Support Zone Chart Objects ... TXOHCLEventHandler mSupportZoneEventListeners[]; // Support Zone Event Listeners ... // // Resistance Zones ... // bool mAllowResistanceZones; // Detect Resistance Zone ... bool mAllowDrawResistanceZones; // Draw Resistance Zone ... int mResistanceZoneLoopBack; // Resistance Zone Loopback ... ENUM_X_PRICE mResistanceZonePriceType; // Resistance Zone Price Type ... XOHCL mResistanceZones[]; // Resistance Zones ... CArrayObj mResistanceZoneObjects; // Resistance Zone Chart Objects ... TXOHCLEventHandler mResistanceZoneEventListeners[]; // Resistance Zone Event Listeners ... // // Supply and Demand Zones ... // // Supply Zones ... // bool mAllowSupplyZones; // Detect Supply Zone ... bool mAllowDrawSupplyZones; // Draw Supply Zone ... ENUM_TIMEFRAMES mSupplyZonePeriod; // Supply Zone Detection Period ... XZone mSupplyZones[]; // Supply Zones ... CArrayObj mSupplyZoneObjects; // Supply Zone Chart Objects ... TXZoneEventHandler mSupplyZoneEventListeners[]; // Supply Zone Event Listeners ... // // Demand Zones ... // bool mAllowDemandZones; // Detect Demand Zone ... bool mAllowDrawDemandZones; // Draw Demand Zone ... ENUM_TIMEFRAMES mDemandZonePeriod; // Demand Zone Detection Period ... XZone mDemandZones[]; // Demand Zones ... CArrayObj mDemandZoneObjects; // Demand Zone Chart Objects ... TXZoneEventHandler mDemandZoneEventListeners[]; // Demand Zone Event Listeners ... // // Order Blocks ... // // Bullish Order Blocks ... // bool mAllowBullishOrderBlocks; // Detect Bullish Order Blocks ... bool mAllowDrawBullishOrderBlocks; // Draw Bullish Order Blocks ... 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 ... // // Bearish Order Blocks ... // bool mAllowBearishOrderBlocks; // Detect Bearish Order Blocks ... bool mAllowDrawBearishOrderBlocks; // Draw Bearish Order Blocks ... 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 ... // // Fair Value Gaps ... // // Bullish Fair Value Gaps ... // bool mAllowBullishFVGs; // Detect Bullish Fair Value Gaps ... bool mAllowDrawBullishFVGs; // Draw Bullish Fair Value Gaps ... bool mBullishFVGForceMiddleBarCheck; // Bullish FVG Force Middle Bar Check ... bool mBullishFVGForceCheckLastBarDirection; // Bullish FVG Check Last Bar Direction ... XZone mBullishFVGs[]; // Bullish FVGs ... CArrayObj mBullishFVGObjects; // Bullish FVG Objects ... TXZoneEventHandler mBullishFVGEventListeners[]; // Bullish FVG Event Listeners ... // // Bearish Fair Value Gaps ... // bool mAllowBearishFVGs; // Detect Bearish Fair Value Gaps ... bool mAllowDrawBearishFVGs; // Draw Bearish Fair Value Gaps ... bool mBearishFVGForceMiddleBarCheck; // Bearish FVG Force Middle Bar Check ... bool mBearishFVGForceCheckLastBarDirection; // Bearish FVG Check Last Bar Direction ... XZone mBearishFVGs[]; // Bearish FVGs ... CArrayObj mBearishFVGObjects; // Bearish FVG Objects ... TXZoneEventHandler mBearishFVGEventListeners[]; // Bearish FVG Event Listeners ... // }; //