This commit is contained in:
2025-05-20 21:48:12 +03:30
parent 587d208823
commit 70876676f5
7 changed files with 5904 additions and 1417 deletions
+780
View File
@@ -0,0 +1,780 @@
// //
// // Now we Have to Detect Spike Breake Ruls ...
// // for Bullish: bar.low goes Below of pBar.low ...
// // for Bearish: bar.high goes Above of pBar.high ...
// for (int i = toIDX; i > pBarIndex; i--)
// {
// //
// // Initialize iBar ...
// result = iBar.Init(
// bar.symbol,
// bar.period,
// i //
// );
// result =
// result &&
// iBar.GetPreviousBar(iPBar);
// if (result)
// {
// //
// if (isBullish)
// {
// result = iBar.low < iPBar.low;
// }
// else if (isBearish)
// {
// result = iBar.high > iPBar.high;
// }
// //
// if (result)
// {
// break;
// }
// }
// //
// iBar.Clean();
// iPBar.Clean();
// }
// if (!result)
// {
// //
// ob.Clean();
// fvg.Clean();
// box.Clean();
// pBar.Clean();
// iBar.Clean();
// iPBar.Clean();
// swingBar.Clean();
// liquidity.Clean();
// //
// return result;
// }
// //
// // Update Box ...
// if (isBullish)
// {
// box.upper = MathMax(box.upper, iBar.GetDown());
// }
// else if (isBearish)
// {
// box.lower = MathMin(box.lower, iBar.GetUp());
// }
bool IsTrigger(
XOHCL &bar,
XBoxZone &box,
XBoxZone &ob,
XBoxZone &fvg,
XBoxZone &liquidity,
XOHCL &swingBar,
int loopback = 10,
int hlDistance = 300,
double maxAlowedRange = 0.0,
bool forceOBOppositBar = true,
bool forceFVGBarType = true,
bool forceSwingBar = true,
bool forceGapBarBreakout = true,
bool forceCheckBarsSequence = true,
bool lookingEntry = false,
bool forceLiquidity = true,
bool forceLiquidityUsed = true,
bool forceEntryBar = true,
bool forceEntryBarPower = true
//
)
{
//
bool result = false;
//
// Normalize Args ...
ob.Clean();
fvg.Clean();
box.Clean();
swingBar.Clean();
liquidity.Clean();
loopback = NormalizeInt(loopback, 5);
//
// Validate Args ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
XOHCL pBar;
XOHCL iBar;
XOHCL iPBar;
int barIndex;
int pBarIndex;
ENUM_X_DIRECTION iDir;
//
result = bar.GetPreviousBar(pBar);
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
barIndex = bar.Index();
pBarIndex = pBar.Index();
//
// Loopback to Find a Block ...
for (int i = pBarIndex; i < pBarIndex + loopback; i++)
{
//
// Inital IBar ...
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
// Detect Block ...
result = IsOB(
iBar,
ob,
forceFVGBarType,
forceOBOppositBar //
);
if (result)
{
//
// Validate Block Last Bars ...
if (forceOBOppositBar)
{
//
XOHCL fromBar;
XOHCL fromBarPrev;
result = ob.FromBar(fromBar);
result =
result &&
fromBar.GetPreviousBar(fromBarPrev);
result =
result &&
(ob.IsBullish()
? fromBarPrev.IsBearish()
: fromBarPrev.IsBullish());
if (result)
{
//
// Detect FVG ...
result = IsFVG(
iBar,
fvg,
forceFVGBarType //
);
if (result)
{
//
box.Clone(ob);
box.type = "XTRG";
box.from = fromBarPrev.time;
break;
}
}
//
fromBar.Clean();
fromBarPrev.Clean();
}
//
break;
}
//
iBar.Clean();
}
iBar.Clean();
result = box.IsValid();
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
// Filter Using Max Allowed Range ...
if (maxAlowedRange > 0)
{
//
result = box.GetRange() <= (maxAlowedRange * GetPoints(bar.symbol));
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
}
//
// Validate Gap Bar ...
if (forceGapBarBreakout)
{
//
// We Have to Check Gap Bar's Breakout ...
result = fvg.ToBar(iBar);
result =
result &&
iBar.GetPreviousBar(iPBar);
result =
result &&
(box.IsBullish()
? iPBar.close > ob.upper
: iPBar.close < ob.lower);
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
iBar.Clean();
iPBar.Clean();
}
//
// Validate HH LL Distance ...
if (hlDistance > 0)
{
//
result = ob.FromBar(iBar);
if (result)
{
//
double ll = iBar.FindLowest(iBar.Index() + hlDistance, MODE_LOW);
double hh = iBar.FindHighest(iBar.Index() + hlDistance, MODE_HIGH);
//
result =
ll > 0 &&
hh > 0 &&
ob.upper < hh &&
ob.lower > ll;
}
//
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
iBar.Clean();
}
//
int toIDX = box.ToIndex();
int fromIDX = box.FromIndex();
bool isBullish = box.IsBullish();
bool isBearish = box.IsBearish();
//
// We Have to Make sure Bars until Spikes Closed ...
// for Bullish: bars must Close Above box.upper ...
// for Bearish: bars must Close Below box.lower ...
for (int i = pBarIndex; i < toIDX; i++)
{
//
// Initialize iBar ...
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
result =
result &&
(isBullish
? iBar.close > box.upper
: iBar.close < box.lower);
//
if (!result)
{
break;
}
//
iBar.Clean();
}
iBar.Clean();
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
// Detect Swing Bar ...
int swingBarIDX = -1;
int swingLoopback = fromIDX - pBarIndex;
if (isBullish)
{
//
// Looking for Swing Low ...
swingBarIDX = pBar.FindLowestIndex(swingLoopback, MODE_LOW);
}
else if (isBearish)
{
//
// Looking for Swing High ...
swingBarIDX = pBar.FindHighestIndex(swingLoopback, MODE_LOW);
}
result = IsValidIndex(swingBarIDX);
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
// Initialize Swing Bar ...
result = swingBar.Init(
bar.symbol,
bar.period,
swingBarIDX //
);
if (forceSwingBar)
{
//
result =
result &&
IsSimpleSwing(
swingBar,
iDir //
) &&
iDir == fvg.dir;
}
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
// Update Trigger Box ...
if (isBullish)
{
box.lower = MathMin(box.lower, swingBar.GetDown());
}
else if (isBearish)
{
box.upper = MathMin(box.upper, swingBar.GetUp());
}
//
// Validating Bar Sequence ...
if (forceCheckBarsSequence)
{
//
// Now we Have to Check Spike from Swing Bar Next till Current Bar ...
// To Validate Highs and Lows ...
for (int i = pBarIndex; i < pBarIndex + (swingBarIDX - pBarIndex) - 1; i++)
{
//
// Initialize iBar ...
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
result =
result &&
iBar.GetPreviousBar(iPBar);
if (!result)
{
break;
}
//
// Since we Go Backward Bars from Current Bar ...
// for Bullish: each Bar Low Must over Prev Bar Low ...
// for Bearish: each Bar High Must Under Prev Bar High ...
if (isBullish)
{
//
result =
result &&
iBar.low > iPBar.low;
}
else if (isBearish)
{
//
result =
result &&
iBar.high < iPBar.high;
}
if (!result)
{
break;
}
//
iBar.Clean();
iPBar.Clean();
}
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
box.to = pBar.time;
//
iBar.Clean();
iPBar.Clean();
}
//
toIDX = box.ToIndex();
fromIDX = box.FromIndex();
//
// Liquidity ...
if (forceLiquidity)
{
//
// Checking Swing Bar is Liquidity ...
result = IsRejected(
swingBar,
iDir,
true, // Force Bar Type ...
true // Foce Fibo Pressure ...
) &&
iDir == fvg.dir;
if (result)
{
//
// Filling Liquidity ...
liquidity.dir = iDir;
liquidity.to = box.to;
liquidity.type = "XLQ";
liquidity.from = swingBar.time;
liquidity.symbol = swingBar.symbol;
liquidity.period = swingBar.period;
liquidity.upper = isBullish
? swingBar.GetDown()
: swingBar.high;
liquidity.lower = isBullish
? swingBar.low
: swingBar.GetUp();
//
result = liquidity.IsValid();
}
result = liquidity.IsValid();
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
//
// Check Liquidity Usage ...
if (forceLiquidityUsed)
{
//
// now We have to Ensure Detected Liqudity is Used ...
toIDX = box.ToIndex();
fromIDX = liquidity.FromIndex();
for (int i = fromIDX - 1; i >= toIDX; i--)
{
//
// Initialize iBar ...
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
result =
result &&
(isBullish
? iBar.low < liquidity.upper
: iBar.high > liquidity.lower);
if (result)
{
break;
}
//
iBar.Clean();
}
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
}
}
//
// Looking for Entry ...
if (lookingEntry)
{
//
// Entry Bar ...
if (forceEntryBar)
{
//
// Validate Bar is Not Opposit Powered Bar ...
//
// Momentum ...
bool isMomentum = IsMomentum(
bar,
iDir,
1 //
);
bool isBullishMomentum =
isMomentum &&
IsBullish(iDir);
bool isBearishMomentum =
isMomentum &&
IsBearish(iDir);
//
// Engulfed ...
bool isEngulfed = IsEngulfed(
bar,
iDir //
);
bool isBullishEngulfed =
isEngulfed &&
IsBullish(iDir);
bool isBearishEngulfed =
isEngulfed &&
IsBearish(iDir);
//
// Rejected ...
bool isRejected = IsRejected(
bar,
iDir,
false,
true //
);
bool isBullishRejected =
isRejected &&
IsBullish(iDir);
bool isBearishRejected =
isRejected &&
IsBearish(iDir);
//
bool isBullishPowered =
isBullishMomentum ||
isBullishEngulfed ||
isBullishRejected;
//
bool isBearishPowered =
isBearishMomentum ||
isBearishEngulfed ||
isBearishRejected;
//
// Make Sure Entry Bar is a Valid Bar ...
result =
isBullish
? !isBearishPowered && (!forceEntryBarPower
? true
: isBullishPowered)
: !isBullishPowered && (!forceEntryBarPower
? true
: isBearishPowered);
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
pBar.Clean();
iBar.Clean();
iPBar.Clean();
swingBar.Clean();
liquidity.Clean();
//
return result;
}
}
//
// Check Entry Bar Sequences ...
if (forceCheckBarsSequence)
{
//
// if Sequences is Important ...
// we have to detect sequence Breaker Bar ...
result =
result &&
(isBullish
? bar.low < pBar.low
: bar.high > pBar.high);
}
//
// Validate Bar Close ...
result =
result &&
(isBullish
? bar.close > box.lower
: bar.close < box.upper);
}
//
if (!lookingEntry)
{
result = fvg.to == pBar.time;
}
//
// Cleanup Resources ...
//
iBar.Clean();
pBar.Clean();
iPBar.Clean();
//
if (!result)
{
//
ob.Clean();
fvg.Clean();
box.Clean();
swingBar.Clean();
swingBar.Clean();
liquidity.Clean();
}
//
return result;
}
File diff suppressed because it is too large Load Diff