// hasTB && // tb.IsBullish() && // // isPeakOverLast && // isSarBullishStart // && // isTrendBullishStart && // isADXBullishStart && // && // isSBarBullishStart // && // isHKSBarBullishStart // // // hasTB && // tb.IsBearish() && // // isValeUnderLast && // isSarBearishStart // && // isTrendBearishStart && // isADXBearishStart && // && // isSBarBearishStart // && // isHKSBarBearishStart // bool DetectTriggerBlock( XCPOIDrawer *drawer, XCX121XCatbHelper *helper, XCBarAnalyser *barAnalyser, X121XCatbConditions &conditions, XTriggerBlock &tb, int barIndex = 0, int loopback = 10 // ) { // bool result = false; // // Normalize Args ... tb.Clean(); conditions.Clean(); barIndex = NormalizeInt(barIndex, 0); loopback = NormalizeInt(loopback, 0); // // Validate Args ... result = helper != NULL; if (!result) { return result; } // // Reading Market Conditions ... result = helper.GetConditions( conditions, barIndex, loopback // ); if (!result) { // tb.Clean(); conditions.Clean(); } // int zIDX = 0; int cIDX = zIDX + 1; int pIDX = cIDX + 1; int p2IDX = pIDX + 1; int p3IDX = p2IDX + 1; int p4IDX = p3IDX + 1; // // Checking Conditions ... // // Detect Bar Verifications ... // ENUM_X_DIRECTION iDir; // // Rejected ... bool isRejected = barAnalyser .IsRejected( conditions.bars[cIDX], iDir // ); bool isBullishRejected = isRejected && IsBullish(iDir); bool isBearishRejected = isRejected && IsBearish(iDir); // // Engulfed ... bool isEngulfed = barAnalyser .IsEngulfed( conditions.bars[cIDX], iDir // ); bool isBullishEngulfed = isEngulfed && IsBullish(iDir); bool isBearishEngulfed = isEngulfed && IsBearish(iDir); // // Momentum ... bool isMomentum = barAnalyser .IsMomentum( conditions.bars[cIDX], iDir // ); bool isBullishMomentum = isMomentum && IsBullish(iDir); bool isBearishMomentum = isMomentum && IsBearish(iDir); // bool isBarBullishPressured = isBullishRejected || isBullishEngulfed || isBullishMomentum; // bool isBarBearishPressured = isBearishRejected || isBearishEngulfed || isBearishMomentum; // // Detect Indicator Base Start Directional Movement ... // // SAR ... // bool isSarBullishStart = // ( // // Current SAR is Directional ... conditions.isSarBullish && // // Previous InDirectional Sar Exists ... helper.lastSarBearish.IsValid() && // // Current Close is Over previous Sar ... conditions.bars[cIDX].close > helper.lastSarBearish.after && // // Before Close is not Over previous Sar ... conditions.bars[pIDX].close <= helper.lastSarBearish.after // ) // ; // bool isSarBearishStart = // ( // // Current SAR is Directional ... conditions.isSarBearish && // // Previous InDirectional Sar Exists ... helper.lastSarBullish.IsValid() && // // Current Close is Under previous ... conditions.bars[cIDX].close < helper.lastSarBullish.after && // // Before Close is not Under previous ... conditions.bars[pIDX].close >= helper.lastSarBullish.after // ) // ; // // TREND ... // bool isTrendBullishStart = // ( // // Current Trend is Directional ... conditions.isTrendBullish && // // Previous InDirectiona; Trend Exists ... helper.lastTrendBearish.IsValid() && // // Current Close is Over previous ... conditions.bars[cIDX].close > helper.lastTrendBearish.after && // // Before close is not Over previous ... conditions.bars[pIDX].close <= helper.lastTrendBearish.after // ) // ; // bool isTrendBearishStart = // ( // // Current Trend is Directional ... conditions.isTrendBearish && // // Previous InDirectiona; Trend Exists ... helper.lastTrendBullish.IsValid() && // // Current Close is Under previous ... conditions.bars[cIDX].close < helper.lastTrendBullish.after && // // Before close is not Under previous ... conditions.bars[pIDX].close >= helper.lastTrendBullish.after // ) // ; // // ADX ... // bool isADXBullishStart = // ( // // ADX Value is Switched to Strong ... conditions.adxBuffer[cIDX] > conditions.adxThreshold && conditions.adxBuffer[pIDX] <= conditions.adxThreshold && // // ADX must Up ... conditions.adxBuffer[cIDX] > conditions.adxBuffer[pIDX] && // // ADX +DI is Bigger than -DI ... conditions.adxpBuffer[cIDX] > conditions.adxnBuffer[cIDX] && // // ADX +DI is Up ... conditions.adxpBuffer[cIDX] > conditions.adxpBuffer[pIDX] // ) // ; // bool isADXBearishStart = // ( // // ADX Value is Switched to Strong ... conditions.adxBuffer[cIDX] > conditions.adxThreshold && conditions.adxBuffer[pIDX] <= conditions.adxThreshold && // // ADX must Up ... conditions.adxBuffer[cIDX] > conditions.adxBuffer[pIDX] && // // ADX -DI is Bigger than +DI ... conditions.adxnBuffer[cIDX] > conditions.adxpBuffer[cIDX] && // // ADX -DI is Up ... conditions.adxnBuffer[cIDX] > conditions.adxnBuffer[pIDX] // ) // ; // // DELTA ... // bool isDeltaBullishStart = // // Check State ... ( // // Delta is Up ... conditions.deltaBuffer[cIDX] > conditions.deltaBuffer[pIDX] && // // Delta Signal is Up ... conditions.deltaSignalBuffer[cIDX] > conditions.deltaSignalBuffer[pIDX] && // // Delta Crossed Over Delta Signal ... conditions.deltaBuffer[cIDX] > conditions.deltaSignalBuffer[cIDX] // ) // && // // Check Last InDirectional Exists ... helper.lastDeltaBearish.IsValid() && // // Current Close is Over last ... conditions.bars[cIDX].close > helper.lastDeltaBearish.after && // // Before Close is not Over last ... conditions.bars[pIDX].close <= helper.lastDeltaBearish.after // ; // bool isDeltaBearishStart = // // Check State ... ( // // Delta is Down ... conditions.deltaBuffer[cIDX] < conditions.deltaBuffer[pIDX] && // // Delta Signal is Down ... conditions.deltaSignalBuffer[cIDX] < conditions.deltaSignalBuffer[pIDX] && // // Delta Crossed Under Delta Signal ... conditions.deltaBuffer[cIDX] < conditions.deltaSignalBuffer[cIDX] // ) // && // // Check Last InDirectional Exists ... helper.lastDeltaBullish.IsValid() && // // Current Close is Under last ... conditions.bars[cIDX].close < helper.lastDeltaBullish.after && // // Before Close is not Under last ... conditions.bars[pIDX].close >= helper.lastDeltaBullish.after // ; // // VOLUME ... // bool isVolumeBullishStart = // ( // // // Volume is Up ... conditions.bullishVolumeBuffer[1] > conditions.bullishVolumeBuffer[2] && // // Volume Signal is Up ... conditions.bullishVolumeSignalBuffer[1] > conditions.bullishVolumeSignalBuffer[2] && // // Volume Signals Crossed Over ... conditions.bullishVolumeSignalBuffer[1] > conditions.bearishVolumeSignalBuffer[1] // ) // && // // Check Last InDirectional Exists ... helper.lastVolumeBearish.IsValid() && // // Current Close is Over last ... conditions.bars[cIDX].close > helper.lastVolumeBearish.after && // // Before Close is not Over last ... conditions.bars[pIDX].close <= helper.lastVolumeBearish.after // ; // bool isVolumeBearishStart = // ( // // // Volume is Up ... conditions.bearishVolumeBuffer[1] > conditions.bearishVolumeBuffer[2] && // // Volume Signal is Up ... conditions.bearishVolumeSignalBuffer[1] > conditions.bearishVolumeSignalBuffer[2] && // // Volume Signals Crossed Over ... conditions.bearishVolumeSignalBuffer[1] > conditions.bullishVolumeSignalBuffer[1] // ) // && // // Check Last InDirectional Exists ... helper.lastVolumeBullish.IsValid() && // // Current Close is Over last ... conditions.bars[cIDX].close < helper.lastVolumeBullish.after && // // Before Close is not Over last ... conditions.bars[pIDX].close >= helper.lastVolumeBullish.after // ; // // SIGNAL Bar ... // bool isSBarBullishStart = // ( // // Check Direction ... conditions.isSBarBullish && // // Previous InDirectional Exists ... helper.lastSignalBarBearish.IsValid() && // // Current Signal Bar close over prev ... conditions.sBarCloseBuffer[cIDX] > helper.lastSignalBarBearish.after && // // Prev Signal Bar not close over prev ... conditions.sBarCloseBuffer[pIDX] <= helper.lastSignalBarBearish.after // ) // ; // bool isSBarBearishStart = // ( // // Check Direction ... conditions.isSBarBearish && // // Previous InDirectional Exists ... helper.lastSignalBarBullish.IsValid() && // // Current Signal Bar close over prev ... conditions.sBarCloseBuffer[cIDX] < helper.lastSignalBarBullish.after && // // Prev Signal Bar not close over prev ... conditions.sBarCloseBuffer[pIDX] >= helper.lastSignalBarBullish.after // ) // ; // // HKSIGNAL Bar ... // bool isHKSBarBullishStart = // ( // // Check Direction ... conditions.isHKSBarBullish && // // Previous InDirectional Exists ... helper.lastHKSignalBarBearish.IsValid() && // // Current Signal Bar close over prev ... conditions.hkSBarCloseBuffer[cIDX] > helper.lastHKSignalBarBearish.after && // // Prev Signal Bar not close over prev ... conditions.hkSBarCloseBuffer[pIDX] <= helper.lastHKSignalBarBearish.after // ) // ; // bool isHKSBarBearishStart = // ( // // Check Direction ... conditions.isHKSBarBearish && // // Previous InDirectional Exists ... helper.lastHKSignalBarBullish.IsValid() && // // Current Signal Bar close over prev ... conditions.hkSBarCloseBuffer[cIDX] < helper.lastHKSignalBarBullish.after && // // Prev Signal Bar not close over prev ... conditions.hkSBarCloseBuffer[pIDX] >= helper.lastHKSignalBarBullish.after // ) // ; // // Check for Vale and Peak ... // bool isPeakOverLast = // (conditions.peakBuffer[cIDX] > conditions.peakBuffer[pIDX] && conditions.peakBuffer[pIDX] <= conditions.peakBuffer[p2IDX] && conditions.bars[cIDX].close > conditions.peakBuffer[pIDX]) // || // (conditions.peakBuffer[pIDX] > conditions.peakBuffer[p2IDX] && conditions.peakBuffer[p2IDX] <= conditions.peakBuffer[p3IDX] && conditions.bars[pIDX].close > conditions.peakBuffer[p2IDX]) // || // (conditions.peakBuffer[p2IDX] > conditions.peakBuffer[p3IDX] && conditions.peakBuffer[p3IDX] <= conditions.peakBuffer[p4IDX] && conditions.bars[p2IDX].close > conditions.peakBuffer[p3IDX]) // ; // bool isValeUnderLast = // (conditions.valeBuffer[cIDX] < conditions.valeBuffer[pIDX] && conditions.valeBuffer[pIDX] >= conditions.valeBuffer[p2IDX] && conditions.bars[cIDX].close < conditions.valeBuffer[pIDX]) // || // (conditions.valeBuffer[pIDX] < conditions.valeBuffer[p2IDX] && conditions.valeBuffer[p2IDX] >= conditions.valeBuffer[p3IDX] && conditions.bars[pIDX].close < conditions.valeBuffer[p2IDX]) // || // (conditions.valeBuffer[p2IDX] < conditions.valeBuffer[p3IDX] && conditions.valeBuffer[p3IDX] >= conditions.valeBuffer[p4IDX] && conditions.bars[p2IDX].close < conditions.valeBuffer[p3IDX]) // ; // // if (isValeUnderLast) // { // Print("SALAM"); // } // // Try to Summarize Conditions ... // bool isBullishPassed = // (isPeakOverLast && isDeltaBullishStart && isVolumeBullishStart && isBarBullishPressured) // ; // bool isBearishPassed = (isValeUnderLast && isDeltaBearishStart && isVolumeBearishStart && isBarBearishPressured) // ; // // Try to Detect Trigger Block ... bool hasTB = false; int tbLoopback = 100; X121XCatbInputs mInputs = helper.GetInputs(); for (int i = barIndex; i < barIndex + tbLoopback; i++) { // // Update Helper ... helper.Update(i); // // Check TB ... hasTB = DetectTriggerBlock( // conditions.symbol, conditions.period, // tb, // drawer, barAnalyser, // // Required Buffers ... helper.atrBuffer, helper.rsiBuffer, helper.adxBuffer, helper.adxpBuffer, helper.adxnBuffer, helper.peakBuffer, helper.valeBuffer, helper.deltaBuffer, helper.sarBuffer, helper.sarStateBuffer, helper.trendBuffer, helper.trendStateBuffer, helper.atrUpperBuffer, helper.atrLowerBuffer, helper.sBarOpenBuffer, helper.sBarCloseBuffer, helper.hkSBarOpenBuffer, helper.hkSBarCloseBuffer, helper.peakGoldenBuffer, helper.valeGoldenBuffer, helper.deltaSignalBuffer, helper.bullishVolumeSignalBuffer, helper.bearishVolumeSignalBuffer, // i + 1, // // Signalling ... mInputs.signalR2R, mInputs.slAtrMultiplier, // // Configs ... mInputs.rsiOBLevel, mInputs.rsiOSLevel, mInputs.adxThreshold, // // Validators ... mInputs.forceObBarType, mInputs.forceOBFVGBarType, mInputs.forceHasSwing, mInputs.forceHasFLiquidity, mInputs.forceHasRLiquidity, mInputs.validateGapSequence, mInputs.validateBlockEdgeBreakout, // // Filters ... mInputs.filterBasedOnPV, mInputs.filterBasedOnSar, mInputs.filterBasedOnRSI, mInputs.filterBasedOnADX, mInputs.filterBasedOnATR, mInputs.filterBasedOnTrend, mInputs.filterBasedOnDelta, mInputs.filterBasedOnVolume, mInputs.filterBasedOnSignalBar, mInputs.filterBasedOnHKSignalBar // ); // // Checking Trigger Block Validation ... hasTB = // hasTB && // ( // (isBullishPassed && tb.IsBullish()) // || // (isBearishPassed && tb.IsBearish()) // ); if (hasTB) { // break; } // tb.Clean(); } // // isBullishPassed = false; // isBearishPassed = false; // // Draw Line for Detect Conditions States on Chart ... if (hasTB && (isBullishPassed || isBearishPassed)) { // color iColor = isBullishPassed ? clrAqua : clrMagenta; // datetime iTime = conditions.bars[cIDX].time; // string iName = "VL_" + ToFormatString(iTime); // long chartID = drawer.ChartIdentification(); int subWindow = drawer.SubWindowIdentification(); // CChartObjectVLine *iObj; iObj = new CChartObjectVLine(); bool isDrawn = iObj.Create( chartID, iName, subWindow, iTime // ); if (isDrawn) { // iObj.Color(iColor); } // CArrayObj *tbObjects = new CArrayObj(); DrawTriggerBlock( tb, drawer, tbObjects, conditions.bars[0].time // ); // tb.Clean(); } // // Summarizing result ... // result = (isBullishPassed || isBearishPassed); // // Cleanup Resources ... // if (!result) { // tb.Clean(); conditions.Clean(); } // return result; } // // has = DetectTriggerBlock( // eaDrawer, // eaHelper, // eaBarAnalyser, // iConditions, // iTB, // barIndex, // 10 // // );