مشسف ...

This commit is contained in:
2025-02-04 19:31:24 +03:30
parent 1f755d6ca3
commit 114f327efe
2 changed files with 795 additions and 47 deletions
+620 -43
View File
@@ -844,17 +844,20 @@ class XCBarZone : public XCZone
} }
/** /**
* Is Activated Zone or not ... * Is Zone Activated ...
* *
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param activatedBar: XOHCL instance Reference ... * @param activatedBar: XOHCL instance Reference ...
* @param activatedDir: ENUM_X_DIRECTION member ... * @param activatedDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsActivated( bool IsActivated(
ENUM_X_DIRECTION forDir, ENUM_X_DIRECTION forDir,
XOHCL &activatedBar, XOHCL &activatedBar,
ENUM_X_DIRECTION &activatedDir // ENUM_X_DIRECTION &activatedDir,
ENUM_TIMEFRAMES forPeriod = NULL //
) )
{ {
// //
@@ -865,7 +868,15 @@ class XCBarZone : public XCZone
activatedDir = X_DIRECTION_NONE; activatedDir = X_DIRECTION_NONE;
// //
result = IsValid(); if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result) if (!result)
{ {
return result; return result;
@@ -877,7 +888,8 @@ class XCBarZone : public XCZone
bool isStarted = IsStarted( bool isStarted = IsStarted(
forDir, forDir,
startedBar, startedBar,
startedDir // startedDir,
forPeriod //
); );
result = isStarted; result = isStarted;
if (!result) if (!result)
@@ -899,7 +911,7 @@ class XCBarZone : public XCZone
XOHCL iBar; XOHCL iBar;
bool isInited = iBar.Init( bool isInited = iBar.Init(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
i // i //
); );
result = isInited; result = isInited;
@@ -971,17 +983,20 @@ class XCBarZone : public XCZone
} }
/** /**
* Is Breaked Zone or not ... * Is Zone Breaked ...
* *
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param breakerBar: XOHCL instance Reference ... * @param breakerBar: XOHCL instance Reference ...
* @param breakerDir: ENUM_X_DIRECTION member ... * @param breakerDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsBreaked( bool IsBreaked(
ENUM_X_DIRECTION forDir, ENUM_X_DIRECTION forDir,
XOHCL &breakerBar, XOHCL &breakerBar,
ENUM_X_DIRECTION &breakerDir // ENUM_X_DIRECTION &breakerDir,
ENUM_TIMEFRAMES forPeriod = NULL //
) )
{ {
// //
@@ -991,9 +1006,16 @@ class XCBarZone : public XCZone
breakerBar.Clean(); breakerBar.Clean();
breakerDir = X_DIRECTION_NONE; breakerDir = X_DIRECTION_NONE;
//
if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
// //
result = IsValid() && result = IsValid() &&
HasDirection(forDir); HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result) if (!result)
{ {
return result; return result;
@@ -1005,7 +1027,8 @@ class XCBarZone : public XCZone
bool isActivated = IsActivated( bool isActivated = IsActivated(
forDir, forDir,
activatedBar, activatedBar,
activatedDir // activatedDir,
forPeriod //
); );
result = isActivated; result = isActivated;
if (!result) if (!result)
@@ -1024,7 +1047,7 @@ class XCBarZone : public XCZone
XOHCL iBar; XOHCL iBar;
bool isInited = iBar.Init( bool isInited = iBar.Init(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
i // i //
); );
result = isInited; result = isInited;
@@ -1085,17 +1108,20 @@ class XCBarZone : public XCZone
} }
/** /**
* Retrieve Order Zone First Breaker Bar ... * Is Zone Started ...
* *
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param breakerBar: XOHCL instance Reference ... * @param breakerBar: XOHCL instance Reference ...
* @param breakerDir: ENUM_X_DIRECTION member ... * @param breakerDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsStarted( bool IsStarted(
ENUM_X_DIRECTION forDir, ENUM_X_DIRECTION forDir,
XOHCL &startedBar, XOHCL &startedBar,
ENUM_X_DIRECTION &startedDir // ENUM_X_DIRECTION &startedDir,
ENUM_TIMEFRAMES forPeriod = NULL //
) )
{ {
// //
@@ -1105,9 +1131,16 @@ class XCBarZone : public XCZone
startedBar.Clean(); startedBar.Clean();
startedDir = X_DIRECTION_NONE; startedDir = X_DIRECTION_NONE;
//
if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
// //
result = IsValid() && result = IsValid() &&
HasDirection(forDir); HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result) if (!result)
{ {
return result; return result;
@@ -1121,7 +1154,7 @@ class XCBarZone : public XCZone
// Detect From Bar Index ... // Detect From Bar Index ...
int fromIndex = iBarShift( int fromIndex = iBarShift(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
From() // From() //
); );
@@ -1132,7 +1165,7 @@ class XCBarZone : public XCZone
XOHCL iBar; XOHCL iBar;
bool isInited = iBar.Init( bool isInited = iBar.Init(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
i // i //
); );
result = isInited; result = isInited;
@@ -1196,6 +1229,191 @@ class XCBarZone : public XCZone
return result; return result;
} }
/**
* Is Zone Rejected/Sweeped ...
*
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param rejectedBar: XOHCL instance Reference ...
* @param rejectedDir: ENUM_X_DIRECTION member, Provides Rejection Direction ...
* @param from: datetime start checking optional ...
* @param forceSweep: bool, Specified Force Sweep Rejection ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
*
* @return ( bool )
*/
bool IsRejected(
ENUM_X_DIRECTION forDir,
XOHCL &rejectedBar,
ENUM_X_DIRECTION &rejectedDir,
datetime from = NULL,
bool forceSweep = false,
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
bool result = false;
//
rejectedBar.Clean();
rejectedDir = X_DIRECTION_NONE;
//
if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
if (!IsSpecifiedValid(from))
{
from = From();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result)
{
return result;
}
//
bool isBullish = IsBullish(forDir);
bool isBearish = IsBearish(forDir);
//
int fromIndex = iBarShift(
GetSymbol(),
forPeriod,
from //
);
fromIndex--;
//
for (int i = fromIndex; i >= 0; i--)
{
//
XOHCL iBar;
bool isInited = iBar.Init(
GetSymbol(),
forPeriod,
i //
);
result = isInited;
if (!result)
{
continue;
}
//
bool isRejectedFromUpper =
//
isBullish &&
//
(
//
(iBar.low <= Upper() &&
iBar.high > Upper() &&
iBar.GetUp() > Upper())
//
)
//
;
//
bool isRejectedFromLower =
//
isBearish &&
//
(
//
(iBar.high >= Lower() &&
iBar.low < Lower() &&
iBar.GetDown() < Lower())
//
)
//
;
//
bool isSweepedFromUpper =
//
isBullish &&
//
(
//
(iBar.low <= Lower() &&
iBar.high > Upper() &&
iBar.GetUp() > Upper())
//
)
//
;
//
bool isSweepedFromLower =
//
isBearish &&
//
(
//
(iBar.high >= Upper() &&
iBar.low < Lower() &&
iBar.GetDown() < Lower())
//
)
//
;
//
bool isRejected = isRejectedFromUpper ||
isRejectedFromLower;
//
bool isSweeped = isSweepedFromUpper ||
isSweepedFromLower;
//
bool fromUpper = isRejectedFromUpper ||
isSweepedFromUpper;
//
bool fromLower = isRejectedFromLower ||
isSweepedFromLower;
//
// Prepare Result ...
bool isPassed =
isSweeped ||
isRejected;
if (forceSweep)
{
isPassed = isSweeped;
}
//
if (isPassed)
{
//
result = isPassed;
rejectedBar = iBar;
rejectedDir =
fromUpper
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
break;
}
}
//
result = rejectedBar.IsValid() &&
HasDirection(rejectedDir);
//
return result;
}
// //
// Overrides ... // Overrides ...
@@ -1523,16 +1741,20 @@ class XCTwoBarZone : public XCZone
} }
/** /**
* Is Activated Zone or not ... * Is Zone Activated ...
* *
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param activatedBar: XOHCL instance Reference ... * @param activatedBar: XOHCL instance Reference ...
* @param activatedDir: ENUM_X_DIRECTION member ... * @param activatedDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsActivated( bool IsActivated(
ENUM_X_DIRECTION forDir,
XOHCL &activatedBar, XOHCL &activatedBar,
ENUM_X_DIRECTION &activatedDir // ENUM_X_DIRECTION &activatedDir,
ENUM_TIMEFRAMES forPeriod = NULL //
) )
{ {
// //
@@ -1543,35 +1765,50 @@ class XCTwoBarZone : public XCZone
activatedDir = X_DIRECTION_NONE; activatedDir = X_DIRECTION_NONE;
// //
result = IsValid(); if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result) if (!result)
{ {
return result; return result;
} }
// //
// Detect From Bar Index ... XOHCL startedBar;
int fromIndex = iBarShift( ENUM_X_DIRECTION startedDir;
GetSymbol(), bool isStarted = IsStarted(
GetPeriod(), forDir,
From() // startedBar,
startedDir,
forPeriod //
); );
fromIndex--; result = isStarted;
if (!result)
{
return result;
}
// //
for (int i = fromIndex; i >= 0; i--) bool isBullish = IsBullish(forDir);
{ bool isBearish = IsBearish(forDir);
//
if (i == fromIndex)
{
continue;
}
//
int startIndex = startedBar.Index() - 1;
//
for (int i = startIndex; i >= 0; i--)
{
// //
XOHCL iBar; XOHCL iBar;
bool isInited = iBar.Init( bool isInited = iBar.Init(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
i // i //
); );
result = isInited; result = isInited;
@@ -1582,8 +1819,7 @@ class XCTwoBarZone : public XCZone
// //
XOHCL iPBar; XOHCL iPBar;
isInited = iBar isInited = iBar.GetPreviousBar(iPBar);
.GetPreviousBar(iPBar);
result = isInited; result = isInited;
if (!result) if (!result)
{ {
@@ -1593,16 +1829,28 @@ class XCTwoBarZone : public XCZone
// //
bool isActivedFromUpper = bool isActivedFromUpper =
// //
(iPBar.low > Upper() && isBullish &&
iBar.low <= Upper()) //
(
//
(iPBar.low > Upper() &&
iBar.low <= Upper())
//
)
// //
; ;
// //
bool isActivedFromLower = bool isActivedFromLower =
// //
(iPBar.high < Lower() && isBearish &&
iBar.high >= Lower()) //
(
//
(iPBar.high < Lower() &&
iBar.high >= Lower())
//
)
// //
; ;
@@ -1623,21 +1871,29 @@ class XCTwoBarZone : public XCZone
} }
} }
//
result = activatedBar.IsValid() &&
HasDirection(activatedDir);
// //
return result; return result;
} }
/** /**
* Is Breaked Zone or not ... * Is Zone Breaked ...
* *
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param breakerBar: XOHCL instance Reference ... * @param breakerBar: XOHCL instance Reference ...
* @param breakerDir: ENUM_X_DIRECTION member ... * @param breakerDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsBreaked( bool IsBreaked(
ENUM_X_DIRECTION forDir,
XOHCL &breakerBar, XOHCL &breakerBar,
ENUM_X_DIRECTION &breakerDir // ENUM_X_DIRECTION &breakerDir,
ENUM_TIMEFRAMES forPeriod = NULL //
) )
{ {
// //
@@ -1648,7 +1904,15 @@ class XCTwoBarZone : public XCZone
breakerDir = X_DIRECTION_NONE; breakerDir = X_DIRECTION_NONE;
// //
result = IsValid(); if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result) if (!result)
{ {
return result; return result;
@@ -1658,8 +1922,10 @@ class XCTwoBarZone : public XCZone
XOHCL activatedBar; XOHCL activatedBar;
ENUM_X_DIRECTION activatedDir; ENUM_X_DIRECTION activatedDir;
bool isActivated = IsActivated( bool isActivated = IsActivated(
forDir,
activatedBar, activatedBar,
activatedDir // activatedDir,
forPeriod //
); );
result = isActivated; result = isActivated;
if (!result) if (!result)
@@ -1678,7 +1944,7 @@ class XCTwoBarZone : public XCZone
XOHCL iBar; XOHCL iBar;
bool isInited = iBar.Init( bool isInited = iBar.Init(
GetSymbol(), GetSymbol(),
GetPeriod(), forPeriod,
i // i //
); );
result = isInited; result = isInited;
@@ -1730,6 +1996,317 @@ class XCTwoBarZone : public XCZone
} }
} }
//
result = breakerBar.IsValid() &&
HasDirection(breakerDir);
//
return result;
}
/**
* Is Zone Started ...
*
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param breakerBar: XOHCL instance Reference ...
* @param breakerDir: ENUM_X_DIRECTION member ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
*
* @return ( bool )
*/
bool IsStarted(
ENUM_X_DIRECTION forDir,
XOHCL &startedBar,
ENUM_X_DIRECTION &startedDir,
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
bool result = false;
//
startedBar.Clean();
startedDir = X_DIRECTION_NONE;
//
if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result)
{
return result;
}
//
bool isBullish = IsBullish(forDir);
bool isBearish = IsBearish(forDir);
//
// Detect From Bar Index ...
int fromIndex = iBarShift(
GetSymbol(),
forPeriod,
From() //
);
//
for (int i = fromIndex; i >= 0; i--)
{
//
XOHCL iBar;
bool isInited = iBar.Init(
GetSymbol(),
forPeriod,
i //
);
result = isInited;
if (!result)
{
continue;
}
//
bool isBreakedFromUpper =
//
isBullish &&
//
(
//
iBar.low > Upper() ||
(iBar.low <= Upper() &&
iBar.high > Upper())
//
)
//
;
//
bool isBreakedFromLower =
//
isBearish &&
//
(
//
iBar.low < Lower() ||
(iBar.high >= Lower() &&
iBar.low < Lower())
//
)
//
;
//
bool isBreaked =
isBreakedFromUpper ||
isBreakedFromLower;
if (isBreaked)
{
//
result = isBreaked;
startedBar = iBar;
startedDir =
isBreakedFromUpper
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
break;
}
}
//
result = startedBar.IsValid() &&
HasDirection(startedDir);
//
return result;
}
/**
* Is Zone Rejected/Sweeped ...
*
* @param forDir: ENUM_X_DIRECTION member, Specified Action Direction ...
* @param rejectedBar: XOHCL instance Reference ...
* @param rejectedDir: ENUM_X_DIRECTION member, Provides Rejection Direction ...
* @param from: datetime start checking optional ...
* @param forceSweep: bool, Specified Force Sweep Rejection ...
* @param forPeriod: ENUM_TIMEFRAMES member, Specified Rejection Period ...
*
* @return ( bool )
*/
bool IsRejected(
ENUM_X_DIRECTION forDir,
XOHCL &rejectedBar,
ENUM_X_DIRECTION &rejectedDir,
datetime from = NULL,
bool forceSweep = false,
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
bool result = false;
//
rejectedBar.Clean();
rejectedDir = X_DIRECTION_NONE;
//
if (!IsSpecifiedValid(forPeriod))
{
forPeriod = GetPeriod();
}
//
if (!IsSpecifiedValid(from))
{
from = From();
}
//
result = IsValid() &&
HasDirection(forDir) &&
IsSpecifiedValid(forPeriod);
if (!result)
{
return result;
}
//
bool isBullish = IsBullish(forDir);
bool isBearish = IsBearish(forDir);
//
int fromIndex = iBarShift(
GetSymbol(),
forPeriod,
from //
);
fromIndex--;
//
for (int i = fromIndex; i >= 0; i--)
{
//
XOHCL iBar;
bool isInited = iBar.Init(
GetSymbol(),
forPeriod,
i //
);
result = isInited;
if (!result)
{
continue;
}
//
bool isRejectedFromUpper =
//
isBullish &&
//
(
//
(iBar.low <= Upper() &&
iBar.high > Upper() &&
iBar.GetUp() > Upper())
//
)
//
;
//
bool isRejectedFromLower =
//
isBearish &&
//
(
//
(iBar.high >= Lower() &&
iBar.low < Lower() &&
iBar.GetDown() < Lower())
//
)
//
;
//
bool isSweepedFromUpper =
//
isBullish &&
//
(
//
(iBar.low <= Lower() &&
iBar.high > Upper() &&
iBar.GetUp() > Upper())
//
)
//
;
//
bool isSweepedFromLower =
//
isBearish &&
//
(
//
(iBar.high >= Upper() &&
iBar.low < Lower() &&
iBar.GetDown() < Lower())
//
)
//
;
//
bool isRejected = isRejectedFromUpper ||
isRejectedFromLower;
//
bool isSweeped = isSweepedFromUpper ||
isSweepedFromLower;
//
bool fromUpper = isRejectedFromUpper ||
isSweepedFromUpper;
//
bool fromLower = isRejectedFromLower ||
isSweepedFromLower;
//
// Prepare Result ...
bool isPassed =
isSweeped ||
isRejected;
if (forceSweep)
{
isPassed = isSweeped;
}
//
if (isPassed)
{
//
result = isPassed;
rejectedBar = iBar;
rejectedDir =
fromUpper
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
break;
}
}
//
result = rejectedBar.IsValid() &&
HasDirection(rejectedDir);
// //
return result; return result;
} }
+175 -4
View File
@@ -41,7 +41,7 @@ struct XOBTest
XCFVG *fvgs[]; XCFVG *fvgs[];
// //
datetime fvgBreakedAt; datetime fvgActedAt;
datetime rewardedAt; datetime rewardedAt;
// //
@@ -65,7 +65,7 @@ struct XOBTest
symbol = NULL; symbol = NULL;
period = NULL; period = NULL;
rewardedAt = NULL; rewardedAt = NULL;
fvgBreakedAt = NULL; fvgActedAt = NULL;
// //
reward = 0; reward = 0;
@@ -1655,7 +1655,8 @@ bool ReTestMarket(
} }
// //
// Now we Have to Validate Breaked Order Blocks Count in additions to Youngest OB directions ... // Now we Have to Validate Breaked Order Blocks Count in additions to
// Youngest OB directions ...
// //
bool hasBullishOrderFlow = bool hasBullishOrderFlow =
@@ -1728,6 +1729,7 @@ bool ReTestMarket(
// //
XCFVG *iOBFVGs[]; XCFVG *iOBFVGs[];
datetime fvgActedAt = NULL;
for (int j = 0; j < fvgsCount; j++) for (int j = 0; j < fvgsCount; j++)
{ {
// //
@@ -1751,8 +1753,89 @@ bool ReTestMarket(
continue; continue;
} }
//
// Validate FVG Based on Conditions ...
// for Bullish Order Blocks FVGs must Rejected as Liquidity ...
// in ttf ...
//
XOHCL rejectedBar;
ENUM_X_DIRECTION rejectedDir;
bool isRejected = jFVG.IsRejected(
X_DIRECTION_BULLISH,
rejectedBar,
rejectedDir,
NULL, // From ...
true, // Force Sweeped ...
ttfState.period // For Period ...
);
//
XOHCL breakedBar;
ENUM_X_DIRECTION breakedDir;
bool isBreaked = jFVG.IsBreaked(
X_DIRECTION_BULLISH,
breakedBar,
breakedDir //
);
//
bool isFVGActed =
isRejected ||
isBreaked;
if (!isFVGActed)
{
continue;
}
//
datetime iFvgActedAt =
isBreaked &&
!isRejected
? breakedBar.time
: !isBreaked &&
isRejected
? rejectedBar.time
: isBreaked &&
isRejected
? (breakedBar.time < rejectedBar.time)
? breakedBar.time
: rejectedBar.time
: NULL;
if (!IsValid(iFvgActedAt))
{
continue;
}
//
if (!IsValid(fvgActedAt)) {
fvgActedAt = iFvgActedAt;
}
//
XCFVG *lastFVG = NULL;
int fvgsCount = ArraySize(iOBFVGs);
bool hasLastFVG = IsValidSize(fvgsCount);
if (hasLastFVG)
{
lastFVG = iOBFVGs[fvgsCount - 1];
}
bool isLastPassed =
!hasLastFVG
? true
: IsAbove(
jFVG,
lastFVG,
true // Ignore Inside ...
);
if (!isLastPassed)
{
continue;
}
// //
jFVG.To(iOB.To()); jFVG.To(iOB.To());
jFVG.To(iFvgActedAt);
// //
Add( Add(
@@ -1775,6 +1858,9 @@ bool ReTestMarket(
iTest.symbol = iOB.GetSymbol(); iTest.symbol = iOB.GetSymbol();
iTest.period = iOB.GetPeriod(); iTest.period = iOB.GetPeriod();
//
iTest.fvgActedAt = fvgActedAt;
// //
Copy( Copy(
iOBFVGs, iOBFVGs,
@@ -1823,6 +1909,7 @@ bool ReTestMarket(
// //
XCFVG *iOBFVGs[]; XCFVG *iOBFVGs[];
datetime fvgActedAt = NULL;
for (int j = 0; j < fvgsCount; j++) for (int j = 0; j < fvgsCount; j++)
{ {
// //
@@ -1846,8 +1933,89 @@ bool ReTestMarket(
continue; continue;
} }
//
// Validate FVG Based on Conditions ...
// for Bearish Order Blocks FVGs must Rejected as Liquidity ...
// in ttf ...
//
XOHCL rejectedBar;
ENUM_X_DIRECTION rejectedDir;
bool isRejected = jFVG.IsRejected(
X_DIRECTION_BEARISH,
rejectedBar,
rejectedDir,
NULL, // From ...
true, // Force Sweeped ...
ttfState.period // For Period ...
);
//
XOHCL breakedBar;
ENUM_X_DIRECTION breakedDir;
bool isBreaked = jFVG.IsBreaked(
X_DIRECTION_BEARISH,
breakedBar,
breakedDir //
);
//
bool isFVGActed =
isRejected ||
isBreaked;
if (!isFVGActed)
{
continue;
}
//
datetime iFvgActedAt =
isBreaked &&
!isRejected
? breakedBar.time
: !isBreaked &&
isRejected
? rejectedBar.time
: isBreaked &&
isRejected
? (breakedBar.time < rejectedBar.time)
? breakedBar.time
: rejectedBar.time
: NULL;
if (!IsValid(iFvgActedAt))
{
continue;
}
//
if (!IsValid(fvgActedAt)) {
fvgActedAt = iFvgActedAt;
}
//
XCFVG *lastFVG = NULL;
int fvgsCount = ArraySize(iOBFVGs);
bool hasLastFVG = IsValidSize(fvgsCount);
if (hasLastFVG)
{
lastFVG = iOBFVGs[fvgsCount - 1];
}
bool isLastPassed =
!hasLastFVG
? true
: IsBelow(
jFVG,
lastFVG,
true // Ignore Inside ...
);
if (!isLastPassed)
{
continue;
}
// //
jFVG.To(iOB.To()); jFVG.To(iOB.To());
jFVG.To(iFvgActedAt);
// //
Add( Add(
@@ -1870,6 +2038,9 @@ bool ReTestMarket(
iTest.symbol = iOB.GetSymbol(); iTest.symbol = iOB.GetSymbol();
iTest.period = iOB.GetPeriod(); iTest.period = iOB.GetPeriod();
//
iTest.fvgActedAt = fvgActedAt;
// //
Copy( Copy(
iOBFVGs, iOBFVGs,
@@ -2054,7 +2225,7 @@ bool ReTestMarket(
{ {
// //
XCFVG *jFVG = iTest.fvgs[j]; XCFVG *jFVG = iTest.fvgs[j];
jFVG.To(iTest.ob.To()); // jFVG.To(iTest.ob.To());
// //
XCBaseObject *fvgObj; XCBaseObject *fvgObj;