This commit is contained in:
2026-02-12 18:01:52 +03:30
parent da2ca0e1ad
commit 7a26df1194
4 changed files with 209 additions and 2 deletions
@@ -227,6 +227,17 @@ class XCMarketPatternDetector : public XCBase
return result;
}
/**
* Check a Bar has Same Sequence Directionalo Bar or Not ...
*
* @param bar: XOHCL, Specified Bar ...
* @param dir: ENUM_X_DIRECTION, Detected Bars Direction ...
* @param count: int, Number of Same Bars ...
* @param validation: int, Validation of Same Bars ...
* @param loopback: int, Loopback for Detection ...
*
* @return ( bool )
*/
bool HasSameBars(
XOHCL &bar,
ENUM_X_DIRECTION &dir,
@@ -252,12 +263,34 @@ class XCMarketPatternDetector : public XCBase
return result;
}
//
XOHCL tmpBar;
bar.GetPreviousBar(tmpBar);
while (tmpBar.GetDirection() == bar.GetDirection())
{
//
count++;
tmpBar.GetPreviousBar(tmpBar);
}
//
// Validate Count ...
result = count >= validation;
if (result)
{
dir = bar.GetDirection();
}
//
result =
result &&
count > 0 &&
HasDirection(dir) &&
count >= validation;
//
tmpBar.Clean();
//
return result;
}
@@ -533,12 +533,13 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
//
// Signaller Flags ...
bool useSignaller1 = true;
bool useSignaller1 = false;
bool useSignaller2 = false;
bool useSignaller3 = false;
bool useSignaller4 = false;
bool useSignaller5 = false;
bool useSignaller6 = false;
bool useSignaller7 = true;
//
XBoxZone tmpZone;
@@ -552,6 +553,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
bool signaller4HasSignal = false;
bool signaller5HasSignal = false;
bool signaller6HasSignal = false;
bool signaller7HasSignal = false;
//
// Validator Flags ...
@@ -772,6 +774,39 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
tmpDir = X_DIRECTION_NONE;
}
//
// Signaller 7 ...
// Supply and Demand ...
if (useSignaller7)
{
//
signaller7HasSignal = Strategy7HasSignal(
bar,
tmpZone,
targets,
tmpDir //
);
//
if (signaller7HasSignal)
{
//
provider += ToXString(X121_XKI_STRATEGY_7);
//
if (!zone.IsValid())
{
//
dir = tmpDir;
zone = tmpZone;
}
}
//
tmpZone.Clean();
tmpDir = X_DIRECTION_NONE;
}
//
// Summarize Signallers Result ...
result = signaller1HasSignal ||
@@ -779,7 +814,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
signaller3HasSignal ||
signaller4HasSignal ||
signaller5HasSignal ||
signaller6HasSignal;
signaller6HasSignal ||
signaller7HasSignal;
//
// Signal Validating ...
@@ -1688,6 +1724,92 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
//
return result;
}
/**
* Check Bar Has Signal Based on Strategy 7 ...
* ُSupply and Demand ...
*
* @return ( bool )
*/
bool Strategy7HasSignal(
XOHCL &bar,
XBoxZone &zone,
XTarget &targets[],
ENUM_X_DIRECTION &dir //
)
{
//
bool result = false;
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index() + 1;
//
// Retrieve Base Conditions ...
bool isBullish = false;
bool isBearish = false;
//
XBoxZone demandZones[];
int demandZonesCount = poiDetector.DetectDemands(
demandZones,
barIndex,
bar.symbol,
bar.period,
100,
4,
2,
100 //
);
//
// Validate Conditions ...
result = isBullish || isBearish;
if (!result)
{
return result;
}
//
// Do Validation and Filtering Market Structure if required ...
//
// Check and Prepare Direction ...
dir =
isBullish
? X_DIRECTION_BULLISH
: isBearish ? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
result = HasDirection(dir);
if (!result)
{
return result;
}
//
// Prepare Zone ...
//
result =
result &&
zone.IsValid() &&
HasDirection(dir);
//
return result;
}
// #endregion
// #region TF Patterns ...
@@ -85,6 +85,7 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
ENUM_TIMEFRAMES forPeriod = NULL,
int loopback = 50,
int minAllowedSameDirectionalBars = 4,
double minFVGAllowedPoints = 30,
int confluence = 1,
int confluenceLoopback = 50 //
)
@@ -134,6 +135,11 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
confluenceLoopback = 0;
}
//
if (minFVGAllowedPoints < 0) {
minFVGAllowedPoints = 0;
}
//
if (minAllowedSameDirectionalBars < 0)
{
@@ -148,11 +154,14 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
double upper = 0;
double lower = 0;
XBoxZone tmpZone;
int tmpCount = 0;
XBoxZone tmpFVGs[];
string type = NULL;
double tmpValue = 0;
datetime from = NULL;
int start = barIndex;
int end = barIndex + loopback;
ENUM_X_DIRECTION tmpDir = X_DIRECTION_NONE;
datetime to = GetBarTime(forSymbol, forPeriod, barIndex);
for (int i = start; i < end; i++)
{
@@ -163,6 +172,40 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
{
//
// Next Step is Detect Sequence Same Directional Bars ...
has = HasSameBars(tmpBar, tmpDir, tmpCount, minAllowedSameDirectionalBars);
if (has)
{
//
// Zone Bar ...
XOHCL zoneBar;
has = zoneBar.Init(tmpBar.symbol, tmpBar.period, i + tmpCount + 1);
//
// Validate Zone Bar Direction ...
has = has &&
zoneBar.GetDirection() != tmpBar.GetDirection();
if (has)
{
//
// Validate FVG Exists ...
CollectFVGs(tmpBar, tmpFVGs, 5, 0, zoneBar.Index() - tmpBar.Index());
FilterZones(tmpBar, tmpFVGs, tmpBar.GetDirection(), X_PRICE_CLOSE, tmpBar.GetDirection());
has = ArraySize(tmpFVGs) > 0;
if (has && minFVGAllowedPoints > 0) {
//
// Validate FVG Gap
}
//
if (has)
{
DebugBreak();
}
}
//
zoneBar.Clean();
}
//
tmpBar.Clean();
@@ -37,6 +37,7 @@ enum X121XKIStrategies
X121_XKI_STRATEGY_4 = 4,
X121_XKI_STRATEGY_5 = 5,
X121_XKI_STRATEGY_6 = 6,
X121_XKI_STRATEGY_7 = 7,
};
bool IsXValid(X121XKIStrategies value)
{
@@ -77,6 +78,10 @@ string ToXString(X121XKIStrategies value)
case X121_XKI_STRATEGY_6:
result = "6";
break;
//
case X121_XKI_STRATEGY_7:
result = "7";
break;
}
}
@@ -116,6 +121,10 @@ X121XKIStrategies ToX121XKIStrategy(string value)
{
result = X121_XKI_STRATEGY_6;
}
else if (value == ToXString(X121_XKI_STRATEGY_7))
{
result = X121_XKI_STRATEGY_7;
}
}
//