This commit is contained in:
2025-05-10 03:27:45 +03:30
parent f49231eeb2
commit c378ce4b4e
6 changed files with 1384 additions and 11 deletions
+533
View File
@@ -4140,6 +4140,539 @@ class XCXCAEAHelper : XCBase
return result;
}
//
bool IsBlockBasedTriggerBar(
XBoxZone &ob,
XOHCL &swingBar,
XOHCL &breakerBar,
XOHCL &outSideBar,
ENUM_X_DIRECTION &dir,
int barIndex = 0,
int loopback = 40,
int swingLength = 3 //
)
{
//
bool result = false;
//
// Normalize Args ...
ob.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
barIndex = NormalizeInt(barIndex, 0);
loopback = NormalizeInt(loopback, 30);
//
// Initializing Current Bar ...
XOHCL bar;
result = bar.Init(
GetSymbol(),
GetPeriod(),
barIndex //
);
if (!result)
{
//
ob.Clean();
bar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// Detecting Newest Block ...
XOHCL iBar;
bool has = false;
for (int i = barIndex; i < barIndex + loopback; i++)
{
//
// Initialize iBar ...
has = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!has)
{
//
iBar.Clean();
//
continue;
}
//
// Check to Find OB ...
has = barAnalyser.IsOrderBlock(
iBar,
ob,
false,
true //
);
if (has)
{
//
iBar.Clean();
//
break;
}
//
ob.Clean();
iBar.Clean();
}
//
// Ensure We Have a Block ...
result = ob.IsValid();
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// Set Direction ...
dir = ob.dir;
int toIDX = ob.ToIndex();
int fromIDX = ob.FromIndex();
bool isBullish = IsBullish(dir);
bool isBearish = IsBearish(dir);
//
// Ensure a Swing Breaked in Block Formation ...
// for Bullish we have to Breake a Swing High ...
// for Bearish we have to Detect a Swing Low ...
// this Breaktion must appear after Block ...
ENUM_X_DIRECTION swingDir = X_DIRECTION_NONE;
for (int i = barIndex + loopback; i > barIndex; i--)
{
//
// Initialize iBar ...
has = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!has)
{
//
iBar.Clean();
swingBar.Clean();
swingDir = X_DIRECTION_NONE;
//
continue;
}
//
// Detecting Swing ...
has = barAnalyser.IsSwing(
iBar,
swingDir //
);
if (!has)
{
//
iBar.Clean();
swingBar.Clean();
swingDir = X_DIRECTION_NONE;
//
continue;
}
//
// Validate Founded Swing ...
swingBar = iBar;
//
bool isValidSwingLow =
isBearish &&
IsBullish(swingDir);
//
bool isValidSwingHigh =
isBullish &&
IsBearish(swingDir);
//
has =
isValidSwingLow ||
isValidSwingHigh;
if (!has)
{
//
iBar.Clean();
swingBar.Clean();
swingDir = X_DIRECTION_NONE;
//
continue;
}
//
// Validating Swing Place ...
//
bool isSwingLowHasValidPlace =
isBearish &&
swingBar.low < ob.lower;
//
bool isSwingHighHasValidPlace =
isBullish &&
swingBar.high > ob.upper;
//
has =
isSwingLowHasValidPlace ||
isSwingHighHasValidPlace;
if (has)
{
//
iBar.Clean();
//
break;
}
//
iBar.Clean();
swingBar.Clean();
swingDir = X_DIRECTION_NONE;
}
//
result =
swingBar.IsValid() &&
HasDirection(swingDir);
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// now We have Proper Swing ...
// Validate Swing Breaktion ...
double breakPrice =
IsBullish(swingDir)
? swingBar.low
: swingBar.high;
ENUM_X_DIRECTION breakedDir =
IsBullish(swingDir)
? X_DIRECTION_BEARISH
: X_DIRECTION_BULLISH;
for (int i = swingBar.Index(); i > barIndex; i--)
{
//
// Initialize iBar ...
has = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!has)
{
//
iBar.Clean();
breakerBar.Clean();
//
continue;
}
//
// Check for Breakes ...
has = iBar.IsBreaked(
breakPrice,
breakedDir //
);
if (!has)
{
//
iBar.Clean();
breakerBar.Clean();
//
continue;
}
//
// Validate Swing Break must be happens
// after Block Formation ...
has = iBar.time > ob.to;
if (has)
{
//
breakerBar = iBar;
//
iBar.Clean();
//
break;
}
//
iBar.Clean();
breakerBar.Clean();
}
//
result = breakerBar.IsValid();
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// now we have a Valid Bloc ...
// which Breakes a Valid Swing ...
//
// find at least on out side of Block Bar ...
for (int i = toIDX; i > barIndex; i--)
{
//
// Initialize iBar ...
has = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!has)
{
//
iBar.Clean();
outSideBar.Clean();
//
continue;
}
//
bool isBullishOutside =
isBullish &&
iBar.high > ob.upper;
//
bool isBearishOutside =
isBearish &&
iBar.low < ob.lower;
//
has =
isBullishOutside ||
isBearishOutside;
if (has)
{
//
outSideBar = iBar;
//
iBar.Clean();
//
break;
}
//
iBar.Clean();
outSideBar.Clean();
}
//
result = outSideBar.IsValid();
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// we Are Looking for Bar inside Block ...
//
bool isBullishInside =
isBullish &&
bar.low < ob.upper &&
bar.low > ob.lower;
//
bool isBearishInside =
isBearish &&
bar.high > ob.lower &&
bar.high < ob.upper;
//
result = isBullishInside ||
isBearishInside;
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
// Since we Ensure have an Inside Block Bar here ...
// must to detect a Bar Pattern verification for Triggering ...
//
// Check Bar Pattern for Position ...
ENUM_X_DIRECTION patternDir;
//
// Hammer ...
bool isHammer = barAnalyser.IsHammer(
bar,
patternDir //
);
bool isBullishHammer =
isHammer &&
IsBullish(patternDir);
bool isBearishHammer =
isHammer &&
IsBearish(patternDir);
//
// Reject ...
bool isReject = barAnalyser.IsRejected(
bar,
patternDir,
false, // Force Bar type ...
true // Force Fibo Pressure ...
);
bool isBullishReject =
isReject &&
IsBullish(patternDir);
bool isBearishReject =
isReject &&
IsBearish(patternDir);
//
// Engulf ...
bool isEngulf = barAnalyser.IsEngulfed(
bar,
patternDir //
);
bool isBullishEngulf =
isEngulf &&
IsBullish(patternDir);
bool isBearishEngulf =
isEngulf &&
IsBearish(patternDir);
//
bool isBarBullishPowered =
isBullishHammer ||
isBullishReject ||
isBullishEngulf;
//
bool isBarBearishPowered =
isBearishHammer ||
isBearishReject ||
isBearishEngulf;
//
// Summarizing Result ...
//
bool isBullishTriggered =
isBullish &&
isBullishInside &&
isBarBullishPowered;
//
bool isBearishTriggered =
isBearish &&
isBearishInside &&
isBarBearishPowered;
//
result = isBullishTriggered ||
isBearishTriggered;
//
if (!result)
{
//
ob.Clean();
bar.Clean();
iBar.Clean();
swingBar.Clean();
breakerBar.Clean();
outSideBar.Clean();
dir = X_DIRECTION_NONE;
//
return result;
}
//
bar.Clean();
//
return result;
}
//
// Protected ...
protected: