last ...
This commit is contained in:
@@ -206,11 +206,22 @@ struct XTriggerBlockFilters
|
|||||||
|
|
||||||
//
|
//
|
||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user