This commit is contained in:
2025-05-28 20:33:06 +03:30
parent f958dddec1
commit b41552a18c
+232 -2
View File
@@ -205,12 +205,23 @@ struct XTriggerBlockFilters
bool filterBasedOnHKSignalBar; // Filter Based On HK Signal Bar ... bool filterBasedOnHKSignalBar; // Filter Based On HK Signal Bar ...
// //
int bosLoopback; // PV Based Filtering BOS Lookup ... int bosLoopback; // PV Based Filtering BOS Lookup ...
//
bool forceSarSwitched; // SAR Switched on Sides for Filtering ... bool forceSarSwitched; // SAR Switched on Sides for Filtering ...
bool forceSarOnBothSide; // SAR Check on Both Sides for Filtering ... bool forceSarOnBothSide; // SAR Check on Both Sides for Filtering ...
bool forceSarHasBreakout; // SAR Must Has Reversal Direction in Trigger Block ... bool forceSarHasBreakout; // SAR Must Has Reversal Direction in Trigger Block ...
bool forceSarHasReversalSide; // SAR Must Has Reversal Direction in Trigger Block ... bool forceSarHasReversalSide; // SAR Must Has Reversal Direction in Trigger Block ...
//
bool forceHasRSITrending; // RSI Must Has Trending ...
bool forceHasRSIVPattern; // RSI Must Has Pattern ...
bool forceHasRSICrossing; // RSI Must Has Crossing Levels ...
//
bool forceHasADXTrending; // ADX Must Trending ...
bool forceHasADXCrossing; // ADX Must Has Crossing +DI/-DI ...
// //
// Constructor(s) ... // Constructor(s) ...
XTriggerBlockFilters() XTriggerBlockFilters()
@@ -239,11 +250,22 @@ struct XTriggerBlockFilters
// //
bosLoopback = 0; bosLoopback = 0;
//
forceSarSwitched = false; forceSarSwitched = false;
forceSarOnBothSide = false; forceSarOnBothSide = false;
forceSarHasBreakout = false; forceSarHasBreakout = false;
forceSarHasReversalSide = false; forceSarHasReversalSide = false;
//
forceHasRSITrending = false;
forceHasRSIVPattern = false;
forceHasRSICrossing = false;
//
forceHasADXTrending = false;
forceHasADXCrossing = false;
// //
ZeroMemory(this); ZeroMemory(this);
} }
@@ -447,11 +469,18 @@ bool DetectTriggerBlock1(
// TODO: Remove this ... // TODO: Remove this ...
// filters.bosLoopback = 0; // filters.bosLoopback = 0;
// filters.filterBasedOnPV = true; // filters.filterBasedOnPV = true;
// filters.filterBasedOnSar = false; // filters.filterBasedOnSar = true;
// filters.forceSarSwitched = false; // filters.forceSarSwitched = false;
// filters.forceSarOnBothSide = true; // filters.forceSarOnBothSide = true;
// filters.forceSarHasBreakout = true; // filters.forceSarHasBreakout = true;
// filters.forceSarHasReversalSide = false; // filters.forceSarHasReversalSide = false;
// filters.filterBasedOnRSI = false;
// filters.forceHasRSITrending = false;
// filters.forceHasRSIVPattern = false;
// filters.forceHasRSICrossing = false;
filters.filterBasedOnADX = true;
filters.forceHasADXTrending = false;
filters.forceHasADXCrossing = true;
// //
// Apply Filtering ... // Apply Filtering ...
@@ -1418,6 +1447,207 @@ bool FilterTriggerBlock(
? isSarBullishStart ? isSarBullishStart
: isSarBearishStart; : isSarBearishStart;
} }
}
//
// Filter Based On RSI ...
if (result &&
filters.filterBasedOnRSI)
{
//
// Here We Can Apply RSI Filters ...
// Since RSI Filters must be Check on FVG Bars ...
// we Have to Loop back Based on FVG Bars to Detect Conditions ...
double rsiTrend = (conditions.rsiOBLevel + conditions.rsiOSLevel) / 2;
//
toIDX = triggerBlock.fvg.ToIndex();
fromIDX = triggerBlock.fvg.FromIndex();
//
// Filter Using RSI Trending ...
if (result &&
filters.forceHasRSITrending)
{
//
for (int i = toIDX; i < fromIDX; i++)
{
//
double iRSI = helper.GetRSI(i);
double iPRSI = helper.GetRSI(i + 1);
//
has =
(isBullish
? (iRSI > rsiTrend &&
iRSI > iPRSI)
: (iRSI < rsiTrend &&
iRSI < iPRSI));
if (has)
{
break;
}
}
//
result = has;
}
//
// Filter Using RSI V Pattern ...
if (result &&
filters.forceHasRSIVPattern)
{
//
for (int i = toIDX; i < fromIDX; i++)
{
//
double iRSI = helper.GetRSI(i);
double iPRSI = helper.GetRSI(i + 1);
double iP2RSI = helper.GetRSI(i + 2);
//
bool isRSIVBullish =
iRSI > iPRSI &&
iP2RSI > iPRSI;
//
bool isRSIVBearish =
iRSI < iPRSI &&
iP2RSI < iPRSI;
//
has =
(isBullish
? isRSIVBullish
: isRSIVBearish);
if (has)
{
break;
}
}
//
result = has;
}
//
// Filter Using RSI Crossing on OB/OS Levels ...
if (result &&
filters.forceHasRSICrossing)
{
//
for (int i = toIDX; i < fromIDX; i++)
{
//
double iRSI = helper.GetRSI(i);
double iPRSI = helper.GetRSI(i + 1);
//
bool isRSICrossedOverOS =
iRSI > conditions.rsiOSLevel &&
iPRSI <= conditions.rsiOSLevel;
//
bool isRSICrossedUnderOB =
iRSI < conditions.rsiOBLevel &&
iPRSI >= conditions.rsiOBLevel;
//
has =
(isBullish
? isRSICrossedOverOS
: isRSICrossedUnderOB);
if (has)
{
break;
}
}
//
result = has;
}
}
//
// Filter Based On ADX ...
if (result &&
filters.filterBasedOnADX)
{
//
// Here We Can Apply ADX Filters ...
// Since ADX Filters must be Check on FVG Bars ...
// we Have to Loop back Based on FVG Bars to Detect Conditions ...
//
toIDX = triggerBlock.fvg.ToIndex();
fromIDX = triggerBlock.fvg.FromIndex();
//
// Filter Using ADX Trending ...
if (result &&
filters.forceHasADXTrending)
{
//
for (int i = toIDX; i < fromIDX; i++)
{
//
double iADX = helper.GetADX(i);
double iPADX = helper.GetADX(i + 1);
//
has = iADX > conditions.adxThreshold &&
iADX > iPADX;
if (has)
{
break;
}
}
//
result = has;
}
//
// Filter Using ADX Crossing on +DI/-DI ...
if (result &&
filters.forceHasADXCrossing)
{
//
for (int i = toIDX; i < fromIDX; i++)
{
//
double iDIPlus = helper.GetADXP(i);
double iPDIPlus = helper.GetADXP(i + 1);
//
double iDIMinus = helper.GetADXN(i);
double iPDIMinus = helper.GetADXN(i + 1);
//
bool isADXPlusCrossedOverMinus =
iDIPlus > iDIMinus &&
iPDIPlus <= iDIMinus;
//
bool isADXMinusCrossedOverPlus =
iDIMinus > iDIPlus &&
iPDIMinus <= iDIPlus;
//
has =
isBullish
? isADXPlusCrossedOverMinus
: isADXMinusCrossedOverPlus;
if (has)
{
break;
}
}
//
result = has;
}
// //
if (result) if (result)