This commit is contained in:
2025-01-15 11:53:34 +03:30
parent 56cd60e31d
commit 341992374c
6 changed files with 737 additions and 145 deletions
+9 -9
View File
@@ -44,15 +44,15 @@ input string eaSymbols = "EURUSDb,GBPUSDb,USDJPYb,USDCHFb"; // Trading Symbols
// //
// Signalling ... // Signalling ...
input group "Signalling"; input group "Signalling";
input bool eaAllowLong = true; // Allow Long Signals input bool eaAllowLong = true; // Allow Long Signals
input bool eaAllowShort = true; // Allow Short Signals input bool eaAllowShort = true; // Allow Short Signals
input int eaMaxAllowedLongs = 5; // Max Allowed Long Signals input int eaMaxAllowedLongs = 5; // Max Allowed Long Signals
input int eaMaxAllowedShorts = 5; // Max Allowed Short Signals input int eaMaxAllowedShorts = 5; // Max Allowed Short Signals
input bool eaUseMaxAllowedSignalsPerSymbol = true; // Use Max Allowed Signal Types Per Symbol input bool eaUseMaxAllowedSignalsPerSymbol = true; // Use Max Allowed Signal Types Per Symbol
input double eaLastPositionProfitForAcceptNextInPoint = 30; // Last Position Profit In Points for Accept new Signal input double eaLastPositionProfitForAcceptNextInPoint = 0; // Last Position Profit In Points for Accept new Signal
input int eaDelaysBetweenTwoSignalsInBar = 100; // Delay between two Signals in Bars input int eaDelaysBetweenTwoSignalsInBar = 0; // Delay between two Signals in Bars
input double eaMaxAllowedSpread = 25; // Max Allowed Spread for Signalling input double eaMaxAllowedSpread = 25; // Max Allowed Spread for Signalling
input int eaMinRequiredVerificationForSpreadPass = 20; // Minimum Spread Verification for Signalling input int eaMinRequiredVerificationForSpreadPass = 20; // Minimum Spread Verification for Signalling
// //
// Trade ... // Trade ...
+195 -16
View File
@@ -237,10 +237,10 @@ struct X121Conditions
bool isRsiCrossedOverOverSold; bool isRsiCrossedOverOverSold;
// //
bool isCloseOverAtrUpper; bool isClosedOverAtrUpper;
bool isCloseOverAtrLower; bool isClosedOverAtrLower;
bool isCloseUnderAtrUpper; bool isClosedUnderAtrUpper;
bool isCloseUnderAtrLower; bool isClosedUnderAtrLower;
// //
bool isRejectUpAtrUpper; bool isRejectUpAtrUpper;
@@ -349,9 +349,25 @@ struct X121Conditions
// //
// Complex Conditions ... // Complex Conditions ...
double cheMin;
double cheMax;
double vwapMin; double vwapMin;
double vwapMax; double vwapMax;
//
bool isBreakedUpPrevCheMin;
bool isBreakedUpPrevCheMax;
bool isBreakedDownPrevCheMin;
bool isBreakedDownPrevCheMax;
bool isBreakedUpPrevCheLE1;
bool isBreakedUpPrevCheLE2;
bool isBreakedUpPrevCheSE1;
bool isBreakedUpPrevCheSE2;
bool isBreakedDownPrevCheLE1;
bool isBreakedDownPrevCheLE2;
bool isBreakedDownPrevCheSE1;
bool isBreakedDownPrevCheSE2;
// //
bool isSarIncreased; bool isSarIncreased;
bool isSarDecreased; bool isSarDecreased;
@@ -473,11 +489,13 @@ struct X121Conditions
bool isStrLowerCrossedUnderDonLowLower; bool isStrLowerCrossedUnderDonLowLower;
// //
bool isAtrUpperOverPeak;
bool isAtrUpperEqualsToPeak; bool isAtrUpperEqualsToPeak;
bool isAtrUpperCrossedUpPeak; bool isAtrUpperCrossedUpPeak;
bool isAtrUpperCrossedDownPeak; bool isAtrUpperCrossedDownPeak;
// //
bool isAtrLowerUnderVale;
bool isAtrLowerEqualsToVale; bool isAtrLowerEqualsToVale;
bool isAtrLowerCrossedUpVale; bool isAtrLowerCrossedUpVale;
bool isAtrLowerCrossedDownVale; bool isAtrLowerCrossedDownVale;
@@ -607,6 +625,8 @@ struct X121Conditions
ArraySetAsSeries(donCloseLowerBuffer, true); ArraySetAsSeries(donCloseLowerBuffer, true);
// //
cheMin = 0;
cheMax = 0;
vwapMin = 0; vwapMin = 0;
vwapMax = 0; vwapMax = 0;
@@ -659,12 +679,12 @@ struct X121Conditions
// ATR ... // ATR ...
// //
isCloseOverAtrUpper = false; isClosedOverAtrUpper = false;
isCloseOverAtrLower = false; isClosedOverAtrLower = false;
// //
isCloseUnderAtrUpper = false; isClosedUnderAtrUpper = false;
isCloseUnderAtrLower = false; isClosedUnderAtrLower = false;
// //
isRejectUpAtrUpper = false; isRejectUpAtrUpper = false;
@@ -858,6 +878,20 @@ struct X121Conditions
isBreakedUpPrevAtrLower = false; isBreakedUpPrevAtrLower = false;
isBreakedDownPrevAtrLower = false; isBreakedDownPrevAtrLower = false;
//
isBreakedUpPrevCheMin = false;
isBreakedUpPrevCheMax = false;
isBreakedDownPrevCheMin = false;
isBreakedDownPrevCheMax = false;
isBreakedUpPrevCheLE1 = false;
isBreakedUpPrevCheLE2 = false;
isBreakedUpPrevCheSE1 = false;
isBreakedUpPrevCheSE2 = false;
isBreakedDownPrevCheLE1 = false;
isBreakedDownPrevCheLE2 = false;
isBreakedDownPrevCheSE1 = false;
isBreakedDownPrevCheSE2 = false;
// //
isSarIncreased = false; isSarIncreased = false;
isSarDecreased = false; isSarDecreased = false;
@@ -899,11 +933,13 @@ struct X121Conditions
isStrLowerUnderVale = false; isStrLowerUnderVale = false;
// //
isAtrUpperOverPeak = false;
isAtrUpperEqualsToPeak = false; isAtrUpperEqualsToPeak = false;
isAtrUpperCrossedUpPeak = false; isAtrUpperCrossedUpPeak = false;
isAtrUpperCrossedDownPeak = false; isAtrUpperCrossedDownPeak = false;
// //
isAtrLowerUnderVale = false;
isAtrLowerEqualsToVale = false; isAtrLowerEqualsToVale = false;
isAtrLowerCrossedUpVale = false; isAtrLowerCrossedUpVale = false;
isAtrLowerCrossedDownVale = false; isAtrLowerCrossedDownVale = false;
@@ -1055,10 +1091,10 @@ struct X121Conditions
"-----------------------" + separator + "-----------------------" + separator +
"ATR ..." + separator + "ATR ..." + separator +
"-----------------------" + separator + "-----------------------" + separator +
ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) + ToString("isClosedOverAtrUpper", isClosedOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) + ToString("isClosedOverAtrLower", isClosedOverAtrLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) + ToString("isClosedUnderAtrUpper", isClosedUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) + ToString("isClosedUnderAtrLower", isClosedUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) + ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) + ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) + ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) +
@@ -1165,6 +1201,8 @@ struct X121Conditions
ToString("isVWapMaxBreakedUp", isVWapMaxBreakedUp, ignoreFalseConditions, separator) + ToString("isVWapMaxBreakedUp", isVWapMaxBreakedUp, ignoreFalseConditions, separator) +
ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) + ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) +
ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) + ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) +
ToString("isAtrUpperOverPeak", isAtrUpperOverPeak, ignoreFalseConditions, separator) +
ToString("isAtrLowerUnderVale", isAtrLowerUnderVale, ignoreFalseConditions, separator) +
ToString("isClosedOverVWapMin", isClosedOverVWapMin, ignoreFalseConditions, separator) + ToString("isClosedOverVWapMin", isClosedOverVWapMin, ignoreFalseConditions, separator) +
ToString("isClosedOverVWapMax", isClosedOverVWapMax, ignoreFalseConditions, separator) + ToString("isClosedOverVWapMax", isClosedOverVWapMax, ignoreFalseConditions, separator) +
ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) + ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) +
@@ -1178,14 +1216,26 @@ struct X121Conditions
ToString("isBreakedDownPrevStr", isBreakedDownPrevStr, ignoreFalseConditions, separator) + ToString("isBreakedDownPrevStr", isBreakedDownPrevStr, ignoreFalseConditions, separator) +
ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) + ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) +
ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) + ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheLE1", isBreakedUpPrevCheLE1, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheLE2", isBreakedUpPrevCheLE2, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheSE1", isBreakedUpPrevCheSE1, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheSE2", isBreakedUpPrevCheSE2, ignoreFalseConditions, separator) +
ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) + ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) +
ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) + ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) +
ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) + ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheMin", isBreakedUpPrevCheMin, ignoreFalseConditions, separator) +
ToString("isBreakedUpPrevCheMax", isBreakedUpPrevCheMax, ignoreFalseConditions, separator) +
ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) + ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) + ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) + ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) +
ToString("isAtrUpperEqualsToPeak", isAtrUpperEqualsToPeak, ignoreFalseConditions, separator) + ToString("isAtrUpperEqualsToPeak", isAtrUpperEqualsToPeak, ignoreFalseConditions, separator) +
ToString("isAtrLowerEqualsToVale", isAtrLowerEqualsToVale, ignoreFalseConditions, separator) + ToString("isAtrLowerEqualsToVale", isAtrLowerEqualsToVale, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheMin", isBreakedDownPrevCheMin, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheMax", isBreakedDownPrevCheMax, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheLE1", isBreakedDownPrevCheLE1, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheLE2", isBreakedDownPrevCheLE2, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheSE1", isBreakedDownPrevCheSE1, ignoreFalseConditions, separator) +
ToString("isBreakedDownPrevCheSE2", isBreakedDownPrevCheSE2, ignoreFalseConditions, separator) +
ToString("isAtrUpperCrossedUpPeak", isAtrUpperCrossedUpPeak, ignoreFalseConditions, separator) + ToString("isAtrUpperCrossedUpPeak", isAtrUpperCrossedUpPeak, ignoreFalseConditions, separator) +
ToString("isAtrLowerCrossedUpVale", isAtrLowerCrossedUpVale, ignoreFalseConditions, separator) + ToString("isAtrLowerCrossedUpVale", isAtrLowerCrossedUpVale, ignoreFalseConditions, separator) +
ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) + ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) +
@@ -1893,14 +1943,14 @@ class XCX121Helper : public XCBase
conditions.isRsiOverBought = xatrConditions.isRsiOverBought; conditions.isRsiOverBought = xatrConditions.isRsiOverBought;
conditions.isBreakUpAtrUpper = xatrConditions.isBreakUpAtrUpper; conditions.isBreakUpAtrUpper = xatrConditions.isBreakUpAtrUpper;
conditions.isBreakUpAtrLower = xatrConditions.isBreakUpAtrLower; conditions.isBreakUpAtrLower = xatrConditions.isBreakUpAtrLower;
conditions.isCloseOverAtrUpper = xatrConditions.isCloseOverAtrUpper; conditions.isClosedOverAtrUpper = xatrConditions.isClosedOverAtrUpper;
conditions.isRejectUpAtrUpper = xatrConditions.isRejectUpAtrUpper; conditions.isRejectUpAtrUpper = xatrConditions.isRejectUpAtrUpper;
conditions.isRejectUpAtrLower = xatrConditions.isRejectUpAtrLower; conditions.isRejectUpAtrLower = xatrConditions.isRejectUpAtrLower;
conditions.isCloseOverAtrLower = xatrConditions.isCloseOverAtrLower; conditions.isClosedOverAtrLower = xatrConditions.isClosedOverAtrLower;
conditions.isBreakDownAtrUpper = xatrConditions.isBreakDownAtrUpper; conditions.isBreakDownAtrUpper = xatrConditions.isBreakDownAtrUpper;
conditions.isBreakDownAtrLower = xatrConditions.isBreakDownAtrLower; conditions.isBreakDownAtrLower = xatrConditions.isBreakDownAtrLower;
conditions.isCloseUnderAtrUpper = xatrConditions.isCloseUnderAtrUpper; conditions.isClosedUnderAtrUpper = xatrConditions.isClosedUnderAtrUpper;
conditions.isCloseUnderAtrLower = xatrConditions.isCloseUnderAtrLower; conditions.isClosedUnderAtrLower = xatrConditions.isClosedUnderAtrLower;
conditions.isRejectDownAtrUpper = xatrConditions.isRejectDownAtrUpper; conditions.isRejectDownAtrUpper = xatrConditions.isRejectDownAtrUpper;
conditions.isRejectDownAtrLower = xatrConditions.isRejectDownAtrLower; conditions.isRejectDownAtrLower = xatrConditions.isRejectDownAtrLower;
conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold; conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold;
@@ -2325,9 +2375,52 @@ class XCX121Helper : public XCBase
// //
double prevSar = conditions.sarBuffer[pIDX]; double prevSar = conditions.sarBuffer[pIDX];
double prevStr = conditions.strBuffer[pIDX]; double prevStr = conditions.strBuffer[pIDX];
double prevCheLE1 = conditions.le1Buffer[pIDX];
double prevCheLE2 = conditions.le2Buffer[pIDX];
double prevCheSE1 = conditions.se1Buffer[pIDX];
double prevCheSE2 = conditions.se2Buffer[pIDX];
double prevAtrUpper = conditions.atrUpperBuffer[pIDX]; double prevAtrUpper = conditions.atrUpperBuffer[pIDX];
double prevAtrLower = conditions.atrLowerBuffer[pIDX]; double prevAtrLower = conditions.atrLowerBuffer[pIDX];
//
double ches[];
if (prevCheLE1 != EMPTY_VALUE)
{
//
Add(
prevCheLE1,
ches //
);
}
if (prevCheLE2 != EMPTY_VALUE)
{
//
Add(
prevCheLE2,
ches //
);
}
if (prevCheSE1 != EMPTY_VALUE)
{
//
Add(
prevCheSE1,
ches //
);
}
if (prevCheSE2 != EMPTY_VALUE)
{
//
Add(
prevCheSE2,
ches //
);
}
//
double cheMin = GetMin(ches);
double cheMax = GetMax(ches);
// //
bool isBreakedUpPrevSar = IsBarBreak( bool isBreakedUpPrevSar = IsBarBreak(
prevSar, prevSar,
@@ -2376,6 +2469,74 @@ class XCX121Helper : public XCBase
cBar // cBar //
); );
//
bool isBreakedUpPrevCheLE1 = IsBarBreak(
prevCheLE1,
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakedUpPrevCheLE2 = IsBarBreak(
prevCheLE2,
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakedUpPrevCheSE1 = IsBarBreak(
prevCheSE1,
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakedUpPrevCheSE2 = IsBarBreak(
prevCheSE2,
X_DIRECTION_BULLISH,
cBar //
);
//
bool isBreakedDownPrevCheLE1 = IsBarBreak(
prevCheLE1,
X_DIRECTION_BEARISH,
cBar //
);
bool isBreakedDownPrevCheLE2 = IsBarBreak(
prevCheLE2,
X_DIRECTION_BEARISH,
cBar //
);
bool isBreakedDownPrevCheSE1 = IsBarBreak(
prevCheSE1,
X_DIRECTION_BEARISH,
cBar //
);
bool isBreakedDownPrevCheSE2 = IsBarBreak(
prevCheSE2,
X_DIRECTION_BEARISH,
cBar //
);
//
bool isBreakedUpPrevCheMin = IsBarBreak(
cheMin,
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakedDownPrevCheMin = IsBarBreak(
cheMin,
X_DIRECTION_BEARISH,
cBar //
);
//
bool isBreakedUpPrevCheMax = IsBarBreak(
cheMax,
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakedDownPrevCheMax = IsBarBreak(
cheMax,
X_DIRECTION_BEARISH,
cBar //
);
// //
bool isSarCrossedUnderPeak = bool isSarCrossedUnderPeak =
conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] && conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
@@ -2519,6 +2680,7 @@ class XCX121Helper : public XCBase
!isStrLowerUnderDonLowLowerPrev; !isStrLowerUnderDonLowLowerPrev;
// //
bool isAtrUpperOverPeak = conditions.atrUpperBuffer[cIDX] > conditions.peaksBuffer[cIDX];
bool isAtrUpperEqualsToPeak = conditions.atrUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX]; bool isAtrUpperEqualsToPeak = conditions.atrUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX];
// //
@@ -2528,6 +2690,7 @@ class XCX121Helper : public XCBase
!(conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX]); !(conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX]);
// //
bool isAtrLowerUnderVale = conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX];
bool isAtrLowerEqualsToVale = conditions.atrUpperBuffer[cIDX] == conditions.valesBuffer[cIDX]; bool isAtrLowerEqualsToVale = conditions.atrUpperBuffer[cIDX] == conditions.valesBuffer[cIDX];
// //
@@ -2537,6 +2700,8 @@ class XCX121Helper : public XCBase
!(conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]); !(conditions.atrUpperBuffer[cIDX] < conditions.valesBuffer[cIDX]);
// //
conditions.cheMin = cheMin;
conditions.cheMax = cheMax;
conditions.vwapMin = vwapMin; conditions.vwapMin = vwapMin;
conditions.vwapMax = vwapMax; conditions.vwapMax = vwapMax;
@@ -2554,6 +2719,8 @@ class XCX121Helper : public XCBase
conditions.isVWapMaxBreakedUp = isVWapMaxBreakedUp; conditions.isVWapMaxBreakedUp = isVWapMaxBreakedUp;
conditions.isBreakedUpPrevSar = isBreakedUpPrevSar; conditions.isBreakedUpPrevSar = isBreakedUpPrevSar;
conditions.isBreakedUpPrevStr = isBreakedUpPrevStr; conditions.isBreakedUpPrevStr = isBreakedUpPrevStr;
conditions.isAtrUpperOverPeak = isAtrUpperOverPeak;
conditions.isAtrLowerUnderVale = isAtrLowerUnderVale;
conditions.isStrLowerUnderVale = isStrLowerUnderVale; conditions.isStrLowerUnderVale = isStrLowerUnderVale;
conditions.isStrUpperUnderPeak = isStrUpperUnderPeak; conditions.isStrUpperUnderPeak = isStrUpperUnderPeak;
conditions.isValeUnderAtrLower = isValeUnderAtrLower; conditions.isValeUnderAtrLower = isValeUnderAtrLower;
@@ -2570,11 +2737,23 @@ class XCX121Helper : public XCBase
conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak; conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak;
conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak; conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak;
conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper; conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper;
conditions.isBreakedUpPrevCheLE1 = isBreakedUpPrevCheLE1;
conditions.isBreakedUpPrevCheLE2 = isBreakedUpPrevCheLE2;
conditions.isBreakedUpPrevCheSE1 = isBreakedUpPrevCheSE1;
conditions.isBreakedUpPrevCheSE2 = isBreakedUpPrevCheSE2;
conditions.isBreakedUpPrevCheMin = isBreakedUpPrevCheMin;
conditions.isBreakedUpPrevCheMax = isBreakedUpPrevCheMax;
conditions.isAtrUpperEqualsToPeak = isAtrUpperEqualsToPeak; conditions.isAtrUpperEqualsToPeak = isAtrUpperEqualsToPeak;
conditions.isAtrLowerEqualsToVale = isAtrLowerEqualsToVale; conditions.isAtrLowerEqualsToVale = isAtrLowerEqualsToVale;
conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower; conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower;
conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper; conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper;
conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower; conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower;
conditions.isBreakedDownPrevCheMin = isBreakedDownPrevCheMin;
conditions.isBreakedDownPrevCheMax = isBreakedDownPrevCheMax;
conditions.isBreakedDownPrevCheLE1 = isBreakedDownPrevCheLE1;
conditions.isBreakedDownPrevCheLE2 = isBreakedDownPrevCheLE2;
conditions.isBreakedDownPrevCheSE1 = isBreakedDownPrevCheSE1;
conditions.isBreakedDownPrevCheSE2 = isBreakedDownPrevCheSE2;
conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper; conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper;
conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower; conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower;
conditions.isBreakedUpPrevAtrUpper = isBreakedUpPrevAtrUpper; conditions.isBreakedUpPrevAtrUpper = isBreakedUpPrevAtrUpper;
+20 -20
View File
@@ -210,12 +210,12 @@ struct X121XATRConditions
// ATR ... // ATR ...
// //
bool isCloseOverAtrUpper; bool isClosedOverAtrUpper;
bool isCloseOverAtrLower; bool isClosedOverAtrLower;
// //
bool isCloseUnderAtrUpper; bool isClosedUnderAtrUpper;
bool isCloseUnderAtrLower; bool isClosedUnderAtrLower;
// //
bool isRejectUpAtrUpper; bool isRejectUpAtrUpper;
@@ -296,12 +296,12 @@ struct X121XATRConditions
// ATR ... // ATR ...
// //
isCloseOverAtrUpper = false; isClosedOverAtrUpper = false;
isCloseOverAtrLower = false; isClosedOverAtrLower = false;
// //
isCloseUnderAtrUpper = false; isClosedUnderAtrUpper = false;
isCloseUnderAtrLower = false; isClosedUnderAtrLower = false;
// //
isRejectUpAtrUpper = false; isRejectUpAtrUpper = false;
@@ -402,10 +402,10 @@ struct X121XATRConditions
ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) + ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) +
// //
// ATR ... // ATR ...
ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) + ToString("isClosedOverAtrUpper", isClosedOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) + ToString("isClosedOverAtrLower", isClosedOverAtrLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) + ToString("isClosedUnderAtrUpper", isClosedUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) + ToString("isClosedUnderAtrLower", isClosedUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) + ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) + ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) + ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) +
@@ -1022,12 +1022,12 @@ class XCX121XATRHelper : public XCBaseHelper
// ATR ... // ATR ...
// //
bool isCloseOverAtrUpper = cBar.close > conditions.atrUpperBuffer[cIDX]; bool isClosedOverAtrUpper = cBar.close > conditions.atrUpperBuffer[cIDX];
bool isCloseOverAtrLower = cBar.close > conditions.atrLowerBuffer[cIDX]; bool isClosedOverAtrLower = cBar.close > conditions.atrLowerBuffer[cIDX];
// //
bool isCloseUnderAtrUpper = cBar.close < conditions.atrUpperBuffer[cIDX]; bool isClosedUnderAtrUpper = cBar.close < conditions.atrUpperBuffer[cIDX];
bool isCloseUnderAtrLower = cBar.close < conditions.atrLowerBuffer[cIDX]; bool isClosedUnderAtrLower = cBar.close < conditions.atrLowerBuffer[cIDX];
// //
bool isRejectUpAtrUpper = IsBarReject( bool isRejectUpAtrUpper = IsBarReject(
@@ -1088,12 +1088,12 @@ class XCX121XATRHelper : public XCBaseHelper
conditions.isBreakUpAtrLower = isBreakUpAtrLower; conditions.isBreakUpAtrLower = isBreakUpAtrLower;
conditions.isRejectDownAtrUpper = isRejectDownAtrUpper; conditions.isRejectDownAtrUpper = isRejectDownAtrUpper;
conditions.isRejectDownAtrLower = isRejectDownAtrLower; conditions.isRejectDownAtrLower = isRejectDownAtrLower;
conditions.isCloseOverAtrUpper = isCloseOverAtrUpper; conditions.isClosedOverAtrUpper = isClosedOverAtrUpper;
conditions.isCloseOverAtrLower = isCloseOverAtrLower; conditions.isClosedOverAtrLower = isClosedOverAtrLower;
conditions.isBreakDownAtrUpper = isBreakDownAtrUpper; conditions.isBreakDownAtrUpper = isBreakDownAtrUpper;
conditions.isBreakDownAtrLower = isBreakDownAtrLower; conditions.isBreakDownAtrLower = isBreakDownAtrLower;
conditions.isCloseUnderAtrUpper = isCloseUnderAtrUpper; conditions.isClosedUnderAtrUpper = isClosedUnderAtrUpper;
conditions.isCloseUnderAtrLower = isCloseUnderAtrLower; conditions.isClosedUnderAtrLower = isClosedUnderAtrLower;
conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold; conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold;
conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold; conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold;
conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought; conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought;
@@ -3272,18 +3272,6 @@ class XC121SMCTradeHandler : public XCBaseAlert
// //
XCSignalObject *iObj; XCSignalObject *iObj;
mDrawer.DrawSignal(signal, iObj); mDrawer.DrawSignal(signal, iObj);
//
XCBaseObject *conditionsObjects[];
DrawX121SMCStrategyConditions(
conditions,
conditionsObjects,
mDrawer,
false,
true, // Analyse Price Zones ...
false, // Decision Zone ...
true // Only Box ...
);
} }
// //
+500 -83
View File
@@ -52,6 +52,11 @@ struct X121SMCStrategyXSTRPVSignalConditions
double pivot; double pivot;
double point; double point;
//
XPriceZones priceZone;
bool isPriceZoneValidForPeak;
bool isPriceZoneValidForVale;
// //
// Constructor ... // Constructor ...
X121SMCStrategyXSTRPVSignalConditions() X121SMCStrategyXSTRPVSignalConditions()
@@ -169,6 +174,11 @@ struct X121SMCStrategyXSTRPVSignalConditions
// //
pivot = 0; pivot = 0;
point = 0; point = 0;
//
priceZone.Clean();
isPriceZoneValidForPeak = false;
isPriceZoneValidForVale = false;
} }
// //
@@ -402,18 +412,68 @@ bool DetectX121SMCXSTRPVSiganlSetup(
// Detect Trend ... // Detect Trend ...
// //
ENUM_X_DIRECTION marketDir; // Consolidation ...
bool hasMarketDir = decisionCycleHelper.DetectMarketStructure(marketDir); ENUM_X_DIRECTION consolidationMarketDir;
bool hasConsolidationMarketDir = consolidationCycleHelper
.DetectMarketStructure(consolidationMarketDir);
// //
bool hasBullishTrend = bool hasConsolidationBullishTrend =
hasMarketDir && hasConsolidationMarketDir &&
IsBullish(marketDir); IsBullish(consolidationMarketDir);
// //
bool hasBearishTrend = bool hasConsolidationBearishTrend =
hasMarketDir && hasConsolidationMarketDir &&
IsBearish(marketDir); IsBearish(consolidationMarketDir);
//
// Verification ...
ENUM_X_DIRECTION verificationMarketDir;
bool hasVerificationMarketDir = verificationCycleHelper
.DetectMarketStructure(verificationMarketDir);
//
bool hasVerificationBullishTrend =
hasVerificationMarketDir &&
IsBullish(verificationMarketDir);
//
bool hasVerificationBearishTrend =
hasVerificationMarketDir &&
IsBearish(verificationMarketDir);
//
// Analyse ...
ENUM_X_DIRECTION analyseMarketDir;
bool hasAnalyseMarketDir = analyseCycleHelper
.DetectMarketStructure(analyseMarketDir);
//
bool hasAnalyseBullishTrend =
hasAnalyseMarketDir &&
IsBullish(analyseMarketDir);
//
bool hasAnalyseBearishTrend =
hasAnalyseMarketDir &&
IsBearish(analyseMarketDir);
//
// Decision ...
ENUM_X_DIRECTION decisionMarketDir;
bool hasDecisionMarketDir = decisionCycleHelper
.DetectMarketStructure(decisionMarketDir);
//
bool hasDecisionBullishTrend =
hasDecisionMarketDir &&
IsBullish(decisionMarketDir);
//
bool hasDecisionBearishTrend =
hasDecisionMarketDir &&
IsBearish(decisionMarketDir);
// //
// Detect Bar State ... // Detect Bar State ...
@@ -515,40 +575,75 @@ bool DetectX121SMCXSTRPVSiganlSetup(
// Detect Price Zone ... // Detect Price Zone ...
// //
double pzPeak = decisionConditions.x121Conditions.peaksBuffer[1]; double pzPeak = decisionXConditions.peaksBuffer[1];
double pzVale = decisionConditions.x121Conditions.valesBuffer[1]; double pzVale = decisionXConditions.valesBuffer[1];
// //
XPriceZones priceZones; // Detecting Analyse Price ones ...
bool hasPriceZones = CalculatePriceInsideZones( XPriceZones analysePriceZone;
priceZones, bool hasAnalysePriceZone = CalculatePriceInsideZones(
analysePriceZone,
analyseState, analyseState,
cBar // cBar //
); );
double priceZonesUpper = 0; double analysePriceZoneUpper = 0;
double priceZonesLower = 0; double analysePriceZoneLower = 0;
bool isPriceZoneValidForPeak = false; bool isAnalysePriceZoneValidForPeak = false;
bool isPriceZoneValidForVale = false; bool isAnalysePriceZoneValidForVale = false;
if (hasPriceZones) if (hasAnalysePriceZone)
{ {
// //
bool hasBoundary = priceZones.GetBoundary( bool hasBoundary = analysePriceZone.GetBoundary(
X_DIRECTION_ALL, X_DIRECTION_ALL,
priceZonesUpper, analysePriceZoneUpper,
priceZonesLower // analysePriceZoneLower //
); );
// //
isPriceZoneValidForPeak = isAnalysePriceZoneValidForPeak =
hasBoundary && hasBoundary &&
pzPeak <= priceZonesUpper && pzPeak <= analysePriceZoneUpper &&
pzPeak >= priceZonesLower; pzPeak >= analysePriceZoneLower;
// //
isPriceZoneValidForVale = isAnalysePriceZoneValidForVale =
hasBoundary && hasBoundary &&
pzVale <= priceZonesUpper && pzVale <= analysePriceZoneUpper &&
pzVale >= priceZonesLower; pzVale >= analysePriceZoneLower;
}
//
// Detecting Verification Price ones ...
XPriceZones verificationPriceZone;
bool hasVerificationPriceZone = CalculatePriceInsideZones(
verificationPriceZone,
verificationState,
cBar //
);
double verificationPriceZoneUpper = 0;
double verificationPriceZoneLower = 0;
bool isVerificationPriceZoneValidForPeak = false;
bool isVerificationPriceZoneValidForVale = false;
if (hasVerificationPriceZone)
{
//
bool hasBoundary = verificationPriceZone.GetBoundary(
X_DIRECTION_ALL,
verificationPriceZoneUpper,
verificationPriceZoneLower //
);
//
isVerificationPriceZoneValidForPeak =
hasBoundary &&
pzPeak <= verificationPriceZoneUpper &&
pzPeak >= verificationPriceZoneLower;
//
isVerificationPriceZoneValidForVale =
hasBoundary &&
pzVale <= verificationPriceZoneUpper &&
pzVale >= verificationPriceZoneLower;
} }
// //
@@ -559,75 +654,363 @@ bool DetectX121SMCXSTRPVSiganlSetup(
// Summarize Conditions ... // Summarize Conditions ...
// //
isBullish = // Decision Conditions ...
//
bool isDecisionBullish =
// //
// Other Time Frames ... hasAnalysePriceZone &&
// analysePriceZone.IsBullish() &&
// Consolidation ... isAnalysePriceZoneValidForVale &&
(consolidationXConditions.isCheBullish &&
consolidationXConditions.isStrBullish &&
consolidationXConditions.isSarBullish &&
consolidationXConditions.isClosedOverVWapMax) &&
//
// Analyse ...
(analyseXConditions.isCheBullish &&
analyseXConditions.isStrBullish &&
analyseXConditions.isSarBullish &&
analyseXConditions.isClosedOverVWapMax) &&
// //
// Decision ... // Decision ...
hasBullishTrend && hasVerificationBullishTrend &&
hasAnalyseBullishTrend &&
hasDecisionBullishTrend &&
decisionXConditions.isBreakedDownPrevAtrUpper &&
( (
// //
((decisionXConditions.isStrSwitchedToBullish && ((decisionXConditions.isSarBullish &&
decisionXConditions.isCheBullish && decisionXConditions.isCheBullish &&
decisionXConditions.isSarBullish) || decisionXConditions.isBreakedUpPrevStr &&
(decisionXConditions.isCheSwitchedToBullish && decisionXConditions.isStrSwitchedToBullish) ||
(decisionXConditions.isStrBullish &&
decisionXConditions.isSarBullish && decisionXConditions.isSarBullish &&
decisionXConditions.isStrBullish) || decisionXConditions.isBreakedUpPrevCheMax &&
(decisionXConditions.isSarSwitchedToBullish && decisionXConditions.isCheSwitchedToBullish) ||
(decisionXConditions.isStrBullish &&
decisionXConditions.isCheBullish && decisionXConditions.isCheBullish &&
decisionXConditions.isStrBullish)) decisionXConditions.isBreakedUpPrevSar &&
decisionXConditions.isSarSwitchedToBullish))
// //
) )
// //
; ;
// //
isBearish = bool isDecisionBearish =
// //
// Other Time Frames ... hasAnalysePriceZone &&
// analysePriceZone.IsBearish() &&
// Consolidation ... isAnalysePriceZoneValidForPeak &&
(consolidationXConditions.isCheBearish &&
consolidationXConditions.isStrBearish &&
consolidationXConditions.isSarBearish &&
consolidationXConditions.isClosedUnderVWapMax) &&
//
// Analyse ...
(analyseXConditions.isCheBearish &&
analyseXConditions.isStrBearish &&
analyseXConditions.isSarBearish &&
analyseXConditions.isClosedUnderVWapMax) &&
// //
// Decision ... // Decision ...
hasBearishTrend && hasVerificationBearishTrend &&
hasAnalyseBearishTrend &&
hasDecisionBearishTrend &&
decisionXConditions.isBreakedDownPrevAtrLower &&
( (
// //
((decisionXConditions.isStrSwitchedToBearish && ((decisionXConditions.isSarBearish &&
decisionXConditions.isCheBearish && decisionXConditions.isCheBearish &&
decisionXConditions.isSarBearish) || decisionXConditions.isBreakedDownPrevStr &&
(decisionXConditions.isCheSwitchedToBearish && decisionXConditions.isStrSwitchedToBearish) ||
(decisionXConditions.isStrBearish &&
decisionXConditions.isSarBearish && decisionXConditions.isSarBearish &&
decisionXConditions.isStrBearish) || decisionXConditions.isCheSwitchedToBearish &&
(decisionXConditions.isSarSwitchedToBearish && decisionXConditions.isBreakedDownPrevCheMin) ||
(decisionXConditions.isStrBearish &&
decisionXConditions.isCheBearish && decisionXConditions.isCheBearish &&
decisionXConditions.isStrBearish)) decisionXConditions.isBreakedDownPrevSar &&
decisionXConditions.isSarSwitchedToBearish))
// //
) )
// //
; ;
//
bool hasDecisionCondition = isDecisionBullish ||
isDecisionBearish;
if (hasDecisionCondition)
{
//
conditions.priceZone = analysePriceZone;
conditions.isPriceZoneValidForPeak = isAnalysePriceZoneValidForPeak;
conditions.isPriceZoneValidForVale = isAnalysePriceZoneValidForVale;
//
pzPeak = analysePriceZoneUpper;
pzVale = analysePriceZoneLower;
//
double point = GetEntry(
conditions.symbol,
conditions.dir //
);
//
// Manipulate Conditions Point ...
//
point =
isDecisionBullish ? pzPeak
: pzVale;
conditions.point = point;
//
// Manipulate Conditions Pivot ...
//
conditions.pivot =
isDecisionBullish
? pzVale
: pzPeak;
}
//
// Analyse Conditions ...
//
bool isAnalyseBullish =
//
!hasDecisionCondition &&
//
hasVerificationPriceZone &&
verificationPriceZone.IsBullish() &&
isVerificationPriceZoneValidForVale &&
//
hasConsolidationBullishTrend &&
hasVerificationBullishTrend &&
hasAnalyseBullishTrend &&
analyseXConditions.isBreakedDownPrevAtrUpper &&
//
(
//
((analyseXConditions.isSarBullish &&
analyseXConditions.isCheBullish &&
analyseXConditions.isBreakedUpPrevStr &&
analyseXConditions.isStrSwitchedToBullish) ||
(analyseXConditions.isStrBullish &&
analyseXConditions.isSarBullish &&
analyseXConditions.isBreakedUpPrevCheMax &&
analyseXConditions.isCheSwitchedToBullish) ||
(analyseXConditions.isStrBullish &&
analyseXConditions.isCheBullish &&
analyseXConditions.isBreakedUpPrevSar &&
analyseXConditions.isSarSwitchedToBullish))
//
)
//
;
//
bool isAnalyseBearish =
//
!hasDecisionCondition &&
//
hasVerificationPriceZone &&
verificationPriceZone.IsBearish() &&
isVerificationPriceZoneValidForPeak &&
//
hasConsolidationBearishTrend &&
hasVerificationBearishTrend &&
hasAnalyseBearishTrend &&
analyseXConditions.isBreakedDownPrevAtrLower &&
//
(
//
((analyseXConditions.isSarBearish &&
analyseXConditions.isCheBearish &&
analyseXConditions.isBreakedDownPrevStr &&
analyseXConditions.isStrSwitchedToBearish) ||
(analyseXConditions.isStrBearish &&
analyseXConditions.isSarBearish &&
analyseXConditions.isCheSwitchedToBearish &&
analyseXConditions.isBreakedDownPrevCheMin) ||
(analyseXConditions.isStrBearish &&
analyseXConditions.isCheBearish &&
analyseXConditions.isBreakedDownPrevSar &&
analyseXConditions.isSarSwitchedToBearish))
//
)
//
;
//
bool hasAnalyseCondition = isAnalyseBullish ||
isAnalyseBearish;
if (hasAnalyseCondition)
{
//
conditions.priceZone = analysePriceZone;
conditions.isPriceZoneValidForPeak = isVerificationPriceZoneValidForPeak;
conditions.isPriceZoneValidForVale = isVerificationPriceZoneValidForVale;
//
pzPeak = analysePriceZoneUpper;
pzVale = analysePriceZoneLower;
//
double point = GetEntry(
conditions.symbol,
conditions.dir //
);
//
// Manipulate Conditions Point ...
//
point =
isAnalyseBullish ? pzPeak
: pzVale;
conditions.point = point;
//
// Manipulate Conditions Pivot ...
//
conditions.pivot =
isAnalyseBullish
? pzVale
: pzPeak;
}
//
//
//
//
double decisionPVMiddle = decisionXConditions.valesBuffer[1] +
(decisionXConditions.peaksBuffer[1] - decisionXConditions.valesBuffer[1]) / 2;
bool isInDecisionPremium =
//
ask > decisionPVMiddle &&
bid > decisionPVMiddle &&
//
ask < decisionXConditions.peaksBuffer[1] &&
bid < decisionXConditions.peaksBuffer[1]
//
;
bool isInDecisionDiscount =
//
ask < decisionPVMiddle &&
bid < decisionPVMiddle &&
//
ask < decisionXConditions.valesBuffer[1] &&
bid < decisionXConditions.valesBuffer[1]
//
;
//
bool isPriceZoneBullish =
//
!hasDecisionCondition &&
!hasAnalyseCondition &&
//
hasVerificationBullishTrend &&
hasAnalyseBullishTrend &&
hasDecisionBullishTrend &&
//
hasAnalysePriceZone &&
analysePriceZone.IsBullish() &&
isAnalysePriceZoneValidForVale &&
//
isCBarBullishFormed &&
isInDecisionDiscount &&
decisionXConditions.isAtrLowerUnderVale &&
decisionXConditions.isAtrLowerSlopeBullish &&
true
//
;
//
bool isPriceZoneBearish =
//
!hasDecisionCondition &&
!hasAnalyseCondition &&
//
hasVerificationBearishTrend &&
hasAnalyseBearishTrend &&
hasDecisionBearishTrend &&
//
hasAnalysePriceZone &&
analysePriceZone.IsBearish() &&
isAnalysePriceZoneValidForPeak &&
//
isInDecisionPremium &&
isCBarBearishFormed &&
decisionXConditions.isAtrUpperOverPeak &&
decisionXConditions.isAtrUpperSlopeBearish &&
true
//
;
//
bool hasPriceZoneCondition = isPriceZoneBullish ||
isPriceZoneBearish;
if (hasPriceZoneCondition)
{
//
ENUM_X_DIRECTION pzDir =
isPriceZoneBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
// XCBaseObject *drawnObjects[];
// int drawnObjectsCount = triggerCycleHelper
// .mPOIDetector
// .mDrawer
// .DrawPriceZone(
// analysePriceZone,
// drawnObjects,
// pzDir //
// );
// if (IsValidSize(drawnObjectsCount))
// {
// Print("DIR: " + EnumToString(pzDir));
// }
//
conditions.priceZone = analysePriceZone;
conditions.isPriceZoneValidForPeak = isAnalysePriceZoneValidForPeak;
conditions.isPriceZoneValidForVale = isAnalysePriceZoneValidForVale;
//
pzPeak = analysePriceZoneUpper;
pzVale = analysePriceZoneLower;
//
double point = GetEntry(
conditions.symbol,
conditions.dir //
);
//
// Manipulate Conditions Point ...
//
// point =
// isPriceZoneBullish ? pzPeak
// : pzVale;
conditions.point = point;
//
// Manipulate Conditions Pivot ...
//
conditions.pivot =
isPriceZoneBullish
? pzVale
: pzPeak;
}
//
//
//
//
isBullish =
isAnalyseBullish ||
isDecisionBullish ||
isPriceZoneBullish;
//
isBearish =
isAnalyseBearish ||
isDecisionBearish ||
isPriceZoneBearish;
// //
result = isBullish || result = isBullish ||
isBearish; isBearish;
@@ -637,23 +1020,12 @@ bool DetectX121SMCXSTRPVSiganlSetup(
} }
// //
conditions.pivot =
isBullish
? pzVale
: pzPeak;
conditions.setupTime = cTime; conditions.setupTime = cTime;
conditions.dir = conditions.dir =
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
//
double point = GetEntry(
conditions.symbol,
conditions.dir //
);
conditions.point = point;
// //
return result; return result;
} }
@@ -970,7 +1342,7 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
// //
double point = conditions.point; double point = conditions.point;
bool isPointBreak = IsBarBreak( bool isPointBreaked = IsBarBreak(
point, point,
setupDir, setupDir,
cBar // cBar //
@@ -983,7 +1355,7 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
isBullish = isBullish =
// //
isBullish && isBullish &&
isPointBreak && isPointBreaked &&
isSlopesBullish && isSlopesBullish &&
cBar.IsBullish() cBar.IsBullish()
// //
@@ -993,7 +1365,7 @@ bool DetectX121SMCXSTRPVSiganlTrigger(
isBearish = isBearish =
// //
isBearish && isBearish &&
isPointBreak && isPointBreaked &&
isSlopesBearish && isSlopesBearish &&
cBar.IsBearish() cBar.IsBearish()
// //
@@ -1392,3 +1764,48 @@ int AddX121SMCXSTRPVConditionsIfNotExists(
} }
// //
int DrawX121SMCXSTRPVConditions(
X121SMCStrategyXSTRPVSignalConditions &conditions,
XCBaseObject *&drawnObjects[],
XCPOIDrawer *drawer //
)
{
//
int result = 0;
//
Clean(drawnObjects);
//
if (drawer == NULL)
{
return result;
}
//
bool isSetuped = conditions.IsSetuped();
if (!isSetuped)
{
return result;
}
//
bool hasPriceZone = conditions.priceZone.IsValid();
if (!hasPriceZone)
{
return result;
}
//
int zonesObjCount = drawer.DrawPriceZone(
conditions.priceZone,
drawnObjects,
conditions.dir //
);
result = zonesObjCount;
//
return result;
}
//
@@ -1184,6 +1184,14 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
1 // 1 //
); );
//
XCBaseObject *objects[];
DrawX121SMCXSTRPVConditions(
mConditions,
objects,
mPOIDrawer //
);
// //
// Check Signal Direction ... // Check Signal Direction ...
isBullish = IsBullish(mConditions.dir); isBullish = IsBullish(mConditions.dir);
@@ -1261,7 +1269,7 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
bool showAll = false; bool showAll = false;
// //
x121Inputs.showRSI = true; x121Inputs.showRSI = false;
// //
bool isInited = false; bool isInited = false;
@@ -1297,10 +1305,10 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
// //
// XCHE ... // XCHE ...
x121Inputs.xcheInputs.showLE1 = showAll || true; x121Inputs.xcheInputs.showLE1 = showAll || false;
x121Inputs.xcheInputs.showLE2 = showAll || true; x121Inputs.xcheInputs.showLE2 = showAll || false;
x121Inputs.xcheInputs.showSE1 = showAll || true; x121Inputs.xcheInputs.showSE1 = showAll || false;
x121Inputs.xcheInputs.showSE2 = showAll || true; x121Inputs.xcheInputs.showSE2 = showAll || false;
// //
// XDON ... // XDON ...