apply new mechanism for validating anf filtering ...

This commit is contained in:
2025-05-29 01:13:31 +03:30
parent b41552a18c
commit 04d11702fe
5 changed files with 1019 additions and 354 deletions
+131 -91
View File
@@ -38,9 +38,9 @@
//
// Common ...
input group "Common";
input long eaMagicNumber = 78692110; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
input long eaMagicNumber = 1694056; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
//
// Detector ...
@@ -49,27 +49,51 @@ input group "Detector";
//
// Validating ...
input group "Validations";
input bool eaForceHasSwing = false; // Force Blocks to Have Swing
input bool eaForceOBBarType = false; // Force Block Has Reversal Bar
input bool eaForceOBFVGBarType = false; // Force FVG Has Same Bars
input bool eaForceHasFLiquidity = false; // Force Blocks to Have Following Liquidity
input bool eaForceHasRLiquidity = false; // Force Blocks to Have Reversal Liquidity
input bool eaValidateGapSequence = false; // Validate Block's Gap Sequence
input bool eaValidateBlockEdgeBreakout = false; // Validate Block's Edge Breakout
input bool eaForceHasSwing = false; // Force Block to Has Propper Swing
input bool eaForceOBBarType = false; // Force Order Block to Has InDirectional Bars
input int eaMinRequiredOBBar = 0; // Min Required OB Bar
input bool eaForceFVGBarType = false; // Force Fair Value Gaps Bars Type
input int eaLiquidityLoopback = 0; // Liquidity Detection Loopback
input double eaMaxAllowedRange = 0.0; // Max Allowed Order Block Range
input double eaMinAllowedRange = 0.0; // Min Allowed Order Block Range
input bool eaForceHasFLiquidity = false; // Force Order Block To Has Reversal Liquidity
input bool eaForceHasRLiquidity = false; // Force Order Block to Has Following Liquidity
input bool eaValidateGapSequence = false; // Validate Fair Value Gaps Bar Sequences
input int eaMinAllowedBlockLength = 5; // Min Allowed Block Length
input bool eaValidateBlockEdgeBreakout = false; // Validate Order Block Edge Breakeout
//
// Filtering ...
input group "Filters";
input bool eaFilterBasedOnPV = false; // Filter Based on Peak and Vale
input bool eaFilterBasedOnSar = false; // Filter Based on Sar
input bool eaFilterBasedOnRSI = false; // Filter Based on RSI
input bool eaFilterBasedOnADX = false; // Filter Based on ADX
input bool eaFilterBasedOnATR = false; // Filter Based on ATR
input bool eaFilterBasedOnTrend = false; // Filter Based on Trend
input bool eaFilterBasedOnDelta = false; // Filter Based on Delta
input bool eaFilterBasedOnVolume = false; // Filter Based on Volume
input bool eaFilterBasedOnSignalBar = false; // Filter Based on Signal Bar
input bool eaFilterBasedOnHKSignalBar = false; // Filter Based on Hiken Ashi Signal Bar
input bool eaFilterBasedOnPV = false; // Filter Based On PV
input int eaBosLoopback = 0; // PV Based Filtering BOS Lookup
input bool eaFilterBasedOnSar = false; // Filter Based On SAR
input bool eaForceSarSwitched = false; // SAR Switched on Sides for Filtering
input bool eaForceSarOnBothSide = false; // SAR Check on Both Sides for Filtering
input bool eaForceSarHasBreakout = false; // SAR Must Has Reversal Direction in Trigger Block
input bool eaForceSarHasReversalSide = false; // SAR Must Has Reversal Direction in Trigger Block
input bool eaFilterBasedOnRSI = false; // Filter Based On RSI
input bool eaForceHasRSITrending = false; // RSI Must Has Trending
input bool eaForceHasRSIVPattern = false; // RSI Must Has Pattern
input bool eaForceHasRSICrossing = false; // RSI Must Has Crossing Levels
input bool eaFilterBasedOnADX = false; // Filter Based On ADX
input bool eaForceHasADXTrending = false; // ADX Must Has Trending
input bool eaForceHasADXCrossing = false; // ADX Must Has Crossing +DI/-DI
input bool eaFilterBasedOnATR = false; // Filter Based On ATR
input bool eaForceHasATRTrending = false; // ATR Must Has Trending
input bool eaForceHasATRBreakout = false; // ATR Must Has Breakout
input bool eaFilterBasedOnTrend = false; // Filter Based On Trend
input bool eaForceHasTrendDir = false; // TREND Must Has Following Direction
input bool eaForceHasTrendPlace = false; // TREND Place Based Filtering
input bool eaForceHasTrendChange = false; // TREND Change Filtering
input bool eaForceHasTrendTrending = false; // TREND Must Has Trending
input bool eaForceHasTrendRejection = false; // TREND Line Must Rejected
input bool eaForceHasTrendLineInside = false; // TREND Line has Inside
input bool eaForceHasTrendDirOnBothSide = false; // TREND Must Has Following Direction in Both Side
input bool eaFilterBasedOnDelta = false; // Filter Based On Delta
input bool eaFilterBasedOnVolume = false; // Filter Based On Volume
input bool eaFilterBasedOnSignalBar = false; // Filter Based on Signal Bar
input bool eaFilterBasedOnHKSignalBar = false; // Filter Based On HK Signal Bar
//
// Signal ...
@@ -137,6 +161,7 @@ XCTrade *eaTrade;
XSignal eaSignal;
string eaTag = "";
XCVolume *eaVolume;
XTriggerBlock eaTB;
CArrayObj *eaObjects;
XCPOIDrawer *eaDrawer;
XBarTracker eaBarTraker;
@@ -144,8 +169,11 @@ X121XCatbInputs eaInputs;
XTimeTracker eaTimeTracker;
XCX121XCatbHelper *eaHelper;
XCBarAnalyser *eaBarAnalyser;
XTriggerBlockFilters eaFilters;
X121XCatbConditions eaCatbConditions;
XCXCATBEATradeManager *eaTradeManager;
XCATBEAStrategyConditions eaConditions;
XTriggerBlockValidationRules eaValidations;
//
// Event Handlers ...
@@ -221,10 +249,16 @@ void OnDeinit(const int reason)
ZeroMemory(eaBarAnalyser);
//
eaTB.Clean();
eaSignal.Clean();
eaSignal.Clean();
eaFilters.Clean();
eaBarTraker.Clean();
eaConditions.Clean();
eaConditions.Clean();
eaTimeTracker.Clean();
eaValidations.Clean();
eaCatbConditions.Clean();
//
DestroyTimer();
@@ -247,8 +281,10 @@ void OnTick()
eaTradeManager.Manage();
//
eaTB.Clean();
eaSignal.Clean();
eaConditions.Clean();
eaCatbConditions.Clean();
//
bool has = false;
@@ -298,45 +334,15 @@ void OnTick()
// Check Trigger Block Detected or Not ...
if (tradeUsingTriggerBlock)
{
//
// Define Requirements ...
XTriggerBlock iTB;
XTriggerBlockFilters iFilters;
X121XCatbConditions iConditions;
XTriggerBlockValidationRules iValidations;
//
// Fill Validations ...
iValidations.forceHasSwing = eaInputs.forceHasSwing;
iValidations.forceOBBarType = eaInputs.forceOBBarType;
iValidations.forceFVGBarType = eaInputs.forceOBFVGBarType;
iValidations.forceHasFLiquidity = eaInputs.forceHasFLiquidity;
iValidations.forceHasRLiquidity = eaInputs.forceHasRLiquidity;
iValidations.validateGapSequence = eaInputs.validateGapSequence;
iValidations.validateBlockEdgeBreakout = eaInputs.validateBlockEdgeBreakout;
//
// Fill Filters ...
iFilters.filterBasedOnPV = eaInputs.filterBasedOnPV;
iFilters.filterBasedOnSar = eaInputs.filterBasedOnSar;
iFilters.filterBasedOnRSI = eaInputs.filterBasedOnRSI;
iFilters.filterBasedOnADX = eaInputs.filterBasedOnADX;
iFilters.filterBasedOnATR = eaInputs.filterBasedOnATR;
iFilters.filterBasedOnTrend = eaInputs.filterBasedOnTrend;
iFilters.filterBasedOnDelta = eaInputs.filterBasedOnDelta;
iFilters.filterBasedOnVolume = eaInputs.filterBasedOnVolume;
iFilters.filterBasedOnSignalBar = eaInputs.filterBasedOnSignalBar;
iFilters.filterBasedOnHKSignalBar = eaInputs.filterBasedOnHKSignalBar;
//
// Trigger Block Detection ...
has = DetectTriggerBlock1(
eaHelper,
eaBarAnalyser,
iTB,
iConditions,
iValidations,
iFilters,
eaTB,
eaCatbConditions,
eaValidations,
eaFilters,
barIndex,
10 // Loopback ...
);
@@ -373,8 +379,8 @@ void OnTick()
//
// Preparing Signal ...
has = ToSignal(
iTB.trigger,
iTB.signal,
eaTB.trigger,
eaTB.signal,
targets,
slAdditional //
);
@@ -382,7 +388,7 @@ void OnTick()
//
// Draw Trigger Block ...
DrawTriggerBlock(
iTB,
eaTB,
eaDrawer,
eaObjects,
NULL //
@@ -390,7 +396,7 @@ void OnTick()
//
// Attach Signal ...
eaSignal = iTB.signal;
eaSignal = eaTB.signal;
//
// Here we Can Fill eaConditions ...
@@ -428,7 +434,7 @@ void OnTick()
}
//
iTB.Clean();
eaTB.Clean();
}
//
@@ -459,6 +465,10 @@ void OnTick()
//
zBar.Clean();
cBar.Clean();
eaTB.Clean();
eaSignal.Clean();
eaConditions.Clean();
eaCatbConditions.Clean();
}
//
@@ -729,40 +739,9 @@ void InitRequirements()
eaInputs.showPV = true;
eaInputs.showSar = true;
eaInputs.showTrend = true;
eaInputs.showATRBand = false;
eaInputs.showATRBand = true;
eaInputs.showPVGolden = true;
//
// Set Validators ...
eaInputs.forceHasSwing = eaForceHasSwing;
eaInputs.forceOBBarType = eaForceOBBarType;
eaInputs.forceOBFVGBarType = eaForceOBFVGBarType;
eaInputs.forceHasFLiquidity = eaForceHasFLiquidity;
eaInputs.forceHasRLiquidity = eaForceHasRLiquidity;
eaInputs.validateGapSequence = eaValidateGapSequence;
eaInputs.validateBlockEdgeBreakout = eaValidateBlockEdgeBreakout;
//
// Set Filters ...
eaInputs.filterBasedOnPV = eaFilterBasedOnPV;
eaInputs.filterBasedOnSar = eaFilterBasedOnSar;
eaInputs.filterBasedOnRSI = eaFilterBasedOnRSI;
eaInputs.filterBasedOnADX = eaFilterBasedOnADX;
eaInputs.filterBasedOnATR = eaFilterBasedOnATR;
eaInputs.filterBasedOnTrend = eaFilterBasedOnTrend;
eaInputs.filterBasedOnDelta = eaFilterBasedOnDelta;
eaInputs.filterBasedOnVolume = eaFilterBasedOnVolume;
eaInputs.filterBasedOnSignalBar = eaFilterBasedOnSignalBar;
eaInputs.filterBasedOnHKSignalBar = eaFilterBasedOnHKSignalBar;
//
// Alerts ...
eaInputs.alertPrefix = eaTag;
eaInputs.logAlerts = false; // eaLogAlerts;
eaInputs.pushAlerts = false; // eaMailAlerts;
eaInputs.mailAlerts = false; // eaPushAlerts;
eaInputs.terminalAlerts = false; // eaTerminalAlerts;
//
eaHelper = new XCX121XCatbHelper();
bool isInited = eaHelper.Init(
@@ -897,6 +876,67 @@ void InitRequirements()
}
}
//
// Fill Validations ...
eaValidations.forceHasSwing = eaForceHasSwing;
eaValidations.forceOBBarType = eaForceOBBarType;
eaValidations.minRequiredOBBar = eaMinRequiredOBBar;
eaValidations.forceFVGBarType = eaForceFVGBarType;
eaValidations.liquidityLoopback = eaLiquidityLoopback;
eaValidations.maxAllowedRange = eaMaxAllowedRange;
eaValidations.minAllowedRange = eaMinAllowedRange;
eaValidations.forceHasFLiquidity = eaForceHasFLiquidity;
eaValidations.forceHasRLiquidity = eaForceHasRLiquidity;
eaValidations.validateGapSequence = eaValidateGapSequence;
eaValidations.minAllowedBlockLength = eaMinAllowedBlockLength;
eaValidations.validateBlockEdgeBreakout = eaValidateBlockEdgeBreakout;
//
// Fill Filters ...
//
eaFilters.filterBasedOnPV = eaFilterBasedOnPV;
eaFilters.bosLoopback = eaBosLoopback;
//
eaFilters.filterBasedOnSar = eaFilterBasedOnSar;
eaFilters.forceSarSwitched = eaForceSarSwitched;
eaFilters.forceSarOnBothSide = eaForceSarOnBothSide;
eaFilters.forceSarHasBreakout = eaForceSarHasBreakout;
eaFilters.forceSarHasReversalSide = eaForceSarHasReversalSide;
//
eaFilters.filterBasedOnRSI = eaFilterBasedOnRSI;
eaFilters.forceHasRSITrending = eaForceHasRSITrending;
eaFilters.forceHasRSIVPattern = eaForceHasRSIVPattern;
eaFilters.forceHasRSICrossing = eaForceHasRSICrossing;
//
eaFilters.filterBasedOnADX = eaFilterBasedOnADX;
eaFilters.forceHasADXTrending = eaForceHasADXTrending;
eaFilters.forceHasADXCrossing = eaForceHasADXCrossing;
//
eaFilters.filterBasedOnATR = eaFilterBasedOnATR;
eaFilters.forceHasATRTrending = eaForceHasATRTrending;
eaFilters.forceHasATRBreakout = eaForceHasATRBreakout;
//
eaFilters.filterBasedOnTrend = eaFilterBasedOnTrend;
eaFilters.forceHasTrendDir = eaForceHasTrendDir;
eaFilters.forceHasTrendPlace = eaForceHasTrendPlace;
eaFilters.forceHasTrendChange = eaForceHasTrendChange;
eaFilters.forceHasTrendTrending = eaForceHasTrendTrending;
eaFilters.forceHasTrendRejection = eaForceHasTrendRejection;
eaFilters.forceHasTrendLineInside = eaForceHasTrendLineInside;
eaFilters.forceHasTrendDirOnBothSide = eaForceHasTrendDirOnBothSide;
//
eaFilters.filterBasedOnDelta = eaFilterBasedOnDelta;
eaFilters.filterBasedOnVolume = eaFilterBasedOnVolume;
eaFilters.filterBasedOnSignalBar = eaFilterBasedOnSignalBar;
eaFilters.filterBasedOnHKSignalBar = eaFilterBasedOnHKSignalBar;
//
}