This commit is contained in:
2025-01-11 19:09:20 +03:30
parent c6cfd9b115
commit 83694f54ff
9 changed files with 2184 additions and 427 deletions
@@ -676,12 +676,12 @@ bool DetectX121SMCXOBGPVSiganlTrigger(
double isNewDecisionVale = decisionConditions.x121Conditions.isNewVale;
//
bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRSICrossedOverOverSold;
bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRSICrossedUnderOverBought;
bool isTriggerRSICrossedOverOverSold = triggerConditions.x121Conditions.isRsiCrossedOverOverSold;
bool isTriggerRSICrossedUnderOverBought = triggerConditions.x121Conditions.isRsiCrossedUnderOverBought;
//
bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRSICrossedOverOverSold;
bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRSICrossedUnderOverBought;
bool isDecisionRSICrossedOverOverSold = decisionConditions.x121Conditions.isRsiCrossedOverOverSold;
bool isDecisionRSICrossedUnderOverBought = decisionConditions.x121Conditions.isRsiCrossedUnderOverBought;
//
// Waits For Price to Go Inside FVG ...
+200 -146
View File
@@ -50,6 +50,7 @@ struct X121SMCStrategyXOBSPVSignalConditions
//
double pivot;
XPriceZones priceZone;
//
// Constructor ...
@@ -167,6 +168,9 @@ struct X121SMCStrategyXOBSPVSignalConditions
{
//
pivot = 0;
//
priceZone.Clean();
}
//
@@ -408,169 +412,213 @@ bool DetectX121SMCXOBSPVSiganlSetup(
}
//
bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish;
double decisionPeak = decisionConditions.x121Conditions.peaksBuffer[1];
double decisionVale = decisionConditions.x121Conditions.valesBuffer[1];
//
if (isStrSwitchedToBullish ||
isStrSwitchedToBearish)
// Find Price Inside Zone ...
XPriceZones priceZone = conditions.priceZone;
bool hasPriceZones = conditions.priceZone.IsValid();
if (!hasPriceZones)
{
Print("Str State Changed ...");
//
hasPriceZones = CalculatePriceInsideZones(
priceZone,
analyseState,
cBar //
);
//
if (hasPriceZones)
{
//
// Validate Price Zone ...
double upper = 0;
double lower = 0;
hasPriceZones = priceZone.GetBoundary(
X_DIRECTION_ALL,
upper,
lower //
);
result = hasPriceZones;
if (!result)
{
return result;
}
//
bool isValid = decisionPeak <= upper ||
decisionVale >= lower;
hasPriceZones = isValid;
result = hasPriceZones;
if (!result)
{
return result;
}
//
conditions.priceZone = priceZone;
}
}
//
X121SMCCycleConditions conditionState = consolidationConditions;
X121SMCCycleConditions conditionStatePrev = consolidationConditionsPrev;
// Detect Str Change Direction ...
//
XOHCL cCBar;
result = cCBar.Init(
conditionState.symbol,
conditionState.period,
cIndex //
);
if (!result)
{
return result;
}
bool isDecisionSarBullish = decisionConditions.x121Conditions.isSarBullish;
bool isDecisionSarBearish = decisionConditions.x121Conditions.isSarBearish;
//
XOHCL cPBar;
result = cCBar.GetPreviousBar(cPBar);
if (!result)
{
return result;
}
bool isDecisionStrBullish = decisionConditions.x121Conditions.isStrBullish;
bool isDecisionStrBearish = decisionConditions.x121Conditions.isStrBearish;
//
// Engulf ...
ENUM_X_DIRECTION cCBarEngulfDir;
bool isCCBarEngulfed = consolidationCycleHelper
.mBarAnalyser
.IsEngulfBar(
cCBar,
cCBarEngulfDir,
0 // Extended ...
);
bool isCCBarBullishEngulfed =
isCCBarEngulfed &&
IsBullish(cCBarEngulfDir);
bool isCCBarBearishEngulfed =
isCCBarEngulfed &&
IsBearish(cCBarEngulfDir);
bool isDecisionSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale;
bool isDecisionSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak;
//
// Momentum ...
ENUM_X_DIRECTION cCBarMomentumDir;
bool isCCBarMomentum = consolidationCycleHelper
.mBarAnalyser
.IsMomentumBar(
cCBar,
cCBarMomentumDir,
1 // Extended ...
);
bool isCCBarBullishMomentum =
isCCBarMomentum &&
IsBullish(cCBarMomentumDir);
bool isCCBarBearishMomentum =
isCCBarMomentum &&
IsBearish(cCBarMomentumDir);
bool isDecisionStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale;
bool isDecisionStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak;
//
// Reject ...
ENUM_X_DIRECTION cCBarRejectDir;
bool isCCBarRejected = consolidationCycleHelper
.mBarAnalyser
.IsRejectionBar(
cCBar,
cCBarRejectDir,
1 // Extended ...
);
bool isCCBarBullishRejected =
isCCBarRejected &&
IsBullish(cCBarRejectDir);
bool isCCBarBearishRejected =
isCCBarRejected &&
IsBearish(cCBarRejectDir);
bool isDecisionPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper;
bool isDecisionValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower;
//
// Bar Checking Summary ...
bool isDecisionVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState;
bool isDecisionVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState;
//
// Bullish ...
bool isCCBarPassedBullish =
//
isCCBarBullishEngulfed ||
isCCBarBullishMomentum ||
isCCBarBullishRejected
//
;
bool isDecisionVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered;
bool isDecisionVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
//
// Bearish ...
bool isCCBarPassedBearish =
//
isCCBarBearishEngulfed ||
isCCBarBearishMomentum ||
isCCBarBearishRejected
//
;
bool isDecisionVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState;
bool isDecisionVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState;
//
double cPeakPrev = conditionStatePrev.x121Conditions.peaksBuffer[0];
double cValePrev = conditionStatePrev.x121Conditions.valesBuffer[0];
bool isDecisionVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered;
bool isDecisionVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
//
double cPeak = conditionState.x121Conditions.peaksBuffer[1];
double cVale = conditionState.x121Conditions.valesBuffer[1];
bool isDecisionStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak;
bool isDecisionStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale;
//
bool isCPeakSame = cPeak == cPeakPrev;
bool isCValeSame = cVale == cValePrev;
bool isDecisionStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak;
bool isDecisionStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale;
//
bool isCNewPeakPrev = conditionStatePrev.x121Conditions.isNewPeak;
bool isCNewPeakOverLastPrev = conditionStatePrev.x121Conditions.isNewPeakOverLast;
bool isCNewPeakUnderLastPrev = conditionStatePrev.x121Conditions.isNewPeakUnderLast;
bool isDecisionDonLowUpperLesserThanDonCloseUpper =
decisionConditions.x121Conditions.donLowUpperBuffer[1] <
decisionConditions.x121Conditions.donCloseUpperBuffer[1];
//
bool isCNewValePrev = conditionStatePrev.x121Conditions.isNewVale;
bool isCNewValeOverLastPrev = conditionStatePrev.x121Conditions.isNewValeOverLast;
bool isCNewValeUnderLastPrev = conditionStatePrev.x121Conditions.isNewValeUnderLast;
bool isDecisionDonHighLowerGreaterThanDonCloseLower =
decisionConditions.x121Conditions.donHighLowerBuffer[1] <
decisionConditions.x121Conditions.donCloseLowerBuffer[1];
//
bool isCRSIOverSold = conditionState.x121Conditions.isRSIOverSold;
bool isCRSICrossedOverOverSold = conditionState.x121Conditions.isRSICrossedOverOverSold;
bool isCRSICrossedUnderOverSold = conditionState.x121Conditions.isRSICrossedUnderOverSold;
//
bool isCRSIOverBought = conditionState.x121Conditions.isRSIOverBought;
bool isCRSICrossedOverOverBought = conditionState.x121Conditions.isRSICrossedOverOverBought;
bool isCRSICrossedUnderOverBought = conditionState.x121Conditions.isRSICrossedUnderOverBought;
//
bool isCRSIOverSoldPrev = conditionStatePrev.x121Conditions.isRSIOverSold;
bool isCRSICrossedOverOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverSold;
bool isCRSICrossedUnderOverSoldPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverSold;
//
bool isCRSIOverBoughtPrev = conditionStatePrev.x121Conditions.isRSIOverBought;
bool isCRSICrossedOverOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedOverOverBought;
bool isCRSICrossedUnderOverBoughtPrev = conditionStatePrev.x121Conditions.isRSICrossedUnderOverBought;
// Summarize Conditions ...
//
isBullish =
//
isCNewValePrev &&
isCCBarPassedBullish
isDecisionValeUnderAtrLower
//
&&
//
isDecisionDonHighLowerGreaterThanDonCloseLower
//
&&
//
(
//
isDecisionVWapBullishState ||
isDecisionVWapBullishOrdered
//
)
//
&&
//
(
//
isDecisionStrUpperOverPeak ||
isDecisionStrLowerOverVale
//
)
//
&&
//
(
//
(
//
isDecisionStrBullish &&
isDecisionSarCrossedOverVale
//
)
//
||
//
(
//
isDecisionSarBullish &&
isDecisionStrCrossedOverVale
//
)
//
)
//
;
//
isBearish =
//
isCNewPeakPrev &&
isCCBarPassedBearish
isDecisionPeakOverAtrUpper
//
&&
//
isDecisionDonLowUpperLesserThanDonCloseUpper
//
&&
//
(
//
isDecisionVWapBearishState ||
isDecisionVWapBearishOrdered
//
)
//
&&
//
(
//
isDecisionStrUpperUnderPeak ||
isDecisionStrLowerUnderVale
//
)
//
&&
//
(
//
(
//
isDecisionStrBearish &&
isDecisionSarCrossedUnderPeak
//
)
//
||
//
(
//
isDecisionSarBearish &&
isDecisionStrCrossedUnderPeak //
)
//
)
//
;
@@ -582,12 +630,6 @@ bool DetectX121SMCXOBSPVSiganlSetup(
return result;
}
//
conditions.pivot =
isBullish
? conditionState.x121Conditions.valesBuffer[1]
: conditionState.x121Conditions.peaksBuffer[1];
//
conditions.setupTime = cTime;
conditions.dir =
@@ -615,7 +657,7 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
XC121SMCCycleHelper *consolidationCycleHelper,
XC121SMCCycleHelper *visionCycleHelper,
//
int maxAllowedSetupAge = 576 //
int maxAllowedSetupAge = 60 //
//
)
{
@@ -817,25 +859,29 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
// Trigger Conditions ...
//
// Looking for STR Direction Change ...
double decisionLastBullishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BULLISH);
double decisionLastBearishStr = decisionCycleHelper.mX121Helper.xstrHelper.GetLastSTR(X_DIRECTION_BEARISH);
//
bool isStrSwitchedToBullish = analyseConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = analyseConditions.x121Conditions.isStrSwitchedToBearish;
bool isDecisionLastBearishStrBreakedUp = IsBarBreak(
decisionLastBearishStr,
X_DIRECTION_BULLISH,
cBar //
);
//
result = isStrSwitchedToBullish ||
isStrSwitchedToBearish;
if (!result)
{
return result;
}
bool isDecisionLastBullishStrBreakedDown = IsBarBreak(
decisionLastBullishStr,
X_DIRECTION_BEARISH,
cBar //
);
//
// Detect Bullish Conditions ...
isBullish =
//
false
isBullish &&
isDecisionLastBearishStrBreakedUp
//
;
@@ -843,7 +889,8 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
// Detect Bearish Conditions ...
isBearish =
//
false
isBearish &&
isDecisionLastBullishStrBreakedDown
//
;
@@ -854,6 +901,13 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
{
//
// Cleanup Setup Conditions ...
int setupAge = conditions.GetSetupAge();
if (IsValidSize(setupAge) &&
IsValidSize(maxAllowedSetupAge) &&
setupAge >= maxAllowedSetupAge)
{
conditions.Clean();
}
//
return result;
@@ -899,15 +953,15 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
double sls[];
//
double atr = triggerConditions.x121Conditions.atrBuffer[1];
double peak = triggerConditions.x121Conditions.peaksBuffer[1];
double vale = triggerConditions.x121Conditions.valesBuffer[1];
double iAtr = triggerConditions.x121Conditions.atrBuffer[1];
double iPeak = triggerConditions.x121Conditions.peaksBuffer[1];
double iVale = triggerConditions.x121Conditions.valesBuffer[1];
//
if (isBullish)
{
//
double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(vale);
double lowerVale = triggerCycleHelper.mX121Helper.xpvHelper.GetLowerVale(iVale);
if (lowerVale > 0)
{
//
@@ -919,14 +973,14 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
//
Add(
vale,
iVale,
sls //
);
}
else if (isBearish)
{
//
double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(peak);
double higherPeak = triggerCycleHelper.mX121Helper.xpvHelper.GetHigherPeak(iPeak);
if (higherPeak > 0)
{
//
@@ -938,7 +992,7 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
//
Add(
peak,
iPeak,
sls //
);
}
@@ -949,8 +1003,8 @@ bool DetectX121SMCXOBSPVSiganlTrigger(
//
double sl = isBullish
? slsMin - atr
: slsMax + atr;
? slsMin - iAtr
: slsMax + iAtr;
double risk = MathAbs(entry - sl);
double targetDelta = 2 * (risk / 3);
if (target == 0)
File diff suppressed because it is too large Load Diff
+23 -64
View File
@@ -185,7 +185,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
bool useTestSignal = false;
bool useXOBGPVSignal = false;
bool useXOBGPVSignal = true;
bool useXOBSPVSignal = true;
//
@@ -874,58 +874,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
X121SMCStrategyXOBSPVSignalConditions mConditions;
for (int i = 0; i < conditionsCount; i++)
{
//
// Update Conditions ...
// mTmpConditions[i].UpdateOrderBlocks();
//
// Retrieve Required Data ...
// ENUM_X_DIRECTION iDir = mTmpConditions[i].dir;
// bool isIBullish = IsBullish(iDir);
// double iUpper = 0;
// double iLower = 0;
// bool iHasBoundary = mTmpConditions[i].fvgOB.GetBoundary(
// iUpper,
// iLower //
// );
// if (!iHasBoundary)
// {
// continue;
// }
//
// Draw Conditions ...
//
// XFVGOrderBlock iFVGOB = mTmpConditions[i].fvgOB;
// XCBaseObject *drawnObjects[];
// mPOIDrawer.DrawFVGOrderBlock(
// iFVGOB,
// drawnObjects //
// );
// AddObjectsIfNotExists(drawnObjects);
//
// Check Broken Order Blocks and Remove them ...
// bool isBreaked =
// isBullish
// ? (cBar.high < iLower ||
// pBar.high < iLower)
// : (cBar.low > iUpper ||
// cBar.low > iUpper);
// if (isBreaked)
// {
// //
// ArrayRemove(
// mXOBSPVConditionsCollection,
// i,
// 1 //
// );
// //
// continue;
// }
//
// Check Triggers ...
bool canTrigger = mTmpConditions[i].CanTrigger();
@@ -950,6 +898,17 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
result = canTrigger;
if (!result)
{
//
bool isISetuped = mTmpConditions[i].IsSetuped();
if (!isISetuped)
{
//
ArrayRemove(
mXOBSPVConditionsCollection,
i,
1 //
);
}
continue;
}
@@ -1057,7 +1016,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
x121Inputs.Default();
//
x121Inputs.showRSI = true;
x121Inputs.showRSI = false;
//
bool isInited = false;
@@ -1082,27 +1041,27 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
//
// XATR ...
x121Inputs.xatrInputs.showATRUpper = true;
x121Inputs.xatrInputs.showATRLower = true;
x121Inputs.xatrInputs.showATRUpper = false;
x121Inputs.xatrInputs.showATRLower = false;
//
// XSTR ...
x121Inputs.xstrInputs.showStr = true;
x121Inputs.xstrInputs.showStrUpper = true;
x121Inputs.xstrInputs.showStrLower = true;
x121Inputs.xstrInputs.showStrUpper = false;
x121Inputs.xstrInputs.showStrLower = false;
//
// XDON ...
x121Inputs.xdonInputs.showOpen = false;
x121Inputs.xdonInputs.showClose = false;
x121Inputs.xdonInputs.showLow = false;
x121Inputs.xdonInputs.showHigh = false;
x121Inputs.xdonInputs.showClose = true;
x121Inputs.xdonInputs.showLow = true;
x121Inputs.xdonInputs.showHigh = true;
//
// XVWAP ...
x121Inputs.xvwapInputs.showVWapFast = true;
x121Inputs.xvwapInputs.showVWapMedium = true;
x121Inputs.xvwapInputs.showVWapSlow = true;
x121Inputs.xvwapInputs.showVWapFast = false;
x121Inputs.xvwapInputs.showVWapMedium = false;
x121Inputs.xvwapInputs.showVWapSlow = false;
//
// Initialize Cycle Helpers ...