This commit is contained in:
2025-04-06 18:45:02 +03:30
parent ffcf43067e
commit 19a7cd7629
18 changed files with 1984 additions and 567 deletions
+942
View File
@@ -0,0 +1,942 @@
//
// Checking Conditions ...
//
// Retrieve Some Values ...
//
double peak = cXConditions.peaksBuffer[cIDX];
double peakZ = cXConditions.peaksBuffer[zIDX];
double peakP = cXConditions.peaksBuffer[pIDX];
double peakPP = cXConditions.peaksBuffer[ppIDX];
//
double vale = cXConditions.valesBuffer[cIDX];
double valeZ = cXConditions.valesBuffer[zIDX];
double valeP = cXConditions.valesBuffer[pIDX];
double valePP = cXConditions.valesBuffer[ppIDX];
//
double cSMHKOpen = cXConditions.xhkSMOpenBuffer[cIDX];
double cSMHKHigh = cXConditions.xhkSMHighBuffer[cIDX];
double cSMHKClose = cXConditions.xhkSMCloseBuffer[cIDX];
double cSMHKLow = cXConditions.xhkSMLowBuffer[cIDX];
double cSMHKMin = MathMin(cSMHKOpen, cSMHKClose);
double cSMHKMax = MathMax(cSMHKOpen, cSMHKClose);
//
double pSMHKOpen = cXConditions.xhkSMOpenBuffer[pIDX];
double pSMHKHigh = cXConditions.xhkSMHighBuffer[pIDX];
double pSMHKClose = cXConditions.xhkSMCloseBuffer[pIDX];
double pSMHKLow = cXConditions.xhkSMLowBuffer[pIDX];
double pSMHKMin = MathMin(pSMHKOpen, pSMHKClose);
double pSMHKMax = MathMax(pSMHKOpen, pSMHKClose);
//
double atrUpperSM = cXConditions.atrUpperSMBuffer[cIDX];
double atrLowerSM = cXConditions.atrLowerSMBuffer[cIDX];
//
double atrUpperSMZ = cXConditions.atrUpperSMBuffer[zIDX];
double atrLowerSMZ = cXConditions.atrLowerSMBuffer[zIDX];
//
double atrUpperSMP = cXConditions.atrUpperSMBuffer[pIDX];
double atrLowerSMP = cXConditions.atrLowerSMBuffer[pIDX];
//
double atrUpperSMPP = cXConditions.atrUpperSMBuffer[ppIDX];
double atrLowerSMPP = cXConditions.atrLowerSMBuffer[ppIDX];
//
double rsiChange = cXConditions.rsiChangeBuffer[cIDX];
double rsiChangeZ = cXConditions.rsiChangeBuffer[zIDX];
double rsiChangeP = cXConditions.rsiChangeBuffer[pIDX];
double rsiChangePP = cXConditions.rsiChangeBuffer[ppIDX];
//
double rsiChangeSM = cXConditions.rsiChangeSMBuffer[cIDX];
double rsiChangeSMZ = cXConditions.rsiChangeSMBuffer[zIDX];
double rsiChangeSMP = cXConditions.rsiChangeSMBuffer[pIDX];
double rsiChangeSMPP = cXConditions.rsiChangeSMBuffer[ppIDX];
//
double peaksGolden = cXConditions.peaksGoldenBuffer[cIDX];
double peaksGoldenZ = cXConditions.peaksGoldenBuffer[zIDX];
double peaksGoldenP = cXConditions.peaksGoldenBuffer[pIDX];
double peaksGoldenPP = cXConditions.peaksGoldenBuffer[ppIDX];
//
double valesGolden = cXConditions.valesGoldenBuffer[cIDX];
double valesGoldenZ = cXConditions.valesGoldenBuffer[zIDX];
double valesGoldenP = cXConditions.valesGoldenBuffer[pIDX];
double valesGoldenPP = cXConditions.valesGoldenBuffer[ppIDX];
//
double priceChange = cXConditions.priceChangeBuffer[cIDX];
double priceChangeZ = cXConditions.priceChangeBuffer[zIDX];
double priceChangeP = cXConditions.priceChangeBuffer[pIDX];
double priceChangePP = cXConditions.priceChangeBuffer[ppIDX];
//
double priceChangeSM = cXConditions.priceChangeSMBuffer[cIDX];
double priceChangeSMZ = cXConditions.priceChangeSMBuffer[zIDX];
double priceChangeSMP = cXConditions.priceChangeSMBuffer[pIDX];
double priceChangeSMPP = cXConditions.priceChangeSMBuffer[ppIDX];
//
//
//
//
// XHK ...
//
bool isPBarClosedOverSMHK =
//
pBar.IsBullish() &&
pBar.GetUp() > pSMHKMax &&
pBar.GetDown() < pSMHKMin
//
;
//
bool isPBarClosedUnderSMHK =
//
pBar.IsBearish() &&
pBar.GetUp() > pSMHKMax &&
pBar.GetDown() < pSMHKMin
//
;
//
bool isPBarBullishPriceChangeVPattern =
priceChangeP > priceChangePP &&
priceChangeP > priceChange;
//
bool isPBarBerishPriceChangeVPattern =
priceChangeP < priceChangePP &&
priceChangeP < priceChange;
//
bool isPBarPriceChangeOverPeak =
priceChangeP > peak &&
priceChangeP > peakP &&
priceChangeP > peakPP;
//
bool isPBarPriceChangeUnderVale =
priceChangeP < vale &&
priceChangeP < valeP &&
priceChangeP < valePP;
//
bool isPBarCloseOverPeaksGoldenZone =
pBar.close > peaksGoldenP;
//
bool isPBarCloseUnderValesGoldenZone =
pBar.close < valesGoldenP;
//
bool isPBarPriceChangeOverAtrUpper =
priceChangeP > atrUpperSMP;
//
bool isPBarPriceChangeUnderAtrLower =
priceChangeP < atrLowerSMP;
//
isBullish =
//
// false
//
hasSelectedBox &&
selectedBox.IsBullish() &&
cXConditions.isStrBullish
//
// cBar.IsBullish() &&
// isPBarPriceChangeUnderVale &&
// isPBarPriceChangeUnderAtrLower &&
// isPBarBerishPriceChangeVPattern &&
// isPBarCloseUnderValesGoldenZone
//
;
//
isBearish =
//
// false
//
hasSelectedBox &&
selectedBox.IsBearish() &&
cXConditions.isStrBearish
//
// cBar.IsBearish() &&
// isPBarPriceChangeOverPeak &&
// isPBarPriceChangeOverAtrUpper &&
// isPBarCloseOverPeaksGoldenZone &&
// isPBarBullishPriceChangeVPattern
//
;
/////////////////////////////////////////////////////////
//
double xhkSL;
ENUM_X_DIRECTION xhkDir;
bool isXHKPassed = IsHKConditionsPassed(
xhkSL,
xhkDir,
cHelper,
cXConditions,
barIndex //
);
bool isXHKBullish =
isXHKPassed &&
IsBullish(xhkDir);
bool isXHKBearish =
isXHKPassed &&
IsBearish(xhkDir);
/////////////////////////////////////////////////////////
//
bool IsRejectedBox(
XOHCL &bar, // CBar ...
XBoxZone &box,
X121Conditions &conditions //
)
{
//
bool result = false;
//
result =
bar.IsValid() &&
box.IsValid();
if (!result)
{
return result;
}
//
bool isBullish = box.IsBullish();
//
bool isBullishRejected =
isBullish &&
bar.IsRejected(
box.upper,
box.dir,
true, // Force Type ...
true // Force Pressure ...
);
//
bool isBearishRejected =
!isBullish &&
bar.IsRejected(
box.lower,
box.dir,
true, // Force Type ...
true // Force Pressure ...
);
//
result = isBullishRejected ||
isBearishRejected;
//
return result;
}
//
bool IsPeaksOrValesPassedBox(
XBoxZone &box,
X121Conditions &conditions //
)
{
//
bool result = false;
//
result = box.IsValid();
if (!result)
{
return result;
}
//
double peakZ = conditions.peaksBuffer[0];
double peakC = conditions.peaksBuffer[1];
double peakP = conditions.peaksBuffer[2];
double peakPP = conditions.peaksBuffer[3];
//
double valeZ = conditions.valesBuffer[0];
double valeC = conditions.valesBuffer[1];
double valeP = conditions.valesBuffer[2];
double valePP = conditions.valesBuffer[3];
//
double boxQ = ((box.upper - box.lower) / 100) * 25;
double upperQuarter = box.upper - boxQ;
double lowerQuarter = box.lower + boxQ;
//
bool isPPeakInsideUpperQ =
peakP < box.upper &&
peakP > upperQuarter;
//
bool isPValeInsideLowerQ =
valeP > box.lower &&
valeP < lowerQuarter;
//
bool isPPPeakInsideUpperQ =
peakPP < box.upper &&
peakPP > upperQuarter;
//
bool isPPValeInsideLowerQ =
valePP > box.lower &&
valePP < lowerQuarter;
//
result =
//
(box.IsBullish() &&
(isPValeInsideLowerQ ||
isPPValeInsideLowerQ) &&
(valeC == valeP ||
valeP == valePP))
//
||
//
(box.IsBearish() &&
(isPPeakInsideUpperQ ||
isPPPeakInsideUpperQ) &&
(peakC == peakP ||
peakP == peakPP))
//
;
//
return result;
}
//
bool IsX3MaPassedBox(
XOHCL &bar, // CBar ...
XBoxZone &box,
X121Conditions &conditions //
)
{
//
bool result = false;
//
result =
bar.IsValid() &&
box.IsValid();
if (!result)
{
return result;
}
//
double x3maFast = conditions.x3maFastBuffer[1];
double x3maMid = conditions.x3maMidBuffer[1];
double x3maSlow = conditions.x3maSlowBuffer[1];
//
bool isx3MaInsideBox =
//
// Fast ...
x3maFast < box.upper &&
x3maFast > box.lower
//
&&
//
// Mid ...
x3maMid < box.upper &&
x3maMid > box.lower
//
&&
//
// Slow ...
x3maSlow < box.upper &&
x3maSlow > box.lower
//
;
//
bool isX3maSwitchedToBullishOrdered =
bar.IsBullish() &&
box.IsBullish() &&
isx3MaInsideBox &&
bar.close > conditions.x3maFastBuffer[1] &&
conditions.isX3MaSwitchedToBullishOrdered;
//
bool isX3maSwitchedToBearishOrdered =
bar.IsBearish() &&
box.IsBearish() &&
isx3MaInsideBox &&
bar.close < conditions.x3maFastBuffer[1] &&
conditions.isX3MaSwitchedToBearishOrdered;
//
result = isX3maSwitchedToBullishOrdered ||
isX3maSwitchedToBearishOrdered;
//
return result;
}
//
// TODO: Complete this ...
bool IsActivatedBoxPassed(
XBoxZone &box,
X121Conditions &conditions //
)
{
//
bool result = false;
//
result = box.IsValid();
if (!result)
{
return result;
}
//
return result;
}
//
//
//
//
bool IsHKConditionsPassed(
double &sl,
ENUM_X_DIRECTION &dir,
XC121SMCCycleHelper *helper,
X121Conditions &conditions,
int barIndex = 0 //
)
{
//
bool result = false;
//
sl = 0;
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int zIDX = 0;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int ppIDX = pIDX + 1;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL ppBar;
//
// Retrieve Bars ...
result = zBar.Init(
conditions.symbol,
conditions.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(ppBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
return result;
}
//
// Check PBar Swing ...
ENUM_X_DIRECTION pBarSwingDir;
bool isPBarSwing = helper
.mBarAnalyser
.IsSwing(
pBar,
pBarSwingDir,
3 //
);
//
bool isPBarSwingLow =
isPBarSwing &&
IsBullish(pBarSwingDir);
//
bool isPBarSwingHigh =
isPBarSwing &&
IsBearish(pBarSwingDir);
//
// Check PBar Rejection ...
ENUM_X_DIRECTION pBarRejectionDir;
bool isPBarRejected = helper
.mBarAnalyser
.IsRejected(
pBar,
pBarRejectionDir,
false,
true //
);
//
bool isPBarBullishRejected =
isPBarRejected &&
IsBullish(pBarRejectionDir);
//
bool isPBarBearishRejected =
isPBarRejected &&
IsBearish(pBarRejectionDir);
//
// Checking Str Incresing/Decreasing ...
//
bool isStrIncresing =
//
(conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] &&
conditions.strBuffer[zIDX] > conditions.strBuffer[pIDX] &&
conditions.strBuffer[zIDX] > conditions.strBuffer[ppIDX])
//
&&
//
(
//
(conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX] &&
conditions.strBuffer[cIDX] > conditions.strBuffer[pIDX])
//
||
//
(conditions.strBuffer[cIDX] > conditions.strBuffer[pIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX])
//
)
//
;
//
bool isStrDecreasing =
//
(conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] &&
conditions.strBuffer[zIDX] < conditions.strBuffer[pIDX] &&
conditions.strBuffer[zIDX] < conditions.strBuffer[ppIDX])
//
&&
//
(
//
(conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX] &&
conditions.strBuffer[cIDX] < conditions.strBuffer[pIDX])
//
||
//
(conditions.strBuffer[cIDX] < conditions.strBuffer[pIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX])
//
)
//
;
//
bool isBullish =
//
isPBarSwingLow &&
isStrIncresing &&
cBar.IsBullish() &&
cBar.low > pBar.low &&
cBar.open > pBar.low &&
zBar.open > cBar.low &&
// isPBarBullishRejected &&
conditions.isSarBullish &&
conditions.isStrBullish &&
conditions.isSMHKBullish
//
;
//
bool isBearish =
//
isPBarSwingHigh &&
isStrDecreasing &&
cBar.IsBearish() &&
cBar.high < pBar.high &&
cBar.open < pBar.high &&
zBar.open < cBar.high &&
// isPBarBearishRejected &&
conditions.isSarBearish &&
conditions.isStrBearish &&
conditions.isSMHKBearish
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir = isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
// Selecting SL ...
sl =
isBullish
? cBar.low
: cBar.high;
}
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
return result;
}
//
bool IsSARConditionsPassed(
double &sl,
ENUM_X_DIRECTION &dir,
XC121SMCCycleHelper *helper,
X121Conditions &conditions,
int barIndex = 0 //
)
{
//
bool result = false;
//
sl = 0;
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int zIDX = 0;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int ppIDX = pIDX + 1;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL ppBar;
//
// Retrieve Bars ...
result = zBar.Init(
conditions.symbol,
conditions.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(ppBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
return result;
}
//
// Check PBar Swing ...
ENUM_X_DIRECTION pBarSwingDir;
bool isPBarSwing = helper
.mBarAnalyser
.IsSwing(
pBar,
pBarSwingDir,
3 //
);
//
bool isPBarSwingLow =
isPBarSwing &&
IsBullish(pBarSwingDir);
//
bool isPBarSwingHigh =
isPBarSwing &&
IsBearish(pBarSwingDir);
//
bool isBullish =
//
isPBarSwingLow &&
cBar.IsBullish() &&
cBar.low > pBar.low &&
cBar.open > pBar.low &&
zBar.open > cBar.low &&
conditions.isSarSwitchedToBullish
//
;
//
bool isBearish =
//
isPBarSwingHigh &&
isStrDecreasing &&
cBar.IsBearish() &&
cBar.high < pBar.high &&
cBar.open < pBar.high &&
zBar.open < cBar.high &&
conditions.isSarSwitchedToBearish
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir = isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
// Selecting SL ...
sl =
isBullish
? cBar.low
: cBar.high;
}
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
//
return result;
}
/////////////////////////////////////////////////////////
// //
// bool isPVPassed = IsPeaksOrValesPassedBox(
// iBox,
// cXConditions //
// );
// if (isPVPassed)
// {
// //
// selectedBox = iBox;
// iBox.Clean();
// break;
// }
//
// bool isx3MaPassed = IsX3MaPassedBox(
// cBar,
// iBox,
// cXConditions //
// );
// if (isx3MaPassed)
// {
// //
// selectedBox = iBox;
// iBox.Clean();
// break;
// }
//
// bool isRejected = IsRejectedBox(
// cBar,
// iBox,
// cXConditions //
// );
// if (isRejected)
// {
// //
// selectedBox = iBox;
// iBox.Clean();
// break;
// }
/////////////////////////////////////////////////////////
//
// Checking Bullish Fair Value Gaps ...
has = cState.HasBullishFairValueGaps();
if (has)
{
//
XBoxZone tmpBoxes[];
ToBox(
cState.bullishFairValueGaps,
tmpBoxes //
);
//
count = ArraySize(tmpBoxes);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox = tmpBoxes[i];
bool isValid = IsBoxValid(
iBox,
0,
iBox.period //
);
if (!isValid)
{
//
iBox.Clean();
continue;
}
//
has = IsBoxExists(iBox);
if (!has)
{
//
AddRef(
iBox,
mWaitingBoxes //
);
}
//
iBox.Clean();
}
}
//
Clean(tmpBoxes);
}
//
// Checking Bearish Fair Value Gaps ...
has = cState.HasBearishFairValueGaps();
if (has)
{
//
XBoxZone tmpBoxes[];
ToBox(
cState.bearishFairValueGaps,
tmpBoxes //
);
//
count = ArraySize(tmpBoxes);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox = tmpBoxes[i];
bool isValid = IsBoxValid(
iBox,
0,
iBox.period //
);
if (!isValid)
{
//
iBox.Clean();
continue;
;
}
//
has = IsBoxExists(iBox);
if (!has)
{
//
AddRef(
iBox,
mWaitingBoxes //
);
}
//
iBox.Clean();
}
}
//
Clean(tmpBoxes);
}
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////