// // Peaks ... int peaksCount = ArraySize(conditions.peaks); if (IsValidSize(peaksCount)) { // for (int i = 0; i < peaksCount; i++) { // XPVPivot iPivot = conditions.peaks[i]; // XCXPVPivotObject *iObj; iObj = new XCXPVPivotObject(); // bool isCreated = iObj.Create( mPOIDrawer.ChartIdentification(), mPOIDrawer.SubWindowIdentification(), iPivot // ); if (isCreated) { // iObj.PivotWidth(1); iObj.PivotFill(false); iObj.PivotColor(clrAqua); iObj.PivotStyle(STYLE_SOLID); // AddObjectIfNotExists(iObj); } } } // // Vales ... int valesCount = ArraySize(conditions.vales); if (IsValidSize(valesCount)) { // for (int i = 0; i < valesCount; i++) { // XPVPivot iPivot = conditions.vales[i]; // XCXPVPivotObject *iObj; iObj = new XCXPVPivotObject(); // bool isCreated = iObj.Create( mPOIDrawer.ChartIdentification(), mPOIDrawer.SubWindowIdentification(), iPivot // ); if (isCreated) { // iObj.PivotWidth(1); iObj.PivotFill(false); iObj.PivotStyle(STYLE_SOLID); iObj.PivotColor(clrMagenta); // AddObjectIfNotExists(iObj); } } } /////////////////////////////////////////////////////////////////// // Conditions Parsing ... /////////////////////////////////////////////////////////////////// // // Conditions Props ... // // D1 ... // XPOIState d1State; ENUM_X_DIRECTION d1MarketDirection; XCSupportZone *d1SupportZones[]; XCResistanceZone *d1ResistanceZones[]; // XCSwing *d1SwingHigh; XCSwing *d1SwingLow; // // H4 ... // XPOIState h4State; ENUM_X_DIRECTION h4MarketDirection; XCSupportZone *h4SupportZones[]; XCResistanceZone *h4ResistanceZones[]; // XCSwing *h4SwingHigh; XCSwing *h4SwingLow; // // H2 ... // XPOIState h2State; ENUM_X_DIRECTION h2MarketDirection; XCSupportZone *h2SupportZones[]; XCResistanceZone *h2ResistanceZones[]; // XCSwing *h2SwingHigh; XCSwing *h2SwingLow; // // H1 ... // XPOIState h1State; ENUM_X_DIRECTION h1MarketDirection; XCSupportZone *h1SupportZones[]; XCResistanceZone *h1ResistanceZones[]; // XCSwing *h1SwingHigh; XCSwing *h1SwingLow; // // M15 ... // XPOIState m15State; ENUM_X_DIRECTION m15MarketDirection; XCSupportZone *m15SupportZones[]; XCResistanceZone *m15ResistanceZones[]; // XCSwing *m15SwingHigh; XCSwing *m15SwingLow; // // M5 ... // XPOIState m5State; ENUM_X_DIRECTION m5MarketDirection; XCSupportZone *m5SupportZones[]; XCResistanceZone *m5ResistanceZones[]; // XCSwing *m5SwingHigh; XCSwing *m5SwingLow; // // M1 ... // XPOIState m1State; ENUM_X_DIRECTION m1MarketDirection; XCSupportZone *m1SupportZones[]; XCResistanceZone *m1ResistanceZones[]; // XCSwing *m1SwingHigh; XCSwing *m1SwingLow; // // Clean Method ... // // D1 ... // d1State.Clean(); d1MarketDirection = X_DIRECTION_NONE; Clean(d1SupportZones); Clean(d1ResistanceZones); // d1SwingHigh = NULL; d1SwingLow = NULL; // // H4 ... // h4State.Clean(); h4MarketDirection = X_DIRECTION_NONE; Clean(h4SupportZones); Clean(h4ResistanceZones); // h4SwingHigh = NULL; h4SwingLow = NULL; // // H2 ... // h2State.Clean(); h2MarketDirection = X_DIRECTION_NONE; Clean(h2SupportZones); Clean(h2ResistanceZones); // h2SwingHigh = NULL; h2SwingLow = NULL; // // H1 ... // h1State.Clean(); h1MarketDirection = X_DIRECTION_NONE; Clean(h1SupportZones); Clean(h1ResistanceZones); // h1SwingHigh = NULL; h1SwingLow = NULL; // // M15 ... // m15State.Clean(); m15MarketDirection = X_DIRECTION_NONE; Clean(m15SupportZones); Clean(m15ResistanceZones); // m15SwingHigh = NULL; m15SwingLow = NULL; // // M5 ... // m5State.Clean(); m5MarketDirection = X_DIRECTION_NONE; Clean(m5SupportZones); Clean(m5ResistanceZones); // m5SwingHigh = NULL; m5SwingLow = NULL; // // M1 ... // m1State.Clean(); m1MarketDirection = X_DIRECTION_NONE; Clean(m1SupportZones); Clean(m1ResistanceZones); // m1SwingHigh = NULL; m1SwingLow = NULL; // // Tools Functions ... // // // Custom Tools ... /** * Check Conditions for Detect Market Structure ... * * @param structure: ENUM_X_DIRECTION member, Market Structure Direction reference ... * * @return ( bool ) */ bool HasMarketStructure( ENUM_X_DIRECTION &structure // ) { // bool result = false; // structure = X_DIRECTION_NONE; // result = IsValid(); if (!result) { return result; } // bool is1DBullish = IsBullish(d1MarketDirection); bool is1DBearish = IsBearish(d1MarketDirection); // bool is4HBullish = IsBullish(h4MarketDirection); bool is4HBearish = IsBearish(h4MarketDirection); // bool is2HBullish = IsBullish(h2MarketDirection); bool is2HBearish = IsBearish(h2MarketDirection); // bool is1HBullish = IsBullish(h1MarketDirection); bool is1HBearish = IsBearish(h1MarketDirection); // bool is15MBullish = IsBullish(m15MarketDirection); bool is15MBearish = IsBearish(m15MarketDirection); // bool is5MBullish = IsBullish(m5MarketDirection); bool is5MBearish = IsBearish(m5MarketDirection); // bool is1MBullish = IsBullish(m1MarketDirection); bool is1MBearish = IsBearish(m1MarketDirection); // bool isStructuresBullish = // is1HBullish && is15MBullish && is5MBullish // ; // bool isStructuresBearish = // is1HBearish && is15MBearish && is5MBearish // ; // bool hasMarketStructure = isStructuresBullish || isStructuresBearish; result = hasMarketStructure; if (!result) { return result; } // structure = isStructuresBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } // // Strategy Class Calling on Conditions Detections ... // // Detect Market Structures ... // // 1D ... conditions.d1State = _1DState; result = DetectMarketStructure( conditions.d1MarketDirection, conditions.d1SupportZones, conditions.d1ResistanceZones, _1DState // ); if (!result) { return result; } // // 4H ... conditions.h4State = _4HState; result = DetectMarketStructure( conditions.h4MarketDirection, conditions.h4SupportZones, conditions.h4ResistanceZones, _4HState // ); if (!result) { return result; } // // 2H ... conditions.h2State = _2HState; result = DetectMarketStructure( conditions.h2MarketDirection, conditions.h2SupportZones, conditions.h2ResistanceZones, _2HState // ); if (!result) { return result; } // // 1H ... conditions.h1State = _1HState; result = DetectMarketStructure( conditions.h1MarketDirection, conditions.h1SupportZones, conditions.h1ResistanceZones, _1HState // ); if (!result) { return result; } // // 15M ... conditions.m15State = _15MState; result = DetectMarketStructure( conditions.m15MarketDirection, conditions.m15SupportZones, conditions.m15ResistanceZones, _15MState // ); if (!result) { return result; } // // 5M ... conditions.m5State = _5MState; result = DetectMarketStructure( conditions.m5MarketDirection, conditions.m5SupportZones, conditions.m5ResistanceZones, _5MState // ); if (!result) { return result; } // // 1M ... conditions.m1State = _1MState; result = DetectMarketStructure( conditions.m1MarketDirection, conditions.m1SupportZones, conditions.m1ResistanceZones, _1MState // ); if (!result) { return result; } // // 1H-15M-5M ... ENUM_X_DIRECTION marketStructure = X_DIRECTION_NONE; result = conditions.HasMarketStructure(marketStructure); if (!result) { return result; } // // Detect Swing High and Swing Low ... // 1H-15M-5M ... int count = 0; // // 1H ... // XCSwing *h1SwingLows[]; XCSwing *h1SwingHighs[]; XCSupportZone *h1SupportZone = NULL; XCResistanceZone *h1ResistanceZone = NULL; // count = ArraySize(conditions.h1SupportZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCSupportZone *item = conditions.h1SupportZones[i]; // bool canSelect = h1SupportZone == NULL || h1SupportZone.Lower() < item.Lower(); if (canSelect) { h1SupportZone = item; } } } if (h1SupportZone != NULL) { // // Detect Swings ... count = ArraySize(conditions.h1State.swingLows); if (IsValidSize(count)) { // double upper = h1SupportZone.Upper(); double lower = h1SupportZone.Lower(); // for (int i = 0; i < count; i++) { // XCSwing *item = conditions.h1State.swingLows[i]; // XOHCL iBar; bool isFilled = item.FillBar(iBar); if (!isFilled) { continue; } // bool canSelect = (iBar.high <= upper && iBar.low >= lower) || (iBar.high >= upper && iBar.low <= lower); if (canSelect) { // Add( item, h1SwingLows // ); // // Draw ... XCSwingLowObject *iObj; bool isCreated = mPOIDrawer.CreateSwingLow( item, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } } } // // Draw ... XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( h1SupportZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // count = ArraySize(conditions.h1ResistanceZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCResistanceZone *item = conditions.h1ResistanceZones[i]; // bool canSelect = h1ResistanceZone == NULL || h1ResistanceZone.Upper() > item.Upper(); if (canSelect) { h1ResistanceZone = item; } } } if (h1ResistanceZone != NULL) { // // Detect Swings ... count = ArraySize(conditions.h1State.swingHighs); if (IsValidSize(count)) { // double upper = h1ResistanceZone.Upper(); double lower = h1ResistanceZone.Lower(); // for (int i = 0; i < count; i++) { // XCSwing *item = conditions.h1State.swingHighs[i]; // XOHCL iBar; bool isFilled = item.FillBar(iBar); if (!isFilled) { continue; } // bool canSelect = (iBar.high <= upper && iBar.low >= lower) || (iBar.high >= upper && iBar.low <= lower); if (canSelect) { // Add( item, h1SwingHighs // ); // // Draw ... XCSwingHighObject *iObj; bool isCreated = mPOIDrawer.CreateSwingHigh( item, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } } } // // Draw ... XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( h1ResistanceZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // // 15M ... // XCSupportZone *m15SupportZone = NULL; count = ArraySize(conditions.m15SupportZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCSupportZone *item = conditions.m15SupportZones[i]; // bool canSelect = m15SupportZone == NULL || m15SupportZone.Lower() < item.Lower(); if (canSelect) { m15SupportZone = item; } } } if (m15SupportZone != NULL) { // XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( m15SupportZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // XCResistanceZone *m15ResistanceZone = NULL; count = ArraySize(conditions.m15ResistanceZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCResistanceZone *item = conditions.m15ResistanceZones[i]; // bool canSelect = m15ResistanceZone == NULL || m15ResistanceZone.Upper() > item.Upper(); if (canSelect) { m15ResistanceZone = item; } } } if (m15ResistanceZone != NULL) { // XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( m15ResistanceZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // // 5M ... // XCSupportZone *m5SupportZone = NULL; count = ArraySize(conditions.m5SupportZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCSupportZone *item = conditions.m5SupportZones[i]; // bool canSelect = m5SupportZone == NULL || m5SupportZone.Lower() < item.Lower(); if (canSelect) { m5SupportZone = item; } } } if (m5SupportZone != NULL) { // XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( m5SupportZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // XCResistanceZone *m5ResistanceZone = NULL; count = ArraySize(conditions.m5ResistanceZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCResistanceZone *item = conditions.m5ResistanceZones[i]; // bool canSelect = m5ResistanceZone == NULL || m5ResistanceZone.Upper() > item.Upper(); if (canSelect) { m5ResistanceZone = item; } } } if (m5ResistanceZone != NULL) { // XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( m5ResistanceZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // // DrawState(_5MState); // // // Strategy Class Tools Functions ... /** * Detect Specified States Market Structure ... * * @param dir: ENUM_X_DIRECTION member, Refrence ... * @param state: XPOIState instance ... * * @return ( bool ) */ bool DetectMarketStructure( ENUM_X_DIRECTION &dir, XCSupportZone *&supportZones[], XCResistanceZone *&resistanceZones[], XPOIState &state // ) { // bool result = false; // int count = 0; // // Filter Untouched Supports ... Clean(supportZones); int untouchedSupportsCount = 0; count = ArraySize(state.supportZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCSupportZone *item = state.supportZones[i]; // // Find Breakout Bar XOHCL iBar; bool isFilled = item.FillBar(iBar); if (!isFilled) { break; } // int iBarIndex = iBar.Index(); int iBarUnTouchedCount = 0; for (int j = 0; j < iBarIndex; j++) { // XOHCL jBar; bool isInited = jBar.Init( iBar.symbol, iBar.period, j // ); if (!isInited) { break; } // bool isUntouched = jBar.low > item.Upper(); if (isUntouched) { iBarUnTouchedCount++; } else { iBarUnTouchedCount--; } } // if (iBarUnTouchedCount > 0) { // Add( item, supportZones // ); } } // untouchedSupportsCount = ArraySize(supportZones); if (IsValidSize(untouchedSupportsCount)) { // // Draw ... // for (int i = 0; i < untouchedSupportsCount; i++) // { // // // XCSupportZone *item = supportZones[i]; // // // XCSupportZoneObject *iObj; // bool isCreated = mPOIDrawer.CreateSupportZone( // item, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } } } // // Filter Untouched Resistances ... Clean(resistanceZones); int untouchedResistancesCount = 0; count = ArraySize(state.resistanceZones); if (IsValidSize(count)) { // for (int i = 0; i < count; i++) { // XCResistanceZone *item = state.resistanceZones[i]; // // Find Breakout Bar XOHCL iBar; bool isFilled = item.FillBar(iBar); if (!isFilled) { break; } // int iBarIndex = iBar.Index(); int iBarUnTouchedCount = 0; for (int j = 0; j < iBarIndex; j++) { // XOHCL jBar; bool isInited = jBar.Init( iBar.symbol, iBar.period, j // ); if (!isInited) { break; } // bool isUntouched = jBar.high < item.Lower(); if (isUntouched) { iBarUnTouchedCount++; } else { iBarUnTouchedCount--; } } // if (iBarUnTouchedCount > 0) { // Add( item, resistanceZones // ); } } // untouchedResistancesCount = ArraySize(resistanceZones); if (IsValidSize(untouchedResistancesCount)) { // // Draw ... // for (int i = 0; i < untouchedResistancesCount; i++) // { // // // XCResistanceZone *item = resistanceZones[i]; // // // XCResistanceZoneObject *iObj; // bool isCreated = mPOIDrawer.CreateResistanceZone( // item, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } } } // bool hasBullishStructure = IsValidSize(untouchedSupportsCount) && untouchedSupportsCount > untouchedResistancesCount; bool hasBearishStructure = IsValidSize(untouchedResistancesCount) && untouchedResistancesCount > untouchedSupportsCount; // result = (hasBullishStructure && !hasBearishStructure) || (hasBearishStructure && !hasBullishStructure); // if (result) { // dir = hasBullishStructure ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; } // return result; } //////////////////////////////////////////////////////////////////////////// // // Detect Order Blocks ... // int obsCount = 0; // // Find Bullish Order Block ... // XCOrderBlock *bullishOB = NULL; // XCRejectionBar *bullishOBRejectionBar = NULL; // obsCount = lastPivot.state.CountBullishOrderBlocks(); // if (IsValidSize(obsCount)) // { // // // for (int i = 0; i < obsCount; i++) // { // // // XCOrderBlock *iOB = lastPivot.state.bullishOrderBlocks[i]; // // // XOHCL iBar; // bool hasBar = iOB.FillBar(iBar); // bool isPeriodSame = hasBar && // iBar.period == _period; // // // if (iOB.Upper() <= pivotMid && // iOB.Lower() >= lastPivot.lower) // { // // // bullishOB = iOB; // break; // } // } // } // bool hasBullishOB = bullishOB != NULL; // bool isBullishOBRejected = false; // if (hasBullishOB) // { // // // int bullishRejectedBarsCount = lastPivot.state.CountBullishRejectionBars(); // if (IsValidSize(bullishRejectedBarsCount)) // { // // // for (int i = 0; i < bullishRejectedBarsCount; i++) // { // // // XCRejectionBar *item = lastPivot.state.bullishRejectionBars[i]; // // // XOHCL iBar; // bool isFilled = item.FillBar(iBar); // if (!isFilled) // { // continue; // } // // // bool isRejected = iBar.low <= bullishOB.Lower() && // (iBar.GetDown() <= bullishOB.Upper() || // iBar.GetDown() > bullishOB.Upper()); // // // isBullishOBRejected = // bullishOBRejectionBar == NULL // ? isRejected // : isRejected && // item.From() > bullishOBRejectionBar.From(); // if (isBullishOBRejected) // { // bullishOBRejectionBar = item; // } // } // } // if (isBullishOBRejected) // { // // // bullishOBRejectionBar.To(cTime); // XCBullishRejectionBarObject *iObj; // bool isCreated = mPOIDrawer.CreateBullishRejectionBar( // bullishOBRejectionBar, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // // // bullishOB.To(cTime); // XCBullishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBullishOrderBlock( // bullishOB, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // // Find Bearish Order Block ... // XCOrderBlock *bearishOB = NULL; // XCRejectionBar *bearishOBRejectionBar = NULL; // obsCount = lastPivot.state.CountBearishOrderBlocks(); // if (IsValidSize(obsCount)) // { // // // for (int i = 0; i < obsCount; i++) // { // // // XCOrderBlock *iOB = lastPivot.state.bearishOrderBlocks[i]; // // // XOHCL iBar; // bool hasBar = iOB.FillBar(iBar); // bool isPeriodSame = hasBar && // iBar.period == _period; // // // if (iOB.Lower() >= pivotMid && // iOB.Upper() <= lastPivot.upper) // { // // // bearishOB = iOB; // break; // } // } // } // bool hasBearishOB = bearishOB != NULL; // bool isBearishOBRejected = false; // if (hasBearishOB) // { // // // int bearishRejectedBarsCount = lastPivot.state.CountBearishRejectionBars(); // if (IsValidSize(bearishRejectedBarsCount)) // { // // // for (int i = 0; i < bearishRejectedBarsCount; i++) // { // // // XCRejectionBar *item = lastPivot.state.bearishRejectionBars[i]; // // // XOHCL iBar; // bool isFilled = item.FillBar(iBar); // if (!isFilled) // { // continue; // } // // // bool isRejected = iBar.high >= bearishOB.Upper() && // (iBar.GetUp() <= bearishOB.Lower() || // iBar.GetUp() > bearishOB.Lower()); // // // isBearishOBRejected = // bearishOBRejectionBar == NULL // ? isRejected // : isRejected && // item.From() > bearishOBRejectionBar.From(); // if (isBearishOBRejected) // { // bearishOBRejectionBar = item; // } // } // } // if (isBearishOBRejected) // { // // // bearishOBRejectionBar.To(cTime); // XCBearishRejectionBarObject *iObj; // bool isCreated = mPOIDrawer.CreateBearishRejectionBar( // bearishOBRejectionBar, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // // // bearishOB.To(cTime); // XCBearishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBearishOrderBlock( // bearishOB, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // // // // Find an Order Block ... // bool isBearishOrderBlockRejected = false; ///////////////////////////////////////////////////////////////////////////// // RedrawOrderFlow(); // // Check Candlestick PullBacks ... ENUM_X_DIRECTION pullBackDir; bool hasPullBack = mBarAnalyser.HasPullBack( pullBackDir, cBar, 3, // Loopback ... true // Force Body ... ); bool hasBullishPullback = hasPullBack && pullBackDir == X_DIRECTION_BULLISH; bool hasBearishPullback = hasPullBack && pullBackDir == X_DIRECTION_BEARISH; // bool isInDiscount = bid < pivotMid && bid > lastPivot.lower; // bool isInPremium = bid > pivotMid && bid < lastPivot.upper; // // Check Order Flow Validation ... // // For Bullish Order Flow ... // if Price Breakes Lower to Down, means Change of Charcter Happens ... bool isCHOCHHappens = isBullishOrderFlow ? bid < lastPivot.lower - pip : bid > lastPivot.upper + pip; // // For Bullish Order Flow ... // if Price Breakes Upper to Up, means Breake of Structure Happens ... bool isBOSHappens = isBullishOrderFlow ? bid > lastPivot.upper + pip : bid < lastPivot.lower - pip; // if (isBOSHappens) { // // RedrawOrderFlow(); Print(""); } // if (isCHOCHHappens) { // result = false; ResetOrderFlow(); return result; } // // Check 3MA and 3VWAP State ... // bool isVWAPBullishOrdered = // ( // (conditions.x3vwapConditions.isBullishOrdered || conditions.x3vwapConditions.isSwitchedToBullishOrdered) // || // conditions.x3vwapConditions.fasts[cIndex] > conditions.x3vwapConditions.mids[cIndex] // || // conditions.x3vwapConditions.mids[cIndex] > conditions.x3vwapConditions.slows[cIndex] // ) // ; // bool isVWAPBearishOrdered = // ( // (conditions.x3vwapConditions.isBearishOrdered || conditions.x3vwapConditions.isSwitchedToBearishOrdered) // || // conditions.x3vwapConditions.fasts[cIndex] < conditions.x3vwapConditions.mids[cIndex] // || // conditions.x3vwapConditions.mids[cIndex] < conditions.x3vwapConditions.slows[cIndex] // ) // ; // bool isVWapBullishState = // ( // (conditions.x3vwapConditions.isBullishState || conditions.x3vwapConditions.isSwitchedToBullishState) // || // (x3vwapHelper.IsBullish(conditions.x3vwapConditions.fastStates[cIndex]) && x3vwapHelper.IsBullish(conditions.x3vwapConditions.midStates[cIndex])) // || // (x3vwapHelper.IsBullish(conditions.x3vwapConditions.midStates[cIndex]) && x3vwapHelper.IsBullish(conditions.x3vwapConditions.slowStates[cIndex])) // ) // ; // bool isVWapBearishState = // ( // (conditions.x3vwapConditions.isBearishState || conditions.x3vwapConditions.isSwitchedToBearishState) // || // (x3vwapHelper.IsBearish(conditions.x3vwapConditions.fastStates[cIndex]) && x3vwapHelper.IsBearish(conditions.x3vwapConditions.midStates[cIndex])) // || // (x3vwapHelper.IsBearish(conditions.x3vwapConditions.midStates[cIndex]) && x3vwapHelper.IsBearish(conditions.x3vwapConditions.slowStates[cIndex])) // ) // ; // bool isVWapOverFastMA = // ( // (conditions.x3vwapConditions.fasts[cIndex] > conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.mids[cIndex] > conditions.x3maConditions.fasts[cIndex]) // || // (conditions.x3vwapConditions.fasts[cIndex] > conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.mids[cIndex] > conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.slows[cIndex] > conditions.x3maConditions.fasts[cIndex]) // ) // ; // bool isVWapUnderFastMA = // ( // (conditions.x3vwapConditions.fasts[cIndex] < conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.mids[cIndex] < conditions.x3maConditions.fasts[cIndex]) // || // (conditions.x3vwapConditions.fasts[cIndex] < conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.mids[cIndex] < conditions.x3maConditions.fasts[cIndex] && conditions.x3vwapConditions.slows[cIndex] < conditions.x3maConditions.fasts[cIndex]) // ) // ; // bool is3Bullish = // ( // (isVWAPBullishOrdered && isVWapBullishState) // || // (isVWAPBullishOrdered && isVWapOverFastMA) // || // (isVWapBullishState && isVWapOverFastMA) // ) // ; // bool is3Bearish = // ( // (isVWAPBearishOrdered && isVWapBearishState) // || // (isVWAPBearishOrdered && isVWapUnderFastMA) // || // (isVWapBearishState && isVWapUnderFastMA) // ) // ; // // Check Parabolic Sars State ... // bool isSarBullish = // (conditions.xchsarConditions.isCBullish && conditions.xchsarConditions.isSSwitchedBullish) // || // (conditions.xchsarConditions.isSBullish && conditions.xchsarConditions.isCSwitchedBullish) // ; bool isSarBearish = // (conditions.xchsarConditions.isCBearish && conditions.xchsarConditions.isSSwitchedBearish) // || // (conditions.xchsarConditions.isSBearish && conditions.xchsarConditions.isCSwitchedBearish) // ; // // // hasLong = // // // is3Bullish && // // isInDiscount && // isSarBullish // && // // hasBullishPullback && // // bullishLiquidityPercent > 30 // // // ; // // // hasShort = // // // is3Bearish && // // isInPremium && // isSarBearish // && // // hasBearishPullback && // // bearishLiquidityPercent > 30 // // // ; ////////////////////// // XPVPivot lastPivot; result = GetLastItem( lastPivot, mOrderFlow // ); if (!result) { return result; } bool isBullishOrderFlow = IsBullish(mOrderFlowDir); bool isBearishOrderFlow = IsBearish(mOrderFlowDir); double pivotMid = lastPivot.CalculateMid(); // // Calculate Liquidity Percent ... double bullishLiquidityPercent = lastPivot .CalculateLiquidityPercent(X_DIRECTION_BULLISH); double bearishLiquidityPercent = lastPivot .CalculateLiquidityPercent(X_DIRECTION_BEARISH); double minLiquidityPercent = 35; bool hasBullishLiquidity = bullishLiquidityPercent >= minLiquidityPercent; bool hasBearishLiquidity = bearishLiquidityPercent >= minLiquidityPercent; result = hasBullishLiquidity || hasBearishLiquidity; if (!result) { return result; } ///////////////////////////////////////////////////////////////// // // // // 1D Period ... // // POI Detector ... // m1DPOI = new XCPOIDetector( // symbol, // PERIOD_D1 // // ); // // // m1DPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m1DPOI.Init(); // // // // 4H Period ... // // POI Detector ... // m4HPOI = new XCPOIDetector( // symbol, // PERIOD_H4 // // ); // // // m4HPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m4HPOI.Init(); // // // // 2H Period ... // // POI Detector ... // m2HPOI = new XCPOIDetector( // symbol, // PERIOD_H2 // // ); // // // m2HPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m2HPOI.Init(); // // 1H Period ... // POI Detector ... // m1HPOI = new XCPOIDetector( // symbol, // PERIOD_H1 // // ); // // // m1HPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m1HPOI.Init(); // // 15M Period ... // POI Detector ... // m15MPOI = new XCPOIDetector( // symbol, // PERIOD_M15 // // ); // // // m15MPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m15MPOI.Init(); // // // // 5M Period ... // // POI Detector ... // m5MPOI = new XCPOIDetector( // symbol, // PERIOD_M5 // // ); // // // m5MPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m5MPOI.Init(); // // // // 1M Period ... // // POI Detector ... // m1MPOI = new XCPOIDetector( // symbol, // PERIOD_M1 // // ); // // // m1MPOI.MaxNumberOfRequiredPOIs(poiRequired); // // // m1MPOI.Init(); //////////////////////////////// // delete m1DPOI; // delete m4HPOI; // delete m2HPOI; delete m1HPOI; delete m15MPOI; // delete m5MPOI; // delete m1MPOI; /////////////////////////////////// // // Point Of Interests ... XCPOIDetector *mTriggerPOIDetector; XCPOIDetector *mAnalysePOIDetector; XCPOIDetector *mVisionPOIDetector; // // XCPOIDetector *m1DPOI; // XCPOIDetector *m4HPOI; // XCPOIDetector *m2HPOI; // XCPOIDetector *m1HPOI; // XCPOIDetector *m15MPOI; // XCPOIDetector *m5MPOI; // XCPOIDetector *m1MPOI; // XPOIState mTriggerPOIState; XPOIState mAnalysePOIState; XPOIState mVisionPOIState; // XPOIState _1DState; // XPOIState _4HState; // XPOIState _2HState; // XPOIState _1HState; // XPOIState _15MState; // XPOIState _5MState; // XPOIState _1MState; // XPOIState _CombineState; /////////////////////////////////////////// // // Update POIs ... // ENUM_XPOI_EVENTS _events[]; mPOIDetector.Update(_events); // // // ENUM_XPOI_EVENTS _1DStates[]; // m1DPOI.Update(_1DStates); // // // ENUM_XPOI_EVENTS _4HStates[]; // m4HPOI.Update(_4HStates); // // // ENUM_XPOI_EVENTS _2HStates[]; // m2HPOI.Update(_2HStates); // ENUM_XPOI_EVENTS _1HStates[]; m1HPOI.Update(_1HStates); // // // ENUM_XPOI_EVENTS _15MStates[]; // m15MPOI.Update(_15MStates); // // // ENUM_XPOI_EVENTS _5MStates[]; // m5MPOI.Update(_5MStates); // // // ENUM_XPOI_EVENTS _1MStates[]; // m1MPOI.Update(_1MStates); // // // // Read all POI States ... mPOIDetector.GetState(_state); // m1DPOI.GetState(_1DState); // m4HPOI.GetState(_4HState); // m2HPOI.GetState(_2HState); m1HPOI.GetState(_1HState); // m15MPOI.GetState(_15MState); // m5MPOI.GetState(_5MState); // m1MPOI.GetState(_1MState); // // Combine States ... // XPOIState _States[]; // AddRef( // _1DState, // _States // // ); // AddRef( // _4HState, // _States // // ); // AddRef( // _2HState, // _States // // ); // AddRef( // _1HState, // _States // // ); // AddRef( // _15MState, // _States // // ); // AddRef( // _5MState, // _States // // ); // AddRef( // _1MState, // _States // // ); // CombineStates( // _CombineState, // _States // // ); //////////////////////////////////////////////////////////////// // // Works by WVAP and PSar ... bool long1 = // conditions.x3vwapConditions.isBullishState && conditions.x3vwapConditions.isBullishOrdered && // conditions.xpvConditions.vales[cIndex] == conditions.xchsarConditions.cSars[cIndex] && conditions.xchsarConditions.cSars[cIndex] < conditions.x3vwapConditions.slows[cIndex] // ; if (long1) { // CustomStateDrawing(_1HState); selectedSL = conditions.xpvConditions.vales[cIndex]; } // // Works by WVAP and PSar ... bool short1 = // conditions.x3vwapConditions.isBearishState && conditions.x3vwapConditions.isBearishOrdered && // conditions.xpvConditions.peaks[cIndex] == conditions.xchsarConditions.cSars[cIndex] && conditions.xchsarConditions.cSars[cIndex] > conditions.x3vwapConditions.slows[cIndex] // ; if (short1) { // CustomStateDrawing(_1HState); selectedSL = conditions.xpvConditions.peaks[cIndex]; } ///////////////////////////////////////////////////////////////////////////////////////////////////// // mOrderFlow[pivotIDX].state.ticksZone = //_15MState.ticksZone; // // // // D1 ... // XPOIState d1; // if (_1DState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _1DState, // d1, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (d1.HasChild()) // { // d1.Fill(mOrderFlow[pivotIDX].state); // } // } // // // // H4 ... // XPOIState h4; // if (_4HState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _4HState, // h4, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (h4.HasChild()) // { // h4.Fill(mOrderFlow[pivotIDX].state); // } // } // // H2 ... // XPOIState h2; // if (_2HState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _2HState, // h2, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (h2.HasChild()) // { // h2.Fill(mOrderFlow[pivotIDX].state); // } // } // // H1 ... XPOIState h1; if (_1HState.HasChild()) { // DetectPivotPOIs( mOrderFlow[pivotIDX], _1HState, h1, lookupSwingHighs, lookupSwingLows, lookupSupportZones, lookupResistanceZones, lookupSupplyZones, lookupDemandZones, lookupBullishOrderBlocks, lookupBearishOrderBlocks, lookupBullishFairValueGaps, lookupBearishFairValueGaps, lookupBullishRejectionBars, lookupBearishRejectionBars, lookupBullishMomentumBars, lookupBearishMomentumBars // ); // if (h1.HasChild()) { h1.Fill(mOrderFlow[pivotIDX].state); } } // // M15 ... // XPOIState m15; // if (_15MState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _15MState, // m15, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (m15.HasChild()) // { // m15.Fill(mOrderFlow[pivotIDX].state); // } // } // // M5 ... // XPOIState m5; // if (_5MState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _5MState, // m5, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (m5.HasChild()) // { // m5.Fill(mOrderFlow[pivotIDX].state); // } // } // // M1 ... // XPOIState m1; // if (_1MState.HasChild()) // { // // // DetectPivotPOIs( // mOrderFlow[pivotIDX], // _1MState, // m1, // lookupSwingHighs, // lookupSwingLows, // lookupSupportZones, // lookupResistanceZones, // lookupSupplyZones, // lookupDemandZones, // lookupBullishOrderBlocks, // lookupBearishOrderBlocks, // lookupBullishFairValueGaps, // lookupBearishFairValueGaps, // lookupBullishRejectionBars, // lookupBearishRejectionBars, // lookupBullishMomentumBars, // lookupBearishMomentumBars // // ); // // // if (m1.HasChild()) // { // m1.Fill(mOrderFlow[pivotIDX].state); // } // }