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
+388 -117
View File
@@ -186,34 +186,34 @@ struct X121Conditions
//
// Conditions ...
bool isRSIOverBought;
bool isRSICrossedOverOverBought;
bool isRSICrossedUnderOverBought;
bool isRSIOverSold;
bool isRSICrossedUnderOverSold;
bool isRSICrossedOverOverSold;
bool isRsiOverBought;
bool isRsiCrossedOverOverBought;
bool isRsiCrossedUnderOverBought;
bool isRsiOverSold;
bool isRsiCrossedUnderOverSold;
bool isRsiCrossedOverOverSold;
//
bool isCloseOverATRUpper;
bool isCloseOverATRLower;
bool isCloseUnderATRUpper;
bool isCloseUnderATRLower;
bool isCloseOverAtrUpper;
bool isCloseOverAtrLower;
bool isCloseUnderAtrUpper;
bool isCloseUnderAtrLower;
//
bool isRejectUpATRUpper;
bool isRejectDownATRUpper;
bool isRejectUpAtrUpper;
bool isRejectDownAtrUpper;
//
bool isRejectUpATRLower;
bool isRejectDownATRLower;
bool isRejectUpAtrLower;
bool isRejectDownAtrLower;
//
bool isBreakUpATRUpper;
bool isBreakDownATRUpper;
bool isBreakUpAtrUpper;
bool isBreakDownAtrUpper;
//
bool isBreakUpATRLower;
bool isBreakDownATRLower;
bool isBreakUpAtrLower;
bool isBreakDownAtrLower;
//
bool isRejectDonOpenUpper;
@@ -294,20 +294,76 @@ struct X121Conditions
bool isSarEqualsToVale;
//
bool isNewPeakOverATRUpper;
bool isNewValeUnderATRLower;
bool isSarCrossedUnderPeak;
bool isSarCrossedOverVale;
//
bool isStrEqualsToPeak;
bool isStrEqualsToVale;
//
bool isStrCrossedUnderPeak;
bool isStrCrossedOverVale;
//
bool isPeakOverAtrUpper;
bool isValeUnderAtrLower;
//
bool isNewPeakOverAtrUpper;
bool isNewValeUnderAtrLower;
//
bool isStrUpperOverPeak;
bool isStrUpperUnderPeak;
//
bool isStrUpperCrossedOverPeak;
bool isStrUpperCrossedUnderPeak;
//
bool isStrLowerOverVale;
bool isStrLowerUnderVale;
//
bool isStrLowerCrossedOverVale;
bool isStrLowerCrossedUnderVale;
//
bool isDonHighUpperEqualsToPeak;
bool isDonLowLowerEqualsToVale;
//
bool isSTRUpperCrossedOverATRUpper;
bool isSTRLowerCrossedUnderATRLower;
bool isStrUpperOverAtrUpper;
bool isStrUpperUnderAtrUpper;
//
bool isSTRUpperCrossedOverDonHighUpper;
bool isSTRLowerCrossedUnderDonLowLower;
bool isStrLowerOverAtrLower;
bool isStrLowerUnderAtrLower;
//
bool isStrUpperCrossedOverAtrUpper;
bool isStrUpperCrossedUnderAtrUpper;
//
bool isStrLowerCrossedOverAtrLower;
bool isStrLowerCrossedUnderAtrLower;
//
bool isStrUpperOverDonHighUpper;
bool isStrUpperUnderDonHighUpper;
//
bool isStrLowerOverDonLowLower;
bool isStrLowerUnderDonLowLower;
//
bool isStrUpperCrossedOverDonHighUpper;
bool isStrUpperCrossedUnderDonHighUpper;
//
bool isStrLowerCrossedOverDonLowLower;
bool isStrLowerCrossedUnderDonLowLower;
//
// Constructor ...
@@ -424,41 +480,41 @@ struct X121Conditions
// RSI ...
//
isRSIOverBought = false;
isRSICrossedOverOverBought = false;
isRSICrossedUnderOverBought = false;
isRsiOverBought = false;
isRsiCrossedOverOverBought = false;
isRsiCrossedUnderOverBought = false;
//
isRSIOverSold = false;
isRSICrossedUnderOverSold = false;
isRSICrossedOverOverSold = false;
isRsiOverSold = false;
isRsiCrossedUnderOverSold = false;
isRsiCrossedOverOverSold = false;
//
// ATR ...
//
isCloseOverATRUpper = false;
isCloseOverATRLower = false;
isCloseOverAtrUpper = false;
isCloseOverAtrLower = false;
//
isCloseUnderATRUpper = false;
isCloseUnderATRLower = false;
isCloseUnderAtrUpper = false;
isCloseUnderAtrLower = false;
//
isRejectUpATRUpper = false;
isRejectDownATRUpper = false;
isRejectUpAtrUpper = false;
isRejectDownAtrUpper = false;
//
isRejectUpATRLower = false;
isRejectDownATRLower = false;
isRejectUpAtrLower = false;
isRejectDownAtrLower = false;
//
isBreakUpATRUpper = false;
isBreakDownATRUpper = false;
isBreakUpAtrUpper = false;
isBreakDownAtrUpper = false;
//
isBreakUpATRLower = false;
isBreakDownATRLower = false;
isBreakUpAtrLower = false;
isBreakDownAtrLower = false;
//
// DON ...
@@ -574,20 +630,76 @@ struct X121Conditions
isSarEqualsToVale = false;
//
isNewPeakOverATRUpper = false;
isNewValeUnderATRLower = false;
isSarCrossedUnderPeak = false;
isSarCrossedOverVale = false;
//
isStrEqualsToPeak = false;
isStrEqualsToVale = false;
//
isStrCrossedUnderPeak = false;
isStrCrossedOverVale = false;
//
isPeakOverAtrUpper = false;
isValeUnderAtrLower = false;
//
isNewPeakOverAtrUpper = false;
isNewValeUnderAtrLower = false;
//
isStrUpperOverPeak = false;
isStrUpperUnderPeak = false;
//
isStrUpperCrossedOverPeak = false;
isStrUpperCrossedUnderPeak = false;
//
isStrLowerOverVale = false;
isStrLowerUnderVale = false;
//
isStrLowerCrossedOverVale = false;
isStrLowerCrossedUnderVale = false;
//
isDonHighUpperEqualsToPeak = false;
isDonLowLowerEqualsToVale = false;
//
isSTRUpperCrossedOverATRUpper = false;
isSTRLowerCrossedUnderATRLower = false;
isStrUpperOverAtrUpper = false;
isStrUpperUnderAtrUpper = false;
//
isSTRUpperCrossedOverDonHighUpper = false;
isSTRLowerCrossedUnderDonLowLower = false;
isStrLowerOverAtrLower = false;
isStrLowerUnderAtrLower = false;
//
isStrUpperCrossedOverAtrUpper = false;
isStrUpperCrossedUnderAtrUpper = false;
//
isStrLowerCrossedOverAtrLower = false;
isStrLowerCrossedUnderAtrLower = false;
//
isStrUpperOverDonHighUpper = false;
isStrUpperUnderDonHighUpper = false;
//
isStrLowerOverDonLowLower = false;
isStrLowerUnderDonLowLower = false;
//
isStrUpperCrossedOverDonHighUpper = false;
isStrUpperCrossedUnderDonHighUpper = false;
//
isStrLowerCrossedOverDonLowLower = false;
isStrLowerCrossedUnderDonLowLower = false;
}
/**
@@ -657,6 +769,7 @@ struct X121Conditions
//
string conditionsStr =
//
"-----------------------" + separator +
"SAR ..." + separator +
"-----------------------" + separator +
ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) +
@@ -664,6 +777,7 @@ struct X121Conditions
ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isSarSwitchedToBearish", isSarSwitchedToBearish, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"STR ..." + separator +
"-----------------------" + separator +
ToString("isStrBullish", isStrBullish, ignoreFalseConditions, separator) +
@@ -671,6 +785,7 @@ struct X121Conditions
ToString("isStrSwitchedToBullish", isStrSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isStrSwitchedToBearish", isStrSwitchedToBearish, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"PV ..." + separator +
"-----------------------" + separator +
ToString("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
@@ -680,32 +795,35 @@ struct X121Conditions
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"> RSI ..." + separator +
"-----------------------" + separator +
ToString("isRSIOverBought", isRSIOverBought, ignoreFalseConditions, separator) +
ToString("isRSICrossedOverOverBought", isRSICrossedOverOverBought, ignoreFalseConditions, separator) +
ToString("isRSICrossedUnderOverBought", isRSICrossedUnderOverBought, ignoreFalseConditions, separator) +
ToString("isRSIOverSold", isRSIOverSold, ignoreFalseConditions, separator) +
ToString("isRSICrossedUnderOverSold", isRSICrossedUnderOverSold, ignoreFalseConditions, separator) +
ToString("isRSICrossedOverOverSold", isRSICrossedOverOverSold, ignoreFalseConditions, separator) +
ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) +
ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) +
ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) +
ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) +
ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) +
ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"ATR ..." + separator +
"-----------------------" + separator +
ToString("isCloseOverATRUpper", isCloseOverATRUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverATRLower", isCloseOverATRLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderATRUpper", isCloseUnderATRUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderATRLower", isCloseUnderATRLower, ignoreFalseConditions, separator) +
ToString("isRejectUpATRUpper", isRejectUpATRUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownATRUpper", isRejectDownATRUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpATRLower", isRejectUpATRLower, ignoreFalseConditions, separator) +
ToString("isRejectDownATRLower", isRejectDownATRLower, ignoreFalseConditions, separator) +
ToString("isBreakUpATRUpper", isBreakUpATRUpper, ignoreFalseConditions, separator) +
ToString("isBreakDownATRUpper", isBreakDownATRUpper, ignoreFalseConditions, separator) +
ToString("isBreakUpATRLower", isBreakUpATRLower, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrLower", isRejectDownAtrLower, ignoreFalseConditions, separator) +
ToString("isBreakUpAtrUpper", isBreakUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isBreakDownAtrUpper", isBreakDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isBreakUpAtrLower", isBreakUpAtrLower, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"DON ..." + separator +
"-----------------------" + separator +
ToString("isBreakDownATRLower", isBreakDownATRLower, ignoreFalseConditions, separator) +
ToString("isBreakDownAtrLower", isBreakDownAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectDonOpenUpper", isRejectDonOpenUpper, ignoreFalseConditions, separator) +
ToString("isRejectDonHighUpper", isRejectDonHighUpper, ignoreFalseConditions, separator) +
ToString("isRejectDonLowUpper", isRejectDonLowUpper, ignoreFalseConditions, separator) +
@@ -723,6 +841,7 @@ struct X121Conditions
ToString("isBreakDonLowLower", isBreakDonLowLower, ignoreFalseConditions, separator) +
ToString("isBreakDonCloseLower", isBreakDonCloseLower, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"VWAP ..." + separator +
"-----------------------" + separator +
ToString("isVWapFastBullish", isVWapFastBullish, ignoreFalseConditions, separator) +
@@ -754,14 +873,42 @@ struct X121Conditions
"-----------------------" + separator +
ToString("isSarEqualsToPeak", isSarEqualsToPeak, ignoreFalseConditions, separator) +
ToString("isSarEqualsToVale", isSarEqualsToVale, ignoreFalseConditions, separator) +
ToString("isNewPeakOverATRUpper", isNewPeakOverATRUpper, ignoreFalseConditions, separator) +
ToString("isNewValeUnderATRLower", isNewValeUnderATRLower, ignoreFalseConditions, separator) +
ToString("isSarCrossedUnderPeak", isSarCrossedUnderPeak, ignoreFalseConditions, separator) +
ToString("isSarCrossedOverVale", isSarCrossedOverVale, ignoreFalseConditions, separator) +
ToString("isStrEqualsToPeak", isStrEqualsToPeak, ignoreFalseConditions, separator) +
ToString("isStrEqualsToVale", isStrEqualsToVale, ignoreFalseConditions, separator) +
ToString("isStrCrossedUnderPeak", isStrCrossedUnderPeak, ignoreFalseConditions, separator) +
ToString("isStrCrossedOverVale", isStrCrossedOverVale, ignoreFalseConditions, separator) +
ToString("isPeakOverAtrUpper", isPeakOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isValeUnderAtrLower", isValeUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isNewPeakOverAtrUpper", isNewPeakOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isNewValeUnderAtrLower", isNewValeUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isStrUpperOverPeak", isStrUpperOverPeak, ignoreFalseConditions, separator) +
ToString("isStrUpperUnderPeak", isStrUpperUnderPeak, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedOverPeak", isStrUpperCrossedOverPeak, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedUnderPeak", isStrUpperCrossedUnderPeak, ignoreFalseConditions, separator) +
ToString("isStrLowerOverVale", isStrLowerOverVale, ignoreFalseConditions, separator) +
ToString("isStrLowerUnderVale", isStrLowerUnderVale, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedOverVale", isStrLowerCrossedOverVale, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedUnderVale", isStrLowerCrossedUnderVale, ignoreFalseConditions, separator) +
ToString("isDonHighUpperEqualsToPeak", isDonHighUpperEqualsToPeak, ignoreFalseConditions, separator) +
ToString("isDonLowLowerEqualsToVale", isDonLowLowerEqualsToVale, ignoreFalseConditions, separator) +
ToString("isSTRUpperCrossedOverATRUpper", isSTRUpperCrossedOverATRUpper, ignoreFalseConditions, separator) +
ToString("isSTRLowerCrossedUnderATRLower", isSTRLowerCrossedUnderATRLower, ignoreFalseConditions, separator) +
ToString("isSTRUpperCrossedOverDonHighUpper", isSTRUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) +
ToString("isSTRLowerCrossedUnderDonLowLower", isSTRLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) +
ToString("isStrUpperOverAtrUpper", isStrUpperOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isStrUpperUnderAtrUpper", isStrUpperUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isStrLowerOverAtrLower", isStrLowerOverAtrLower, ignoreFalseConditions, separator) +
ToString("isStrLowerUnderAtrLower", isStrLowerUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedOverAtrUpper", isStrUpperCrossedOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedUnderAtrUpper", isStrUpperCrossedUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedOverAtrLower", isStrLowerCrossedOverAtrLower, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedUnderAtrLower", isStrLowerCrossedUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isStrUpperOverDonHighUpper", isStrUpperOverDonHighUpper, ignoreFalseConditions, separator) +
ToString("isStrUpperUnderDonHighUpper", isStrUpperUnderDonHighUpper, ignoreFalseConditions, separator) +
ToString("isStrLowerOverDonLowLower", isStrLowerOverDonLowLower, ignoreFalseConditions, separator) +
ToString("isStrLowerUnderDonLowLower", isStrLowerUnderDonLowLower, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedOverDonHighUpper", isStrUpperCrossedOverDonHighUpper, ignoreFalseConditions, separator) +
ToString("isStrUpperCrossedUnderDonHighUpper", isStrUpperCrossedUnderDonHighUpper, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedOverDonLowLower", isStrLowerCrossedOverDonLowLower, ignoreFalseConditions, separator) +
ToString("isStrLowerCrossedUnderDonLowLower", isStrLowerCrossedUnderDonLowLower, ignoreFalseConditions, separator) +
//
""
//
@@ -1378,24 +1525,24 @@ class XCX121Helper : public XCBase
// Conditions ...
//
conditions.isRSIOverSold = xatrConditions.isRSIOverSold;
conditions.isRSIOverBought = xatrConditions.isRSIOverBought;
conditions.isBreakUpATRUpper = xatrConditions.isBreakUpATRUpper;
conditions.isBreakUpATRLower = xatrConditions.isBreakUpATRLower;
conditions.isCloseOverATRUpper = xatrConditions.isCloseOverATRUpper;
conditions.isRejectUpATRUpper = xatrConditions.isRejectUpATRUpper;
conditions.isRejectUpATRLower = xatrConditions.isRejectUpATRLower;
conditions.isCloseOverATRLower = xatrConditions.isCloseOverATRLower;
conditions.isBreakDownATRUpper = xatrConditions.isBreakDownATRUpper;
conditions.isBreakDownATRLower = xatrConditions.isBreakDownATRLower;
conditions.isCloseUnderATRUpper = xatrConditions.isCloseUnderATRUpper;
conditions.isCloseUnderATRLower = xatrConditions.isCloseUnderATRLower;
conditions.isRejectDownATRUpper = xatrConditions.isRejectDownATRUpper;
conditions.isRejectDownATRLower = xatrConditions.isRejectDownATRLower;
conditions.isRSICrossedOverOverSold = xatrConditions.isRSICrossedOverOverSold;
conditions.isRSICrossedUnderOverSold = xatrConditions.isRSICrossedUnderOverSold;
conditions.isRSICrossedOverOverBought = xatrConditions.isRSICrossedOverOverBought;
conditions.isRSICrossedUnderOverBought = xatrConditions.isRSICrossedUnderOverBought;
conditions.isRsiOverSold = xatrConditions.isRsiOverSold;
conditions.isRsiOverBought = xatrConditions.isRsiOverBought;
conditions.isBreakUpAtrUpper = xatrConditions.isBreakUpAtrUpper;
conditions.isBreakUpAtrLower = xatrConditions.isBreakUpAtrLower;
conditions.isCloseOverAtrUpper = xatrConditions.isCloseOverAtrUpper;
conditions.isRejectUpAtrUpper = xatrConditions.isRejectUpAtrUpper;
conditions.isRejectUpAtrLower = xatrConditions.isRejectUpAtrLower;
conditions.isCloseOverAtrLower = xatrConditions.isCloseOverAtrLower;
conditions.isBreakDownAtrUpper = xatrConditions.isBreakDownAtrUpper;
conditions.isBreakDownAtrLower = xatrConditions.isBreakDownAtrLower;
conditions.isCloseUnderAtrUpper = xatrConditions.isCloseUnderAtrUpper;
conditions.isCloseUnderAtrLower = xatrConditions.isCloseUnderAtrLower;
conditions.isRejectDownAtrUpper = xatrConditions.isRejectDownAtrUpper;
conditions.isRejectDownAtrLower = xatrConditions.isRejectDownAtrLower;
conditions.isRsiCrossedOverOverSold = xatrConditions.isRsiCrossedOverOverSold;
conditions.isRsiCrossedUnderOverSold = xatrConditions.isRsiCrossedUnderOverSold;
conditions.isRsiCrossedOverOverBought = xatrConditions.isRsiCrossedOverOverBought;
conditions.isRsiCrossedUnderOverBought = xatrConditions.isRsiCrossedUnderOverBought;
//
// XSTR ...
@@ -1613,13 +1760,77 @@ class XCX121Helper : public XCBase
conditions.sarBuffer[cIDX] == conditions.valesBuffer[cIDX];
//
bool isNewPeakOverATRUpper =
conditions.isNewPeak &&
bool isSarCrossedUnderPeak =
conditions.sarBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
!(conditions.sarBuffer[pIDX] < conditions.peaksBuffer[pIDX]);
bool isSarCrossedOverVale =
conditions.sarBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
!(conditions.sarBuffer[pIDX] > conditions.valesBuffer[pIDX]);
//
bool isStrEqualsToPeak =
conditions.strBuffer[cIDX] == conditions.peaksBuffer[cIDX];
bool isStrEqualsToVale =
conditions.strBuffer[cIDX] == conditions.valesBuffer[cIDX];
//
bool isStrCrossedUnderPeak =
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
!(conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX]);
bool isStrCrossedOverVale =
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
!(conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX]);
//
bool isPeakOverAtrUpper =
conditions.peaksBuffer[cIDX] > conditions.atrUpperBuffer[cIDX];
bool isNewValeUnderATRLower =
conditions.isNewVale &&
bool isValeUnderAtrLower =
conditions.valesBuffer[cIDX] > conditions.atrLowerBuffer[cIDX];
//
bool isNewPeakOverAtrUpper =
isPeakOverAtrUpper &&
conditions.isNewPeak;
bool isNewValeUnderAtrLower =
isValeUnderAtrLower &&
conditions.isNewVale;
//
bool isStrUpperOverPeak =
conditions.strBuffer[cIDX] > conditions.peaksBuffer[cIDX];
bool isStrUpperOverPeakPrev =
conditions.strBuffer[pIDX] > conditions.peaksBuffer[pIDX];
//
bool isStrUpperUnderPeak =
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX];
bool isStrUpperUnderPeakPrev =
conditions.strBuffer[pIDX] < conditions.peaksBuffer[pIDX];
//
bool isStrUpperCrossedOverPeak = isStrUpperOverPeak &&
!isStrUpperOverPeakPrev;
bool isStrUpperCrossedUnderPeak = isStrUpperUnderPeak &&
!isStrUpperUnderPeakPrev;
//
bool isStrLowerOverVale =
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX];
bool isStrLowerOverValePrev =
conditions.strBuffer[pIDX] > conditions.valesBuffer[pIDX];
//
bool isStrLowerUnderVale =
conditions.strBuffer[cIDX] < conditions.valesBuffer[cIDX];
bool isStrLowerUnderValePrev =
conditions.strBuffer[pIDX] < conditions.valesBuffer[pIDX];
//
bool isStrLowerCrossedOverVale = isStrLowerOverVale &&
!isStrLowerOverValePrev;
bool isStrLowerCrossedUnderVale = isStrLowerUnderVale &&
!isStrLowerUnderValePrev;
//
bool isDonHighUpperEqualsToPeak =
conditions.donHighUpperBuffer[cIDX] == conditions.peaksBuffer[cIDX];
@@ -1627,48 +1838,108 @@ class XCX121Helper : public XCBase
conditions.donLowLowerBuffer[cIDX] == conditions.valesBuffer[cIDX];
//
bool isSTRUpperOverATRUpper =
bool isStrUpperOverAtrUpper =
conditions.strUpBuffer[cIDX] > conditions.atrUpperBuffer[cIDX];
bool isSTRUpperOverATRUpperPrev =
bool isStrUpperOverAtrUpperPrev =
conditions.strUpBuffer[pIDX] > conditions.atrUpperBuffer[pIDX];
bool isSTRUpperCrossedOverATRUpper = isSTRUpperOverATRUpper &&
!isSTRUpperOverATRUpperPrev;
bool isStrUpperCrossedOverAtrUpper = isStrUpperOverAtrUpper &&
!isStrUpperOverAtrUpperPrev;
//
bool isSTRLowerUnderATRLower =
bool isStrUpperUnderAtrUpper =
conditions.strUpBuffer[cIDX] < conditions.atrUpperBuffer[cIDX];
bool isStrUpperUnderAtrUpperPrev =
conditions.strUpBuffer[pIDX] < conditions.atrUpperBuffer[pIDX];
bool isStrUpperCrossedUnderAtrUpper = isStrUpperUnderAtrUpper &&
!isStrUpperUnderAtrUpperPrev;
//
bool isStrLowerOverAtrLower =
conditions.strDownBuffer[cIDX] > conditions.atrLowerBuffer[cIDX];
bool isStrLowerOverAtrLowerPrev =
conditions.strDownBuffer[pIDX] > conditions.atrLowerBuffer[pIDX];
bool isStrLowerCrossedOverAtrLower = isStrLowerOverAtrLower &&
!isStrLowerOverAtrLowerPrev;
//
bool isStrLowerUnderAtrLower =
conditions.strDownBuffer[cIDX] < conditions.atrLowerBuffer[cIDX];
bool isSTRLowerUnderATRLowerPrev =
bool isStrLowerUnderAtrLowerPrev =
conditions.strDownBuffer[pIDX] < conditions.atrLowerBuffer[pIDX];
bool isSTRLowerCrossedUnderATRLower = isSTRLowerUnderATRLower &&
!isSTRLowerUnderATRLowerPrev;
bool isStrLowerCrossedUnderAtrLower = isStrLowerUnderAtrLower &&
!isStrLowerUnderAtrLowerPrev;
//
bool isSTRUpperOverDonHighUpper =
bool isStrUpperOverDonHighUpper =
conditions.strUpBuffer[cIDX] > conditions.donHighUpperBuffer[cIDX];
bool isSTRUpperOverDonHighUpperPrev =
bool isStrUpperOverDonHighUpperPrev =
conditions.strUpBuffer[pIDX] > conditions.donHighUpperBuffer[pIDX];
bool isSTRUpperCrossedOverDonHighUpper = isSTRUpperOverDonHighUpper &&
!isSTRUpperOverDonHighUpperPrev;
bool isStrUpperCrossedOverDonHighUpper = isStrUpperOverDonHighUpper &&
!isStrUpperOverDonHighUpperPrev;
//
bool isSTRLowerUnderDonLowLower =
bool isStrUpperUnderDonHighUpper =
conditions.strUpBuffer[cIDX] < conditions.donHighUpperBuffer[cIDX];
bool isStrUpperUnderDonHighUpperPrev =
conditions.strUpBuffer[pIDX] < conditions.donHighUpperBuffer[pIDX];
bool isStrUpperCrossedUnderDonHighUpper = isStrUpperUnderDonHighUpper &&
!isStrUpperUnderDonHighUpperPrev;
//
bool isStrLowerOverDonLowLower =
conditions.strDownBuffer[cIDX] > conditions.donLowLowerBuffer[cIDX];
bool isStrLowerOverDonLowLowerPrev =
conditions.strDownBuffer[pIDX] > conditions.donLowLowerBuffer[pIDX];
bool isStrLowerCrossedOverDonLowLower = isStrLowerOverDonLowLower &&
!isStrLowerOverDonLowLowerPrev;
//
bool isStrLowerUnderDonLowLower =
conditions.strDownBuffer[cIDX] < conditions.donLowLowerBuffer[cIDX];
bool isSTRLowerUnderDonLowLowerPrev =
bool isStrLowerUnderDonLowLowerPrev =
conditions.strDownBuffer[pIDX] < conditions.donLowLowerBuffer[pIDX];
bool isSTRLowerCrossedUnderDonLowLower = isSTRLowerUnderDonLowLower &&
!isSTRLowerUnderDonLowLowerPrev;
bool isStrLowerCrossedUnderDonLowLower = isStrLowerUnderDonLowLower &&
!isStrLowerUnderDonLowLowerPrev;
//
conditions.isSarEqualsToPeak = isSarEqualsToPeak;
conditions.isSarEqualsToVale = isSarEqualsToVale;
conditions.isNewPeakOverATRUpper = isNewPeakOverATRUpper;
conditions.isNewValeUnderATRLower = isNewValeUnderATRLower;
conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak;
conditions.isStrEqualsToPeak = isStrEqualsToPeak;
conditions.isStrEqualsToVale = isStrEqualsToVale;
conditions.isStrUpperOverPeak = isStrUpperOverPeak;
conditions.isPeakOverAtrUpper = isPeakOverAtrUpper;
conditions.isStrLowerOverVale = isStrLowerOverVale;
conditions.isStrLowerUnderVale = isStrLowerUnderVale;
conditions.isStrUpperUnderPeak = isStrUpperUnderPeak;
conditions.isValeUnderAtrLower = isValeUnderAtrLower;
conditions.isSarCrossedOverVale = isSarCrossedOverVale;
conditions.isStrCrossedOverVale = isStrCrossedOverVale;
conditions.isSarCrossedUnderPeak = isSarCrossedUnderPeak;
conditions.isStrCrossedUnderPeak = isStrCrossedUnderPeak;
conditions.isNewPeakOverAtrUpper = isNewPeakOverAtrUpper;
conditions.isNewValeUnderAtrLower = isNewValeUnderAtrLower;
conditions.isStrUpperOverAtrUpper = isStrUpperOverAtrUpper;
conditions.isStrLowerOverAtrLower = isStrLowerOverAtrLower;
conditions.isStrUpperUnderAtrUpper = isStrUpperUnderAtrUpper;
conditions.isStrLowerUnderAtrLower = isStrLowerUnderAtrLower;
conditions.isDonLowLowerEqualsToVale = isDonLowLowerEqualsToVale;
conditions.isSTRUpperCrossedOverATRUpper = isSTRUpperCrossedOverATRUpper;
conditions.isSTRLowerCrossedUnderATRLower = isSTRLowerCrossedUnderATRLower;
conditions.isSTRUpperCrossedOverDonHighUpper = isSTRUpperCrossedOverDonHighUpper;
conditions.isSTRLowerCrossedUnderDonLowLower = isSTRLowerCrossedUnderDonLowLower;
conditions.isStrUpperCrossedOverPeak = isStrUpperCrossedOverPeak;
conditions.isStrLowerCrossedOverVale = isStrLowerCrossedOverVale;
conditions.isStrLowerOverDonLowLower = isStrLowerOverDonLowLower;
conditions.isStrUpperOverDonHighUpper = isStrUpperOverDonHighUpper;
conditions.isStrLowerUnderDonLowLower = isStrLowerUnderDonLowLower;
conditions.isDonHighUpperEqualsToPeak = isDonHighUpperEqualsToPeak;
conditions.isStrUpperCrossedUnderPeak = isStrUpperCrossedUnderPeak;
conditions.isStrLowerCrossedUnderVale = isStrLowerCrossedUnderVale;
conditions.isStrUpperUnderDonHighUpper = isStrUpperUnderDonHighUpper;
conditions.isStrLowerCrossedOverAtrLower = isStrLowerCrossedOverAtrLower;
conditions.isStrUpperCrossedOverAtrUpper = isStrUpperCrossedOverAtrUpper;
conditions.isStrUpperCrossedUnderAtrUpper = isStrUpperCrossedUnderAtrUpper;
conditions.isStrLowerCrossedUnderAtrLower = isStrLowerCrossedUnderAtrLower;
conditions.isStrLowerCrossedOverDonLowLower = isStrLowerCrossedOverDonLowLower;
conditions.isStrUpperCrossedOverDonHighUpper = isStrUpperCrossedOverDonHighUpper;
conditions.isStrLowerCrossedUnderDonLowLower = isStrLowerCrossedUnderDonLowLower;
conditions.isStrUpperCrossedUnderDonHighUpper = isStrUpperCrossedUnderDonHighUpper;
//
return result;
+96 -96
View File
@@ -197,41 +197,41 @@ struct X121XATRConditions
// RSI ...
//
bool isRSIOverBought;
bool isRSICrossedOverOverBought;
bool isRSICrossedUnderOverBought;
bool isRsiOverBought;
bool isRsiCrossedOverOverBought;
bool isRsiCrossedUnderOverBought;
//
bool isRSIOverSold;
bool isRSICrossedUnderOverSold;
bool isRSICrossedOverOverSold;
bool isRsiOverSold;
bool isRsiCrossedUnderOverSold;
bool isRsiCrossedOverOverSold;
//
// ATR ...
//
bool isCloseOverATRUpper;
bool isCloseOverATRLower;
bool isCloseOverAtrUpper;
bool isCloseOverAtrLower;
//
bool isCloseUnderATRUpper;
bool isCloseUnderATRLower;
bool isCloseUnderAtrUpper;
bool isCloseUnderAtrLower;
//
bool isRejectUpATRUpper;
bool isRejectDownATRUpper;
bool isRejectUpAtrUpper;
bool isRejectDownAtrUpper;
//
bool isRejectUpATRLower;
bool isRejectDownATRLower;
bool isRejectUpAtrLower;
bool isRejectDownAtrLower;
//
bool isBreakUpATRUpper;
bool isBreakDownATRUpper;
bool isBreakUpAtrUpper;
bool isBreakDownAtrUpper;
//
bool isBreakUpATRLower;
bool isBreakDownATRLower;
bool isBreakUpAtrLower;
bool isBreakDownAtrLower;
//
// bool isCloseLower
@@ -283,41 +283,41 @@ struct X121XATRConditions
// RSI ...
//
isRSIOverBought = false;
isRSICrossedOverOverBought = false;
isRSICrossedUnderOverBought = false;
isRsiOverBought = false;
isRsiCrossedOverOverBought = false;
isRsiCrossedUnderOverBought = false;
//
isRSIOverSold = false;
isRSICrossedUnderOverSold = false;
isRSICrossedOverOverSold = false;
isRsiOverSold = false;
isRsiCrossedUnderOverSold = false;
isRsiCrossedOverOverSold = false;
//
// ATR ...
//
isCloseOverATRUpper = false;
isCloseOverATRLower = false;
isCloseOverAtrUpper = false;
isCloseOverAtrLower = false;
//
isCloseUnderATRUpper = false;
isCloseUnderATRLower = false;
isCloseUnderAtrUpper = false;
isCloseUnderAtrLower = false;
//
isRejectUpATRUpper = false;
isRejectDownATRUpper = false;
isRejectUpAtrUpper = false;
isRejectDownAtrUpper = false;
//
isRejectUpATRLower = false;
isRejectDownATRLower = false;
isRejectUpAtrLower = false;
isRejectDownAtrLower = false;
//
isBreakUpATRUpper = false;
isBreakDownATRUpper = false;
isBreakUpAtrUpper = false;
isBreakDownAtrUpper = false;
//
isBreakUpATRLower = false;
isBreakDownATRLower = false;
isBreakUpAtrLower = false;
isBreakDownAtrLower = false;
//
// XDON ...
@@ -394,26 +394,26 @@ struct X121XATRConditions
string conditionsStr =
//
// RSI ...
ToString("isRSIOverBought", isRSIOverBought, ignoreFalseConditions, separator) +
ToString("isRSICrossedOverOverBought", isRSICrossedOverOverBought, ignoreFalseConditions, separator) +
ToString("isRSICrossedUnderOverBought", isRSICrossedUnderOverBought, ignoreFalseConditions, separator) +
ToString("isRSIOverSold", isRSIOverSold, ignoreFalseConditions, separator) +
ToString("isRSICrossedUnderOverSold", isRSICrossedUnderOverSold, ignoreFalseConditions, separator) +
ToString("isRSICrossedOverOverSold", isRSICrossedOverOverSold, ignoreFalseConditions, separator) +
ToString("isRsiOverBought", isRsiOverBought, ignoreFalseConditions, separator) +
ToString("isRsiCrossedOverOverBought", isRsiCrossedOverOverBought, ignoreFalseConditions, separator) +
ToString("isRsiCrossedUnderOverBought", isRsiCrossedUnderOverBought, ignoreFalseConditions, separator) +
ToString("isRsiOverSold", isRsiOverSold, ignoreFalseConditions, separator) +
ToString("isRsiCrossedUnderOverSold", isRsiCrossedUnderOverSold, ignoreFalseConditions, separator) +
ToString("isRsiCrossedOverOverSold", isRsiCrossedOverOverSold, ignoreFalseConditions, separator) +
//
// ATR ...
ToString("isCloseOverATRUpper", isCloseOverATRUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverATRLower", isCloseOverATRLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderATRUpper", isCloseUnderATRUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderATRLower", isCloseUnderATRLower, ignoreFalseConditions, separator) +
ToString("isRejectUpATRUpper", isRejectUpATRUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownATRUpper", isRejectDownATRUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpATRLower", isRejectUpATRLower, ignoreFalseConditions, separator) +
ToString("isRejectDownATRLower", isRejectDownATRLower, ignoreFalseConditions, separator) +
ToString("isBreakUpATRUpper", isBreakUpATRUpper, ignoreFalseConditions, separator) +
ToString("isBreakDownATRUpper", isBreakDownATRUpper, ignoreFalseConditions, separator) +
ToString("isBreakUpATRLower", isBreakUpATRLower, ignoreFalseConditions, separator) +
ToString("isBreakDownATRLower", isBreakDownATRLower, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrUpper", isCloseOverAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseOverAtrLower", isCloseOverAtrLower, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrUpper", isCloseUnderAtrUpper, ignoreFalseConditions, separator) +
ToString("isCloseUnderAtrLower", isCloseUnderAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrUpper", isRejectUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrUpper", isRejectDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isRejectUpAtrLower", isRejectUpAtrLower, ignoreFalseConditions, separator) +
ToString("isRejectDownAtrLower", isRejectDownAtrLower, ignoreFalseConditions, separator) +
ToString("isBreakUpAtrUpper", isBreakUpAtrUpper, ignoreFalseConditions, separator) +
ToString("isBreakDownAtrUpper", isBreakDownAtrUpper, ignoreFalseConditions, separator) +
ToString("isBreakUpAtrLower", isBreakUpAtrLower, ignoreFalseConditions, separator) +
ToString("isBreakDownAtrLower", isBreakDownAtrLower, ignoreFalseConditions, separator) +
//
""
//
@@ -999,56 +999,56 @@ class XCX121XATRHelper : public XCBaseHelper
// RSI ...
//
bool isRSIOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel;
bool isRSIOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel;
bool isRsiOverBought = conditions.rsiBuffer[cIDX] > mInputs.rsiOverBoughtLevel;
bool isRsiOverBoughtPrev = conditions.rsiBuffer[pIDX] > mInputs.rsiOverBoughtLevel;
//
bool isRSICrossedOverOverBought = isRSIOverBought &&
!isRSIOverBoughtPrev;
bool isRSICrossedUnderOverBought = !isRSIOverBought &&
isRSIOverBoughtPrev;
bool isRsiCrossedOverOverBought = isRsiOverBought &&
!isRsiOverBoughtPrev;
bool isRsiCrossedUnderOverBought = !isRsiOverBought &&
isRsiOverBoughtPrev;
//
bool isRSIOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel;
bool isRSIOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel;
bool isRsiOverSold = conditions.rsiBuffer[cIDX] < mInputs.rsiOverSoldLevel;
bool isRsiOverSoldPrev = conditions.rsiBuffer[pIDX] < mInputs.rsiOverSoldLevel;
//
bool isRSICrossedUnderOverSold = isRSIOverSold &&
!isRSIOverSoldPrev;
bool isRSICrossedOverOverSold = !isRSIOverSold &&
isRSIOverSoldPrev;
bool isRsiCrossedUnderOverSold = isRsiOverSold &&
!isRsiOverSoldPrev;
bool isRsiCrossedOverOverSold = !isRsiOverSold &&
isRsiOverSoldPrev;
//
// ATR ...
//
bool isCloseOverATRUpper = cBar.close > conditions.atrUpperBuffer[cIDX];
bool isCloseOverATRLower = cBar.close > conditions.atrLowerBuffer[cIDX];
bool isCloseOverAtrUpper = cBar.close > conditions.atrUpperBuffer[cIDX];
bool isCloseOverAtrLower = cBar.close > conditions.atrLowerBuffer[cIDX];
//
bool isCloseUnderATRUpper = cBar.close < conditions.atrUpperBuffer[cIDX];
bool isCloseUnderATRLower = cBar.close < conditions.atrLowerBuffer[cIDX];
bool isCloseUnderAtrUpper = cBar.close < conditions.atrUpperBuffer[cIDX];
bool isCloseUnderAtrLower = cBar.close < conditions.atrLowerBuffer[cIDX];
//
bool isRejectUpATRUpper = IsBarReject(
bool isRejectUpAtrUpper = IsBarReject(
atrUpperBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
);
bool isRejectDownATRUpper = IsBarReject(
bool isRejectDownAtrUpper = IsBarReject(
atrUpperBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
);
//
bool isRejectUpATRLower = IsBarReject(
bool isRejectUpAtrLower = IsBarReject(
atrLowerBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
);
;
bool isRejectDownATRLower = IsBarReject(
bool isRejectDownAtrLower = IsBarReject(
atrLowerBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
@@ -1056,48 +1056,48 @@ class XCX121XATRHelper : public XCBaseHelper
;
//
bool isBreakUpATRUpper = IsBarBreak(
bool isBreakUpAtrUpper = IsBarBreak(
atrUpperBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakDownATRUpper = IsBarBreak(
bool isBreakDownAtrUpper = IsBarBreak(
atrUpperBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
);
//
bool isBreakUpATRLower = IsBarBreak(
bool isBreakUpAtrLower = IsBarBreak(
atrLowerBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
);
bool isBreakDownATRLower = IsBarBreak(
bool isBreakDownAtrLower = IsBarBreak(
atrLowerBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
);
//
conditions.isRSIOverSold = isRSIOverSold;
conditions.isRSIOverBought = isRSIOverBought;
conditions.isRejectUpATRUpper = isRejectUpATRUpper;
conditions.isRejectUpATRLower = isRejectUpATRLower;
conditions.isBreakUpATRUpper = isBreakUpATRUpper;
conditions.isBreakUpATRLower = isBreakUpATRLower;
conditions.isRejectDownATRUpper = isRejectDownATRUpper;
conditions.isRejectDownATRLower = isRejectDownATRLower;
conditions.isCloseOverATRUpper = isCloseOverATRUpper;
conditions.isCloseOverATRLower = isCloseOverATRLower;
conditions.isBreakDownATRUpper = isBreakDownATRUpper;
conditions.isBreakDownATRLower = isBreakDownATRLower;
conditions.isCloseUnderATRUpper = isCloseUnderATRUpper;
conditions.isCloseUnderATRLower = isCloseUnderATRLower;
conditions.isRSICrossedOverOverSold = isRSICrossedOverOverSold;
conditions.isRSICrossedUnderOverSold = isRSICrossedUnderOverSold;
conditions.isRSICrossedOverOverBought = isRSICrossedOverOverBought;
conditions.isRSICrossedUnderOverBought = isRSICrossedUnderOverBought;
conditions.isRsiOverSold = isRsiOverSold;
conditions.isRsiOverBought = isRsiOverBought;
conditions.isRejectUpAtrUpper = isRejectUpAtrUpper;
conditions.isRejectUpAtrLower = isRejectUpAtrLower;
conditions.isBreakUpAtrUpper = isBreakUpAtrUpper;
conditions.isBreakUpAtrLower = isBreakUpAtrLower;
conditions.isRejectDownAtrUpper = isRejectDownAtrUpper;
conditions.isRejectDownAtrLower = isRejectDownAtrLower;
conditions.isCloseOverAtrUpper = isCloseOverAtrUpper;
conditions.isCloseOverAtrLower = isCloseOverAtrLower;
conditions.isBreakDownAtrUpper = isBreakDownAtrUpper;
conditions.isBreakDownAtrLower = isBreakDownAtrLower;
conditions.isCloseUnderAtrUpper = isCloseUnderAtrUpper;
conditions.isCloseUnderAtrLower = isCloseUnderAtrLower;
conditions.isRsiCrossedOverOverSold = isRsiCrossedOverOverSold;
conditions.isRsiCrossedUnderOverSold = isRsiCrossedUnderOverSold;
conditions.isRsiCrossedOverOverBought = isRsiCrossedOverOverBought;
conditions.isRsiCrossedUnderOverBought = isRsiCrossedUnderOverBought;
//
return result;
+53
View File
@@ -743,6 +743,59 @@ class XCX121XSTRHelper : public XCBaseHelper
);
}
//
double GetLastSTR(
ENUM_X_DIRECTION dir,
int barIndex = 0 //
)
{
//
double result = 0;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
if (!HasDirection(dir))
{
return result;
}
//
int index = barIndex;
bool isBullish = IsBullish(dir);
//
bool canContinue = true;
while (canContinue)
{
//
double iStr = GetSTR(index);
double iState = GetSTRState(index);
//
canContinue =
isBullish
? iState < 0
: iState > 0;
if (!canContinue)
{
//
result = iStr;
break;
}
//
index++;
}
//
return result;
}
//
bool GetConditions(
X121XSTRConditions &conditions, //