last works on create X121Setup ...

This commit is contained in:
2024-06-10 12:44:15 +03:30
parent d15ec966ae
commit da4c0f6646
17 changed files with 8813 additions and 10 deletions
+746
View File
@@ -190,6 +190,568 @@ struct XICHInputs
}
};
//
// Define Conditions ...
struct XICHConditions
{
//
// Common ...
string symbol;
ENUM_TIMEFRAMES period;
datetime time;
//
// Buffers ...
double tenkanSen[];
double kijunSen[];
double chikouSpan[];
double senkouSpanA[];
double senkouSpanB[];
double futureSenkouSpanA[];
double futureSenkouSpanB[];
//
// Conditions ...
//
bool isClosedOverKijunSen;
bool isClosedUnderKijunSen;
bool isTenkanSenOverKijunSen;
bool isTenkanSenUnderKijunSen;
bool isTenkanSenCrossedOverKijunSen;
bool isTenkanSenCrossedUnderKijunSen;
//
bool isSenkouSpanAOverB;
bool isSenkouSpanAUnderB;
bool isSenkouSpanAOverLast;
bool isSenkouSpanAUnderLast;
bool isFutureSenkouSpanAOverB;
bool isFutureSenkouSpanAUnderB;
bool isFutureSenkouSpanAOverLast;
bool isFutureSenkouSpanAUnderLast;
//
bool isSenkouSpanACrossedOverB;
bool isSenkouSpanACrossedUnderB;
bool isSenkouSpanACrossedOverLast;
bool isSenkouSpanACrossedUnderLast;
bool isFutureSenkouSpanACrossedOverB;
bool isFutureSenkouSpanACrossedUnderB;
bool isFutureSenkouSpanACrossedOverLast;
bool isFutureSenkouSpanACrossedUnderLast;
//
void Clean()
{
//
Clean(tenkanSen);
Clean(kijunSen);
Clean(chikouSpan);
Clean(senkouSpanA);
Clean(senkouSpanB);
Clean(futureSenkouSpanA);
Clean(futureSenkouSpanB);
//
ArraySetAsSeries(tenkanSen, true);
ArraySetAsSeries(kijunSen, true);
ArraySetAsSeries(chikouSpan, true);
ArraySetAsSeries(senkouSpanA, true);
ArraySetAsSeries(senkouSpanB, true);
ArraySetAsSeries(futureSenkouSpanA, true);
ArraySetAsSeries(futureSenkouSpanB, true);
//
isClosedOverKijunSen = false;
isClosedUnderKijunSen = false;
isTenkanSenOverKijunSen = false;
isTenkanSenUnderKijunSen = false;
isTenkanSenCrossedOverKijunSen = false;
isTenkanSenCrossedUnderKijunSen = false;
//
isSenkouSpanAOverB = false;
isSenkouSpanAUnderB = false;
isSenkouSpanAOverLast = false;
isSenkouSpanAUnderLast = false;
isFutureSenkouSpanAOverB = false;
isFutureSenkouSpanAUnderB = false;
isFutureSenkouSpanAOverLast = false;
isFutureSenkouSpanAUnderLast = false;
//
isSenkouSpanACrossedOverB = false;
isSenkouSpanACrossedUnderB = false;
isSenkouSpanACrossedOverLast = false;
isSenkouSpanACrossedUnderLast = false;
isFutureSenkouSpanACrossedOverB = false;
isFutureSenkouSpanACrossedUnderB = false;
isFutureSenkouSpanACrossedOverLast = false;
isFutureSenkouSpanACrossedUnderLast = false;
}
//
void GenerateScore(
double &bullishScore,
double &bearishScore //
)
{
//
bullishScore = 0;
bearishScore = 0;
//
if (isClosedOverKijunSen)
{
bullishScore++;
}
if (isTenkanSenOverKijunSen)
{
bullishScore++;
}
if (isTenkanSenCrossedOverKijunSen)
{
bullishScore++;
}
if (isSenkouSpanAOverB)
{
bullishScore++;
}
if (isSenkouSpanAOverLast)
{
bullishScore++;
}
if (isFutureSenkouSpanAOverB)
{
bullishScore++;
}
if (isFutureSenkouSpanAOverLast)
{
bullishScore++;
}
if (isSenkouSpanACrossedOverB)
{
bullishScore++;
}
if (isSenkouSpanACrossedOverLast)
{
bullishScore++;
}
if (isFutureSenkouSpanACrossedOverB)
{
bullishScore++;
}
if (isFutureSenkouSpanACrossedOverLast)
{
bullishScore++;
}
//
if (isClosedUnderKijunSen)
{
bearishScore++;
}
if (isTenkanSenUnderKijunSen)
{
bearishScore++;
}
if (isTenkanSenCrossedUnderKijunSen)
{
bearishScore++;
}
if (isSenkouSpanAUnderB)
{
bearishScore++;
}
if (isSenkouSpanAUnderLast)
{
bearishScore++;
}
if (isFutureSenkouSpanAUnderB)
{
bearishScore++;
}
if (isFutureSenkouSpanAUnderLast)
{
bearishScore++;
}
if (isSenkouSpanACrossedUnderB)
{
bearishScore++;
}
if (isSenkouSpanACrossedUnderLast)
{
bearishScore++;
}
if (isFutureSenkouSpanACrossedUnderB)
{
bearishScore++;
}
if (isFutureSenkouSpanACrossedUnderLast)
{
bearishScore++;
}
}
//
string GenerateSummary(
bool onlyCommons = false,
bool onlyConditions = false,
bool includeScores = true,
bool ignoreFalseConditions = true,
string separator = "\n" //
)
{
//
string result = NULL;
//
double bullishScore = 0;
double bearishScore = 0;
GenerateScore(
bullishScore,
bearishScore //
);
//
string scoresStr =
//
"Scores: " + separator +
"---------------" + separator +
"Bullish: " + ToString(bullishScore) + separator +
"Bearish: " + ToString(bearishScore) + separator +
""
//
;
//
string commonStr = GenerateSpecifiedCommonSummary(
this,
separator,
includeScores //
);
//
string conditionsStr =
//
ToString("isClosedOverKijunSen", isClosedOverKijunSen, ignoreFalseConditions, separator) +
ToString("isClosedUnderKijunSen", isClosedUnderKijunSen, ignoreFalseConditions, separator) +
ToString("isTenkanSenOverKijunSen", isTenkanSenOverKijunSen, ignoreFalseConditions, separator) +
ToString("isTenkanSenUnderKijunSen", isTenkanSenUnderKijunSen, ignoreFalseConditions, separator) +
ToString("isTenkanSenCrossedOverKijunSen", isTenkanSenCrossedOverKijunSen, ignoreFalseConditions, separator) +
ToString("isTenkanSenCrossedUnderKijunSen", isTenkanSenCrossedUnderKijunSen, ignoreFalseConditions, separator) +
//
ToString("isSenkouSpanAOverB", isSenkouSpanAOverB, ignoreFalseConditions, separator) +
ToString("isSenkouSpanAUnderB", isSenkouSpanAUnderB, ignoreFalseConditions, separator) +
ToString("isSenkouSpanAOverLast", isSenkouSpanAOverLast, ignoreFalseConditions, separator) +
ToString("isSenkouSpanAUnderLast", isSenkouSpanAUnderLast, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanAOverB", isFutureSenkouSpanAOverB, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanAUnderB", isFutureSenkouSpanAUnderB, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanAOverLast", isFutureSenkouSpanAOverLast, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanAUnderLast", isFutureSenkouSpanAUnderLast, ignoreFalseConditions, separator) +
//
ToString("isSenkouSpanACrossedOverB", isSenkouSpanACrossedOverB, ignoreFalseConditions, separator) +
ToString("isSenkouSpanACrossedUnderB", isSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) +
ToString("isSenkouSpanACrossedOverLast", isSenkouSpanACrossedOverLast, ignoreFalseConditions, separator) +
ToString("isSenkouSpanACrossedUnderLast", isSenkouSpanACrossedUnderLast, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanACrossedOverB", isFutureSenkouSpanACrossedOverB, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanACrossedUnderB", isFutureSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanACrossedOverLast", isFutureSenkouSpanACrossedOverLast, ignoreFalseConditions, separator) +
ToString("isFutureSenkouSpanACrossedUnderLast", isFutureSenkouSpanACrossedUnderLast, ignoreFalseConditions, separator) +
""
//
;
//
result =
//
"[" + GetTag() + "]" + separator +
(onlyConditions
? ""
: commonStr) +
(!includeScores
? ""
: scoresStr) +
" " + separator +
(onlyCommons
? ""
: conditionsStr) +
""
//
;
//
return result;
}
//
string GetTag()
{
return "XICH";
}
//
bool HasLongConditions()
{
//
bool result;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
bool isCloseOverSenkouSpanA = cBar.close > senkouSpanA[cIndex];
//
bool isBaseBullish = isCloseOverSenkouSpanA &&
isSenkouSpanAOverB &&
isSenkouSpanAOverLast;
//
bool isKijunSenOverSenkouSpanA = kijunSen[cIndex] > senkouSpanA[cIndex];
//
bool isCloseOverTenkanSen = cBar.close > tenkanSen[cIndex];
//
bool isPriceCloseCrossedUpTenkanSen = pBar.close <= tenkanSen[pIndex] &&
cBar.close > tenkanSen[cIndex];
//
double cKumoUpper = MathMax(senkouSpanA[cIndex], senkouSpanB[cIndex]);
double pKumoUpper = MathMax(senkouSpanA[pIndex], senkouSpanB[pIndex]);
//
double cKumoLower = MathMin(senkouSpanA[cIndex], senkouSpanB[cIndex]);
double pKumoLower = MathMin(senkouSpanA[pIndex], senkouSpanB[pIndex]);
//
bool isTenkanSenOverKumo = tenkanSen[cIndex] > cKumoUpper;
bool isTenkanSenOverKumoPrev = tenkanSen[pIndex] > pKumoUpper;
//
bool isTenkanSenUnderKumo = tenkanSen[cIndex] < cKumoLower;
bool isTenkanSenUnderKumoPrev = tenkanSen[pIndex] < pKumoLower;
//
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
!isTenkanSenOverKumoPrev;
//
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
!isTenkanSenUnderKumoPrev;
//
bool condition1 =
isBaseBullish &&
isCloseOverTenkanSen &&
isKijunSenOverSenkouSpanA &&
isTenkanSenCrossedOverKijunSen;
//
bool condition2 =
isBaseBullish &&
isCloseOverTenkanSen &&
isKijunSenOverSenkouSpanA &&
isTenkanSenOverKijunSen &&
isSenkouSpanACrossedOverB;
//
bool condition3 =
isBaseBullish &&
isKijunSenOverSenkouSpanA &&
isPriceCloseCrossedUpTenkanSen &&
isTenkanSenOverKijunSen;
//
bool condition4 =
isCloseOverTenkanSen &&
isTenkanSenCrossedOverKumo &&
isTenkanSenOverKijunSen &&
isFutureSenkouSpanAOverB &&
isFutureSenkouSpanAOverLast;
//
result =
//
condition1
//
||
//
condition2
//
||
//
condition3
//
||
//
condition4
//
;
//
return result;
}
//
bool HasShortConditions()
{
//
bool result = false;
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
//
XOHCL cBar;
result = cBar.Init(
symbol,
period,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
symbol,
period,
pIndex //
);
if (!result)
{
return result;
}
//
bool isCloseUnderSenkouSpanB = cBar.close < senkouSpanB[cIndex];
//
bool isBaseBearish = isCloseUnderSenkouSpanB &&
isSenkouSpanAUnderB &&
isSenkouSpanAUnderLast;
//
bool isKijunSenUnderSenkouSpanB = kijunSen[cIndex] < senkouSpanB[cIndex];
//
bool isCloseUnderTenkanSen = cBar.close < tenkanSen[cIndex];
//
bool isPriceCloseCrossedDownTenkanSen = pBar.close >= tenkanSen[pIndex] &&
cBar.close < tenkanSen[cIndex];
//
double cKumoUpper = MathMax(senkouSpanA[cIndex], senkouSpanB[cIndex]);
double pKumoUpper = MathMax(senkouSpanA[pIndex], senkouSpanB[pIndex]);
//
double cKumoLower = MathMin(senkouSpanA[cIndex], senkouSpanB[cIndex]);
double pKumoLower = MathMin(senkouSpanA[pIndex], senkouSpanB[pIndex]);
//
bool isTenkanSenOverKumo = tenkanSen[cIndex] > cKumoUpper;
bool isTenkanSenOverKumoPrev = tenkanSen[pIndex] > pKumoUpper;
//
bool isTenkanSenUnderKumo = tenkanSen[cIndex] < cKumoLower;
bool isTenkanSenUnderKumoPrev = tenkanSen[pIndex] < pKumoLower;
//
bool isTenkanSenCrossedOverKumo = isTenkanSenOverKumo &&
!isTenkanSenOverKumoPrev;
//
bool isTenkanSenCrossedUnderKumo = isTenkanSenUnderKumo &&
!isTenkanSenUnderKumoPrev;
//
bool condition1 =
isBaseBearish &&
isCloseUnderTenkanSen &&
isKijunSenUnderSenkouSpanB &&
isTenkanSenCrossedUnderKijunSen;
//
bool condition2 =
isBaseBearish &&
isCloseUnderTenkanSen &&
isKijunSenUnderSenkouSpanB &&
isTenkanSenUnderKijunSen &&
isSenkouSpanACrossedUnderB;
//
bool condition3 =
isBaseBearish &&
isKijunSenUnderSenkouSpanB &&
isPriceCloseCrossedDownTenkanSen &&
isTenkanSenUnderKijunSen;
//
bool condition4 =
isCloseUnderTenkanSen &&
isTenkanSenCrossedUnderKumo &&
isTenkanSenUnderKijunSen &&
isFutureSenkouSpanAUnderB &&
isFutureSenkouSpanAUnderLast;
//
result =
//
condition1
||
//
condition2
//
||
//
condition3
//
||
//
condition4
//
;
//
return result;
}
};
//
// Class ...
class XSCXICHHelper : public XSCBaseHelper
@@ -703,6 +1265,190 @@ public:
);
}
//
bool GetConditions(
XICHConditions &conditions, //
int barIndex = 0, //
int loopback = 4 //
)
{
//
bool result = true;
//
if (loopback < 4)
{
loopback = 4;
}
//
conditions.Clean();
//
conditions.symbol = mSymbol;
conditions.period = mPeriod;
conditions.time = TimeCurrent();
//
int zIndex = barIndex;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
CopyTenkanSen(
zIndex,
loopback,
conditions.tenkanSen //
);
CopyKijunSen(
zIndex,
loopback,
conditions.kijunSen //
);
CopyChikouSpan(
zIndex,
loopback,
conditions.chikouSpan //
);
CopySenkouSpanA(
zIndex,
loopback,
conditions.senkouSpanA //
);
CopySenkouSpanB(
zIndex,
loopback,
conditions.senkouSpanB //
);
CopyFutureSenkouSpanA(
zIndex,
loopback,
conditions.futureSenkouSpanA //
);
CopyFutureSenkouSpanB(
zIndex,
loopback,
conditions.futureSenkouSpanB //
);
//
// Calculate Conditions ...
//
XOHCL cBar;
result = cBar.Init(
_Symbol,
_Period,
cIndex //
);
if (!result)
{
return result;
}
//
bool isClosedOverKijunSen = cBar.close > conditions.kijunSen[cIndex];
bool isClosedUnderKijunSen = cBar.close < conditions.kijunSen[cIndex];
//
bool isTenkanSenOverKijunSen = conditions.tenkanSen[cIndex] > conditions.kijunSen[cIndex];
bool isTenkanSenUnderKijunSen = conditions.tenkanSen[cIndex] < conditions.kijunSen[cIndex];
//
bool isTenkanSenOverKijunSenPrev = conditions.tenkanSen[pIndex] > conditions.kijunSen[pIndex];
bool isTenkanSenUnderKijunSenPrev = conditions.tenkanSen[pIndex] < conditions.kijunSen[pIndex];
//
bool isTenkanSenCrossedOverKijunSen = isTenkanSenOverKijunSen &&
!isTenkanSenOverKijunSenPrev;
bool isTenkanSenCrossedUnderKijunSen = isTenkanSenUnderKijunSen &&
!isTenkanSenUnderKijunSenPrev;
//
bool isSenkouSpanAOverB = conditions.senkouSpanA[cIndex] > conditions.senkouSpanB[cIndex];
bool isSenkouSpanAUnderB = conditions.senkouSpanA[cIndex] < conditions.senkouSpanB[cIndex];
//
bool isSenkouSpanAOverBPrev = conditions.senkouSpanA[pIndex] > conditions.senkouSpanB[pIndex];
bool isSenkouSpanAUnderBPrev = conditions.senkouSpanA[pIndex] < conditions.senkouSpanB[pIndex];
//
bool isSenkouSpanAOverLast = conditions.senkouSpanA[cIndex] > conditions.senkouSpanA[pIndex];
bool isSenkouSpanAUnderLast = conditions.senkouSpanA[cIndex] < conditions.senkouSpanA[pIndex];
//
bool isSenkouSpanAOverLastPrev = conditions.senkouSpanA[pIndex] > conditions.senkouSpanA[ppIndex];
bool isSenkouSpanAUnderLastPrev = conditions.senkouSpanA[pIndex] < conditions.senkouSpanA[ppIndex];
//
bool isFutureSenkouSpanAOverB = conditions.futureSenkouSpanA[cIndex] > conditions.futureSenkouSpanB[cIndex];
bool isFutureSenkouSpanAUnderB = conditions.futureSenkouSpanA[cIndex] < conditions.futureSenkouSpanB[cIndex];
//
bool isFutureSenkouSpanAOverBPrev = conditions.futureSenkouSpanA[pIndex] > conditions.futureSenkouSpanB[pIndex];
bool isFutureSenkouSpanAUnderBPrev = conditions.futureSenkouSpanA[pIndex] < conditions.futureSenkouSpanB[pIndex];
//
bool isFutureSenkouSpanAOverLast = conditions.futureSenkouSpanA[cIndex] > conditions.futureSenkouSpanA[pIndex];
bool isFutureSenkouSpanAUnderLast = conditions.futureSenkouSpanA[cIndex] < conditions.futureSenkouSpanA[pIndex];
//
bool isFutureSenkouSpanAOverLastPrev = conditions.futureSenkouSpanA[pIndex] > conditions.futureSenkouSpanA[ppIndex];
bool isFutureSenkouSpanAUnderLastPrev = conditions.futureSenkouSpanA[pIndex] < conditions.futureSenkouSpanA[ppIndex];
//
bool isSenkouSpanACrossedOverB = isSenkouSpanAOverB &&
!isSenkouSpanAOverBPrev;
bool isSenkouSpanACrossedUnderB = isSenkouSpanAUnderB &&
!isSenkouSpanAUnderBPrev;
//
bool isSenkouSpanACrossedOverLast = isSenkouSpanAOverLast &
!isSenkouSpanAOverLastPrev;
bool isSenkouSpanACrossedUnderLast = isSenkouSpanAUnderLast &&
!isSenkouSpanAUnderLastPrev;
//
bool isFutureSenkouSpanACrossedOverB = isFutureSenkouSpanAOverB &&
!isFutureSenkouSpanAOverBPrev;
bool isFutureSenkouSpanACrossedUnderB = isFutureSenkouSpanAUnderB &&
!isFutureSenkouSpanAUnderBPrev;
//
bool isFutureSenkouSpanACrossedOverLast = isFutureSenkouSpanAOverLast &&
!isFutureSenkouSpanAOverLastPrev;
bool isFutureSenkouSpanACrossedUnderLast = isFutureSenkouSpanAUnderLast &&
!isFutureSenkouSpanAUnderLastPrev;
//
conditions.isClosedOverKijunSen = isClosedOverKijunSen;
conditions.isClosedUnderKijunSen = isClosedUnderKijunSen;
conditions.isTenkanSenOverKijunSen = isTenkanSenOverKijunSen;
conditions.isTenkanSenUnderKijunSen = isTenkanSenUnderKijunSen;
conditions.isTenkanSenCrossedOverKijunSen = isTenkanSenCrossedOverKijunSen;
conditions.isTenkanSenCrossedUnderKijunSen = isTenkanSenCrossedUnderKijunSen;
conditions.isSenkouSpanAOverB = isSenkouSpanAOverB;
conditions.isSenkouSpanAUnderB = isSenkouSpanAUnderB;
conditions.isSenkouSpanAOverLast = isSenkouSpanAOverLast;
conditions.isSenkouSpanAUnderLast = isSenkouSpanAUnderLast;
conditions.isFutureSenkouSpanAOverB = isFutureSenkouSpanAOverB;
conditions.isFutureSenkouSpanAUnderB = isFutureSenkouSpanAUnderB;
conditions.isFutureSenkouSpanAOverLast = isFutureSenkouSpanAOverLast;
conditions.isFutureSenkouSpanAUnderLast = isFutureSenkouSpanAUnderLast;
conditions.isSenkouSpanACrossedOverB = isSenkouSpanACrossedOverB;
conditions.isSenkouSpanACrossedUnderB = isSenkouSpanACrossedUnderB;
conditions.isSenkouSpanACrossedOverLast = isSenkouSpanACrossedOverLast;
conditions.isSenkouSpanACrossedUnderLast = isSenkouSpanACrossedUnderLast;
conditions.isFutureSenkouSpanACrossedOverB = isFutureSenkouSpanACrossedOverB;
conditions.isFutureSenkouSpanACrossedUnderB = isFutureSenkouSpanACrossedUnderB;
conditions.isFutureSenkouSpanACrossedOverLast = isFutureSenkouSpanACrossedOverLast;
conditions.isFutureSenkouSpanACrossedUnderLast = isFutureSenkouSpanACrossedUnderLast;
//
return result;
}
//
// Protected ...
protected: