This commit is contained in:
2025-02-24 19:15:41 +03:30
parent cee35a424b
commit 3ed72f0271
4 changed files with 634 additions and 212 deletions
+347 -117
View File
@@ -34,6 +34,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
public:
//
// Props ...
XOBFVG chochZone;
XOBFVG targetZone;
XOBFVG signalZone;
XOBFVG waitingZone;
@@ -605,6 +606,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
// Checking Order Flow Break ...
int breakedIDX = -1;
bool isOrderFlowBreaked =
hasOrderFlow &&
workingZone.IsOrderFlowBreaked(
breakedIDX,
true, // Force OB Breaked
@@ -624,59 +626,21 @@ class XCX121SMCXWZSignalDetector : public XCBase
);
//
Clean(workingZone.orderFlow);
hasOrderFlow = false;
signalZone = workingZone.orderFlow[breakedIDX];
provider = X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH;
//
ArrayRemove(
workingZone.orderFlow,
breakedIDX,
1 //
);
//
CleanupArray(
workingZone.brokenOrderFlow,
10 //
);
//
// TODO: Here Implement CHOCH Trading Senario ...
//
}
result = !isOrderFlowBreaked;
if (!result)
{
//
Clean(visionPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(consolidationPoiEvents);
//
Clean(visionCycleEvents);
Clean(analyseCycleEvents);
Clean(decisionCycleEvents);
Clean(consolidationCycleEvents);
//
visionState.Clean();
analyseState.Clean();
decisionState.Clean();
consolidationState.Clean();
//
visionConditions.Clean();
analyseConditions.Clean();
decisionConditions.Clean();
consolidationConditions.Clean();
//
visionXConditions.Clean();
analyseXConditions.Clean();
decisionXConditions.Clean();
consolidationXConditions.Clean();
//
mConditions.Clean();
consolidationZBar.Clean();
//
return result;
}
//
@@ -1150,6 +1114,48 @@ class XCX121SMCXWZSignalDetector : public XCBase
waitingZone.Clean();
}
//
if (signalZone.IsValid() &&
provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH)
{
//
ENUM_X_DIRECTION iForDir = Opposit(signalZone.GetDirection());
if (hasNewAnalyseOB &&
hasNewAnalyseFVG)
{
//
bool isSameDir =
newAnalyseOB.GetDirection() == iForDir &&
newAnalyseFVG.GetDirection() == iForDir;
bool isOneInsideAnoter =
//
(newAnalyseFVG.Upper() < newAnalyseOB.Upper() &&
newAnalyseFVG.Upper() > newAnalyseOB.Lower())
//
||
//
(newAnalyseOB.Upper() < newAnalyseFVG.Upper() &&
newAnalyseOB.Upper() > newAnalyseFVG.Lower())
//
;
//
bool isZoneDetected =
isSameDir &&
isOneInsideAnoter;
if (isZoneDetected)
{
//
XOBFVG iSignalZone;
iSignalZone.ob = newAnalyseOB;
iSignalZone.fvg = newAnalyseFVG;
//
chochZone = iSignalZone;
}
}
}
//
ZeroMemory(newOB);
ZeroMemory(newFVG);
@@ -1157,6 +1163,74 @@ class XCX121SMCXWZSignalDetector : public XCBase
ZeroMemory(newAnalyseFVG);
}
//
bool isPriceInsideCHOCHZone = false;
bool hasCHOCHZone = chochZone.IsValid();
if (hasCHOCHZone)
{
//
XCBaseObject *objects[];
bool isCreated = visionCycleHelper
.mPOIDrawer
.DrawOBFVG(
chochZone,
objects //
);
if (isCreated)
{
AddDrawnObjects(objects);
}
//
XOHCL cBar;
bool isInited = cBar.Init(
symbol,
period,
cIndex //
);
//
isPriceInsideCHOCHZone =
isInited &&
cBar.low >= chochZone.fvg.Lower() &&
cBar.high <= chochZone.fvg.Upper();
if (isPriceInsideCHOCHZone)
{
//
// Reverse Trend and ReCalculate Requirements
// For CHOCH Tradng ...
//
trend = chochZone.GetDirection();
//
isBullish = IsBullish(trend);
isBearish = IsBearish(trend);
//
bool hasPriority = workingZone
.DetectPriority(
priority,
trend,
zIndex,
period //
);
//
bool hasRewardAmount = CalculateRiskReward(
priority,
reward,
amountPercent //
);
//
provider = X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH;
}
//
cBar.Clean();
}
//
// Reading Trand Line Value ...
double zValue = workingZone.GetOrderFlowTrendLinePrice(
@@ -1264,6 +1338,44 @@ class XCX121SMCXWZSignalDetector : public XCBase
signalZone.Clean();
}
//
// TODO: Implement CHOCH Trading Senario ...
bool hasCHOCHConditions =
hasCHOCHZone &&
chochZone.IsValid() &&
isPriceInsideCHOCHZone &&
provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH;
//
hasChochBullishConditions =
hasCHOCHConditions &&
chochZone.IsBullish();
hasChochBearishConditions =
hasCHOCHConditions &&
chochZone.IsBearish();
//
if (hasCHOCHConditions)
{
//
mConditions.signalZone = chochZone;
mConditions.targetZone = targetZone;
//
point = hasChochBullishConditions
? chochZone.ob.Upper()
: chochZone.ob.Lower();
//
pivot = hasChochBearishConditions
? chochZone.ob.Lower()
: chochZone.ob.Upper();
//
chochZone.Clean();
signalZone.Clean();
}
//
// TODO: Implement Trend Line Trading Senario ...
@@ -1276,6 +1388,9 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
// TODO: Implement Support and Resistance Trading Senario ...
//
// TODO: Implement Mitigation Blocks Trading Senario ...
//
// Summarize ...
@@ -1287,6 +1402,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
hasSupResBullishConditions ||
hasTrendLineBullishConditions ||
hasOrderFlowhBullishConditions ||
hasInsideZoneBullishConditions ||
hasBQuarterLineBullishConditions
//
;
@@ -1299,6 +1415,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
hasSupResBearishConditions ||
hasTrendLineBearishConditions ||
hasOrderFlowhBearishConditions ||
hasInsideZoneBearishConditions ||
hasBQuarterLineBearishConditions
//
;
@@ -1533,13 +1650,21 @@ class XCX121SMCXWZSignalDetector : public XCBase
bullishScore,
bearishScore //
);
bool isBullishScorePassed =
isBullish &&
bullishScore > (bearishScore * 1.5);
bool isBearishScorePassed =
isBearish &&
bearishScore > (bullishScore * 1.5);
bool isScorePassed = isBullishScorePassed ||
isBearishScorePassed;
//
// Base SL Used Pivot of Conditions ...
Add(
conditions.pivot,
sls //
);
// Add(
// conditions.pivot,
// sls //
// );
//
int lowestSupportIDX = -1;
@@ -1588,11 +1713,15 @@ class XCX121SMCXWZSignalDetector : public XCBase
;
//
if (isBullish)
isSupportRejected =
isBullish &&
isSupportRejected;
if (isSupportRejected)
{
//
double vPivot = conditions.signalZone.supportZones[lowestSupportIDX].Lower();
bool canSetPivot = conditions.pivot < vPivot;
bool canSetPivot = vPivot > conditions.pivot &&
vPivot < conditions.point;
if (canSetPivot)
{
//
@@ -1609,7 +1738,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
if (IsValidIndex(highestResistanceIDX))
{
//
isSupportRejected =
isResistanceRejected =
//
isBarInited &&
(
@@ -1627,11 +1756,15 @@ class XCX121SMCXWZSignalDetector : public XCBase
;
//
if (isBearish)
isResistanceRejected =
isBearish &&
isResistanceRejected;
if (isResistanceRejected)
{
//
double vPivot = conditions.signalZone.resistanceZones[highestResistanceIDX].Upper();
bool canSetPivot = conditions.pivot > vPivot;
bool canSetPivot = vPivot < conditions.pivot &&
vPivot > conditions.point;
if (canSetPivot)
{
//
@@ -1650,73 +1783,122 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
// Consolidation Zone Detection ...
//
// Detect Consolidation Zones ...
//
// Bullish Consolidation Zone ...
XConsolidationZone lastBullishConsolidationZone;
bool hasBullishConsolidationZone = decisionCycleHelper
.GetLastDirectionalConsolidationZone(
X_DIRECTION_BULLISH,
lastBullishConsolidationZone //
);
if (hasBullishConsolidationZone)
XConsolidationZone bullishCZones[];
bool hasBullishConsolidationZone = false;
XConsolidationZone bullishConsolidationZone;
int bullishCZonesCount = decisionCycleHelper.FillConsolidationZones(
X_DIRECTION_BULLISH,
bullishCZones //
);
bool hasBullishConsolidationZones = IsValidSize(bullishCZonesCount);
if (hasBullishConsolidationZones)
{
//
// Validate Consolidation Zone ...
hasBullishConsolidationZone =
lastBullishConsolidationZone.lower > conditions.pivot;
//
if (isBullish &&
hasBullishConsolidationZone)
int idx = -1;
while (HasChild(bullishCZones))
{
//
double vPivot = lastBullishConsolidationZone.lower;
bool canSetPivot = conditions.pivot < vPivot;
if (canSetPivot)
idx = GetYoungest(bullishCZones);
hasBullishConsolidationZone = IsValidIndex(idx);
if (hasBullishConsolidationZone)
{
//
Add(
vPivot,
sls //
bullishConsolidationZone = bullishCZones[idx];
//
ArrayRemove(
bullishCZones,
idx,
1 //
);
//
// Check Zone Based On pivot, since this is the SL ...
hasBullishConsolidationZone =
isBullish &&
hasBullishConsolidationZone &&
bullishConsolidationZone.lower > conditions.pivot &&
bullishConsolidationZone.upper <= conditions.point;
if (hasBullishConsolidationZone)
{
//
XCConsolidationZoneObject *iObj;
bool isCreated = decisionCycleHelper.mPOIDrawer.CreateConsolidationZone(
bullishConsolidationZone,
iObj //
);
if (isCreated)
{
mObjects.Add(iObj);
}
//
Add(
bullishConsolidationZone.lower,
sls //
);
}
}
}
}
lastBullishConsolidationZone.Clean();
Clean(bullishCZones);
bullishConsolidationZone.Clean();
//
// Bearish Consolidation Zone ...
XConsolidationZone lastBearishConsolidationZone;
bool hasBearishConsolidationZone = decisionCycleHelper
.GetLastDirectionalConsolidationZone(
X_DIRECTION_BEARISH,
lastBearishConsolidationZone //
);
if (hasBearishConsolidationZone)
XConsolidationZone bearishCZones[];
bool hasBearishConsolidationZone = false;
XConsolidationZone bearishConsolidationZone;
int bearishCZonesCount = decisionCycleHelper.FillConsolidationZones(
X_DIRECTION_BEARISH,
bearishCZones //
);
bool hasBearishConsolidationZones = IsValidSize(bearishCZones);
if (hasBearishConsolidationZones)
{
//
// Validate Consolidation Zone ...
hasBearishConsolidationZone =
lastBearishConsolidationZone.upper < conditions.pivot;
//
if (isBearish &&
hasBearishConsolidationZone)
int idx = -1;
while (HasChild(bearishCZones))
{
//
double vPivot = lastBearishConsolidationZone.upper;
bool canSetPivot = conditions.pivot > vPivot;
if (canSetPivot)
idx = GetYoungest(bearishCZones);
hasBearishConsolidationZone = IsValidIndex(idx);
if (hasBearishConsolidationZone)
{
//
Add(
vPivot,
sls //
bearishConsolidationZone = bearishCZones[idx];
//
ArrayRemove(
bearishCZones,
idx,
1 //
);
//
hasBearishConsolidationZone =
isBearish &&
hasBearishConsolidationZone &&
bearishConsolidationZone.upper < conditions.pivot &&
bearishConsolidationZone.lower >= conditions.point;
if (hasBearishConsolidationZone)
{
//
Add(
bearishConsolidationZone.upper,
sls //
);
}
}
}
}
lastBearishConsolidationZone.Clean();
Clean(bearishCZones);
bearishConsolidationZone.Clean();
//
// Check VWap Crossing ...
@@ -1733,12 +1915,17 @@ class XCX121SMCXWZSignalDetector : public XCBase
decisionXConditions.isVWapSwitchedToBullishOrdered)
//
;
if (isBullish &&
isVWapSwitchedToBullish)
//
isVWapSwitchedToBullish =
isBullish &&
isVWapSwitchedToBullish;
if (isVWapSwitchedToBullish)
{
//
double vPivot = decisionXConditions.vwapMin;
bool canSetPivot = conditions.pivot < vPivot;
bool canSetPivot = vPivot > conditions.pivot &&
vPivot < conditions.point;
if (canSetPivot)
{
//
@@ -1761,12 +1948,17 @@ class XCX121SMCXWZSignalDetector : public XCBase
decisionXConditions.isVWapSwitchedToBearishOrdered)
//
;
if (isBearish &&
isVWapSwitchedToBearish)
//
isVWapSwitchedToBearish =
isBearish &&
isVWapSwitchedToBearish;
if (isVWapSwitchedToBearish)
{
//
double vPivot = decisionXConditions.vwapMax;
bool canSetPivot = conditions.pivot > vPivot;
bool canSetPivot = vPivot < conditions.pivot &&
vPivot > conditions.point;
if (canSetPivot)
{
//
@@ -1794,16 +1986,36 @@ class XCX121SMCXWZSignalDetector : public XCBase
);
cBar.Clean();
//
bool isCommonsPassed =
//
(isSupportRejected ||
isResistanceRejected ||
isVWapSwitchedToBullish ||
isVWapSwitchedToBearish ||
hasBullishConsolidationZone ||
hasBearishConsolidationZone)
//
;
//
// Trigger Conditions ...
//
bool canTriggerCHOCHZone =
//
isScorePassed &&
isCommonsPassed &&
conditions.provider == X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH
//
;
//
bool canTriggerActivatedZone =
//
// isPointBreaked &&
(isSupportRejected ||
hasBullishConsolidationZone) &&
bullishScore > (bearishScore * 1.5) &&
isScorePassed &&
isCommonsPassed &&
conditions.provider == X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE
//
;
@@ -1811,16 +2023,15 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
bool canTriggerPriceInsideZone =
//
// isPointBreaked &&
(isResistanceRejected ||
hasBearishConsolidationZone) &&
bearishScore > (bullishScore * 1.5) &&
isScorePassed &&
isCommonsPassed &&
conditions.provider == X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE
//
;
//
bool canTrigger = (canTriggerActivatedZone ||
bool canTrigger = (canTriggerCHOCHZone ||
canTriggerActivatedZone ||
canTriggerPriceInsideZone);
//
@@ -1887,7 +2098,20 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
double iAtr = decisionXConditions.atrBuffer[1];
iAtr *= 0;
iAtr *= 1.5;
//
// Since Pivot Value almost used
// as Default SL, if there isn't any Refind SL
// we use Default ...
if (!HasChild(sls))
{
//
Add(
conditions.pivot,
sls //
);
}
//
double slsMin = GetMin(sls);
@@ -1895,8 +2119,8 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
double sl = isBullish
? slsMax - iAtr
: slsMin + iAtr;
? slsMin - iAtr
: slsMax + iAtr;
double risk = MathAbs(entry - sl);
//
@@ -1953,6 +2177,9 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
;
//
return false;
//
result = isCycleHelpersValid;
if (!result)
@@ -2417,7 +2644,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
//
// Trail Stops Using Consolidation Zones ...
bool canTraiLonglUsingCZone =
bool canTraiLonglUsingCZone =
//
(isLong &&
isInProfit &&
@@ -2432,7 +2659,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
}
//
bool canTraiShortlUsingCZone =
bool canTraiShortlUsingCZone =
//
(!isLong &&
isInProfit &&
@@ -3264,6 +3491,7 @@ class XCX121SMCXWZSignalDetector : public XCBase
void DeInit()
{
//
chochZone.Clean();
signalZone.Clean();
targetZone.Clean();
mConditions.Clean();
@@ -3289,7 +3517,9 @@ class XCX121SMCXWZSignalDetector : public XCBase
value = NormalizeTime(value);
//
chochZone.UpdateTo(value);
targetZone.UpdateTo(value);
signalZone.UpdateTo(value);
workingZone.UpdateTo(value);
mConditions.UpdateTo(value);
waitingZone.UpdateTo(value);
@@ -31,6 +31,7 @@ enum ENUM_X121SMC_XWZ_PROVIDERS
{
X121SMC_XWZ_PROVIDER_NONE,
X121SMC_XWZ_PROVIDER_ACTIVATED_ZONE,
X121SMC_XWZ_PROVIDER_ACTIVATED_CHOCH,
X121SMC_XWZ_PROVIDER_PRICE_INSIDE_ZONE,
};