// // 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); // } // } ////////////////////////////////// /** * Detect SL Candidates based on Strategy and Conditions ... * * @param result: Double array reference ... * @param entry: Double, Position Entry Price ... * @param conditions: X121SMCStrategyConditions instance, Provides Configurations ... * @param type: ENUM_X_POSITION_TYPES member, Specified Position Type ... */ void DetectSLCandidates( double &result[], double entry, X121SMCStrategyConditions &conditions, ENUM_X_POSITION_TYPES type // ) override { // Clean(result); // int cIndex = 1; // if (entry <= 0 || !conditions.IsValid() || type == X_POSITION_TYPE_ALL || type == X_POSITION_TYPE_NONE) { return; } // Add( conditions.x3vwapConditions.fasts[cIndex], result // ); // Add( conditions.x3vwapConditions.mids[cIndex], result // ); // Add( conditions.x3vwapConditions.slows[cIndex], result // ); // Add( conditions.x3maConditions.fasts[cIndex], result // ); // Add( conditions.xpvConditions.vales[cIndex], result // ); // Add( conditions.xpvConditions.peaks[cIndex], result // ); // } //////////////////////////////////////// bool canContinue = true; while (canContinue) { // XOHCL iBar; bool isBarInited = iBar.Init( mBar.symbol, mBar.period, barIndex // ); if (!isBarInited) { break; } // if (bullOB == NULL) { // XCOrderBlock *ob; bool isBullOB = cycleHelper .mPOIDetector .DetectBullishOrderBlock( mBar, ob // ); if (isBullOB) { // bool isPricePassed = bar.low > ob.Upper(); if (isPricePassed) { // if (mBullOB == NULL) { // mBullOB = ob; } else { // bool isRefined = mBullOB.Upper() < ob.Upper(); if (isRefined) { mBullOB = ob; } } } } } // if (bearOB == NULL) { // XCOrderBlock *ob; bool isBearOB = cycleHelper .mPOIDetector .DetectBearishOrderBlock( mBar, ob // ); if (isBearOB) { // bool isPricePassed = bar.high < ob.Lower(); if (isPricePassed) { // if (mBearOB == NULL) { // mBearOB = ob; } else { // bool isRefined = mBearOB.Lower() > ob.Lower(); if (isRefined) { mBearOB = ob; } } } } } // canContinue = (bullOB == NULL && mBullOB == NULL) || (bearOB == NULL && mBearOB == NULL); if (canContinue) { barIndex++; } } // if (mBullOB != NULL) { bullOB = mBullOB; } // if (mBearOB != NULL) { bearOB = mBearOB; } //////////////////////////////////////////////////////////// // // Detect an Order Block in Vision ... if (conditions.visionBullOB == NULL || conditions.visionBearOB == NULL) { // result = DetectOrderBlocks( NULL, NULL, conditions.visionBullOB, conditions.visionBearOB, cBar, mVisionState // ); if (!result) { // conditions.Clean(); return result; } // XCBullishOrderBlockObject *iBullOBObj; conditions.visionBullOB.To(cTime); result = mPOIDrawer.CreateBullishOrderBlock( conditions.visionBullOB, iBullOBObj // ); if (result) { AddObjectIfNotExists(iBullOBObj); } // XCBearishOrderBlockObject *iBearOBObj; conditions.visionBearOB.To(cTime); result = mPOIDrawer.CreateBearishOrderBlock( conditions.visionBearOB, iBearOBObj // ); if (result) { AddObjectIfNotExists(iBearOBObj); } } // // Consolidation Order Blocks ... if (conditions.consolidationBullOB == NULL || conditions.consolidationBearOB == NULL) { // result = DetectOrderBlocks( conditions.visionBullOB, conditions.visionBearOB, conditions.consolidationBullOB, conditions.consolidationBearOB, cBar, mConsolidationState // ); if (!result) { // conditions.Clean(); return result; } // XCBullishOrderBlockObject *iBullOBObj; conditions.consolidationBullOB.To(cTime); result = mPOIDrawer.CreateBullishOrderBlock( conditions.consolidationBullOB, iBullOBObj // ); if (result) { AddObjectIfNotExists(iBullOBObj); } // XCBearishOrderBlockObject *iBearOBObj; conditions.consolidationBearOB.To(cTime); result = mPOIDrawer.CreateBearishOrderBlock( conditions.consolidationBearOB, iBearOBObj // ); if (result) { AddObjectIfNotExists(iBearOBObj); } } // msg = "OrderBlocks Detected ..."; Alert(msg); // // Detect Trigger Order Flow ... if (!HasValidOrderFlow()) { // int samePivots = 40; int requiredPivots = 10; // bool useVisionState = false; bool useConsolidationState = false; bool useVerificationState = false; bool useAnalyseState = false; bool useDecisionState = true; bool useTriggerState = false; // DetectOrderFlow( cIndex, samePivots, requiredPivots, mTriggerCycleHelper, mOrderFlow, mOrderFlowDir, // // Filling Pivot State ... useVisionState, // Use Vision State ... useConsolidationState, // Use Consolidation State ... useVerificationState, // Use Verification State ... useAnalyseState, // Use Analyse State ... useDecisionState, // Use Decision State ... useTriggerState // Use Trigger State ... ); // result = HasValidOrderFlow(); if (!result) { // conditions.Clean(); return result; } // bool ignoreSwingHighs = true; bool ignoreSwingLows = true; bool ignoreSupportZones = true; bool ignoreResistanceZones = true; bool ignoreSupplyZones = true; bool ignoreDemandZones = true; bool ignoreBullishOrderBlocks = true; bool ignoreBearishOrderBlocks = true; bool ignoreBullishFairValueGaps = true; bool ignoreBearishFairValueGaps = true; bool ignoreBullishRejectionBars = true; bool ignoreBearishRejectionBars = true; bool ignoreBullishMomentumBars = true; bool ignoreBearishMomentumBars = true; // RedrawOrderFlow( false, // Force Clean ... false, // Same Period ... true, // Order Flow ... true, // Order Flow State ... false, // Only Last Order Flow ... true, // Only Last Order Flow State ... // mOrderFlowDir, // Direction Force ... ignoreSwingHighs, ignoreSwingLows, ignoreSupportZones, ignoreResistanceZones, ignoreSupplyZones, ignoreDemandZones, ignoreBullishOrderBlocks, ignoreBearishOrderBlocks, ignoreBullishFairValueGaps, ignoreBearishFairValueGaps, ignoreBullishRejectionBars, ignoreBearishRejectionBars, ignoreBullishMomentumBars, ignoreBearishMomentumBars // ); } // msg = "Found OrderFlow : " + (IsBullish(mOrderFlowDir) ? "Bullish" : "Berish"); Alert(msg); // // Check Market Conditions for // Specified Structure ... // ENUM_X_DIRECTION marketStructureDir = X_DIRECTION_NONE; // result = conditions.HasDirection( // marketStructureDir, // cBar // // ); // if (!result) // { // // // conditions.Clean(); // return result; // } // msg = "Found Market Strucutre : " + (IsBullish(marketStructureDir) ? "Bullish" : "Berish"); // Alert(msg); // // conditions.marketStructureDir = marketStructureDir; // // // XPVPivot lastPivot; // result = GetLastItem( // lastPivot, // mOrderFlow // // ); // if (!result) // { // // // conditions.Clean(); // return result; // } // // Detect Last FVG ... // XOHCL breakerBar; // result = DetectLastBreakerBar( // cBar, // breakerBar, // lastPivot, // marketStructureDir // // ); // if (!result) // { // // // conditions.Clean(); // return result; // } // msg = "Found Breaker Bar: " + breakerBar.GetTag(); // Alert(msg); // // // // Detect Nearest Momentum or Rejection Bar ... // XOHCL decisionBar; // result = mDecisionCycleHelper.DetectNearestDecisionBar( // decisionBar, // marketStructureDir, // cBar // // ); // if (!result) // { // return result; // } // msg = "Found Decision Bar: " + decisionBar.GetTag(); // Alert(msg); // // // // Detect Nearest Sar Change ... // XOHCL sarChangeBar; // result = mTriggerCycleHelper.DetectNearestCSARChange( // sarChangeBar, // cBar // // ); // if (!result) // { // // // conditions.Clean(); // return result; // } // msg = "Found Sar Change Bar: " + sarChangeBar.GetTag(); // Alert(msg); // // // // Now we Hvae to Check Other Conditions ... // result = // // breakerBar.time > sarChangeBar.time && // // decisionBar.time > breakerBar.time; // decisionBar.time > sarChangeBar.time; // if (!result) // { // // // conditions.Clean(); // return result; // } // // // // Now we Have Check Direction Related Conditions ... // if (IsBullish(marketStructureDir)) // { // // // result = // // bid > decisionBar.high && // // bid > breakerBar.high && // bid > sarChangeBar.high && // bid > conditions.triggerConditions.xchsarConditions.cSars[0]; // } // else // { // // // result = // // bid < decisionBar.low && // // bid < breakerBar.low && // bid < sarChangeBar.high && // bid < conditions.triggerConditions.xchsarConditions.cSars[0]; // } // if (!result) // { // // // conditions.Clean(); // return result; // } // // // conditions.provider = "X121SMC"; // if (IsBullish(marketStructureDir)) // { // // // // conditions.sl = decisionBar.low; // // conditions.sl = breakerBar.low; // conditions.sl = conditions.triggerConditions.xchsarConditions.cSars[0]; // } // else // { // // // // conditions.sl = decisionBar.high; // // conditions.sl = breakerBar.high; // conditions.sl = conditions.triggerConditions.xchsarConditions.cSars[0]; // } ////////////////////////////////////////////////////////////////// // bool isSamePeaks = // conditions.triggerConditions.x121Conditions.peaksBuffer[0] == conditions.decisionConditions.x121Conditions.peaksBuffer[0] && conditions.decisionConditions.x121Conditions.peaksBuffer[0] == conditions.analyseConditions.x121Conditions.peaksBuffer[0] // && // conditions.analyseConditions.x121Conditions.peaksBuffer[0] == conditions.verificationConditions.x121Conditions.peaksBuffer[0] && // conditions.verificationConditions.x121Conditions.peaksBuffer[0] == conditions.consolidationConditions.x121Conditions.peaksBuffer[0] && // conditions.consolidationConditions.x121Conditions.peaksBuffer[0] == conditions.visionConditions.x121Conditions.peaksBuffer[0] // ; if (isSamePeaks) { Print("isSamePeaks"); } // bool isSameVales = // conditions.triggerConditions.x121Conditions.valesBuffer[0] == conditions.decisionConditions.x121Conditions.valesBuffer[0] && conditions.decisionConditions.x121Conditions.valesBuffer[0] == conditions.analyseConditions.x121Conditions.valesBuffer[0] // && // conditions.analyseConditions.x121Conditions.valesBuffer[0] == conditions.verificationConditions.x121Conditions.valesBuffer[0] && // conditions.verificationConditions.x121Conditions.valesBuffer[0] == conditions.consolidationConditions.x121Conditions.valesBuffer[0] && // conditions.consolidationConditions.x121Conditions.valesBuffer[0] == conditions.visionConditions.x121Conditions.valesBuffer[0] // ; if (isSameVales) { Print("isSameVales"); } ////////////////////////////////////////////////////////////////////// // // Detect Valid Supply and Demand Zones ... XCSupplyZone *supplyZone; XCDemandZone *demandZone; result = mTriggerCycleHelper .DetectValisSupplyZone( cBar, supplyZone, demandZone // ); if (!result) { // conditions.Clean(); return result; } // supplyZone.To(cTime); XCSupplyZoneObject *iSupplyZoneObj; result = mPOIDrawer.CreateSupplyZone( supplyZone, iSupplyZoneObj // ); if (!result) { // conditions.Clean(); return result; } // demandZone.To(cTime); XCDemandZoneObject *iDemandZoneObj; result = mPOIDrawer.CreateDemandZone( demandZone, iDemandZoneObj // ); if (!result) { // conditions.Clean(); return result; } // Print("Supply and Demand Zone Created ..."); ////////////////////////////////////////////////////////////////////// // int consolidationsCount = mTriggerCycleHelper.CountConsolidationZones(); result = IsValidSize(consolidationsCount); if (!result) { // conditions.Clean(); return result; } XConsolidationZone consolidations[]; mTriggerCycleHelper.FillConsolidationZones(consolidations); // // Detect Bid inside Of Zones ... bool hasSupply = false; bool hasDemand = false; XCSupplyZone *supplyZone; XCDemandZone *demandZone; bool isBidInsideZone = false; XConsolidationZone bidContainsConsolidationZone; for (int i = consolidationsCount - 1; i >= 0; i--) { // XConsolidationZone iZone = consolidations[i]; // // Check Supply or Demand Zone ... hasSupply = iZone.HasSupplyZone(supplyZone); hasDemand = iZone.HasDemandZone(demandZone); // result = hasSupply || hasDemand; if (!result) { continue; } // // Check Bid inside Zone ... if (hasSupply) { // result = bid < supplyZone.Upper() && bid > supplyZone.Lower(); } else { // result = bid < demandZone.Upper() && bid > demandZone.Lower(); } // if (result) { break; } } if (!result) { // conditions.Clean(); return result; } // if (hasSupply) { // supplyZone.To(cTime); XCSupplyZoneObject *iSupplyZoneObj; result = mPOIDrawer.CreateSupplyZone( supplyZone, iSupplyZoneObj // ); if (!result) { // conditions.Clean(); return result; } } // if (hasDemand) { // demandZone.To(cTime); XCDemandZoneObject *iDemandZoneObj; result = mPOIDrawer.CreateDemandZone( demandZone, iDemandZoneObj // ); if (!result) { // conditions.Clean(); return result; } } // Print("BID Inside Zone ..."); ////////////////////////////////////////////////////////////////////////// bool DetectCandlestic( ENUM_X_DIRECTION &dir, X121SMCStrategyConditions &conditions // ) { // bool result = false; // dir = X_DIRECTION_NONE; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // int cIndex = 1; int pIndex = cIndex + 1; // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // XOHCL pBar; result = pBar.Init( symbol, period, pIndex // ); if (!result) { return result; } // // Momentum Bars ... XCMomentumBar *cBullishMomentum = NULL; XCMomentumBar *cBearishMomentum = NULL; XCMomentumBar *pBullishMomentum = NULL; XCMomentumBar *pBearishMomentum = NULL; int bullishMomentumBarsCount = conditions.triggerConditions.state .CountBullishMomentumBars(); int bearishMomentumBarsCount = conditions.triggerConditions.state .CountBearishMomentumBars(); if (IsValidSize(bullishMomentumBarsCount)) { // cBullishMomentum = conditions.triggerConditions.state.bullishMomentumBars[bullishMomentumBarsCount - 1]; pBullishMomentum = conditions.triggerConditions.state.bullishMomentumBars[bullishMomentumBarsCount - 2]; } if (IsValidSize(bearishMomentumBarsCount)) { // cBearishMomentum = conditions.triggerConditions.state.bearishMomentumBars[bearishMomentumBarsCount - 1]; pBearishMomentum = conditions.triggerConditions.state.bearishMomentumBars[bearishMomentumBarsCount - 2]; } // // Rejection Bars ... XCRejectionBar *cBullishRejection = NULL; XCRejectionBar *cBearishRejection = NULL; XCRejectionBar *pBullishRejection = NULL; XCRejectionBar *pBearishRejection = NULL; int bullishRejectionBarsCount = conditions.triggerConditions.state .CountBullishRejectionBars(); int bearishRejectionBarsCount = conditions.triggerConditions.state .CountBearishRejectionBars(); if (IsValidSize(bullishRejectionBarsCount)) { // cBullishRejection = conditions.triggerConditions.state.bullishRejectionBars[bullishRejectionBarsCount - 1]; pBullishRejection = conditions.triggerConditions.state.bullishRejectionBars[bullishRejectionBarsCount - 2]; } if (IsValidSize(bearishRejectionBarsCount)) { // cBearishRejection = conditions.triggerConditions.state.bearishRejectionBars[bearishRejectionBarsCount - 1]; pBearishRejection = conditions.triggerConditions.state.bearishRejectionBars[bearishRejectionBarsCount - 2]; } // bool isBullish = // // pBar is Rejection and cBar is Momentum ... // pBar is Momentum and cBar is Rejection ... // cBar is Momentum and Rejection ... // pBullishMomentum != NULL && pBullishMomentum.IsValid() && // cBullishMomentum != NULL && cBullishMomentum.IsValid() && // // pBullishRejection != NULL && pBullishRejection.IsValid() && // cBullishRejection != NULL && cBullishRejection.IsValid() && // ( // (pBar.time == pBullishRejection.BarTime() && cBar.time == cBullishMomentum.BarTime()) // || // (pBar.time == pBullishMomentum.BarTime() && cBar.time == cBullishRejection.BarTime()) // || // (cBar.time == cBullishMomentum.BarTime() && cBar.time == cBullishRejection.BarTime()) // ) // ; // bool isBearish = // // pBar is Rejection and cBar is Momentum ... // pBar is Momentum and cBar is Rejection ... // cBar is Momentum and Rejection ... // pBearishMomentum != NULL && pBearishMomentum.IsValid() && // cBearishMomentum != NULL && cBearishMomentum.IsValid() && // // pBearishRejection != NULL && pBearishRejection.IsValid() && // cBearishRejection != NULL && cBearishRejection.IsValid() && // ( // (pBar.time == pBearishRejection.BarTime() && cBar.time == cBearishMomentum.BarTime()) // || // (pBar.time == pBearishMomentum.BarTime() && cBar.time == cBearishRejection.BarTime()) // || // (cBar.time == cBearishMomentum.BarTime() && cBar.time == cBearishRejection.BarTime()) // ) // ; // result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } ///////////////////////////////////////////////////////////////////////////////////// /** * Detect Nearest Supply/Demand Zones ... * * @param bar: XOHCL instance, Start Bar ... * * @return ( bool ) */ bool DetectValisSupplyZone( XOHCL &bar, XCSupplyZone *&supplyZone, XCDemandZone *&demandZone // ) { // bool result = false; // result = bar.IsValid(); if (!result) { return result; } // int index = bar.Index(); // double bid = GetBid(bar.symbol); double ask = GetAsk(bar.symbol); // // Retrieve X121 Cnditions ... int conditionsLoopback = 10; X121Conditions x121Conditions; result = mX121Helper.GetConditions( x121Conditions, index, conditionsLoopback // ); if (!result) { return result; } int validPeaksCount = ArraySize(x121Conditions.validPeaksBuffer); int validValesCount = ArraySize(x121Conditions.validValesBuffer); // XPOIState state; ENUM_XPOI_EVENTS events[]; mPOIDetector.Update(events); mPOIDetector.GetState(state); result = state.IsValid() && state.HasChild(); if (!result) { return result; } // // Supply Zones ... XCSupplyZone *supplies[]; int suppliesCount = state.CountSupplyZones(); // // Select Bar Validated Supply Zones ... if (IsValidSize(suppliesCount)) { // for (int i = 0; i < suppliesCount; i++) { // XCSupplyZone *iZone = state.supplyZones[i]; // // Check Zone is Valid For Bar ... bool isValid = bar.high < iZone.Lower() && ask < iZone.Lower() && bid < iZone.Lower(); if (isValid) { // Add( iZone, supplies // ); } } } suppliesCount = ArraySize(supplies); // // Select Valid Peaks Filtered Supplies ... if (IsValidSize(suppliesCount)) { // // Check Valid Peaks ... XCSupplyZone *tmp[]; if (IsValidSize(validPeaksCount)) { // for (int i = 0; i < suppliesCount; i++) { // XCSupplyZone *iZone = supplies[i]; // for (int j = 0; j < validPeaksCount; j++) { // double value = x121Conditions.validPeaksBuffer[j]; // // Check Valid Peaks in Zone ... bool isZoneContainsValidValue = value >= iZone.Lower() && value <= iZone.Upper(); if (isZoneContainsValidValue) { // Add( iZone, tmp // ); } } } } // Clean(supplies); Copy( tmp, supplies // ); } suppliesCount = ArraySize(supplies); // // Select Nearest Supply Zone ... if (IsValidSize(suppliesCount)) { // // Check Nearest Supplies ... for (int i = 0; i < suppliesCount; i++) { // XCSupplyZone *iZone = supplies[i]; if (supplyZone == NULL) { supplyZone = iZone; } else { // bool canChange = iZone.Lower() < supplyZone.Lower(); if (canChange) { supplyZone = iZone; } } } } // // Demand Zones ... XCDemandZone *demands[]; int demandsCount = state.CountDemandZones(); // // Select Bar Validated Demand Zones ... if (IsValidSize(demandsCount)) { // for (int i = 0; i < demandsCount; i++) { // XCDemandZone *iZone = state.demandZones[i]; // // Check Zone is Valid For Bar ... bool isValid = bar.low > iZone.Upper() && ask > iZone.Upper() && bid > iZone.Upper(); if (isValid) { // Add( iZone, demands // ); } } } demandsCount = ArraySize(demands); // // Select Valid Vales Filtered Demands ... if (IsValidSize(demandsCount)) { // // Check Valid Vales ... XCDemandZone *tmp[]; if (IsValidSize(validValesCount)) { // for (int i = 0; i < demandsCount; i++) { // XCDemandZone *iZone = demands[i]; // for (int j = 0; j < validValesCount; j++) { // double value = x121Conditions.validValesBuffer[j]; // // Check Valid Peaks in Zone ... bool isZoneContainsValidValue = value >= iZone.Lower() && value <= iZone.Upper(); if (isZoneContainsValidValue) { // Add( iZone, tmp // ); } } } } // Clean(demands); Copy( tmp, demands // ); } demandsCount = ArraySize(demands); // // Select Nearest Demand Zone ... if (IsValidSize(demandsCount)) { // // Check Nearest Demands ... for (int i = 0; i < demandsCount; i++) { // XCDemandZone *iZone = demands[i]; if (demandZone == NULL) { demandZone = iZone; } else { // bool canChange = iZone.Upper() > demandZone.Upper(); if (canChange) { demandZone = iZone; } } } } // // Validate Founded Zones ... result = (supplyZone != NULL && supplyZone.IsValid()) && (demandZone != NULL && demandZone.IsValid()); // return result; } //////////////////////////////////////////////////////////////////// // CustomStateDrawing( conditions.consolidationConditions.state, false, // X_DIRECTION_NONE, false, // ignoreSwingHighs false, // ignoreSwingLows false, // ignoreSupportZones false, // ignoreResistanceZones false, // ignoreSupplyZones false, // ignoreDemandZones true, // ignoreBullishOrderBlocks true, // ignoreBearishOrderBlocks true, // ignoreBullishFairValueGaps true, // ignoreBearishFairValueGaps true, // ignoreBullishRejectionBars true, // ignoreBearishRejectionBars true, // ignoreBullishMomentumBars true // ignoreBearishMomentumBars ); // // TODO: Remove ... // Draw ... if (hasVisionSupplyZone && visionSupplyZone != NULL) { // visionSupplyZone.To(TimeCurrent()); XCSupplyZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupplyZone( visionSupplyZone, iObj // ); if (isCreated) { // iObj.ZoneWidth(4); iObj.ZoneColor(clrMagenta); AddObjectIfNotExists(iObj); } } // // TODO: Remove ... // Draw ... if (hasVisionDemandZone && visionDemandZone != NULL) { // visionDemandZone.To(TimeCurrent()); XCDemandZoneObject *iObj; bool isCreated = mPOIDrawer.CreateDemandZone( visionDemandZone, iObj // ); if (isCreated) { // iObj.ZoneWidth(4); iObj.ZoneColor(clrAqua); AddObjectIfNotExists(iObj); } } // if (result) { ClearDraws(); } // // TODO: Remove this ... // Draw ... if (hasConsolidationSupportZone && consolidationSupportZone != NULL) { // consolidationSupportZone.To(TimeCurrent()); XCSupportZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupportZone( consolidationSupportZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // // TODO: Remove this ... // Draw ... if (hasConsolidationResistanceZone && consolidationResistanceZone != NULL) { // consolidationResistanceZone.To(TimeCurrent()); XCResistanceZoneObject *iObj; bool isCreated = mPOIDrawer.CreateResistanceZone( consolidationResistanceZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } //////////////////////////////////////////////////////////////////////////////////// // XCSwing *swingLow = NULL; XCSwing *swingHigh = NULL; bool isSwingLowRejected = false; bool isSwingHighRejected = false; int swingLowsCount = decisionConditions.state.CountSwingLows(); int swingHighsCount = decisionConditions.state.CountSwingHighs(); if (IsValidSize(swingLowsCount)) { swingLow = decisionConditions.state.swingLows[swingLowsCount - 1]; } if (IsValidSize(swingHighsCount)) { swingHigh = decisionConditions.state.swingHighs[swingHighsCount - 1]; } // isSwingLowRejected = swingLow != NULL && swingLow.IsValid() && decisionCBar.low > swingLow.GetValue(); // isSwingHighRejected = swingHigh != NULL && swingHigh.IsValid() && decisionCBar.high < swingHigh.GetValue(); /////////////////////////////////////////////////////////////////////////////////////////// // // TODO: Remove this ... XTestProiderConditions mTestConditions; bool DetectTestSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // bool isBullish = false; bool isBearish = false; // double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double selectedSL = 0; // // Retrieve Peak and Vale ... double peak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double vale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; // X121SMCCycleConditions triggerConditions = conditions.triggerConditions; X121SMCCycleConditions decisionConditions = conditions.decisionConditions; X121SMCCycleConditions analyseConditions = conditions.analyseConditions; X121SMCCycleConditions verificationConditions = conditions.verificationConditions; X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions; X121SMCCycleConditions visionConditions = conditions.visionConditions; // XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // int zoneValidationDivider = 10; // // Try to Detect Setup Conditions ... ENUM_X_DIRECTION setupDir; result = mTestConditions.IsSetuped(setupDir); if (!result) { // // First we must check a new Peak or Vale Happens ... bool isNewPeak = conditions.triggerConditions.x121Conditions.isNewPeak; bool isNewVale = conditions.triggerConditions.x121Conditions.isNewVale; // result = isNewPeak || isNewVale; if (!result) { return result; } // mTestConditions.isNewPeak = isNewPeak; mTestConditions.isNewVale = isNewVale; // // We have to Check the Peaks and Vales Happens inside a Demand or Supply Zone ... // in Vision State ... // bool hasVisionSupplyZone = false; XCSupplyZone *visionSupplyZone = NULL; int visionSupplyZonesCount = visionState.CountSupplyZones(); if (isNewPeak && IsValidSize(visionSupplyZonesCount)) { // // Try to Find Inside Zone ... for (int i = 0; i < visionSupplyZonesCount; i++) { // XCSupplyZone *iZone = visionState.supplyZones[i]; double zoneValidRange = (iZone.Upper() - iZone.Lower()) / zoneValidationDivider; // hasVisionSupplyZone = // peak >= iZone.Lower() && peak <= iZone.Upper() && peak > iZone.Upper() - zoneValidRange // ; if (hasVisionSupplyZone) { // visionSupplyZone = iZone; break; } } } // bool hasVisionDemandZone = false; XCDemandZone *visionDemandZone = NULL; int visionDemandZonesCount = visionState.CountDemandZones(); if (isNewVale && IsValidSize(visionDemandZonesCount)) { // // Try to Find Inside Zone ... for (int i = 0; i < visionDemandZonesCount; i++) { // XCDemandZone *iZone = visionState.demandZones[i]; double zoneValidRange = (iZone.Upper() - iZone.Lower()) / zoneValidationDivider; // hasVisionDemandZone = // vale >= iZone.Lower() && vale <= iZone.Upper() && vale < iZone.Lower() + zoneValidRange // ; if (hasVisionDemandZone) { // visionDemandZone = iZone; break; } } } // result = hasVisionSupplyZone || hasVisionDemandZone; if (!result) { return result; } // mTestConditions.visionSupplyZone = visionSupplyZone; mTestConditions.visionDemandZone = visionDemandZone; // mTestConditions.hasVisionSupplyZone = hasVisionSupplyZone; mTestConditions.hasVisionDemandZone = hasVisionDemandZone; // double triggerPeak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double decisionPeak = conditions.decisionConditions.x121Conditions.peaksBuffer[0]; double analysePeak = conditions.analyseConditions.x121Conditions.peaksBuffer[0]; double verificationPeak = conditions.verificationConditions.x121Conditions.peaksBuffer[0]; double consolidationPeak = conditions.consolidationConditions.x121Conditions.peaksBuffer[0]; double visionPeak = conditions.visionConditions.x121Conditions.peaksBuffer[0]; // bool isPeaksSame = // triggerPeak && decisionPeak && analysePeak && verificationPeak && consolidationPeak && visionPeak // ; // double triggerVale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; double decisionVale = conditions.decisionConditions.x121Conditions.valesBuffer[0]; double analyseVale = conditions.analyseConditions.x121Conditions.valesBuffer[0]; double verificationVale = conditions.verificationConditions.x121Conditions.valesBuffer[0]; double consolidationVale = conditions.consolidationConditions.x121Conditions.valesBuffer[0]; double visionVale = conditions.visionConditions.x121Conditions.valesBuffer[0]; // bool isValesSame = // triggerVale && decisionVale && analyseVale && verificationVale && consolidationVale && visionVale // ; // mTestConditions.hasSamePeaks = isPeaksSame; mTestConditions.hasSameVales = isValesSame; // isBullish = // isNewVale && isPeaksSame && isValesSame && hasVisionDemandZone // ; // isBearish = // isNewPeak && isPeaksSame && isValesSame && hasVisionSupplyZone // ; // result = isBullish || isBearish; if (!result) { return result; } // mTestConditions.setupTime = TimeCurrent(); // result = mTestConditions.IsSetuped(setupDir); if (!result) { return result; } // // Alert ... string message = providerStr + " Conditions Set Upped: " + ToString(setupDir); Alert(message); } else { // // Try to Detect Trigger Conditions ... mTestConditions.symbol = symbol; mTestConditions.period = period; // // Try to Find Support Zone which Vales Inside it ... bool hasConsolidationSupportZone = false; XCSupportZone *consolidationSupportZone = NULL; int consolidationSupportZonesCount = consolidationState.CountSupportZones(); if (IsValidSize(consolidationSupportZonesCount)) { // for (int i = 0; i < consolidationSupportZonesCount; i++) { // XCSupportZone *iZone = consolidationState.supportZones[i]; // double zoneValidRange = (iZone.Upper() - iZone.Lower()) / zoneValidationDivider; // hasConsolidationSupportZone = // peak >= iZone.Lower() && peak <= iZone.Upper() // && // vale < iZone.Upper() - zoneValidRange // ; if (hasConsolidationSupportZone) { // consolidationSupportZone = iZone; break; } } } // // Try to Find Resistance Zone which Peaks Inside it ... bool hasConsolidationResistanceZone = false; XCResistanceZone *consolidationResistanceZone = NULL; int consolidationResistanceZonesCount = consolidationState.CountResistanceZones(); if (IsValidSize(consolidationResistanceZonesCount)) { // for (int i = 0; i < consolidationResistanceZonesCount; i++) { // XCResistanceZone *iZone = consolidationState.resistanceZones[i]; // double zoneValidRange = (iZone.Upper() - iZone.Lower()) / zoneValidationDivider; // hasConsolidationResistanceZone = // vale >= iZone.Lower() && vale <= iZone.Upper() // && // peak > iZone.Lower() + zoneValidRange // ; if (hasConsolidationResistanceZone) { // consolidationResistanceZone = iZone; break; } } } // result = hasConsolidationSupportZone || hasConsolidationResistanceZone; if (!result) { return result; } // result = // (IsBullish(setupDir) && hasConsolidationResistanceZone) // || // (IsBearish(setupDir) && hasConsolidationSupportZone) // ; if (!result) { return result; } // // Detect State Conditions ... // // Vision ... // bool isVisionBullishPassed = // // Sar ... visionConditions.x121Conditions.isSarBullish // && // // VWap ... visionConditions.x121Conditions.isVWapFastBullish // ; // bool isVisionBearishPassed = // // Sar ... visionConditions.x121Conditions.isSarBearish // && // // VWap ... visionConditions.x121Conditions.isVWapFastBearish // ; // bool isVisionPassed = isVisionBullishPassed || isVisionBearishPassed; result = isVisionPassed; if (!result) { return result; } // // Consolidation ... // bool isConsolidationBullishPassed = // // Sar ... consolidationConditions.x121Conditions.isSarBullish // && // // VWap State ... consolidationConditions.x121Conditions.isVWapBullishState // && // // VWap Order ... consolidationConditions.x121Conditions.isVWapBullishOrdered // ; // bool isConsolidationBearishPassed = // // // Sar ... consolidationConditions.x121Conditions.isSarBearish // && // // VWap State ... consolidationConditions.x121Conditions.isVWapBearishState // && // // VWap Order ... consolidationConditions.x121Conditions.isVWapBearishOrdered // ; // bool isConsolidationPassed = isConsolidationBullishPassed || isConsolidationBearishPassed; result = isConsolidationPassed; if (!result) { return result; } // // Verification ... // bool isVerificationBullishPassed = // // Sar ... verificationConditions.x121Conditions.isSarBullish // && // // VWap State ... verificationConditions.x121Conditions.isVWapBullishState // && // // VWap Order ... verificationConditions.x121Conditions.isVWapBullishOrdered // ; // bool isVerificationBearishPassed = // // Sar ... verificationConditions.x121Conditions.isSarBearish // && // // VWap State ... verificationConditions.x121Conditions.isVWapBearishState // && // // VWap Order ... verificationConditions.x121Conditions.isVWapBearishOrdered // ; // bool isVerificationPassed = isVerificationBullishPassed || isVerificationBearishPassed; result = isVerificationPassed; if (!result) { return result; } // // Analyse ... // bool isAnalyseBullishPassed = // // Sar ... analyseConditions.x121Conditions.isSarBullish // && // // VWap Order ... analyseConditions.x121Conditions.isVWapBullishOrdered // && // // VWap State ... (analyseConditions.x121Conditions.isVWapBullishState || (analyseConditions.x121Conditions.isVWapMidBullish && analyseConditions.x121Conditions.isVWapSlowBullish)) // ; // bool isAnalyseBearishPassed = // // Sar ... analyseConditions.x121Conditions.isSarBearish // && // // VWap Order ... analyseConditions.x121Conditions.isVWapBearishOrdered // && // // VWap State ... (analyseConditions.x121Conditions.isVWapBearishState || (analyseConditions.x121Conditions.isVWapMidBearish && analyseConditions.x121Conditions.isVWapSlowBearish)) // ; // bool isAnalysePassed = isAnalyseBullishPassed || isAnalyseBearishPassed; result = isAnalysePassed; if (!result) { return result; } // // Decision ... // double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1]; double decisionVale = decisionConditions.x121Conditions.valesBuffer[1]; // XOHCL decisionCBar; result = mDecisionCycleHelper.GetBar( decisionCBar, cIndex // ); // // Check Fibo Pressure ... ENUM_X_DIRECTION pressureDir; bool hasPressurePin = mBarAnalyser.HasFiboPressure( decisionCBar, pressureDir // ); // bool isBarBullish = // (hasPressurePin && IsBullish(pressureDir)) // && // decisionCBar.low == decisionVale // ; // bool isBarBearish = // (hasPressurePin && IsBearish(pressureDir)) // && // decisionCBar.high == decisionPeak // ; // bool isBarPassed = isBarBullish || isBarBearish; result = isBarPassed; if (!result) { return result; } // bool isDecisionBullishPassed = // // Bar ... isBarBullish // && // // VWap Order ... decisionConditions.x121Conditions.isVWapBullishOrdered // ; // bool isDecisionBearishPassed = // // Bar ... isBarBearish // && // // VWap Order ... decisionConditions.x121Conditions.isVWapBearishOrdered // ; // bool isDecisionPassed = isDecisionBullishPassed || isDecisionBearishPassed; result = isDecisionPassed; if (!result) { return result; } // // Trigger ... // double donOpenUpper = triggerConditions.x121Conditions.donOpenUpperBuffer[1]; double donOpenLower = triggerConditions.x121Conditions.donOpenLowerBuffer[1]; // double donCloseUpper = triggerConditions.x121Conditions.donCloseUpperBuffer[1]; double donCloseLower = triggerConditions.x121Conditions.donCloseLowerBuffer[1]; // bool isDonBullish = // donCloseLower > donOpenUpper // && // cBar.low > donCloseLower && cBar.high > donCloseLower // ; // bool isDonBearish = // donOpenUpper > donCloseUpper // && // cBar.low < donCloseUpper && cBar.high < donCloseUpper // ; // bool isTriggerBullishPassed = // // Don ... isDonBullish // && // // Sar ... triggerConditions.x121Conditions.isSarBullish // ; // bool isTriggerBearishPassed = // // Don ... isDonBearish // && // // Sar ... triggerConditions.x121Conditions.isSarBearish // ; // bool isTriggerPassed = isTriggerBullishPassed || isTriggerBearishPassed; result = isTriggerPassed; if (!result) { return result; } // // // // bool isBullishTriggerConditionsPassed = // isConsolidationBullishPassed && isVerificationBullishPassed && isAnalyseBullishPassed && isDecisionBullishPassed && isTriggerBullishPassed // ; // bool isBearishTriggerConditionsPassed = // isConsolidationBearishPassed && isVerificationBearishPassed && isAnalyseBearishPassed && isDecisionBearishPassed && isTriggerBearishPassed // ; // // // // bool isBullish = // IsBullish(setupDir) && hasConsolidationSupportZone && isBullishTriggerConditionsPassed // ; // bool isBearish = // IsBearish(setupDir) && hasConsolidationResistanceZone && isBearishTriggerConditionsPassed // ; // result = isBullish || isBearish; if (!result) { return result; } // double entry = GetEntry( symbol, setupDir // ); double spread = GetSpread( symbol // ); // zoneValidationDivider = 8; double selectedSL = isBullish ? consolidationResistanceZone.Upper() - spread - ((consolidationResistanceZone.Upper() - consolidationResistanceZone.Lower()) / zoneValidationDivider) : consolidationSupportZone.Lower() + spread + ((consolidationSupportZone.Upper() - consolidationSupportZone.Lower()) / zoneValidationDivider); // mTestConditions.sl = selectedSL; mTestConditions.type = isBullish ? X_POSITION_TYPE_LONG : X_POSITION_TYPE_SHORT; mTestConditions.triggerTime = TimeCurrent(); } // // Check Conditions is Prepared for Trigger ... result = mTestConditions.CanTrigger(); if (!result) { return result; } // conditions.signalDir = setupDir; conditions.provider = providerStr; conditions.sl = mTestConditions.sl; // mTestConditions.Clean(); // return result; } /////////////////////////////////////////////////////////////////////////////////////////////// // // Detect Supply and Demand Zones inside Order Block ... XCOrderBlock *orderBlock = NULL; if (isNewPeakInsideBearihOrderBlock) { orderBlock = mTestConditions.bearishOrderBlock; } else { orderBlock = mTestConditions.bullishOrderBlock; } // // Supply Zone ... XPOIState selectedState = visionState; bool hasSupplyZone = mTestConditions.HasSupplyZone(); int supplyZonesCount = selectedState.CountSupplyZones(); if (!hasSupplyZone) { // if (IsValidSize(supplyZonesCount)) { // XCSupplyZone *supplyZones[]; for (int i = 0; i < supplyZonesCount; i++) { // XCSupplyZone *iZone = selectedState.supplyZones[i]; // bool isValid = iZone.Upper() <= orderBlock.Upper() && iZone.Lower() >= orderBlock.Lower(); if (isValid) { // Add( iZone, supplyZones // ); } } // XCSupplyZone *supply = NULL; supplyZonesCount = ArraySize(supplyZones); for (int i = 0; i < supplyZonesCount; i++) { // XCSupplyZone *iZone = supplyZones[i]; // bool isValid = supply == NULL ? true : supply.Upper() < iZone.Upper(); if (isValid) { supply = iZone; } } if (supply != NULL && supply.IsValid()) { mTestConditions.supplyZone = supply; } // hasSupplyZone = mTestConditions.HasSupplyZone(); } } // // TODO: Remove ... else { // mTestConditions.supplyZone.To(TimeCurrent()); XCSupplyZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupplyZone( mTestConditions.supplyZone, iObj // ); if (isCreated) { // iObj.ZoneWidth(3); // AddObjectIfNotExists(iObj); } } // // Demand Zone ... bool hasDemandZone = mTestConditions.HasDemandZone(); int demandZonesCount = selectedState.CountDemandZones(); if (!hasDemandZone) { // if (IsValidSize(demandZonesCount)) { // XCDemandZone *demandZones[]; for (int i = 0; i < demandZonesCount; i++) { // XCDemandZone *iZone = selectedState.demandZones[i]; // bool isValid = iZone.Upper() <= orderBlock.Upper() && iZone.Lower() >= orderBlock.Lower(); if (isValid) { // Add( iZone, demandZones // ); } } // XCDemandZone *demand = NULL; demandZonesCount = ArraySize(demandZones); for (int i = 0; i < demandZonesCount; i++) { // XCDemandZone *iZone = demandZones[i]; // bool isValid = demand == NULL ? true : demand.Upper() < iZone.Upper(); if (isValid) { demand = iZone; } } if (demand != NULL && demand.IsValid()) { mTestConditions.demandZone = demand; } // hasDemandZone = mTestConditions.HasDemandZone(); } } // // TODO: Remove ... else { // mTestConditions.demandZone.To(TimeCurrent()); XCDemandZoneObject *iObj; bool isCreated = mPOIDrawer.CreateDemandZone( mTestConditions.demandZone, iObj // ); if (isCreated) { // iObj.ZoneWidth(3); // AddObjectIfNotExists(iObj); } } // // Supply and Demand Zone ... XCSupplyZone *supplyZone; XCDemandZone *demandZone; // supplyZone = NULL; demandZone = NULL; // // Supply and Demand ... bool HasSupplyZone() { // bool result = false; // result = // supplyZone != NULL && supplyZone.IsValid() // ; // return result; } bool HasDemandZone() { // bool result = false; // result = // demandZone != NULL && demandZone.IsValid() // ; // return result; } //////////////////////////////////////////////////////////////////////////////////////////////// // else // // // // Draw ... // { // // // // TODO: Remove this ... // // // bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); // if (hasBullishOB) // { // // // mTestConditions.bullishOrderBlock.To(TimeCurrent()); // XCBullishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBullishOrderBlock( // mTestConditions.bullishOrderBlock, // iObj // // ); // if (isCreated) // { // // // iObj.ZoneWidth(4); // iObj.ZoneColor(clrAqua); // // // AddObjectIfNotExists(iObj); // } // } // // // bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); // if (hasBearishOB) // { // // // mTestConditions.bearishOrderBlock.To(TimeCurrent()); // XCBearishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBearishOrderBlock( // mTestConditions.bearishOrderBlock, // iObj // // ); // if (isCreated) // { // // // iObj.ZoneWidth(4); // iObj.ZoneColor(clrMagenta); // // // AddObjectIfNotExists(iObj); // } // } // } // // Detect Supply and Demand Zone inside Order Block ... /////////////////////////////////////////////////////////////////////////////////////////////// // // TODO: Remove this ... XSMCStrategySetupConditions mTestConditions; bool DetectTestSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // bool isBullish = false; bool isBearish = false; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double selectedSL = 0; // // Retrieve Peak and Vale ... double peak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double vale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; // X121SMCCycleConditions triggerConditions = conditions.triggerConditions; X121SMCCycleConditions decisionConditions = conditions.decisionConditions; X121SMCCycleConditions analyseConditions = conditions.analyseConditions; X121SMCCycleConditions verificationConditions = conditions.verificationConditions; X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions; X121SMCCycleConditions visionConditions = conditions.visionConditions; // XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // int zoneValidationDivider = 10; // // Try to Detect Setup Conditions ... result = mTestConditions.IsSetuped(); // // Try to Validate if not Pssed ... if (result) { // bool canReset = false; bool iBullish = IsBullish(mTestConditions.dir); if (isBullish) { // canReset = // bid < mTestConditions.bullishOrderBlock.Lower() && ask < mTestConditions.bullishOrderBlock.Lower() && cBar.high < mTestConditions.bullishOrderBlock.Lower() // ; } else { // canReset = // bid < mTestConditions.bearishOrderBlock.Upper() && ask < mTestConditions.bearishOrderBlock.Upper() && cBar.high < mTestConditions.bearishOrderBlock.Upper() // ; } // if (canReset) { // string message = providerStr + " Conditions Resetted ..."; Alert(message); mTestConditions.Clean(); } // result = mTestConditions.IsSetuped(); } // if (!result) { // // Check has Order Block ... bool hasOrderBlock = mTestConditions.HasOrderBlock(); if (!hasOrderBlock) { // // Detect Order Blocks ... // // Bullish ... bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); if (!hasBullishOB) { // // Bullish ... int bullishOBsCount = visionState.CountBullishOrderBlocks(); if (IsValidSize(bullishOBsCount)) { // XCOrderBlock *bullishOBs[]; for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bullishOrderBlocks[i]; // bool isValid = cBar.low > iZone.Upper(); if (isValid) { // Add( iZone, bullishOBs // ); } } // XCOrderBlock *ob = NULL; bullishOBsCount = ArraySize(bullishOBs); if (IsValidSize(bullishOBsCount)) { // for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = bullishOBs[i]; // bool isValid = ob == NULL ? true : ob.Upper() < iZone.Upper(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { mTestConditions.bullishOrderBlock = ob; } } } // // Bearish ... bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); if (!hasBearishOB) { // // Bearish ... int bearishOBsCount = visionState.CountBearishOrderBlocks(); if (IsValidSize(bearishOBsCount)) { // XCOrderBlock *bearishOBs[]; for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bearishOrderBlocks[i]; // bool isValid = cBar.high < iZone.Lower(); if (isValid) { // Add( iZone, bearishOBs // ); } } // XCOrderBlock *ob = NULL; bearishOBsCount = ArraySize(bearishOBs); if (IsValidSize(bearishOBsCount)) { // for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = bearishOBs[i]; // bool isValid = ob == NULL ? true : ob.Lower() > iZone.Lower(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { mTestConditions.bearishOrderBlock = ob; } } } // result = mTestConditions.HasOrderBlock(); if (!result) { return result; } } // // Wait for new Vale or Peaks ... double visionPeak = visionConditions.x121Conditions.peaksBuffer[0]; double visionVale = visionConditions.x121Conditions.valesBuffer[0]; bool isNewVisionPeak = visionConditions.x121Conditions.isNewPeak; bool isNewVisionVale = visionConditions.x121Conditions.isNewVale; // bool isNewPeakInsideBearihOrderBlock = // isNewVisionPeak && visionPeak > mTestConditions.bearishOrderBlock.Lower() && visionPeak < mTestConditions.bearishOrderBlock.Upper() // ; // bool isNewValeInsideBullishOrderBlock = // isNewVisionVale && visionVale > mTestConditions.bullishOrderBlock.Lower() && visionVale < mTestConditions.bullishOrderBlock.Upper() // ; // result = isNewPeakInsideBearihOrderBlock || isNewValeInsideBullishOrderBlock; if (!result) { return result; } // // Lookig for a Valid Peaks and Vales Formes ... // Peaks Inside Bearish Order Block ... // Vales inside Bullish Order Block ... // int validPivotRepetition = mTriggerCycleHelper.mX121Helper .GetDonChainLength(); double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[0]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[0]; // // Valid Peaks ... XPVPivotPoint validPeak; XPVPivotPoint peaksChanges[]; int peaksChangesCount = mTriggerCycleHelper.FillPeakPivotPoints(peaksChanges); if (IsValidSize(peaksChangesCount)) { validPeak = peaksChanges[peaksChangesCount - 1]; } // // Valid Vales ... XPVPivotPoint validVale; XPVPivotPoint valesChanges[]; int valesChangesCount = mTriggerCycleHelper.FillValePivotPoints(valesChanges); if (IsValidSize(valesChangesCount)) { validVale = valesChanges[valesChangesCount - 1]; } // bool hasValidPeak = (validPeak.IsValid() && validPeak.value < mTestConditions.bearishOrderBlock.Upper() && validPeak.value > mTestConditions.bearishOrderBlock.Lower()); // bool hasValidVale = (validVale.IsValid() && validVale.value < mTestConditions.bullishOrderBlock.Upper() && validVale.value > mTestConditions.bullishOrderBlock.Lower()); // result = hasValidPeak || hasValidVale; if (!result) { return result; } // if (hasValidPeak) { mTestConditions.validPeak = validPeak; } if (hasValidVale) { mTestConditions.validVale = validVale; } // bool isBullish = // hasValidVale && isNewValeInsideBullishOrderBlock // ; // bool isBearish = // hasValidPeak && isNewPeakInsideBearihOrderBlock // ; // result = isBullish || isBearish; if (!result) { return result; } // mTestConditions.dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; mTestConditions.setupTime = TimeCurrent(); // result = mTestConditions.IsSetuped(); if (!result) { return result; } // // Alert ... string message = providerStr + " Conditions Set Upped: " + ToString(mTestConditions.dir); Alert(message); } else { // // Waits for Sar Change Under Valid Value or Above Valid Peak ... double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[1]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[1]; double triggerSar = triggerConditions.x121Conditions.sarBuffer[1]; bool isSarSwitchedToBullish = triggerConditions.x121Conditions.isSarSwitchedToBullish; bool isSarSwitchedToBearish = triggerConditions.x121Conditions.isSarSwitchedToBearish; // bool isBullish = // isSarSwitchedToBullish && triggerSar == triggerVale && IsBullish(mTestConditions.dir) && mTestConditions.validVale.IsValid() && triggerSar < mTestConditions.validVale.value // ; // bool isBearish = // isSarSwitchedToBearish && triggerSar == triggerPeak && IsBearish(mTestConditions.dir) && mTestConditions.validPeak.IsValid() && triggerSar < mTestConditions.validPeak.value // ; // result = isBullish || isBearish; if (!result) { return result; } // // Try to Detect Trigger Conditions ... // mTestConditions.symbol = symbol; mTestConditions.period = period; // mTestConditions.Clean(); } // // Check Conditions is Prepared for Trigger ... result = mTestConditions.CanTrigger(); if (!result) { return result; } // conditions.signalDir = mTestConditions.dir; conditions.provider = providerStr; conditions.sl = mTestConditions.sl; // mTestConditions.Clean(); // return result; } ///////////////////////////////////////////////////////////////////////////////////////// // // TODO: Remove this ... XSMCStrategySetupConditions mTestConditions; bool DetectTestSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // bool isBullish = false; bool isBearish = false; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double selectedSL = 0; // // Retrieve Peak and Vale ... double peak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double vale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; // X121SMCCycleConditions triggerConditions = conditions.triggerConditions; X121SMCCycleConditions decisionConditions = conditions.decisionConditions; X121SMCCycleConditions analyseConditions = conditions.analyseConditions; X121SMCCycleConditions verificationConditions = conditions.verificationConditions; X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions; X121SMCCycleConditions visionConditions = conditions.visionConditions; // XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // int zoneValidationDivider = 10; // // Try to Detect Setup Conditions ... result = mTestConditions.IsSetuped(); // // Try to Validate if not Pssed ... if (result) { // bool canReset = false; bool iBullish = IsBullish(mTestConditions.dir); if (isBullish) { // canReset = // bid < mTestConditions.bullishOrderBlock.Lower() && ask < mTestConditions.bullishOrderBlock.Lower() && cBar.high < mTestConditions.bullishOrderBlock.Lower() // ; } else { // canReset = // bid < mTestConditions.bearishOrderBlock.Upper() && ask < mTestConditions.bearishOrderBlock.Upper() && cBar.high < mTestConditions.bearishOrderBlock.Upper() // ; } // if (canReset) { // string message = providerStr + " Conditions Resetted ..."; Alert(message); mTestConditions.Clean(); } // result = mTestConditions.IsSetuped(); } // if (!result) { // // Check has Order Block ... bool hasOrderBlock = mTestConditions.HasOrderBlock(); if (!hasOrderBlock) { // // Detect Order Blocks ... // // Bullish ... bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); if (!hasBullishOB) { // // Bullish ... int bullishOBsCount = visionState.CountBullishOrderBlocks(); if (IsValidSize(bullishOBsCount)) { // XCOrderBlock *bullishOBs[]; for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bullishOrderBlocks[i]; // bool isValid = cBar.low > iZone.Upper(); if (isValid) { // Add( iZone, bullishOBs // ); } } // XCOrderBlock *ob = NULL; bullishOBsCount = ArraySize(bullishOBs); if (IsValidSize(bullishOBsCount)) { // for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = bullishOBs[i]; // bool isValid = ob == NULL ? true : ob.Upper() < iZone.Upper(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { mTestConditions.bullishOrderBlock = ob; } } } // // Bearish ... bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); if (!hasBearishOB) { // // Bearish ... int bearishOBsCount = visionState.CountBearishOrderBlocks(); if (IsValidSize(bearishOBsCount)) { // XCOrderBlock *bearishOBs[]; for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bearishOrderBlocks[i]; // bool isValid = cBar.high < iZone.Lower(); if (isValid) { // Add( iZone, bearishOBs // ); } } // XCOrderBlock *ob = NULL; bearishOBsCount = ArraySize(bearishOBs); if (IsValidSize(bearishOBsCount)) { // for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = bearishOBs[i]; // bool isValid = ob == NULL ? true : ob.Lower() > iZone.Lower(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { mTestConditions.bearishOrderBlock = ob; } } } // result = mTestConditions.HasOrderBlock(); if (!result) { return result; } } // // Wait for new Vale or Peaks ... double visionPeak = visionConditions.x121Conditions.peaksBuffer[0]; double visionVale = visionConditions.x121Conditions.valesBuffer[0]; bool isNewVisionPeak = visionConditions.x121Conditions.isNewPeak; bool isNewVisionVale = visionConditions.x121Conditions.isNewVale; // bool isNewPeakInsideBearihOrderBlock = // isNewVisionPeak && visionPeak > mTestConditions.bearishOrderBlock.Lower() && visionPeak < mTestConditions.bearishOrderBlock.Upper() // ; // bool isNewValeInsideBullishOrderBlock = // isNewVisionVale && visionVale > mTestConditions.bullishOrderBlock.Lower() && visionVale < mTestConditions.bullishOrderBlock.Upper() // ; // result = isNewPeakInsideBearihOrderBlock || isNewValeInsideBullishOrderBlock; if (!result) { return result; } // // Lookig for a Valid Peaks and Vales Formes ... // Peaks Inside Bearish Order Block ... // Vales inside Bullish Order Block ... // int validPivotRepetition = mTriggerCycleHelper.mX121Helper .GetDonChainLength(); double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[0]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[0]; // // Valid Peaks ... XPVPivotPoint validPeak; XPVPivotPoint peaksChanges[]; int peaksChangesCount = mTriggerCycleHelper.FillPeakPivotPoints(peaksChanges); if (IsValidSize(peaksChangesCount)) { validPeak = peaksChanges[peaksChangesCount - 1]; } // // Valid Vales ... XPVPivotPoint validVale; XPVPivotPoint valesChanges[]; int valesChangesCount = mTriggerCycleHelper.FillValePivotPoints(valesChanges); if (IsValidSize(valesChangesCount)) { validVale = valesChanges[valesChangesCount - 1]; } // bool hasValidPeak = (validPeak.IsValid() && validPeak.value < mTestConditions.bearishOrderBlock.Upper() && validPeak.value > mTestConditions.bearishOrderBlock.Lower()); // bool hasValidVale = (validVale.IsValid() && validVale.value < mTestConditions.bullishOrderBlock.Upper() && validVale.value > mTestConditions.bullishOrderBlock.Lower()); // result = hasValidPeak || hasValidVale; if (!result) { return result; } // if (hasValidPeak) { mTestConditions.validPeak = validPeak; } if (hasValidVale) { mTestConditions.validVale = validVale; } // bool isBullish = // hasValidVale && isNewValeInsideBullishOrderBlock // ; // bool isBearish = // hasValidPeak && isNewPeakInsideBearihOrderBlock // ; // result = isBullish || isBearish; if (!result) { return result; } // mTestConditions.dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; mTestConditions.setupTime = TimeCurrent(); // result = mTestConditions.IsSetuped(); if (!result) { return result; } // // Alert ... string message = providerStr + " Conditions Set Upped: " + ToString(mTestConditions.dir); Alert(message); } else { // // Waits for Sar Change Under Valid Value or Above Valid Peak ... double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[1]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[1]; double triggerSar = triggerConditions.x121Conditions.sarBuffer[1]; bool isSarSwitchedToBullish = triggerConditions.x121Conditions.isSarSwitchedToBullish; bool isSarSwitchedToBearish = triggerConditions.x121Conditions.isSarSwitchedToBearish; // bool isBullish = // isSarSwitchedToBullish && triggerSar == triggerVale && IsBullish(mTestConditions.dir) && mTestConditions.validVale.IsValid() && triggerSar < mTestConditions.validVale.value // ; // bool isBearish = // isSarSwitchedToBearish && triggerSar == triggerPeak && IsBearish(mTestConditions.dir) && mTestConditions.validPeak.IsValid() && triggerSar < mTestConditions.validPeak.value // ; // result = isBullish || isBearish; if (!result) { return result; } // // Try to Detect Trigger Conditions ... // mTestConditions.symbol = symbol; mTestConditions.period = period; // mTestConditions.Clean(); } // // Check Conditions is Prepared for Trigger ... result = mTestConditions.CanTrigger(); if (!result) { return result; } // conditions.signalDir = mTestConditions.dir; conditions.provider = providerStr; conditions.sl = mTestConditions.sl; // mTestConditions.Clean(); // return result; } ///////////////////////////////////////////////////////////////////////////// // // TODO: Remove this ... XSMCStrategySetupConditions mTestConditions; bool DetectTestSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // bool isBullish = false; bool isBearish = false; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double selectedSL = 0; // // Retrieve Peak and Vale ... double triggerPeak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double triggerVale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; // X121SMCCycleConditions triggerConditions = conditions.triggerConditions; X121SMCCycleConditions decisionConditions = conditions.decisionConditions; X121SMCCycleConditions analyseConditions = conditions.analyseConditions; X121SMCCycleConditions verificationConditions = conditions.verificationConditions; X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions; X121SMCCycleConditions visionConditions = conditions.visionConditions; // XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // int zoneValidationDivider = 10; int validPivotRepetition = mTriggerCycleHelper.mX121Helper .GetDonChainLength(); // // Check Setting Upped ... result = mTestConditions.IsSetuped(); // // Try to Validate if not Pssed ... if (result) { // double upper = 0; double lower = 0; // double hh = cBar.FindHighest(9, MODE_HIGH); double ll = cBar.FindLowest(9, MODE_LOW); // bool canReset = false; isBullish = IsBullish(mTestConditions.dir); if (isBullish) { // upper = mTestConditions.bullishOrderBlock.Upper(); lower = mTestConditions.bullishOrderBlock.Lower(); // canReset = // (ll > upper && bid > upper && ask > upper) // || // (hh < lower && bid < lower && ask < lower) // ; } else { // upper = mTestConditions.bearishOrderBlock.Upper(); lower = mTestConditions.bearishOrderBlock.Lower(); // canReset = // (hh < lower && bid < lower && ask < lower) // || // (ll > upper && bid > upper && ask > upper) // ; } // if (canReset) { // string message = providerStr + " Conditions Resetted ..."; Alert(message); // ClearDraws(); mTestConditions.Clean(); } // result = mTestConditions.IsSetuped(); } // // Try to Detect Setting Up Conditions ... if (!result) { // // Check has Order Block ... bool hasOrderBlock = mTestConditions.HasOrderBlock(); if (!hasOrderBlock) { // // Detect Order Blocks ... // // Bullish ... bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); if (!hasBullishOB) { // // Bullish ... int bullishOBsCount = visionState.CountBullishOrderBlocks(); if (IsValidSize(bullishOBsCount)) { // XCOrderBlock *bullishOBs[]; for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bullishOrderBlocks[i]; // bool isValid = cBar.low > iZone.Upper(); if (isValid) { // Add( iZone, bullishOBs // ); } } // XCOrderBlock *ob = NULL; bullishOBsCount = ArraySize(bullishOBs); if (IsValidSize(bullishOBsCount)) { // for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = bullishOBs[i]; // bool isValid = ob == NULL ? true : ob.Upper() < iZone.Upper(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { // mTestConditions.bullishOrderBlock = ob; mTestConditions.bullishOrderBlockTime = TimeCurrent(); } } } // // Bearish ... bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); if (!hasBearishOB) { // // Bearish ... int bearishOBsCount = visionState.CountBearishOrderBlocks(); if (IsValidSize(bearishOBsCount)) { // XCOrderBlock *bearishOBs[]; for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = visionState.bearishOrderBlocks[i]; // bool isValid = cBar.high < iZone.Lower(); if (isValid) { // Add( iZone, bearishOBs // ); } } // XCOrderBlock *ob = NULL; bearishOBsCount = ArraySize(bearishOBs); if (IsValidSize(bearishOBsCount)) { // for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = bearishOBs[i]; // bool isValid = ob == NULL ? true : ob.Lower() > iZone.Lower(); if (isValid) { ob = iZone; } } } // if (ob != NULL && ob.IsValid()) { // mTestConditions.bearishOrderBlock = ob; mTestConditions.bearishOrderBlockTime = TimeCurrent(); } } } // hasOrderBlock = mTestConditions.HasOrderBlock(); result = hasOrderBlock; if (!result) { return result; } } else { // datetime nearestTime = NULL; // bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); if (hasBullishOB) { // nearestTime = !IsValid(nearestTime) ? mTestConditions.bullishOrderBlockTime : nearestTime < mTestConditions.bullishOrderBlockTime ? mTestConditions.bullishOrderBlockTime : nearestTime; // mTestConditions.bullishOrderBlock.To(TimeCurrent()); XCBullishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBullishOrderBlock( mTestConditions.bullishOrderBlock, iObj // ); if (isCreated) { // iObj.ZoneWidth(4); iObj.ZoneColor(clrAqua); // AddObjectIfNotExists(iObj); } } // bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); if (hasBearishOB) { // nearestTime = !IsValid(nearestTime) ? mTestConditions.bearishOrderBlockTime : nearestTime < mTestConditions.bearishOrderBlockTime ? mTestConditions.bearishOrderBlockTime : nearestTime; // mTestConditions.bearishOrderBlock.To(TimeCurrent()); XCBearishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBearishOrderBlock( mTestConditions.bearishOrderBlock, iObj // ); if (isCreated) { // iObj.ZoneWidth(4); iObj.ZoneColor(clrMagenta); // AddObjectIfNotExists(iObj); } } // if (IsValid(nearestTime)) { // datetime cTime = TimeCurrent(); int periodSeconds = PeriodSeconds(period); int passedTime = (int)cTime - (int)nearestTime; // int barsPassed = passedTime / periodSeconds; bool canReset = barsPassed >= validPivotRepetition * 5; if (canReset && !mTestConditions.isOrderBlockAttacked) { // ClearDraws(); mTestConditions.Clean(); result = false; // return result; } } } // // Check Order Block Attacks ... if (!mTestConditions.isOrderBlockAttacked) { // bool isBullishOrderBlockAttacked = // (mTestConditions.HasBullishOrderBlock() && cBar.high < mTestConditions.bullishOrderBlock.Upper() && cBar.low > mTestConditions.bullishOrderBlock.Lower()) // ; bool isBearishOrderBlockAttacked = // (mTestConditions.HasBearishOrderBlock() && cBar.high < mTestConditions.bearishOrderBlock.Upper() && cBar.low > mTestConditions.bearishOrderBlock.Lower()) // ; bool isOrderBlockAttacked = isBullishOrderBlockAttacked || isBearishOrderBlockAttacked; result = isOrderBlockAttacked; if (!result) { return result; } // mTestConditions.isOrderBlockAttacked = isOrderBlockAttacked; } // // Other Conditions ... bool isNewTriggerPeak = triggerConditions.x121Conditions.isNewPeak; bool isNewTriggerVale = triggerConditions.x121Conditions.isNewVale; // bool isNewPeakInsideBearihOrderBlock = // isNewTriggerPeak && triggerPeak > mTestConditions.bearishOrderBlock.Lower() && triggerPeak < mTestConditions.bearishOrderBlock.Upper() // ; // bool isNewValeInsideBullishOrderBlock = // isNewTriggerVale && triggerVale > mTestConditions.bullishOrderBlock.Lower() && triggerVale < mTestConditions.bullishOrderBlock.Upper() // ; // result = isNewPeakInsideBearihOrderBlock || isNewValeInsideBullishOrderBlock; if (!result) { return result; } // // Lookig for a Valid Peaks and Vales Formes ... // Peaks Inside Bearish Order Block ... // Vales inside Bullish Order Block ... // double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[0]; double triggerVale = triggerConditions.x121Conditions.valesBuffer[0]; // // Valid Peaks ... XPVPivotPoint validPeak; XPVPivotPoint peaksChanges[]; int peaksChangesCount = mTriggerCycleHelper.FillPeakPivotPoints(peaksChanges); if (IsValidSize(peaksChangesCount)) { validPeak = peaksChanges[peaksChangesCount - 1]; } // // Valid Vales ... XPVPivotPoint validVale; XPVPivotPoint valesChanges[]; int valesChangesCount = mTriggerCycleHelper.FillValePivotPoints(valesChanges); if (IsValidSize(valesChangesCount)) { validVale = valesChanges[valesChangesCount - 1]; } // bool hasValidPeak = (validPeak.IsValid() && validPeak.value < mTestConditions.bearishOrderBlock.Upper() && validPeak.value > mTestConditions.bearishOrderBlock.Lower()); // bool hasValidVale = (validVale.IsValid() && validVale.value < mTestConditions.bullishOrderBlock.Upper() && validVale.value > mTestConditions.bullishOrderBlock.Lower()); // result = hasValidPeak || hasValidVale; if (!result) { return result; } // if (hasValidPeak) { mTestConditions.validPeak = validPeak; } if (hasValidVale) { mTestConditions.validVale = validVale; } // isBullish = // hasValidVale && isNewValeInsideBullishOrderBlock // ; // isBearish = // hasValidPeak && isNewPeakInsideBearihOrderBlock // ; // result = isBullish || isBearish; if (!result) { return result; } // ENUM_X_DIRECTION setupDir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // mTestConditions.dir = setupDir; mTestConditions.setupTime = TimeCurrent(); // // Alert ... string message = providerStr + " Conditions Set Upped: " + ToString(mTestConditions.dir); Alert(message); } // // Try To Detect Trigger Conditions ... // // Check Conditions is Prepared for Trigger ... result = mTestConditions.CanTrigger(); if (!result) { return result; } // // Issues Signal on Conditions ... conditions.signalDir = mTestConditions.dir; conditions.provider = providerStr; conditions.sl = mTestConditions.sl; // // mTestConditions.Clean(); // return result; } ////////////////////////////////////////////////////////////////////////////////// /** * Detect and Parse Market Conditions for Signalling ... * * @param conditions: X121SMCStrategyConditions instance Reference ... * * @return ( bool ) */ bool DetectSamePeaksAndValesSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // string msg = NULL; // double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double selectedSL = 0; // // Here We Select Cycles For Conditions Check ... ENUM_X_CYCLES cycles[5] = { X_CYCLE_TRIGGER, X_CYCLE_DECISION, X_CYCLE_ANALYSE, X_CYCLE_VERIFICATION, X_CYCLE_CONSOLIDATION // }; bool hasSamePeaks = DetectSamePeaks( cycles, conditions // ); bool hasSameVales = DetectSameVales( cycles, conditions // ); result = hasSamePeaks || hasSameVales; if (!result) { return result; } // // Check Peaks And Vales Order ... bool hasPeakBreak = false; bool hasValeBreak = false; // // Retrieve Last Sar Change ... XOHCL cSarChangeBar; XOHCL pSarChangeBar; XValueChange cSarChange; // Current Sar Change (IsDirect) ... XValueChange pSarChange; // Prev Sar Change (Direct) ... XValueChange sarChanges[]; int sarChangesCount = mTriggerCycleHelper .FillSarChanges(sarChanges); if (IsValidSize(sarChangesCount) && sarChangesCount > 2) { // cSarChange = sarChanges[sarChangesCount - 1]; pSarChange = sarChanges[sarChangesCount - 2]; // result = cSarChange.FillBar( cSarChangeBar, symbol, period // ); if (!result) { return result; } // result = pSarChange.FillBar( pSarChangeBar, symbol, period // ); if (!result) { return result; } // int start = cSarChangeBar.Index(); int end = pSarChangeBar.Index(); for (int i = start; i < end; i++) { // ENUM_X_CYCLE_EVENTS iEvents[]; X121SMCCycleConditions iConditions; result = mTriggerCycleHelper.GetConditions( iEvents, iConditions, i // ); if (!result) { continue; } // hasPeakBreak = iConditions.x121Conditions.isNewPeakOverLast; hasValeBreak = iConditions.x121Conditions.isNewValeUnderLast; result = hasPeakBreak || hasValeBreak; if (result) { break; } } } if (!result) { return result; } // // Check Sar State ... ENUM_X_DIRECTION sarDir; result = DetectSarState( provider, sarDir, conditions // ); if (!result) { return result; } // // Check VWAP State ... ENUM_X_DIRECTION vwapDir; result = DetectVWapState( provider, vwapDir, conditions // ); if (!result) { return result; } // // Detect a Valid Peaks Break ... // // Find Supply and Demand Zones ... // XPOIState state = conditions.visionConditions.state; // int supplyZonesCount = // bool isBullish = // hasSamePeaks && hasPeakBreak && IsBullish(sarDir) && IsBullish(vwapDir) // ; // bool isBearish = // hasSameVales && hasValeBreak && IsBearish(sarDir) && IsBearish(vwapDir) // ; // result = isBullish || isBearish; if (!result) { return result; } // CustomStateDrawing( conditions.visionConditions.state, false, // X_DIRECTION_NONE, false, // ignoreSwingHighs false, // ignoreSwingLows true, // ignoreSupportZones true, // ignoreResistanceZones false, // ignoreSupplyZones false, // ignoreDemandZones true, // ignoreBullishOrderBlocks true, // ignoreBearishOrderBlocks true, // ignoreBullishFairValueGaps true, // ignoreBearishFairValueGaps true, // ignoreBullishRejectionBars true, // ignoreBearishRejectionBars true, // ignoreBullishMomentumBars true // ignoreBearishMomentumBars ); // // Set SL, Provider and Direction ... conditions.signalDir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; conditions.provider = providerStr; // // Selectiong SL ... double selectedSLRJ = SelectSL( conditions, conditions.signalDir, X_121_SMC_SL_TYPE_REJECTION // ); double selectedSLMN = SelectSL( conditions, conditions.signalDir, X_121_SMC_SL_TYPE_MOMENTUM // ); double selectedSLSW = SelectSL( conditions, conditions.signalDir, X_121_SMC_SL_TYPE_SWING // ); double selectedSLSR = SelectSL( conditions, conditions.signalDir, X_121_SMC_SL_TYPE_CURRENT_SAR // ); // double slCandidates[4] = { selectedSLRJ, selectedSLMN, selectedSLSW, selectedSLSR // }; selectedSL = isBullish ? GetMin(slCandidates) : GetMax(slCandidates); // // Normalizing SL ... double entry = GetEntry( symbol, conditions.signalDir // ); double pip = GetPipPrice(symbol); double spread = GetSpread(symbol); double points = GetPoints(symbol); // if (isBullish && selectedSL <= entry) { selectedSL -= (points * 30) - spread; } else if (isBearish && selectedSL >= entry) { selectedSL += (points * 30) + spread; } // // Detect SL and TP ... conditions.sl = selectedSL; // return result; } /** * Detect and Parse Market Conditions for Signalling ... * * @param conditions: X121SMCStrategyConditions instance Reference ... * * @return ( bool ) */ bool DetectRJBPVSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // XOHCL pBar; result = pBar.Init( symbol, period, pIndex // ); if (!result) { return result; } // string msg = NULL; // double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_RJBPV; string providerStr = ToString(provider); // // Bar High Eqauls to Peaks or Vale ... double peak = conditions.triggerConditions.x121Conditions.peaksBuffer[2]; double vale = conditions.triggerConditions.x121Conditions.valesBuffer[2]; bool isNewPeak = conditions.triggerConditions.x121Conditions.peaksBuffer[2] != conditions.triggerConditions.x121Conditions.peaksBuffer[3]; bool isNewVale = conditions.triggerConditions.x121Conditions.valesBuffer[2] != conditions.triggerConditions.x121Conditions.valesBuffer[3]; bool isClosedUnderDonCloseUpper = cBar.close < conditions.triggerConditions.x121Conditions.donCloseUpperBuffer[1]; bool isClosedOverDonCloseLower = cBar.close > conditions.triggerConditions.x121Conditions.donCloseLowerBuffer[1]; bool isSarBullish = zBar.low > conditions.triggerConditions.x121Conditions.sarBuffer[0]; bool isSarBearish = zBar.high < conditions.triggerConditions.x121Conditions.sarBuffer[0]; // // XPVPivot orderFlow[]; // ENUM_X_DIRECTION orderFlowDir; // mTriggerCycleHelper // .DetectOrderFlow( // zIndex, // orderFlow, // orderFlowDir // // ); // int pivotsCount = ArraySize(orderFlow); // result = IsValidSize(pivotsCount); // if (!result) // { // return result; // } // XPVPivot lastPivot = orderFlow[pivotsCount - 1]; // double zoneVerificationDivider = 10; bool isPeakInsideSupplyZone = false; bool isValeInsideDemandZone = false; // XPOIState state = conditions.verificationConditions.state; // // // // Detect Order Block ... // XCOrderBlock *orderBlock = NULL; // // // int bullishOBCount = state.CountBullishOrderBlocks(); // if (IsValidSize(bullishOBCount)) // { // // // for (int i = 0; i < bullishOBCount; i++) // { // // // XCOrderBlock *iZone = state.bullishOrderBlocks[i]; // // // bool isInside = vale >= iZone.Lower() && // vale <= iZone.Upper() && // bid <= iZone.Lower() + ((iZone.Upper() - iZone.Lower()) / zoneVerificationDivider); // if (isInside) // { // // // orderBlock = iZone; // break; // } // } // } // // // int bearishOBCount = state.CountBearishOrderBlocks(); // if (IsValidSize(bearishOBCount)) // { // // // for (int i = 0; i < bearishOBCount; i++) // { // // // XCOrderBlock *iZone = state.bearishOrderBlocks[i]; // // // bool isInside = peak >= iZone.Lower() && // peak <= iZone.Upper() && // bid >= iZone.Upper() - ((iZone.Upper() - iZone.Lower()) / zoneVerificationDivider); // if (isInside) // { // // // orderBlock = iZone; // break; // } // } // } // // // result = orderBlock != NULL && // orderBlock.IsValid(); // if (!result) // { // return result; // } // // // // Draw Order Block ... // orderBlock.To(TimeCurrent()); // if (orderBlock.IsBullish()) // { // // // XCBullishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBullishOrderBlock( // orderBlock, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // else // { // // // XCBearishOrderBlockObject *iObj; // bool isCreated = mPOIDrawer.CreateBearishOrderBlock( // orderBlock, // iObj // // ); // if (isCreated) // { // AddObjectIfNotExists(iObj); // } // } // XCSupplyZone *supplyZone; int supplyCount = state.CountSupplyZones(); if (IsValidSize(supplyCount)) { // for (int i = 0; i < supplyCount; i++) { // XCSupplyZone *iZone = state.supplyZones[i]; isPeakInsideSupplyZone = peak >= iZone.Lower() && peak <= iZone.Upper() && bid >= iZone.Lower() + ((iZone.Upper() - iZone.Lower()) / zoneVerificationDivider); if (isPeakInsideSupplyZone) { // supplyZone = iZone; break; } } } // XCDemandZone *demandZone; int demandCount = state.CountDemandZones(); if (IsValidSize(demandCount)) { // for (int i = 0; i < demandCount; i++) { // XCDemandZone *iZone = state.demandZones[i]; isValeInsideDemandZone = vale >= iZone.Lower() && vale <= iZone.Upper() && bid <= iZone.Lower() + ((iZone.Upper() - iZone.Lower()) / zoneVerificationDivider); if (isValeInsideDemandZone) { // demandZone = iZone; break; } } } // bool isPeakAttacked = isNewPeak && isSarBearish && pBar.high == peak && isPeakInsideSupplyZone && isClosedUnderDonCloseUpper; // bool isValeAttacked = isNewVale && isSarBullish && pBar.low == vale && isValeInsideDemandZone && isClosedOverDonCloseLower; // result = isPeakAttacked || isValeAttacked; if (!result) { return result; } // if (isPeakAttacked) { // supplyZone.To(TimeCurrent()); XCSupplyZoneObject *iObj; bool isCreated = mPOIDrawer.CreateSupplyZone( supplyZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } else { // demandZone.To(TimeCurrent()); XCDemandZoneObject *iObj; bool isCreated = mPOIDrawer.CreateDemandZone( demandZone, iObj // ); if (isCreated) { AddObjectIfNotExists(iObj); } } // bool isBullish = // isValeAttacked // ; // bool isBearish = // isPeakAttacked // ; // result = // isBullish || isBearish // ; if (!result) { return result; } // // Set SL, Provider and Direction ... conditions.signalDir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; conditions.provider = providerStr; // conditions.sl = isBullish ? demandZone.Lower() : supplyZone.Upper(); // return result; } /** * Detect and Parse Market Conditions for Signalling ... * * @param conditions: X121SMCStrategyConditions instance Reference ... * * @return ( bool ) */ // TODO: Required Calibrate ... bool DetectVWAPCSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; return false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // string msg = NULL; // double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_VWAPC; string providerStr = ToString(provider); // // Check Candlestic State ... ENUM_X_DIRECTION candlesticDir; result = DetectCandlestic( provider, candlesticDir, conditions // ); if (!result) { return result; } // // Check Sar State ... ENUM_X_DIRECTION sarDir; result = DetectSarState( provider, sarDir, conditions // ); if (!result) { return result; } // // Check VWAP State ... ENUM_X_DIRECTION vwapDir; result = DetectVWapState( provider, vwapDir, conditions // ); if (!result) { return result; } // bool isBullish = // IsBullish(sarDir) && IsBullish(vwapDir) && IsBullish(candlesticDir) // ; // bool isBearish = // IsBearish(sarDir) && IsBearish(vwapDir) && IsBearish(candlesticDir) // ; // result = // isBullish || isBearish // ; // Print("VWap Signal ..."); // if (!result) { return result; } // return result; } /** * Detect Where Cycles has Same Peaks ... * * @param cycles: ENUM_X_CYCLES members, Array ... * @param conditions: X121SMCStrategyConditions instance, Reference ... * * @return ( bool ) */ bool DetectSamePeaks( ENUM_X_CYCLES &cycles[], X121SMCStrategyConditions &conditions // ) { // bool result = false; // int count = ArraySize(cycles); result = IsValidSize(count); if (!result) { return result; } // double value = -1; for (int i = 0; i < count; i++) { // ENUM_X_CYCLES iCycle = cycles[i]; // double iValue = -1; switch (iCycle) { // case X_CYCLE_TRIGGER: iValue = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; break; // case X_CYCLE_DECISION: iValue = conditions.decisionConditions.x121Conditions.peaksBuffer[0]; break; // case X_CYCLE_ANALYSE: iValue = conditions.analyseConditions.x121Conditions.peaksBuffer[0]; break; // case X_CYCLE_VERIFICATION: iValue = conditions.verificationConditions.x121Conditions.peaksBuffer[0]; break; // case X_CYCLE_CONSOLIDATION: iValue = conditions.consolidationConditions.x121Conditions.peaksBuffer[0]; break; // case X_CYCLE_VISION: iValue = conditions.visionConditions.x121Conditions.peaksBuffer[0]; break; } // if (iValue > 0) { // if (value <= 0) { value = iValue; } // result = value == iValue; if (!result) { break; } } } // return result; } /** * Detect Where Cycles has Same Vales ... * * @param cycles: ENUM_X_CYCLES members, Array ... * @param conditions: X121SMCStrategyConditions instance, Reference ... * * @return ( bool ) */ bool DetectSameVales( ENUM_X_CYCLES &cycles[], X121SMCStrategyConditions &conditions // ) { // bool result = false; // int count = ArraySize(cycles); result = IsValidSize(count); if (!result) { return result; } // double value = -1; for (int i = 0; i < count; i++) { // ENUM_X_CYCLES iCycle = cycles[i]; // double iValue = -1; switch (iCycle) { // case X_CYCLE_TRIGGER: iValue = conditions.triggerConditions.x121Conditions.valesBuffer[0]; break; // case X_CYCLE_DECISION: iValue = conditions.decisionConditions.x121Conditions.valesBuffer[0]; break; // case X_CYCLE_ANALYSE: iValue = conditions.analyseConditions.x121Conditions.valesBuffer[0]; break; // case X_CYCLE_VERIFICATION: iValue = conditions.verificationConditions.x121Conditions.valesBuffer[0]; break; // case X_CYCLE_CONSOLIDATION: iValue = conditions.consolidationConditions.x121Conditions.valesBuffer[0]; break; // case X_CYCLE_VISION: iValue = conditions.visionConditions.x121Conditions.valesBuffer[0]; break; } // if (iValue > 0) { // if (value <= 0) { value = iValue; } // result = value == iValue; if (!result) { break; } } } // return result; } /** * Detect Sar State for Signalling ... * * @param forProvider: ENUM_X_121_SMC_PROVIDERS member ... * @param dir: ENUM_X_DIRECTION member Reference ... * @param conditions: X121SMCStrategyConditions instance, Reference ... * * @return ( bool ) */ bool DetectSarState( ENUM_X_121_SMC_PROVIDERS forProvider, ENUM_X_DIRECTION &dir, X121SMCStrategyConditions &conditions // ) { // bool result = false; // dir = X_DIRECTION_NONE; // bool isBullish = false; bool isBearish = false; // if (forProvider == X_121_SMC_PROVIDER_SMPV) { // isBullish = // // Check One of Verification or Consolidation Cycles Must be Sar Bullish ... (conditions.verificationConditions.x121Conditions.isSarBullish || conditions.consolidationConditions.x121Conditions.isSarBullish) // && // // Decision and Analyse Cycles Must be Bullish ... (conditions.decisionConditions.x121Conditions.isSarBullish && conditions.analyseConditions.x121Conditions.isSarBullish) // && // // Trigger State Must be Bearish ... conditions.triggerConditions.x121Conditions.isSarBearish // ; // isBearish = // // Check One of Verification or Consolidation Cycles Must be Sar Bearish ... (conditions.verificationConditions.x121Conditions.isSarBearish || conditions.consolidationConditions.x121Conditions.isSarBearish) // && // // Decision and Analyse Cycles Must be Bearish ... (conditions.decisionConditions.x121Conditions.isSarBearish && conditions.analyseConditions.x121Conditions.isSarBearish) // && // // Trigger State Must be Bullish ... conditions.triggerConditions.x121Conditions.isSarBullish // ; } // if (forProvider == X_121_SMC_PROVIDER_RJBPV) { // isBullish = // // Trigger, Decision and Analyse must be Directional ... conditions.triggerConditions.x121Conditions.isSarBullish && conditions.decisionConditions.x121Conditions.isSarBullish && conditions.analyseConditions.x121Conditions.isSarBullish // ; // isBearish = // // Trigger, Decision and Analyse must be Directional ... conditions.triggerConditions.x121Conditions.isSarBearish && conditions.decisionConditions.x121Conditions.isSarBearish && conditions.analyseConditions.x121Conditions.isSarBearish // ; } // if (forProvider == X_121_SMC_PROVIDER_VWAPC) { // isBullish = // // All Cycles Sars Must be Directional exept Vision ... conditions.triggerConditions.x121Conditions.isSarBullish && conditions.decisionConditions.x121Conditions.isSarBullish && conditions.analyseConditions.x121Conditions.isSarBullish && conditions.verificationConditions.x121Conditions.isSarBullish && conditions.consolidationConditions.x121Conditions.isSarBullish // ; // isBearish = // // All Cycles Sars Must be Directional exept Vision ... conditions.triggerConditions.x121Conditions.isSarBearish && conditions.decisionConditions.x121Conditions.isSarBearish && conditions.analyseConditions.x121Conditions.isSarBearish && conditions.verificationConditions.x121Conditions.isSarBearish && conditions.consolidationConditions.x121Conditions.isSarBearish // ; } // result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } /** * Detect Sar State for Signalling ... * * @param forProvider: ENUM_X_121_SMC_PROVIDERS member ... * @param dir: ENUM_X_DIRECTION member Reference ... * @param conditions: X121SMCStrategyConditions instance, Reference ... * * @return ( bool ) */ bool DetectVWapState( ENUM_X_121_SMC_PROVIDERS forProvider, ENUM_X_DIRECTION &dir, X121SMCStrategyConditions &conditions // ) { // bool result = false; // dir = X_DIRECTION_NONE; // bool isBullish = false; bool isBearish = false; // if (forProvider == X_121_SMC_PROVIDER_SMPV) { // isBullish = // // Trigger, Decision and Analyse Cycles Must be in Direction Order and State ... // // Orders ... (conditions.triggerConditions.x121Conditions.isVWapBullishOrdered && conditions.decisionConditions.x121Conditions.isVWapBullishOrdered && conditions.analyseConditions.x121Conditions.isVWapBullishOrdered) // && // // State ... (conditions.triggerConditions.x121Conditions.isVWapBullishState && conditions.decisionConditions.x121Conditions.isVWapBullishState && conditions.analyseConditions.x121Conditions.isVWapBullishState) // && // // One of Verification and Consolidation must Be in Direction State ... (conditions.verificationConditions.x121Conditions.isVWapBullishState || conditions.consolidationConditions.x121Conditions.isVWapBullishState) // ; // isBearish = // // Trigger, Decision and Analyse Cycles Must be in Direction Order and State ... // // Orders ... (conditions.triggerConditions.x121Conditions.isVWapBearishOrdered && conditions.decisionConditions.x121Conditions.isVWapBearishOrdered && conditions.analyseConditions.x121Conditions.isVWapBearishOrdered) // && // // State ... (conditions.triggerConditions.x121Conditions.isVWapBearishState && conditions.decisionConditions.x121Conditions.isVWapBearishState && conditions.analyseConditions.x121Conditions.isVWapBearishState) // && // // One of Verification and Consolidation must Be in Direction State ... (conditions.verificationConditions.x121Conditions.isVWapBearishState || conditions.consolidationConditions.x121Conditions.isVWapBearishState) // ; } // if (forProvider == X_121_SMC_PROVIDER_VWAPC) { // isBullish = // // All Cycles Must be State and Ordered Directional Except Vision ... // State ... conditions.triggerConditions.x121Conditions.isVWapBullishState && conditions.decisionConditions.x121Conditions.isVWapBullishState && conditions.analyseConditions.x121Conditions.isVWapBullishState && conditions.verificationConditions.x121Conditions.isVWapBullishState && conditions.consolidationConditions.x121Conditions.isVWapBullishState // && // Order ... conditions.triggerConditions.x121Conditions.isVWapBullishOrdered && conditions.decisionConditions.x121Conditions.isVWapBullishOrdered && conditions.analyseConditions.x121Conditions.isVWapBullishOrdered && conditions.verificationConditions.x121Conditions.isVWapBullishOrdered && conditions.consolidationConditions.x121Conditions.isVWapBullishOrdered // ; // isBearish = // // All Cycles Must be State and Ordered Directional Except Vision ... // State ... conditions.triggerConditions.x121Conditions.isVWapBearishState && conditions.decisionConditions.x121Conditions.isVWapBearishState && conditions.analyseConditions.x121Conditions.isVWapBearishState && conditions.verificationConditions.x121Conditions.isVWapBearishState && conditions.consolidationConditions.x121Conditions.isVWapBearishState // && // Order ... conditions.triggerConditions.x121Conditions.isVWapBearishOrdered && conditions.decisionConditions.x121Conditions.isVWapBearishOrdered && conditions.analyseConditions.x121Conditions.isVWapBearishOrdered && conditions.verificationConditions.x121Conditions.isVWapBearishOrdered && conditions.consolidationConditions.x121Conditions.isVWapBearishOrdered // ; } // result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } /** * Detect Candlestic Patters for Signalling ... * * @param forProvider: ENUM_X_121_SMC_PROVIDERS member ... * @param dir: ENUM_X_DIRECTION member Reference ... * @param conditions: X121SMCStrategyConditions instance, Reference ... * * @return ( bool ) */ bool DetectCandlestic( ENUM_X_121_SMC_PROVIDERS forProvider, ENUM_X_DIRECTION &dir, X121SMCStrategyConditions &conditions // ) { // bool result = false; // dir = X_DIRECTION_NONE; // int cIndex = 1; int pIndex = cIndex + 1; // // Select Specified Cycle Helper ... XC121SMCCycleHelper *cycleHelper = mTriggerCycleHelper; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = cycleHelper.GetPeriod(); // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // // Momentum Bar ... ENUM_X_DIRECTION cBarMomentumDir; bool isCBarMomentum = cycleHelper.mBarAnalyser.IsMomentumBar( cBar, cBarMomentumDir // ); // // Rejection Bar ... ENUM_X_DIRECTION cBarRejectionDir; bool isCBarRejection = cycleHelper.mBarAnalyser.IsRejectionBar( cBar, cBarRejectionDir // ); // // Engulf Bar ... ENUM_X_DIRECTION cBarEngulfDir; bool isCBarEngulf = cycleHelper.mBarAnalyser.IsEngulfBar( cBar, cBarEngulfDir // ); // // Pin Bar ... ENUM_X_DIRECTION cBarPinDir; bool isCBarPin = cycleHelper.mBarAnalyser.IsPinBar( cBar, cBarPinDir // ); // XOHCL pBar; result = pBar.Init( symbol, period, pIndex // ); if (!result) { return result; } // // Momentum Bar ... ENUM_X_DIRECTION pBarMomentumDir; bool isPBarMomentum = cycleHelper.mBarAnalyser.IsMomentumBar( pBar, pBarMomentumDir // ); // // Rejection Bar ... ENUM_X_DIRECTION pBarRejectionDir; bool isPBarRejection = cycleHelper.mBarAnalyser.IsRejectionBar( pBar, pBarRejectionDir // ); // // Engulf Bar ... ENUM_X_DIRECTION pBarEngulfDir; bool isPBarEngulf = cycleHelper.mBarAnalyser.IsEngulfBar( pBar, pBarEngulfDir // ); // // Pin Bar ... ENUM_X_DIRECTION pBarPinDir; bool isPBarPin = cycleHelper.mBarAnalyser.IsPinBar( pBar, pBarPinDir // ); // bool isBullish = false; bool isBearish = false; // if (forProvider == X_121_SMC_PROVIDER_VWAPC) { // isBullish = // // pBar is Pin and cBar is Momentum or Rejection or Engulf ( // (isPBarPin && IsBullish(pBarPinDir) && ( // (isCBarMomentum && IsBullish(cBarMomentumDir)) // || // (isCBarRejection && IsBullish(cBarRejectionDir)) // || // (isCBarEngulf && IsBullish(cBarEngulfDir)) // ) // ) // || // // pBar is Engulf and cBar is Momentum or Rejection or Pin ... (isPBarEngulf && IsBullish(pBarEngulfDir) && ( // (isCBarMomentum && IsBullish(cBarMomentumDir)) // || // (isCBarRejection && IsBullish(cBarRejectionDir)) // || // (isCBarPin && IsBullish(cBarPinDir)) // ) // ) // || // // pBar is Rejection and cBar is Momentum or Engulf or Pin ... (isPBarRejection && IsBullish(pBarRejectionDir) && ( // (isCBarMomentum && IsBullish(cBarMomentumDir)) // || // (isCBarEngulf && IsBullish(cBarEngulfDir)) // || // (isCBarPin && IsBullish(cBarPinDir)) // ) // ) // || // // pBar is Momentum and cBar is Rejection or Engulf or Pin ... (isPBarMomentum && IsBullish(pBarMomentumDir) && ( // (isCBarRejection && IsBullish(cBarRejectionDir)) // || // (isCBarEngulf && IsBullish(cBarEngulfDir)) // || // (isCBarPin && IsBullish(cBarPinDir)) // ) // ) // || // // cBar is Pin and Momentum and Rejection and Engulf ... ( // (isCBarPin && IsBullish(cBarPinDir)) // && // (isCBarMomentum && IsBullish(cBarMomentumDir)) // && // (isCBarRejection && IsBullish(cBarRejectionDir)) // && // (isCBarEngulf && IsBullish(cBarEngulfDir)) // ) // ) // ; // isBearish = // // pBar is Pin and cBar is Momentum or Rejection or Engulf ( // (isPBarPin && IsBearish(pBarPinDir) && ( // (isCBarMomentum && IsBearish(cBarMomentumDir)) // || // (isCBarRejection && IsBearish(cBarRejectionDir)) // || // (isCBarEngulf && IsBearish(cBarEngulfDir)) // ) // ) // || // // pBar is Engulf and cBar is Momentum or Rejection or Pin ... (isPBarEngulf && IsBearish(pBarEngulfDir) && ( // (isCBarMomentum && IsBearish(cBarMomentumDir)) // || // (isCBarRejection && IsBearish(cBarRejectionDir)) // || // (isCBarPin && IsBearish(cBarPinDir)) // ) // ) // || // // pBar is Rejection and cBar is Momentum or Engulf or Pin ... (isPBarRejection && IsBearish(pBarRejectionDir) && ( // (isCBarMomentum && IsBearish(cBarMomentumDir)) // || // (isCBarEngulf && IsBearish(cBarEngulfDir)) // || // (isCBarPin && IsBearish(cBarPinDir)) // ) // ) // || // // pBar is Momentum and cBar is Rejection or Engulf or Pin ... (isPBarMomentum && IsBearish(pBarMomentumDir) && ( // (isCBarRejection && IsBearish(cBarRejectionDir)) // || // (isCBarEngulf && IsBearish(cBarEngulfDir)) // || // (isCBarPin && IsBearish(cBarPinDir)) // ) // ) // || // // cBar is Pin and Momentum and Rejection and Engulf ... ( // (isCBarPin && IsBearish(cBarPinDir)) // && // (isCBarMomentum && IsBearish(cBarMomentumDir)) // && // (isCBarRejection && IsBearish(cBarRejectionDir)) // && // (isCBarEngulf && IsBearish(cBarEngulfDir)) // ) // ) // ; } // if (forProvider == X_121_SMC_PROVIDER_RJBPV) { // isBullish = // // CBar is Pin, Engulf, Momentum or Rejection ... ( // // // (isCBarMomentum && // IsBullish(cBarMomentumDir)) // // // || // // (isCBarRejection && IsBullish(cBarRejectionDir)) // // // || // // // (isCBarEngulf && // IsBullish(cBarEngulfDir)) // || // (isCBarPin && IsBullish(cBarPinDir)) // ) // ; // isBearish = // // CBar is Pin, Engulf, Momentum or Rejection ... ( // // (isCBarMomentum && // IsBearish(cBarMomentumDir)) // // // || // // (isCBarRejection && IsBearish(cBarRejectionDir)) // // // || // // // (isCBarEngulf && // IsBearish(cBarEngulfDir)) // || // (isCBarPin && IsBearish(cBarPinDir)) // ) // ; } // result = isBullish || isBearish; if (!result) { return result; } // dir = isBullish ? X_DIRECTION_BULLISH : X_DIRECTION_BEARISH; // return result; } //////////////////////////////////////////////////////////////////////////////////// // // TODO: Remove this ... XSMCStrategySetupConditions mTestConditions; bool DetectTestSignal( X121SMCStrategyConditions &conditions // ) { // bool result = false; // string symbol = GetSymbol(); ENUM_TIMEFRAMES period = GetPeriod(); // ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV; string providerStr = ToString(provider); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( symbol, period, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( symbol, period, cIndex // ); if (!result) { return result; } // bool isBullish = false; bool isBearish = false; // double ask = GetAsk(symbol); double bid = GetBid(symbol); datetime cTime = TimeCurrent(); // double ll = cBar.FindLowest(9, MODE_LOW); double hh = cBar.FindHighest(9, MODE_HIGH); // double selectedSL = 0; // // Retrieve Peak and Vale ... double triggerPeak = conditions.triggerConditions.x121Conditions.peaksBuffer[0]; double triggerVale = conditions.triggerConditions.x121Conditions.valesBuffer[0]; // X121SMCCycleConditions triggerConditions = conditions.triggerConditions; X121SMCCycleConditions decisionConditions = conditions.decisionConditions; X121SMCCycleConditions analyseConditions = conditions.analyseConditions; X121SMCCycleConditions verificationConditions = conditions.verificationConditions; X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions; X121SMCCycleConditions visionConditions = conditions.visionConditions; // XPOIState triggerState = triggerConditions.state; XPOIState decisionState = decisionConditions.state; XPOIState analyseState = analyseConditions.state; XPOIState verificationState = verificationConditions.state; XPOIState consolidationState = consolidationConditions.state; XPOIState visionState = visionConditions.state; // int zoneValidationDivider = 10; int validPivotRepetition = mTriggerCycleHelper.mX121Helper .GetDonChainLength(); // // Waits For Bullish Or Bearish Order Block Forms ... bool hasBullishOB = mTestConditions.HasBullishOrderBlock(); bool hasBearishOB = mTestConditions.HasBearishOrderBlock(); result = mTestConditions.HasOrderBlock(); if (!result) { // // Try to Detect Order Blocks ... XPOIState state = consolidationState; // // Bullish ... if (!hasBullishOB) { // // Bullish ... int bullishOBsCount = state.CountBullishOrderBlocks(); if (IsValidSize(bullishOBsCount)) { // XCFVG *fvg = NULL; XCOrderBlock *ob = NULL; XCOrderBlock *bullishOBs[]; for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = state.bullishOrderBlocks[i]; // bool isValid = cBar.low > iZone.Upper() && HasValidBullishFVG( analyseState, iZone, fvg, cBar // ); if (isValid) { // Add( iZone, bullishOBs // ); } } // bullishOBsCount = ArraySize(bullishOBs); if (IsValidSize(bullishOBsCount)) { // for (int i = 0; i < bullishOBsCount; i++) { // XCOrderBlock *iZone = bullishOBs[i]; // bool isValid = ob == NULL ? true : ob.Upper() < iZone.Upper(); if (isValid) { ob = iZone; } } } // if ( ob != NULL && fvg != NULL && ob.IsValid() && fvg.IsValid()) { // mTestConditions.bullishFVG = fvg; mTestConditions.bullishFVGTime = cTime; mTestConditions.bullishOrderBlock = ob; mTestConditions.bullishOrderBlockTime = cTime; } } } // // Bearish ... if (!hasBearishOB) { // // Bearish ... int bearishOBsCount = state.CountBearishOrderBlocks(); if (IsValidSize(bearishOBsCount)) { // XCFVG *fvg = NULL; XCOrderBlock *ob = NULL; XCOrderBlock *bearishOBs[]; for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = state.bearishOrderBlocks[i]; // bool isValid = cBar.high < iZone.Lower() && HasValidBearishFVG( analyseState, iZone, fvg, cBar // ); if (isValid) { // Add( iZone, bearishOBs // ); } } // bearishOBsCount = ArraySize(bearishOBs); if (IsValidSize(bearishOBsCount)) { // for (int i = 0; i < bearishOBsCount; i++) { // XCOrderBlock *iZone = bearishOBs[i]; // bool isValid = ob == NULL ? true : ob.Lower() > iZone.Lower(); if (isValid) { ob = iZone; } } } // if ( ob != NULL && fvg != NULL && ob.IsValid() && fvg.IsValid()) { // mTestConditions.bearishFVG = fvg; mTestConditions.bearishFVGTime = cTime; mTestConditions.bearishOrderBlock = ob; mTestConditions.bearishOrderBlockTime = cTime; } } } // hasBullishOB = mTestConditions.HasBullishOrderBlock(); hasBearishOB = mTestConditions.HasBearishOrderBlock(); result = mTestConditions.HasOrderBlock(); if (!result) { return result; } } // // Renew and Draw Order Blocks ... // if (hasBullishOB) { // mTestConditions.bullishFVG.To(cTime); mTestConditions.bullishOrderBlock.To(cTime); // XCBullishOrderBlockObject *iOBObj; bool isCreated = mPOIDrawer.CreateBullishOrderBlock( mTestConditions.bullishOrderBlock, iOBObj // ); if (isCreated) { // iOBObj.ZoneWidth(4); iOBObj.ZoneColor(clrAqua); // AddObjectIfNotExists(iOBObj); } // XCBullishFairValueGapObject *iFVGObj; isCreated = mPOIDrawer.CreateBullishFairValueGap( mTestConditions.bullishFVG, iFVGObj // ); if (isCreated) { // iFVGObj.ZoneWidth(4); // AddObjectIfNotExists(iFVGObj); } } // if (hasBearishOB) { // mTestConditions.bearishFVG.To(cTime); mTestConditions.bearishOrderBlock.To(cTime); // XCBearishOrderBlockObject *iObj; bool isCreated = mPOIDrawer.CreateBearishOrderBlock( mTestConditions.bearishOrderBlock, iObj // ); if (isCreated) { // iObj.ZoneWidth(4); iObj.ZoneColor(clrMagenta); // AddObjectIfNotExists(iObj); } // XCBearishFairValueGapObject *iFVGObj; isCreated = mPOIDrawer.CreateBearishFairValueGap( mTestConditions.bearishFVG, iFVGObj // ); if (isCreated) { // iFVGObj.ZoneWidth(4); // AddObjectIfNotExists(iFVGObj); } } // // Here we Make Sure we Have Valid Order Blocks ... // we have to Validate Order Block Attacks ... bool isBullishOBAttacked = mTestConditions.isBullishOrderBlockAttacked; bool isBearishOBAttacked = mTestConditions.isBearishOrderBlockAttacked; result = mTestConditions.IsOrderBlockAttacked(); if (!result) { // // Detect Order Blocks Attack ... // // Bullish Order Block ... XCOrderBlock *bullishOb = mTestConditions.bullishOrderBlock; isBullishOBAttacked = // bullishOb.IsValid() && cBar.high <= bullishOb.Upper() && cBar.low >= bullishOb.Lower() // ; if (!isBullishOBAttacked) { // // Try to Reset Bullish Ob if Needed ... int timePassed = (int)cTime - (int)mTestConditions.bullishOrderBlockTime; int barsPassed = timePassed / PeriodSeconds(period); bool canReset = barsPassed >= validPivotRepetition * 10; if (canReset) { // ClearDraws(); mTestConditions.ResetBullishOrderBlock(); } } // // Bearish Order Block ... XCOrderBlock *bearishOb = mTestConditions.bearishOrderBlock; isBearishOBAttacked = // bearishOb.IsValid() && cBar.high <= bearishOb.Upper() && cBar.low >= bearishOb.Lower() // ; if (!isBearishOBAttacked) { // // Try to Reset Bullish Ob if Needed ... int timePassed = (int)cTime - (int)mTestConditions.bearishOrderBlockTime; int barsPassed = timePassed / PeriodSeconds(period); bool canReset = barsPassed >= validPivotRepetition * 10; if (canReset) { // ClearDraws(); mTestConditions.ResetBearishOrderBlock(); } } // bool isOrderBlockAttacked = isBullishOBAttacked || isBearishOBAttacked; if (isOrderBlockAttacked) { // if (isBullishOBAttacked) { mTestConditions.isBullishOrderBlockAttacked = isBullishOBAttacked; } // if (isBearishOBAttacked) { mTestConditions.isBearishOrderBlockAttacked = isBearishOBAttacked; } } // result = mTestConditions.IsOrderBlockAttacked(); if (!result) { return result; } } // // Detect Analyse State FVG ... // // here We Make Sure Order Block is ttacked Before ... // Loockup For Zone Break ... bool isBullishOrderBlockBreaked = false; bool isBearishOrderBlockBreaked = false; if (isBullishOBAttacked) { // isBullishOrderBlockBreaked = // mTestConditions.HasBullishOrderBlock() // && // ( // // Break From Bottom to Top ... (ll < mTestConditions.bullishOrderBlock.Upper() && hh > mTestConditions.bullishOrderBlock.Upper()) // || // // Break From Top to Bottom ... (hh > mTestConditions.bullishOrderBlock.Lower() && ll < mTestConditions.bullishOrderBlock.Lower()) // ) // ; } if (isBearishOBAttacked) { // isBearishOrderBlockBreaked = // mTestConditions.HasBearishOrderBlock() // && // ( // // Break From Bottom to Top ... (ll < mTestConditions.bearishOrderBlock.Upper() && hh > mTestConditions.bearishOrderBlock.Upper()) // || // // Break From Top to Bottom ... (hh > mTestConditions.bearishOrderBlock.Lower() && ll < mTestConditions.bearishOrderBlock.Lower()) // ) // ; } // bool isOrderBlockBreaked = isBullishOrderBlockBreaked || isBearishOrderBlockBreaked; if (isOrderBlockBreaked) { // // Clean Order Block ... // if (isBullishOrderBlockBreaked) { // ClearDraws(); mTestConditions.ResetBullishOrderBlock(); } // if (isBearishOrderBlockBreaked) { // ClearDraws(); mTestConditions.ResetBearishOrderBlock(); } } result = !isOrderBlockBreaked; if (!result) { return result; } // // Try to Getting Setup Conditions ... // // Check Setting Upped ... result = mTestConditions.IsSetuped(); if (!result) { return result; } // // Try To Detect Trigger Conditions ... // // Check Conditions is Prepared for Trigger ... result = mTestConditions.CanTrigger(); if (!result) { return result; } // // Issues Signal on Conditions ... conditions.signalDir = mTestConditions.dir; conditions.provider = providerStr; conditions.sl = mTestConditions.sl; // mTestConditions.Clean(); // return result; } // // Helper Functions ... /** * Detect Valid Order Block's FVG ... * * @return ( bool ) */ bool HasValidBullishFVG( XPOIState &state, XCOrderBlock *ob, XCFVG *&fvg, XOHCL &bar // ) { // bool result = false; // fvg = NULL; // // Validate ... result = // ob != NULL && bar.IsValid() && state.IsValid() && ob.IsBullish() && state.HasChild() // ; if (!result) { return result; } // // Counting FVGs ... int count = state.CountBullishFairValueGaps(); result = IsValidSize(count); if (!result) { return result; } // for (int i = 0; i < count; i++) { // XCFVG *iFVG = state.bullishFairValueGaps[i]; // bool isValid = // // Must be Happens After Order Block ... iFVG.From() > ob.From() // && // // Must Happens Inside or Boundary of Order Blocks ... iFVG.Lower() > ob.Lower() && iFVG.Lower() < ob.Upper() // // && // // Must Not Touched till bar ... // ; if (isValid) { // bool canSet = fvg == NULL; if (canSet) { // fvg = iFVG; break; } } } // return result; } /** * Detect Valid Order Block's FVG ... * * @return ( bool ) */ bool HasValidBearishFVG( XPOIState &state, XCOrderBlock *ob, XCFVG *&fvg, XOHCL &bar // ) { // bool result = false; // fvg = NULL; // // Validate ... result = // ob != NULL && bar.IsValid() && state.IsValid() && ob.IsBearish() && state.HasChild() // ; if (!result) { return result; } // // Counting FVGs ... int count = state.CountBearishFairValueGaps(); result = IsValidSize(count); if (!result) { return result; } // for (int i = 0; i < count; i++) { // XCFVG *iFVG = state.bearishFairValueGaps[i]; // bool isValid = // // Must be Happens After Order Block ... iFVG.From() > ob.From() // && // // Must Happens Inside or Boundary of Order Blocks ... iFVG.Upper() < ob.Upper() && iFVG.Upper() > ob.Lower() // // && // // Must Not Touched till bar ... // ; if (isValid) { // bool canSet = fvg == NULL; if (canSet) { // fvg = iFVG; break; } } } // return result; } struct XSMCStrategySetupConditions { // // Props ... // string symbol; ENUM_TIMEFRAMES period; // double sl; ENUM_X_DIRECTION dir; ENUM_X_POSITION_TYPES type; // // Setup Props ... // datetime setupTime; datetime triggerTime; // datetime bullishOrderBlockTime; XCOrderBlock *bullishOrderBlock; bool isBullishOrderBlockAttacked; // datetime bearishOrderBlockTime; XCOrderBlock *bearishOrderBlock; bool isBearishOrderBlockAttacked; // datetime bullishFVGTime; XCFVG *bullishFVG; bool isBullishFVGRejected; // datetime bearishFVGTime; XCFVG *bearishFVG; bool isBearishFVGRejected; // XPVPivotPoint validPeak; XPVPivotPoint validVale; // // Trigger Props ... // // Constructor ... XSMCStrategySetupConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // sl = 0; // dir = X_DIRECTION_NONE; type = X_POSITION_TYPE_NONE; // symbol = NULL; period = NULL; setupTime = NULL; triggerTime = NULL; // validPeak.Clean(); validVale.Clean(); // bullishOrderBlock = NULL; bearishOrderBlock = NULL; bullishOrderBlockTime = NULL; bearishOrderBlockTime = NULL; // bullishFVG = NULL; bullishFVGTime = NULL; isBullishFVGRejected = false; // bearishFVG = NULL; bearishFVGTime = NULL; isBearishFVGRejected = false; // isBullishOrderBlockAttacked = false; isBearishOrderBlockAttacked = false; } /** * Check Condition is Setting Up ... * * @param dir: ENUM_X_DIRECTION member, Setting Up Direction ... * * @return ( bool ) */ bool IsSetuped() { // bool result = false; // result = IsValid(setupTime) && HasDirection(dir); if (!result) { return result; } // return result; } /** * Detect How we Can Trigger Signal ... * * @return ( bool ) */ bool CanTrigger() { // bool result = false; // result = // sl > 0 && IsValid(symbol) && IsValid(period) && IsValid(triggerTime) && type != X_POSITION_TYPE_ALL && type != X_POSITION_TYPE_NONE // ; // return result; } // // Helpers ... // // Order Block ... /** * Check has Order Block ... * * @return ( bool ) */ bool HasOrderBlock() { // bool result = false; // result = HasBullishOrderBlock() && HasBearishOrderBlock(); // return result; } bool HasBullishOrderBlock() { // bool result = false; // result = // (bullishOrderBlock != NULL && bullishOrderBlock.IsValid()) // ; // return result; } bool HasBearishOrderBlock() { // bool result = false; // result = // (bearishOrderBlock != NULL && bearishOrderBlock.IsValid()) // ; // return result; } bool IsOrderBlockAttacked() { // bool result = isBullishOrderBlockAttacked || isBearishOrderBlockAttacked; // return result; } void ResetBullishOrderBlock() { // bullishOrderBlock = NULL; bullishOrderBlockTime = NULL; isBullishOrderBlockAttacked = false; } void ResetBearishOrderBlock() { // bearishOrderBlock = NULL; bearishOrderBlockTime = NULL; isBearishOrderBlockAttacked = false; } bool HasFVG() { // bool result = false; // result = HasBullishFVG() || HasBearishFVG(); // return result; } bool HasBullishFVG() { // bool result = false; // result = IsValid(bullishFVGTime) && bullishFVG != NULL && bullishFVG.IsValid(); // return result; } bool HasBearishFVG() { // bool result = false; // result = IsValid(bearishFVGTime) && bearishFVG != NULL && bearishFVG.IsValid(); // return result; } // }; //////////////////////////////////////////////////////////////////////////////////