This commit is contained in:
2025-01-13 12:31:09 +03:30
parent 218dda0a72
commit 56cd60e31d
6 changed files with 361 additions and 625 deletions
+34
View File
@@ -283,3 +283,37 @@
} }
} }
} }
//
// Method 1 ...
// VWap Switch Start ...
//
bool bullishMethod1 =
//
isSarBullish &&
isStrBullish &&
isSlopesBullish &&
hasBullishTrend &&
cBar.IsBullish() &&
isAtrBullishSlope &&
isPVBullishFormed &&
isRsiBullishFormed &&
isVWapBullishFormed
//
;
//
bool bearishMethod1 =
//
isSarBearish &&
isStrBearish &&
isSlopesBearish &&
hasBearishTrend &&
cBar.IsBearish() &&
isAtrBearishSlope &&
isPVBearishFormed &&
isRsiBearishFormed &&
isVWapBearishFormed
//
;
+48 -48
View File
@@ -305,22 +305,22 @@ struct X121Conditions
bool isStrSwitchedToBearish; bool isStrSwitchedToBearish;
// //
bool isCHE1Bullish; bool isChe1Bullish;
bool isCHE1Bearish; bool isChe1Bearish;
bool isCHE1SwitchedToBullish; bool isChe1SwitchedToBullish;
bool isCHE1SwitchedToBearish; bool isChe1SwitchedToBearish;
// //
bool isCHE2Bullish; bool isChe2Bullish;
bool isCHE2Bearish; bool isChe2Bearish;
bool isCHE2SwitchedToBullish; bool isChe2SwitchedToBullish;
bool isCHE2SwitchedToBearish; bool isChe2SwitchedToBearish;
// //
bool isCHEBullish; bool isCheBullish;
bool isCHEBearish; bool isCheBearish;
bool isCHESwitchedToBullish; bool isCheSwitchedToBullish;
bool isCHESwitchedToBearish; bool isCheSwitchedToBearish;
// //
bool isVWapMidBullish; bool isVWapMidBullish;
@@ -792,28 +792,28 @@ struct X121Conditions
// CHE ... // CHE ...
// //
isCHE1Bullish = false; isChe1Bullish = false;
isCHE1Bearish = false; isChe1Bearish = false;
// //
isCHE1SwitchedToBullish = false; isChe1SwitchedToBullish = false;
isCHE1SwitchedToBearish = false; isChe1SwitchedToBearish = false;
// //
isCHE2Bullish = false; isChe2Bullish = false;
isCHE2Bearish = false; isChe2Bearish = false;
// //
isCHE2SwitchedToBullish = false; isChe2SwitchedToBullish = false;
isCHE2SwitchedToBearish = false; isChe2SwitchedToBearish = false;
// //
isCHEBullish = false; isCheBullish = false;
isCHEBearish = false; isCheBearish = false;
// //
isCHESwitchedToBullish = false; isCheSwitchedToBullish = false;
isCHESwitchedToBearish = false; isCheSwitchedToBearish = false;
// //
// Complex Conditions ... // Complex Conditions ...
@@ -1118,18 +1118,18 @@ struct X121Conditions
"-----------------------" + separator + "-----------------------" + separator +
"CHE ..." + separator + "CHE ..." + separator +
"-----------------------" + separator + "-----------------------" + separator +
ToString("isCHE1Bullish", isCHE1Bullish, ignoreFalseConditions, separator) + ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) +
ToString("isCHE1Bearish", isCHE1Bearish, ignoreFalseConditions, separator) + ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) +
ToString("isCHE1SwitchedToBullish", isCHE1SwitchedToBullish, ignoreFalseConditions, separator) + ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHE1SwitchedToBearish", isCHE1SwitchedToBearish, ignoreFalseConditions, separator) + ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isCHE2Bullish", isCHE2Bullish, ignoreFalseConditions, separator) + ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) +
ToString("isCHE2Bearish", isCHE2Bearish, ignoreFalseConditions, separator) + ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) +
ToString("isCHE2SwitchedToBullish", isCHE2SwitchedToBullish, ignoreFalseConditions, separator) + ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHE2SwitchedToBearish", isCHE2SwitchedToBearish, ignoreFalseConditions, separator) + ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isCHEBullish", isCHEBullish, ignoreFalseConditions, separator) + ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) +
ToString("isCHEBearish", isCHEBearish, ignoreFalseConditions, separator) + ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) +
ToString("isCHESwitchedToBullish", isCHESwitchedToBullish, ignoreFalseConditions, separator) + ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHESwitchedToBearish", isCHESwitchedToBearish, ignoreFalseConditions, separator) + ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) +
// //
"-----------------------" + separator + "-----------------------" + separator +
"Slopes ..." + separator + "Slopes ..." + separator +
@@ -2010,18 +2010,18 @@ class XCX121Helper : public XCBase
// //
// Conditions ... // Conditions ...
conditions.isCHEBullish = xcheConditions.isCHEBullish; conditions.isCheBullish = xcheConditions.isCheBullish;
conditions.isCHEBearish = xcheConditions.isCHEBearish; conditions.isCheBearish = xcheConditions.isCheBearish;
conditions.isCHE1Bullish = xcheConditions.isCHE1Bullish; conditions.isChe1Bullish = xcheConditions.isChe1Bullish;
conditions.isCHE1Bearish = xcheConditions.isCHE1Bearish; conditions.isChe1Bearish = xcheConditions.isChe1Bearish;
conditions.isCHE2Bullish = xcheConditions.isCHE2Bullish; conditions.isChe2Bullish = xcheConditions.isChe2Bullish;
conditions.isCHE2Bearish = xcheConditions.isCHE2Bearish; conditions.isChe2Bearish = xcheConditions.isChe2Bearish;
conditions.isCHESwitchedToBullish = xcheConditions.isCHESwitchedToBullish; conditions.isCheSwitchedToBullish = xcheConditions.isCheSwitchedToBullish;
conditions.isCHESwitchedToBearish = xcheConditions.isCHESwitchedToBearish; conditions.isCheSwitchedToBearish = xcheConditions.isCheSwitchedToBearish;
conditions.isCHE1SwitchedToBullish = xcheConditions.isCHE1SwitchedToBullish; conditions.isChe1SwitchedToBullish = xcheConditions.isChe1SwitchedToBullish;
conditions.isCHE1SwitchedToBearish = xcheConditions.isCHE1SwitchedToBearish; conditions.isChe1SwitchedToBearish = xcheConditions.isChe1SwitchedToBearish;
conditions.isCHE2SwitchedToBullish = xcheConditions.isCHE2SwitchedToBullish; conditions.isChe2SwitchedToBullish = xcheConditions.isChe2SwitchedToBullish;
conditions.isCHE2SwitchedToBearish = xcheConditions.isCHE2SwitchedToBearish; conditions.isChe2SwitchedToBearish = xcheConditions.isChe2SwitchedToBearish;
// //
// XDON ... // XDON ...
+76 -76
View File
@@ -176,28 +176,28 @@ struct X121XCHEConditions
// Conditions ... // Conditions ...
// //
bool isCHE1Bullish; bool isChe1Bullish;
bool isCHE1Bearish; bool isChe1Bearish;
// //
bool isCHE1SwitchedToBullish; bool isChe1SwitchedToBullish;
bool isCHE1SwitchedToBearish; bool isChe1SwitchedToBearish;
// //
bool isCHE2Bullish; bool isChe2Bullish;
bool isCHE2Bearish; bool isChe2Bearish;
// //
bool isCHE2SwitchedToBullish; bool isChe2SwitchedToBullish;
bool isCHE2SwitchedToBearish; bool isChe2SwitchedToBearish;
// //
bool isCHEBullish; bool isCheBullish;
bool isCHEBearish; bool isCheBearish;
// //
bool isCHESwitchedToBullish; bool isCheSwitchedToBullish;
bool isCHESwitchedToBearish; bool isCheSwitchedToBearish;
// //
// bool isCloseLower // bool isCloseLower
@@ -250,28 +250,28 @@ struct X121XCHEConditions
// Conditions ... // Conditions ...
// //
isCHE1Bullish = false; isChe1Bullish = false;
isCHE1Bearish = false; isChe1Bearish = false;
// //
isCHE1SwitchedToBullish = false; isChe1SwitchedToBullish = false;
isCHE1SwitchedToBearish = false; isChe1SwitchedToBearish = false;
// //
isCHE2Bullish = false; isChe2Bullish = false;
isCHE2Bearish = false; isChe2Bearish = false;
// //
isCHE2SwitchedToBullish = false; isChe2SwitchedToBullish = false;
isCHE2SwitchedToBearish = false; isChe2SwitchedToBearish = false;
// //
isCHEBullish = false; isCheBullish = false;
isCHEBearish = false; isCheBearish = false;
// //
isCHESwitchedToBullish = false; isCheSwitchedToBullish = false;
isCHESwitchedToBearish = false; isCheSwitchedToBearish = false;
// //
// XDON ... // XDON ...
@@ -347,18 +347,18 @@ struct X121XCHEConditions
// //
string conditionsStr = string conditionsStr =
// //
ToString("isCHE1Bullish", isCHE1Bullish, ignoreFalseConditions, separator) + ToString("isChe1Bullish", isChe1Bullish, ignoreFalseConditions, separator) +
ToString("isCHE1Bearish", isCHE1Bearish, ignoreFalseConditions, separator) + ToString("isChe1Bearish", isChe1Bearish, ignoreFalseConditions, separator) +
ToString("isCHE1SwitchedToBullish", isCHE1SwitchedToBullish, ignoreFalseConditions, separator) + ToString("isChe1SwitchedToBullish", isChe1SwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHE1SwitchedToBearish", isCHE1SwitchedToBearish, ignoreFalseConditions, separator) + ToString("isChe1SwitchedToBearish", isChe1SwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isCHE2Bullish", isCHE2Bullish, ignoreFalseConditions, separator) + ToString("isChe2Bullish", isChe2Bullish, ignoreFalseConditions, separator) +
ToString("isCHE2Bearish", isCHE2Bearish, ignoreFalseConditions, separator) + ToString("isChe2Bearish", isChe2Bearish, ignoreFalseConditions, separator) +
ToString("isCHE2SwitchedToBullish", isCHE2SwitchedToBullish, ignoreFalseConditions, separator) + ToString("isChe2SwitchedToBullish", isChe2SwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHE2SwitchedToBearish", isCHE2SwitchedToBearish, ignoreFalseConditions, separator) + ToString("isChe2SwitchedToBearish", isChe2SwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isCHEBullish", isCHEBullish, ignoreFalseConditions, separator) + ToString("isCheBullish", isCheBullish, ignoreFalseConditions, separator) +
ToString("isCHEBearish", isCHEBearish, ignoreFalseConditions, separator) + ToString("isCheBearish", isCheBearish, ignoreFalseConditions, separator) +
ToString("isCHESwitchedToBullish", isCHESwitchedToBullish, ignoreFalseConditions, separator) + ToString("isCheSwitchedToBullish", isCheSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isCHESwitchedToBearish", isCHESwitchedToBearish, ignoreFalseConditions, separator) + ToString("isCheSwitchedToBearish", isCheSwitchedToBearish, ignoreFalseConditions, separator) +
// //
"" ""
// //
@@ -1044,72 +1044,72 @@ class XCX121XCHEHelper : public XCBaseHelper
int pIDX = cIDX + 1; int pIDX = cIDX + 1;
// //
bool isCHE1Bullish = le1Buffer[cIDX] != EMPTY_VALUE && bool isChe1Bullish = le1Buffer[cIDX] != EMPTY_VALUE &&
se1Buffer[cIDX] == EMPTY_VALUE; se1Buffer[cIDX] == EMPTY_VALUE;
bool isCHE1BullishPrev = le1Buffer[cIDX] != EMPTY_VALUE && bool isChe1BullishPrev = le1Buffer[cIDX] != EMPTY_VALUE &&
se1Buffer[pIDX] == EMPTY_VALUE; se1Buffer[pIDX] == EMPTY_VALUE;
// //
bool isCHE1Bearish = se1Buffer[cIDX] != EMPTY_VALUE && bool isChe1Bearish = se1Buffer[cIDX] != EMPTY_VALUE &&
le1Buffer[cIDX] == EMPTY_VALUE; le1Buffer[cIDX] == EMPTY_VALUE;
bool isCHE1BearishPrev = se1Buffer[pIDX] != EMPTY_VALUE && bool isChe1BearishPrev = se1Buffer[pIDX] != EMPTY_VALUE &&
le1Buffer[pIDX] == EMPTY_VALUE; le1Buffer[pIDX] == EMPTY_VALUE;
// //
bool isCHE1SwitchedToBullish = isCHE1Bullish && bool isChe1SwitchedToBullish = isChe1Bullish &&
!isCHE1BullishPrev; !isChe1BullishPrev;
bool isCHE1SwitchedToBearish = isCHE1Bearish && bool isChe1SwitchedToBearish = isChe1Bearish &&
!isCHE1BearishPrev; !isChe1BearishPrev;
// //
bool isCHE2Bullish = le2Buffer[cIDX] != EMPTY_VALUE && bool isChe2Bullish = le2Buffer[cIDX] != EMPTY_VALUE &&
se2Buffer[cIDX] == EMPTY_VALUE; se2Buffer[cIDX] == EMPTY_VALUE;
bool isCHE2BullishPrev = le2Buffer[pIDX] != EMPTY_VALUE && bool isChe2BullishPrev = le2Buffer[pIDX] != EMPTY_VALUE &&
se2Buffer[pIDX] == EMPTY_VALUE; se2Buffer[pIDX] == EMPTY_VALUE;
// //
bool isCHE2Bearish = se2Buffer[cIDX] != EMPTY_VALUE && bool isChe2Bearish = se2Buffer[cIDX] != EMPTY_VALUE &&
le2Buffer[cIDX] == EMPTY_VALUE; le2Buffer[cIDX] == EMPTY_VALUE;
bool isCHE2BearishPrev = se2Buffer[pIDX] != EMPTY_VALUE && bool isChe2BearishPrev = se2Buffer[pIDX] != EMPTY_VALUE &&
le2Buffer[pIDX] == EMPTY_VALUE; le2Buffer[pIDX] == EMPTY_VALUE;
// //
bool isCHE2SwitchedToBullish = isCHE2Bullish && bool isChe2SwitchedToBullish = isChe2Bullish &&
!isCHE2BullishPrev; !isChe2BullishPrev;
bool isCHE2SwitchedToBearish = isCHE2Bearish && bool isChe2SwitchedToBearish = isChe2Bearish &&
!isCHE2BearishPrev; !isChe2BearishPrev;
// //
bool isCHEBullish = isCHE1Bullish && bool isCheBullish = isChe1Bullish &&
isCHE2Bullish; isChe2Bullish;
bool isCHEBullishPrev = isCHE1BullishPrev && bool isCheBullishPrev = isChe1BullishPrev &&
isCHE2BullishPrev; isChe2BullishPrev;
// //
bool isCHEBearish = isCHE1Bearish && bool isCheBearish = isChe1Bearish &&
isCHE2Bearish; isChe2Bearish;
bool isCHEBearishPrev = isCHE1BearishPrev && bool isCheBearishPrev = isChe1BearishPrev &&
isCHE2BearishPrev; isChe2BearishPrev;
// //
bool isCHESwitchedToBullish = isCHEBullish && bool isCheSwitchedToBullish = isCheBullish &&
!isCHEBullishPrev; !isCheBullishPrev;
bool isCHESwitchedToBearish = isCHEBearish && bool isCheSwitchedToBearish = isCheBearish &&
!isCHEBearishPrev; !isCheBearishPrev;
// //
conditions.isCHE1Bullish = isCHE1Bullish; conditions.isChe1Bullish = isChe1Bullish;
conditions.isCHE1Bearish = isCHE1Bearish; conditions.isChe1Bearish = isChe1Bearish;
conditions.isCHE1SwitchedToBullish = isCHE1SwitchedToBullish; conditions.isChe1SwitchedToBullish = isChe1SwitchedToBullish;
conditions.isCHE1SwitchedToBearish = isCHE1SwitchedToBearish; conditions.isChe1SwitchedToBearish = isChe1SwitchedToBearish;
conditions.isCHE2Bullish = isCHE2Bullish; conditions.isChe2Bullish = isChe2Bullish;
conditions.isCHE2Bearish = isCHE2Bearish; conditions.isChe2Bearish = isChe2Bearish;
conditions.isCHE2SwitchedToBullish = isCHE2SwitchedToBullish; conditions.isChe2SwitchedToBullish = isChe2SwitchedToBullish;
conditions.isCHE2SwitchedToBearish = isCHE2SwitchedToBearish; conditions.isChe2SwitchedToBearish = isChe2SwitchedToBearish;
conditions.isCHEBullish = isCHEBullish; conditions.isCheBullish = isCheBullish;
conditions.isCHEBearish = isCHEBearish; conditions.isCheBearish = isCheBearish;
conditions.isCHESwitchedToBullish = isCHESwitchedToBullish; conditions.isCheSwitchedToBullish = isCheSwitchedToBullish;
conditions.isCHESwitchedToBearish = isCHESwitchedToBearish; conditions.isCheSwitchedToBearish = isCheSwitchedToBearish;
// //
return result; return result;
@@ -3288,7 +3288,7 @@ class XC121SMCTradeHandler : public XCBaseAlert
// //
// Handle Last Executed Signal ... // Handle Last Executed Signal ...
HandleSignalExecuted(signal); HandleSignalExecuted(signal);
// //
// Alert Executed Signal ... // Alert Executed Signal ...
+196 -494
View File
@@ -387,27 +387,13 @@ bool DetectX121SMCXSTRPVSiganlSetup(
XPOIState visionState = visionConditions.state; XPOIState visionState = visionConditions.state;
// //
// Setup Conditions ... // Cycle X121Conditions ...
X121Conditions triggerXConditions = triggerConditions.x121Conditions;
// X121Conditions decisionXConditions = decisionConditions.x121Conditions;
// Waits for new Peak or Vale ... X121Conditions analyseXConditions = analyseConditions.x121Conditions;
X121Conditions verificationXConditions = verificationConditions.x121Conditions;
// X121Conditions consolidationXConditions = consolidationConditions.x121Conditions;
// Reading Previous Conditions ... X121Conditions visionXConditions = visionConditions.x121Conditions;
ENUM_XPOI_EVENTS consolidationPoiEventsPrev[];
ENUM_X_CYCLE_EVENTS consolidationCycleEventsPrev[];
X121SMCCycleConditions consolidationConditionsPrev;
result = consolidationCycleHelper.GetConditions(
consolidationCycleEventsPrev,
consolidationPoiEventsPrev,
consolidationConditionsPrev,
cIndex,
loopback //
);
if (!result)
{
return result;
}
// //
// Setup Conditions ... // Setup Conditions ...
@@ -430,7 +416,7 @@ bool DetectX121SMCXSTRPVSiganlSetup(
IsBearish(marketDir); IsBearish(marketDir);
// //
// Reading Bar State ... // Detect Bar State ...
// //
// Engulf ... // Engulf ...
@@ -526,370 +512,11 @@ bool DetectX121SMCXSTRPVSiganlSetup(
; ;
// //
// Read Slopes ... // Detect Price Zone ...
double rsiSlope = decisionConditions.x121Conditions.rsiSlope;
double strSlope = decisionConditions.x121Conditions.strSlope;
double atrUpperSlope = decisionConditions.x121Conditions.atrUpperSlope;
double atrLowerSlope = decisionConditions.x121Conditions.atrLowerSlope;
double vwapFastSlope = decisionConditions.x121Conditions.vwapFastSlope;
double vwapMidSlope = decisionConditions.x121Conditions.vwapMidSlope;
double vwapSlowSlope = decisionConditions.x121Conditions.vwapSlowSlope;
// //
bool isRsiSlopeBullish = decisionConditions.x121Conditions.isRsiSlopeBullish; double pzPeak = decisionConditions.x121Conditions.peaksBuffer[1];
bool isStrSlopeBullish = decisionConditions.x121Conditions.isStrSlopeBullish; double pzVale = decisionConditions.x121Conditions.valesBuffer[1];
bool isAtrUpperSlopeBullish = decisionConditions.x121Conditions.isAtrUpperSlopeBullish;
bool isAtrLowerSlopeBullish = decisionConditions.x121Conditions.isAtrLowerSlopeBullish;
bool isVwapFastSlopeBullish = decisionConditions.x121Conditions.isVwapFastSlopeBullish;
bool isVwapMidSlopeBullish = decisionConditions.x121Conditions.isVwapMidSlopeBullish;
bool isVwapSlowSlopeBullish = decisionConditions.x121Conditions.isVwapSlowSlopeBullish;
//
bool isRsiSlopeBearish = decisionConditions.x121Conditions.isRsiSlopeBearish;
bool isStrSlopeBearish = decisionConditions.x121Conditions.isStrSlopeBearish;
bool isAtrUpperSlopeBearish = decisionConditions.x121Conditions.isAtrUpperSlopeBearish;
bool isAtrLowerSlopeBearish = decisionConditions.x121Conditions.isAtrLowerSlopeBearish;
bool isVwapFastSlopeBearish = decisionConditions.x121Conditions.isVwapFastSlopeBearish;
bool isVwapMidSlopeBearish = decisionConditions.x121Conditions.isVwapMidSlopeBearish;
bool isVwapSlowSlopeBearish = decisionConditions.x121Conditions.isVwapSlowSlopeBearish;
//
bool isSlopesBullish =
isRsiSlopeBullish &&
isVwapMidSlopeBullish &&
isAtrUpperSlopeBullish &&
isAtrLowerSlopeBullish &&
isVwapFastSlopeBullish &&
isVwapSlowSlopeBullish;
//
bool isSlopesBearish =
isRsiSlopeBearish &&
isVwapMidSlopeBearish &&
isAtrUpperSlopeBearish &&
isAtrLowerSlopeBearish &&
isVwapFastSlopeBearish &&
isVwapSlowSlopeBearish;
//
// RSI ...
//
double rsiMult1 = 2;
double rsiMult2 = 2;
//
double rsi = decisionConditions.x121Conditions.rsiBuffer[1];
//
bool isRsiOverSold = decisionConditions.x121Conditions.isRsiOverSold;
bool isRsiOverBought = decisionConditions.x121Conditions.isRsiOverBought;
//
bool isRsiCrossedOverOverSold = decisionConditions.x121Conditions.isRsiCrossedOverOverSold;
bool isRsiCrossedUnderOverBought = decisionConditions.x121Conditions.isRsiCrossedUnderOverBought;
//
bool isRsiBullishFormed =
//
(rsiSlope > rsiMult2)
//
||
//
(rsiSlope > rsiMult1 &&
isRsiCrossedOverOverSold)
//
;
//
bool isRsiBearishFormed =
//
(rsiSlope < (-1 * rsiMult2))
//
||
//
(rsiSlope < (-1 * rsiMult1) &&
isRsiCrossedUnderOverBought)
//
;
//
// SAR ...
//
double sar = decisionConditions.x121Conditions.sarBuffer[1];
double sarPrev = decisionConditions.x121Conditions.sarBuffer[2];
//
bool isSarBullish = decisionConditions.x121Conditions.isSarBullish;
bool isSarBearish = decisionConditions.x121Conditions.isSarBearish;
//
bool isSarSwitchedToBullish = decisionConditions.x121Conditions.isSarSwitchedToBullish;
bool isSarSwitchedToBearish = decisionConditions.x121Conditions.isSarSwitchedToBearish;
//
bool isPrevSarBreakedUp = IsBarBreak(
sarPrev,
X_DIRECTION_BULLISH,
cBar //
);
bool isPrevSarBreakedDown = IsBarBreak(
sarPrev,
X_DIRECTION_BEARISH,
cBar //
);
//
// ATR ...
//
double atr = decisionConditions.x121Conditions.atrBuffer[1];
double atrUpper = decisionConditions.x121Conditions.atrUpperBuffer[1];
double atrLower = decisionConditions.x121Conditions.atrLowerBuffer[1];
//
bool isAtrUpperBullishSlope = atrUpperSlope > 0;
bool isAtrLowerBullishSlope = atrLowerSlope > 0;
//
bool isAtrUpperBearishSlope = atrUpperSlope < 0;
bool isAtrLowerBearishSlope = atrLowerSlope < 0;
//
bool isAtrBullishSlope = isAtrUpperBullishSlope &&
isAtrLowerBullishSlope;
bool isAtrBearishSlope = isAtrUpperBearishSlope &&
isAtrLowerBearishSlope;
//
// STR ...
//
double str = decisionConditions.x121Conditions.strBuffer[1];
//
bool isStrBullish = decisionConditions.x121Conditions.isStrBullish;
bool isStrBearish = decisionConditions.x121Conditions.isStrBearish;
//
bool isStrSwitchedToBullish = decisionConditions.x121Conditions.isStrSwitchedToBullish;
bool isStrSwitchedToBearish = decisionConditions.x121Conditions.isStrSwitchedToBearish;
//
// PV ...
//
double peak = decisionConditions.x121Conditions.peaksBuffer[1];
double vale = decisionConditions.x121Conditions.valesBuffer[1];
//
bool isPeakIncreasing = IsIncreasing(decisionConditions.x121Conditions.peaksBuffer);
bool isPeakDecreasing = IsDecreasing(decisionConditions.x121Conditions.peaksBuffer);
//
bool isValeIncreasing = IsIncreasing(decisionConditions.x121Conditions.valesBuffer);
bool isValeDecreasing = IsDecreasing(decisionConditions.x121Conditions.valesBuffer);
//
bool isPVIncreasing = (isPeakIncreasing &&
isValeIncreasing) &&
!(isPeakDecreasing &&
isValeDecreasing);
bool isPVDecreasing = (isPeakDecreasing &&
isValeDecreasing) &&
!(isPeakIncreasing &&
isValeIncreasing);
//
bool isNewPeak = decisionConditions.x121Conditions.isNewPeak;
bool isNewPeakOverLast = decisionConditions.x121Conditions.isNewPeakOverLast;
bool isNewPeakUnderLast = decisionConditions.x121Conditions.isNewPeakUnderLast;
//
bool isNewVale = decisionConditions.x121Conditions.isNewVale;
bool isNewValeOverLast = decisionConditions.x121Conditions.isNewValeOverLast;
bool isNewValeUnderLast = decisionConditions.x121Conditions.isNewValeUnderLast;
//
bool isPVBullishFormed =
isPVIncreasing ||
isNewPeakOverLast ||
isNewValeOverLast;
//
bool isPVBearishFormed =
isPVDecreasing ||
isNewPeakUnderLast ||
isNewValeUnderLast;
//
// VWAP ...
//
bool isVWapFastOverMid = decisionConditions.x121Conditions.isVWapFastOverMid;
bool isVWapFastUnderMid = decisionConditions.x121Conditions.isVWapFastUnderMid;
//
bool isVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState;
bool isVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState;
//
bool isVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState;
bool isVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState;
//
bool isVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered;
bool isVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered;
//
bool isVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
bool isVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
//
bool isVWapMinBreakedUp = decisionConditions.x121Conditions.isVWapMinBreakedUp;
bool isVWapMaxBreakedUp = decisionConditions.x121Conditions.isVWapMaxBreakedUp;
//
bool isVWapMinBreakedDown = decisionConditions.x121Conditions.isVWapMinBreakedDown;
bool isVWapMaxBreakedDown = decisionConditions.x121Conditions.isVWapMaxBreakedDown;
//
bool isVWapFastCrossedOverMid = decisionConditions.x121Conditions.isVWapFastCrossedOverMid;
bool isVWapFastCrossedUnderMid = decisionConditions.x121Conditions.isVWapFastCrossedUnderMid;
//
bool isVWapFastCrossedOverSlow = decisionConditions.x121Conditions.isVWapFastCrossedOverSlow;
bool isVWapFastCrossedUnderSlow = decisionConditions.x121Conditions.isVWapFastCrossedUnderSlow;
//
bool isClosedOverVWapMin = decisionConditions.x121Conditions.isClosedOverVWapMin;
bool isClosedUnderVWapMin = decisionConditions.x121Conditions.isClosedUnderVWapMin;
//
bool isClosedOverVWapMax = decisionConditions.x121Conditions.isClosedOverVWapMax;
bool isClosedUnderVWapMax = decisionConditions.x121Conditions.isClosedUnderVWapMax;
//
bool isVWapBullishSlope =
vwapFastSlope > 0 &&
vwapMidSlope > 0 &&
vwapSlowSlope > 0;
//
bool isVWapBearishSlope =
vwapFastSlope < 0 &&
vwapMidSlope < 0 &&
vwapSlowSlope < 0;
//
bool isVWapBullishFormed =
//
isVWapBullishSlope
//
&&
//
(
//
(isVWapBullishOrdered &&
isVWapSwitchedToBullishState)
//
||
//
(isVWapBullishState &&
isVWapSwitchedToBullishOrdered)
//
||
//
((isVWapMaxBreakedUp ||
isClosedOverVWapMax) &&
(isVWapFastCrossedOverMid ||
isVWapFastCrossedOverSlow))
//
)
//
;
//
bool isVWapBearishFormed =
//
isVWapBearishSlope
//
&&
//
(
//
(isVWapBearishOrdered &&
isVWapSwitchedToBearishState)
//
||
//
(isVWapBearishState &&
isVWapSwitchedToBearishOrdered)
//
||
//
((isVWapMinBreakedDown ||
isClosedUnderVWapMin) &&
(isVWapFastCrossedUnderMid ||
isVWapFastCrossedUnderSlow))
//
)
//
;
//
// Complext ...
//
bool isSarIncreased = decisionConditions.x121Conditions.isSarIncreased;
bool isSarDecreased = decisionConditions.x121Conditions.isSarDecreased;
bool isSarEqualsToPeak = decisionConditions.x121Conditions.isSarEqualsToPeak;
bool isSarEqualsToVale = decisionConditions.x121Conditions.isSarEqualsToVale;
bool isStrEqualsToPeak = decisionConditions.x121Conditions.isStrEqualsToPeak;
bool isStrEqualsToVale = decisionConditions.x121Conditions.isStrEqualsToVale;
bool isStrUpperOverPeak = decisionConditions.x121Conditions.isStrUpperOverPeak;
bool isPeakOverAtrUpper = decisionConditions.x121Conditions.isPeakOverAtrUpper;
bool isStrLowerOverVale = decisionConditions.x121Conditions.isStrLowerOverVale;
bool isBreakedUpPrevSar = decisionConditions.x121Conditions.isBreakedUpPrevSar;
bool isBreakedUpPrevStr = decisionConditions.x121Conditions.isBreakedUpPrevStr;
bool isStrLowerUnderVale = decisionConditions.x121Conditions.isStrLowerUnderVale;
bool isStrUpperUnderPeak = decisionConditions.x121Conditions.isStrUpperUnderPeak;
bool isValeUnderAtrLower = decisionConditions.x121Conditions.isValeUnderAtrLower;
bool isSarCrossedOverVale = decisionConditions.x121Conditions.isSarCrossedOverVale;
bool isStrCrossedOverVale = decisionConditions.x121Conditions.isStrCrossedOverVale;
bool isBreakedDownPrevStr = decisionConditions.x121Conditions.isBreakedDownPrevStr;
bool isBreakedDownPrevSar = decisionConditions.x121Conditions.isBreakedDownPrevSar;
bool isSarCrossedUnderPeak = decisionConditions.x121Conditions.isSarCrossedUnderPeak;
bool isStrCrossedUnderPeak = decisionConditions.x121Conditions.isStrCrossedUnderPeak;
bool isNewPeakOverAtrUpper = decisionConditions.x121Conditions.isNewPeakOverAtrUpper;
bool isNewValeUnderAtrLower = decisionConditions.x121Conditions.isNewValeUnderAtrLower;
bool isStrUpperOverAtrUpper = decisionConditions.x121Conditions.isStrUpperOverAtrUpper;
bool isStrLowerOverAtrLower = decisionConditions.x121Conditions.isStrLowerOverAtrLower;
bool isStrUpperUnderAtrUpper = decisionConditions.x121Conditions.isStrUpperUnderAtrUpper;
bool isStrLowerUnderAtrLower = decisionConditions.x121Conditions.isStrLowerUnderAtrLower;
bool isBreakedUpPrevAtrUpper = decisionConditions.x121Conditions.isBreakedUpPrevAtrUpper;
bool isBreakedUpPrevAtrLower = decisionConditions.x121Conditions.isBreakedUpPrevAtrLower;
bool isBreakedDownPrevAtrUpper = decisionConditions.x121Conditions.isBreakedDownPrevAtrUpper;
bool isBreakedDownPrevAtrLower = decisionConditions.x121Conditions.isBreakedDownPrevAtrLower;
bool isDonLowLowerEqualsToVale = decisionConditions.x121Conditions.isDonLowLowerEqualsToVale;
bool isStrUpperCrossedOverPeak = decisionConditions.x121Conditions.isStrUpperCrossedOverPeak;
bool isStrLowerCrossedOverVale = decisionConditions.x121Conditions.isStrLowerCrossedOverVale;
bool isStrLowerOverDonLowLower = decisionConditions.x121Conditions.isStrLowerOverDonLowLower;
bool isStrUpperOverDonHighUpper = decisionConditions.x121Conditions.isStrUpperOverDonHighUpper;
bool isStrLowerUnderDonLowLower = decisionConditions.x121Conditions.isStrLowerUnderDonLowLower;
bool isDonHighUpperEqualsToPeak = decisionConditions.x121Conditions.isDonHighUpperEqualsToPeak;
bool isStrUpperCrossedUnderPeak = decisionConditions.x121Conditions.isStrUpperCrossedUnderPeak;
bool isStrLowerCrossedUnderVale = decisionConditions.x121Conditions.isStrLowerCrossedUnderVale;
bool isStrUpperUnderDonHighUpper = decisionConditions.x121Conditions.isStrUpperUnderDonHighUpper;
bool isStrLowerCrossedOverAtrLower = decisionConditions.x121Conditions.isStrLowerCrossedOverAtrLower;
bool isStrUpperCrossedOverAtrUpper = decisionConditions.x121Conditions.isStrUpperCrossedOverAtrUpper;
bool isStrUpperCrossedUnderAtrUpper = decisionConditions.x121Conditions.isStrUpperCrossedUnderAtrUpper;
bool isStrLowerCrossedUnderAtrLower = decisionConditions.x121Conditions.isStrLowerCrossedUnderAtrLower;
bool isStrLowerCrossedOverDonLowLower = decisionConditions.x121Conditions.isStrLowerCrossedOverDonLowLower;
bool isStrUpperCrossedOverDonHighUpper = decisionConditions.x121Conditions.isStrUpperCrossedOverDonHighUpper;
bool isStrLowerCrossedUnderDonLowLower = decisionConditions.x121Conditions.isStrLowerCrossedUnderDonLowLower;
bool isStrUpperCrossedUnderDonHighUpper = decisionConditions.x121Conditions.isStrUpperCrossedUnderDonHighUpper;
// //
XPriceZones priceZones; XPriceZones priceZones;
@@ -914,107 +541,90 @@ bool DetectX121SMCXSTRPVSiganlSetup(
// //
isPriceZoneValidForPeak = isPriceZoneValidForPeak =
hasBoundary && hasBoundary &&
peak <= priceZonesUpper && pzPeak <= priceZonesUpper &&
peak >= priceZonesLower; pzPeak >= priceZonesLower;
// //
isPriceZoneValidForVale = isPriceZoneValidForVale =
hasBoundary && hasBoundary &&
vale <= priceZonesUpper && pzVale <= priceZonesUpper &&
vale >= priceZonesLower; pzVale >= priceZonesLower;
} }
// //
// //
// //
//
// Method 1 ...
// VWap Switch Start ...
//
bool bullishMethod1 =
//
isSarBullish &&
isStrBullish &&
isSlopesBullish &&
hasBullishTrend &&
cBar.IsBullish() &&
isAtrBullishSlope &&
isPVBullishFormed &&
isRsiBullishFormed &&
isVWapBullishFormed
//
;
//
bool bearishMethod1 =
//
isSarBearish &&
isStrBearish &&
isSlopesBearish &&
hasBearishTrend &&
cBar.IsBearish() &&
isAtrBearishSlope &&
isPVBearishFormed &&
isRsiBearishFormed &&
isVWapBearishFormed
//
;
//
// Method 2 ...
// PV Start ...
//
bool bullishMethod2 =
//
false
// isStrCrossedOverVale
//
;
//
bool bearishMethod2 =
//
!isNewVale &&
(
//
isStrCrossedUnderPeak
//
||
//
(isPrevSarBreakedDown &&
isStrSwitchedToBearish)
//
)
//
;
//
// //
// Summarize Conditions ... // Summarize Conditions ...
// //
isBullish = isBullish =
// //
// bullishMethod1 // Other Time Frames ...
// //
// ||
// //
bullishMethod2 // Consolidation ...
(consolidationXConditions.isCheBullish &&
consolidationXConditions.isStrBullish &&
consolidationXConditions.isSarBullish &&
consolidationXConditions.isClosedOverVWapMax) &&
//
// Analyse ...
(analyseXConditions.isCheBullish &&
analyseXConditions.isStrBullish &&
analyseXConditions.isSarBullish &&
analyseXConditions.isClosedOverVWapMax) &&
//
// Decision ...
hasBullishTrend &&
(
//
((decisionXConditions.isStrSwitchedToBullish &&
decisionXConditions.isCheBullish &&
decisionXConditions.isSarBullish) ||
(decisionXConditions.isCheSwitchedToBullish &&
decisionXConditions.isSarBullish &&
decisionXConditions.isStrBullish) ||
(decisionXConditions.isSarSwitchedToBullish &&
decisionXConditions.isCheBullish &&
decisionXConditions.isStrBullish))
//
)
// //
; ;
// //
isBearish = isBearish =
// //
// bearishMethod1 // Other Time Frames ...
// //
// ||
// //
bearishMethod2 // Consolidation ...
(consolidationXConditions.isCheBearish &&
consolidationXConditions.isStrBearish &&
consolidationXConditions.isSarBearish &&
consolidationXConditions.isClosedUnderVWapMax) &&
//
// Analyse ...
(analyseXConditions.isCheBearish &&
analyseXConditions.isStrBearish &&
analyseXConditions.isSarBearish &&
analyseXConditions.isClosedUnderVWapMax) &&
//
// Decision ...
hasBearishTrend &&
(
//
((decisionXConditions.isStrSwitchedToBearish &&
decisionXConditions.isCheBearish &&
decisionXConditions.isSarBearish) ||
(decisionXConditions.isCheSwitchedToBearish &&
decisionXConditions.isSarBearish &&
decisionXConditions.isStrBearish) ||
(decisionXConditions.isSarSwitchedToBearish &&
decisionXConditions.isCheBearish &&
decisionXConditions.isStrBearish))
//
)
// //
; ;
@@ -1027,10 +637,10 @@ bool DetectX121SMCXSTRPVSiganlSetup(
} }
// //
conditions.point = conditions.pivot =
isBullish isBullish
? vale ? pzVale
: peak; : pzPeak;
conditions.setupTime = cTime; conditions.setupTime = cTime;
conditions.dir = conditions.dir =
isBullish isBullish
@@ -1262,26 +872,42 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
XPOIState consolidationState = consolidationConditions.state; XPOIState consolidationState = consolidationConditions.state;
XPOIState visionState = visionConditions.state; XPOIState visionState = visionConditions.state;
//
// Cycle X121Conditions ...
X121Conditions triggerXConditions = triggerConditions.x121Conditions;
X121Conditions decisionXConditions = decisionConditions.x121Conditions;
X121Conditions analyseXConditions = analyseConditions.x121Conditions;
X121Conditions verificationXConditions = verificationConditions.x121Conditions;
X121Conditions consolidationXConditions = consolidationConditions.x121Conditions;
X121Conditions visionXConditions = visionConditions.x121Conditions;
// //
// Trigger Conditions ... // Trigger Conditions ...
// //
// SAR ... // SAR ...
double sar = decisionConditions.x121Conditions.sarBuffer[1]; double sar = decisionXConditions.sarBuffer[1];
// //
// STR ... // STR ...
double str = decisionConditions.x121Conditions.strBuffer[1]; double str = decisionXConditions.strBuffer[1];
//
// CHE ...
double le1 = decisionXConditions.le1Buffer[1];
double le2 = decisionXConditions.le2Buffer[1];
double se1 = decisionXConditions.se1Buffer[1];
double se2 = decisionXConditions.se2Buffer[1];
// //
// ATR ... // ATR ...
double atrUpper = decisionConditions.x121Conditions.atrUpperBuffer[1]; double atrUpper = decisionXConditions.atrUpperBuffer[1];
double atrLower = decisionConditions.x121Conditions.atrLowerBuffer[1]; double atrLower = decisionXConditions.atrLowerBuffer[1];
// //
// PV ... // PV ...
double peak = decisionConditions.x121Conditions.peaksBuffer[1]; double peak = decisionXConditions.peaksBuffer[1];
double vale = decisionConditions.x121Conditions.valesBuffer[1]; double vale = decisionXConditions.valesBuffer[1];
// //
int higherPeakIDX = -1; int higherPeakIDX = -1;
@@ -1301,6 +927,47 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
vale // vale //
); );
//
// Slopes ...
//
bool isRsiSlopeBullish = decisionXConditions.isRsiSlopeBullish;
bool isStrSlopeBullish = decisionXConditions.isStrSlopeBullish;
bool isAtrUpperSlopeBullish = decisionXConditions.isAtrUpperSlopeBullish;
bool isAtrLowerSlopeBullish = decisionXConditions.isAtrLowerSlopeBullish;
bool isVwapFastSlopeBullish = decisionXConditions.isVwapFastSlopeBullish;
bool isVwapMidSlopeBullish = decisionXConditions.isVwapMidSlopeBullish;
bool isVwapSlowSlopeBullish = decisionXConditions.isVwapSlowSlopeBullish;
//
bool isRsiSlopeBearish = decisionXConditions.isRsiSlopeBearish;
bool isStrSlopeBearish = decisionXConditions.isStrSlopeBearish;
bool isAtrUpperSlopeBearish = decisionXConditions.isAtrUpperSlopeBearish;
bool isAtrLowerSlopeBearish = decisionXConditions.isAtrLowerSlopeBearish;
bool isVwapFastSlopeBearish = decisionXConditions.isVwapFastSlopeBearish;
bool isVwapMidSlopeBearish = decisionXConditions.isVwapMidSlopeBearish;
bool isVwapSlowSlopeBearish = decisionXConditions.isVwapSlowSlopeBearish;
//
bool isSlopesBullish =
isRsiSlopeBullish &&
isStrSlopeBullish &&
isAtrUpperSlopeBullish &&
isAtrLowerSlopeBullish &&
isVwapFastSlopeBullish &&
isVwapMidSlopeBullish &&
isVwapSlowSlopeBullish;
//
bool isSlopesBearish =
isRsiSlopeBearish &&
isStrSlopeBearish &&
isAtrUpperSlopeBearish &&
isAtrLowerSlopeBearish &&
isVwapFastSlopeBearish &&
isVwapMidSlopeBearish &&
isVwapSlowSlopeBearish;
// //
double point = conditions.point; double point = conditions.point;
bool isPointBreak = IsBarBreak( bool isPointBreak = IsBarBreak(
@@ -1310,31 +977,26 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
); );
// //
// Detect Bullish Conditions ... // Summary ...
//
isBullish = isBullish =
// //
isBullish && isBullish &&
isPointBreak && isPointBreak &&
isSlopesBullish &&
cBar.IsBullish() cBar.IsBullish()
// //
// &&
// //
// false
//
; ;
// //
// Detect Bearish Conditions ...
isBearish = isBearish =
// //
isBearish && isBearish &&
isPointBreak && isPointBreak &&
isSlopesBearish &&
cBar.IsBearish() cBar.IsBearish()
// //
// &&
// //
// false
//
; ;
// //
@@ -1512,11 +1174,11 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
sls // sls //
); );
// // //
Add( // Add(
vale, // vale,
sls // // sls //
); // );
// //
if (bullishMomentumBar.IsValid()) if (bullishMomentumBar.IsValid())
@@ -1528,12 +1190,32 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
); );
} }
// //
// if (IsValidIndex(lowerValeIDX))
// {
// //
// Add(
// lowerVale,
// sls //
// );
// }
// //
if (IsValidIndex(lowerValeIDX)) if (le1 != EMPTY_VALUE)
{ {
// //
Add( Add(
lowerVale, le1,
sls //
);
}
//
if (le2 != EMPTY_VALUE)
{
//
Add(
le2,
sls // sls //
); );
} }
@@ -1546,11 +1228,11 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
sls // sls //
); );
// // //
Add( // Add(
peak, // peak,
sls // // sls //
); // );
// //
if (bearishMomentumBar.IsValid()) if (bearishMomentumBar.IsValid())
@@ -1563,11 +1245,31 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
} }
// //
if (IsValidIndex(higherPeakIDX)) // if (IsValidIndex(higherPeakIDX))
// {
// //
// Add(
// higherPeak,
// sls //
// );
// }
//
if (se1 != EMPTY_VALUE)
{ {
// //
Add( Add(
higherPeak, se1,
sls //
);
}
//
if (se2 != EMPTY_VALUE)
{
//
Add(
se2,
sls // sls //
); );
} }
@@ -1261,7 +1261,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
bool showAll = false; bool showAll = false;
// //
x121Inputs.showRSI = false; x121Inputs.showRSI = true;
// //
bool isInited = false; bool isInited = false;
@@ -1286,8 +1286,8 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
// //
// XATR ... // XATR ...
x121Inputs.xatrInputs.showATRUpper = showAll || false; x121Inputs.xatrInputs.showATRUpper = showAll || true;
x121Inputs.xatrInputs.showATRLower = showAll || false; x121Inputs.xatrInputs.showATRLower = showAll || true;
// //
// XSTR ... // XSTR ...
@@ -1311,9 +1311,9 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
// //
// XVWAP ... // XVWAP ...
x121Inputs.xvwapInputs.showVWapFast = showAll || false; x121Inputs.xvwapInputs.showVWapFast = showAll || true;
x121Inputs.xvwapInputs.showVWapMedium = showAll || false; x121Inputs.xvwapInputs.showVWapMedium = showAll || true;
x121Inputs.xvwapInputs.showVWapSlow = showAll || false; x121Inputs.xvwapInputs.showVWapSlow = showAll || true;
// //
// Initialize Cycle Helpers ... // Initialize Cycle Helpers ...