complete XCA Indicator, implements it's Helper and Add all Conditions, and also rename XSTRCCI tProject o XCAEA and only use XCA and XOSC inside it ...

This commit is contained in:
2025-04-15 04:31:43 +03:30
parent ab6ddf0b43
commit d912210e68
11 changed files with 6725 additions and 1445 deletions
+365
View File
@@ -1801,6 +1801,371 @@ bool IsFVGBoxValid(
}
/////////////////////////////////////////////////////////
//
bool DetectXCAEAConditions(
XCAEAConditions &conditions,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
XCXCAEAHelper *helper,
int barIndex = 0,
int loopback = 10 //
)
{
//
bool result = false;
//
box.Clean();
conditions.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
loopback = NormalizeInt(loopback, 5);
//
string symbol = helper.GetSymbol();
ENUM_TIMEFRAMES period = helper.GetPeriod();
//
result = helper.GetConditions(
conditions,
barIndex,
loopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int ppIDX = pIDX + 1;
int p3IDX = ppIDX + 1;
int p4IDX = p3IDX + 1;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL ppBar;
XOHCL p3Bar;
XOHCL p4Bar;
result = zBar.Init(
symbol,
period,
zIDX //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(ppBar);
result =
result &&
ppBar.GetPreviousBar(p3Bar);
result =
result &&
p3Bar.GetPreviousBar(p4Bar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
box.Clean();
conditions.Clean();
//
return result;
}
//
// Bars Conditions ...
//
ENUM_X_DIRECTION cBarDir;
//
// Hammer ...
bool isCBarHammer = helper
.barAnalyser
.IsHammer(
cBar,
cBarDir //
);
bool isCBarBullishHammer =
isCBarHammer &&
IsBullish(cBarDir);
bool isCBarBearishHammer =
isCBarHammer &&
IsBearish(cBarDir);
//
// Rejected ...
bool isCBarRejected = helper
.barAnalyser
.IsRejected(
cBar,
cBarDir,
false, // Force Type ...
true // Force Fibo Pressure ...
);
bool isCBarBullishRejected =
isCBarRejected &&
IsBullish(cBarDir);
bool isCBarBearishRejected =
isCBarRejected &&
IsBearish(cBarDir);
//
// Engulfed ...
bool isCBarEngulfed = helper
.barAnalyser
.IsEngulfed(
cBar,
cBarDir //
);
bool isCBarBullishEngulfed =
isCBarEngulfed &&
IsBullish(cBarDir);
bool isCBarBearishEngulfed =
isCBarEngulfed &&
IsBearish(cBarDir);
//
// Momentum ...
bool isCBarMomentum = helper
.barAnalyser
.IsMomentum(
cBar,
cBarDir,
1 //
);
bool isCBarBullishMomentum =
isCBarMomentum &&
IsBullish(cBarDir);
bool isCBarBearishMomentum =
isCBarMomentum &&
IsBearish(cBarDir);
//
// Bar Sumarise ...
//
bool isCBarValidForBullish =
(isCBarBullishHammer ||
isCBarBullishRejected ||
isCBarBullishMomentum ||
isCBarBullishEngulfed);
//
bool isCBarValidForBearish =
(isCBarBearishHammer ||
isCBarBearishRejected ||
isCBarBearishMomentum ||
isCBarBearishEngulfed);
//
// Conditions ...
//
bool isLowsUnderValesGolden =
//
pBar.low < conditions.valesGoldenBuffer[pIDX] &&
ppBar.low < conditions.valesGoldenBuffer[ppIDX] &&
p3Bar.low < conditions.valesGoldenBuffer[p3IDX] &&
p4Bar.low < conditions.valesGoldenBuffer[p4IDX]
//
;
//
bool isHighsOverPeaksGolden =
//
pBar.high > conditions.peaksGoldenBuffer[pIDX] &&
ppBar.high > conditions.peaksGoldenBuffer[ppIDX] &&
p3Bar.high > conditions.peaksGoldenBuffer[p3IDX] &&
p4Bar.high > conditions.peaksGoldenBuffer[p4IDX]
//
;
//
bool isSwingLowSameAsVale =
conditions.swingLowsBuffer[p4IDX] == conditions.valesBuffer[p4IDX];
//
bool isSwingHighSameAsPeak =
conditions.swingHighsBuffer[p4IDX] == conditions.peaksBuffer[p4IDX];
//
bool isStrSame = conditions.strBuffer[cIDX] == conditions.strBuffer[pIDX] &&
conditions.strBuffer[pIDX] == conditions.strBuffer[ppIDX];
//
bool isSameStrBreakedUp =
isStrSame &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX];
//
bool isSameStrBreakedDown =
isStrSame &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX];
//
bool isStrBullishVPattern =
//
conditions.strStateBuffer[zIDX] > 0 &&
conditions.strStateBuffer[cIDX] > 0 &&
conditions.strStateBuffer[pIDX] > 0 &&
conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX]
//
;
//
bool isStrBearishVPattern =
//
conditions.strStateBuffer[zIDX] < 0 &&
conditions.strStateBuffer[cIDX] < 0 &&
conditions.strStateBuffer[pIDX] < 0 &&
conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX]
//
;
//
bool isCBarLowInTKZone =
//
cBar.low < conditions.tenkanSenBuffer[cIDX] &&
cBar.low > conditions.kijunSenBuffer[cIDX]
//
;
//
bool isCBarHighInTKZone =
//
cBar.high > conditions.tenkanSenBuffer[cIDX] &&
cBar.high < conditions.kijunSenBuffer[cIDX]
//
;
//
// Summarise Conditions ...
//
bool isBullish =
//
isCBarLowInTKZone &&
isCBarBullishRejected &&
isCBarValidForBullish &&
conditions.isX3MaSlowBullish &&
conditions.isTenkanSenOverKijunSen &&
conditions.kijunSenBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX]
//
;
//
bool isBearish =
//
isCBarHighInTKZone &&
isCBarBearishRejected &&
isCBarValidForBearish &&
conditions.isX3MaSlowBearish &&
conditions.isTenkanSenUnderKijunSen &&
conditions.kijunSenBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX]
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
double entry = GetEntry(
conditions.symbol,
dir //
);
double sl = conditions.kijunSenBuffer[cIDX];
//
box.dir = dir;
box.symbol = conditions.symbol;
box.period = conditions.period;
//
box.upper =
isBullish
? entry
: sl;
//
box.lower =
isBullish
? sl
: entry;
//
box.to = zBar.time;
box.from = p4Bar.time;
//
box.type = ToString(dir) + "_Signal_" + conditions.symbol + "_" + ToString(conditions.period);
}
//
result = box.IsValid() &&
HasDirection(dir);
//
// Cleanup Resources ...
//
if (!result)
{
//
box.Clean();
conditions.Clean();
}
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
return result;
}
/////////////////////////////////////////////////////////