This commit is contained in:
2025-05-05 17:43:53 +03:30
parent 83242e6d1e
commit eb01acca2c
3 changed files with 615 additions and 362 deletions
+529 -1
View File
@@ -421,6 +421,535 @@ int AddGuard(
return result;
}
//
bool TestDetectSignal(
XCXCAEAHelper *helper,
XCXCAEAPOIDrawer *drawer,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
XCAEAConditions &conditions,
int barIndex = 0,
int loopback = 10 //
)
{
//
bool result = false;
//
int idx = -1;
int count = 0;
bool has = false;
//
box.Clean();
conditions.Clean();
dir = X_DIRECTION_NONE;
barIndex = NormalizeInt(barIndex, 0);
loopback = NormalizeInt(loopback, 5);
//
// Retrieve Some Requirements ...
string symbol = helper.GetSymbol();
ENUM_TIMEFRAMES period = helper.GetPeriod();
double points = GetPoints(symbol);
//
// Retrieve Conditions for Processing ...
result = helper.GetConditions(
conditions,
barIndex,
loopback //
);
if (!result)
{
//
box.Clean();
conditions.Clean();
//
return result;
}
//
// Define IDXses ...
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int p2IDX = pIDX + 1;
int p3IDX = p2IDX + 1;
int p4IDX = p3IDX + 1;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
XOHCL p4Bar;
result = zBar.Init(
symbol,
period,
zIDX //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(p2Bar);
result =
result &&
p2Bar.GetPreviousBar(p3Bar);
result =
result &&
p3Bar.GetPreviousBar(p4Bar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
box.Clean();
conditions.Clean();
//
return result;
}
//
// Bars Conditions ...
//
// Score ...
//
double bullishScore = 0;
double bearishScore = 0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
//
bool isScoreBullish =
bullishScore > bearishScore;
//
bool isScoreBearish =
bearishScore > bullishScore;
//
bool isScoreNeutural = MathAbs(bullishScore - bearishScore) == 0;
//
// Calculating Range Volumes ...
//
double bullishVolume = 0;
double bearishVolume = 0;
helper.barAnalyser.CalculateRangeVolume(
cBar,
bullishVolume,
bearishVolume,
loopback //
);
//
bool isVolumeNeutural = MathAbs(bullishVolume - bearishVolume) == 0;
//
// Reading Values ...
//
// PEAK ...
double zPeak = conditions.peakBuffer[zIDX];
double cPeak = conditions.peakBuffer[cIDX];
double pPeak = conditions.peakBuffer[pIDX];
double p2Peak = conditions.peakBuffer[p2IDX];
double p3Peak = conditions.peakBuffer[p3IDX];
double p4Peak = conditions.peakBuffer[p4IDX];
//
// VALE ...
double zVale = conditions.valeBuffer[zIDX];
double cVale = conditions.valeBuffer[cIDX];
double pVale = conditions.valeBuffer[pIDX];
double p2Vale = conditions.valeBuffer[p2IDX];
double p3Vale = conditions.valeBuffer[p3IDX];
double p4Vale = conditions.valeBuffer[p4IDX];
//
// SWING Low ...
double zSWL = conditions.swingLowBuffer[zIDX];
double cSWL = conditions.swingLowBuffer[cIDX];
double pSWL = conditions.swingLowBuffer[pIDX];
double p2SWL = conditions.swingLowBuffer[p2IDX];
double p3SWL = conditions.swingLowBuffer[p3IDX];
//
// SWING High ...
double zSWH = conditions.swingHighBuffer[zIDX];
double cSWH = conditions.swingHighBuffer[cIDX];
double pSWH = conditions.swingHighBuffer[pIDX];
double p2SWH = conditions.swingHighBuffer[p2IDX];
double p3SWH = conditions.swingHighBuffer[p3IDX];
//
// SUPPORT ...
double zSupport = conditions.supportBuffer[zIDX];
double cSupport = conditions.supportBuffer[cIDX];
double pSupport = conditions.supportBuffer[pIDX];
double p2Support = conditions.supportBuffer[p2IDX];
double p3Support = conditions.supportBuffer[p3IDX];
//
// RESISTANCE ...
double zResistance = conditions.resistanceBuffer[zIDX];
double cResistance = conditions.resistanceBuffer[cIDX];
double pResistance = conditions.resistanceBuffer[pIDX];
double p2Resistance = conditions.resistanceBuffer[p2IDX];
double p3Resistance = conditions.resistanceBuffer[p3IDX];
//
// MAH ...
double zMAH = conditions.mahBuffer[zIDX];
double cMAH = conditions.mahBuffer[cIDX];
double pMAH = conditions.mahBuffer[pIDX];
double p2MAH = conditions.mahBuffer[p2IDX];
double p3MAH = conditions.mahBuffer[p3IDX];
//
// MAL ...
double zMAL = conditions.malBuffer[zIDX];
double cMAL = conditions.malBuffer[cIDX];
double pMAL = conditions.malBuffer[pIDX];
double p2MAL = conditions.malBuffer[p2IDX];
double p3MAL = conditions.malBuffer[p3IDX];
//
// MAC ...
double zMAC = conditions.macBuffer[zIDX];
double cMAC = conditions.macBuffer[cIDX];
double pMAC = conditions.macBuffer[pIDX];
double p2MAC = conditions.macBuffer[p2IDX];
double p3MAC = conditions.macBuffer[p3IDX];
//
// FIBO Level 1 ...
double zFib1 = conditions.fiboLevel1Buffer[zIDX];
double cFib1 = conditions.fiboLevel1Buffer[cIDX];
double pFib1 = conditions.fiboLevel1Buffer[pIDX];
double p2Fib1 = conditions.fiboLevel1Buffer[p2IDX];
double p3Fib1 = conditions.fiboLevel1Buffer[p3IDX];
//
// FIBO Level 2 ...
double zFib2 = conditions.fiboLevel2Buffer[zIDX];
double cFib2 = conditions.fiboLevel2Buffer[cIDX];
double pFib2 = conditions.fiboLevel2Buffer[pIDX];
double p2Fib2 = conditions.fiboLevel2Buffer[p2IDX];
double p3Fib2 = conditions.fiboLevel2Buffer[p3IDX];
//
// FIBO Level 3 ...
double zFib3 = conditions.fiboLevel3Buffer[zIDX];
double cFib3 = conditions.fiboLevel3Buffer[cIDX];
double pFib3 = conditions.fiboLevel3Buffer[pIDX];
double p2Fib3 = conditions.fiboLevel3Buffer[p2IDX];
double p3Fib3 = conditions.fiboLevel3Buffer[p3IDX];
//
// FIBO Level 4 ...
double zFib4 = conditions.fiboLevel4Buffer[zIDX];
double cFib4 = conditions.fiboLevel4Buffer[cIDX];
double pFib4 = conditions.fiboLevel4Buffer[pIDX];
double p2Fib4 = conditions.fiboLevel4Buffer[p2IDX];
double p3Fib4 = conditions.fiboLevel4Buffer[p3IDX];
//
// FIBO Level 5 ...
double zFib5 = conditions.fiboLevel5Buffer[zIDX];
double cFib5 = conditions.fiboLevel5Buffer[cIDX];
double pFib5 = conditions.fiboLevel5Buffer[pIDX];
double p2Fib5 = conditions.fiboLevel5Buffer[p2IDX];
double p3Fib5 = conditions.fiboLevel5Buffer[p3IDX];
//
// Create Custom Conditions ...
//
// Bar and Fibo Conditions ...
//
// Bearish ...
//
// Strong Reversal ...
bool isZBarOnFiboStrongBearish = zBar.low > zFib5;
bool isCBarOnFiboStrongBearish = cBar.low > cFib5;
bool isPBarOnFiboStrongBearish = pBar.low > pFib5;
bool isP2BarOnFiboStrongBearish = p2Bar.low > p2Fib5;
bool isP3BarOnFiboStrongBearish = p3Bar.low > p3Fib5;
//
// Golden Zone Reversal ...
bool isZBarOnFiboGoldenBearish = zBar.low > zFib3 &&
zBar.high < zFib4;
bool isCBarOnFiboGoldenBearish = cBar.low > cFib3 &&
cBar.high < cFib4;
bool isPBarOnFiboGoldenBearish = pBar.low > pFib3 &&
pBar.high < pFib4;
bool isP2BarOnFiboGoldenBearish = p2Bar.low > p2Fib3 &&
p2Bar.high < p2Fib4;
bool isP3BarOnFiboGoldenBearish = p3Bar.low > p3Fib3 &&
p3Bar.high < p3Fib4;
//
// Bullish ...
//
// Strong Reversal ...
bool isZBarOnFiboStrongBullish = zBar.high < zFib1;
bool isCBarOnFiboStrongBullish = cBar.high < cFib1;
bool isPBarOnFiboStrongBullish = pBar.high < pFib1;
bool isP2BarOnFiboStrongBullish = p2Bar.high < p2Fib1;
bool isP3BarOnFiboStrongBullish = p3Bar.high < p3Fib1;
//
// Golden Zone Reversal ...
bool isZBarOnFiboGoldenBullish = zBar.low > zFib2 &&
zBar.high < zFib3;
bool isCBarOnFiboGoldenBullish = cBar.low > cFib2 &&
cBar.high < cFib3;
bool isPBarOnFiboGoldenBullish = pBar.low > pFib2 &&
pBar.high < pFib3;
bool isP2BarOnFiboGoldenBullish = p2Bar.low > p2Fib2 &&
p2Bar.high < p2Fib3;
bool isP3BarOnFiboGoldenBullish = p3Bar.low > p3Fib2 &&
p3Bar.high < p3Fib3;
//
// Score and Volume Conditions ...
//
bool isScoreVolumeNeutural = isScoreNeutural ||
isVolumeNeutural;
//
bool isScoreVolumeNeuturalInFiboStrongBullish =
isScoreNeutural &&
isCBarOnFiboStrongBullish;
bool isScoreVolumeNeuturalInFiboGoldenBullish =
isScoreNeutural &&
isCBarOnFiboGoldenBullish;
//
bool isScoreVolumeNeuturalInFiboStrongBearish =
isScoreNeutural &&
isCBarOnFiboStrongBearish;
bool isScoreVolumeNeuturalInFiboGoldenBearish =
isScoreNeutural &&
isCBarOnFiboGoldenBearish;
//
bool isScoreVolumeNeuturalBullishPowered =
isScoreVolumeNeuturalInFiboStrongBullish ||
isScoreVolumeNeuturalInFiboGoldenBullish;
bool isScoreVolumeNeuturalBearishPowered =
isScoreVolumeNeuturalInFiboStrongBearish ||
isScoreVolumeNeuturalInFiboGoldenBearish;
//
// PEAK and VALES ...
//
// PEAK Pivot ...
bool isZIsPeakPivot =
zPeak == cPeak &&
zPeak == zSWH &&
zPeak == zResistance &&
isZBarOnFiboStrongBearish;
bool isCIsPeakPivot =
cPeak == pPeak &&
cPeak == cSWH &&
cPeak == cResistance &&
isCBarOnFiboStrongBearish;
bool isPIsPeakPivot =
pPeak == p2Peak &&
pPeak == pSWH &&
pPeak == pResistance &&
isPBarOnFiboStrongBearish;
bool isP2IsPeakPivot =
p2Peak == p3Peak &&
p2Peak == p2SWH &&
p2Peak == p2Resistance &&
isP2BarOnFiboStrongBearish;
bool isP3IsPeakPivot =
p3Peak == p4Peak &&
p3Peak == p3SWH &&
p3Peak == p3Resistance &&
isP3BarOnFiboStrongBearish;
//
// VALE Pivot ...
bool isZIsValePivot =
zVale == cVale &&
zVale == zSWL &&
zVale == zSupport &&
isZBarOnFiboStrongBullish;
bool isCIsValePivot =
cVale == pVale &&
cVale == cSWL &&
cVale == cSupport &&
isCBarOnFiboStrongBullish;
bool isPIsValePivot =
pVale == p2Vale &&
pVale == pSWL &&
pVale == pSupport &&
isPBarOnFiboStrongBullish;
bool isP2IsValePivot =
p2Vale == p3Vale &&
p2Vale == p2SWL &&
p2Vale == p2Support &&
isP2BarOnFiboStrongBullish;
bool isP3IsValePivot =
p3Vale == p4Vale &&
p3Vale == p3SWL &&
p3Vale == p3Support &&
isP3BarOnFiboStrongBullish;
//
// Testing Conditions ...
//
// Score and Volume Conditions ...
if (isScoreVolumeNeuturalBullishPowered ||
isScoreVolumeNeuturalBearishPowered)
{
//
ENUM_X_DIRECTION iScoreVolumeDir =
isScoreVolumeNeuturalBullishPowered
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
int timeOffset = (int)cBar.time;
string iName = ToString(iScoreVolumeDir) + "_SCVM_" + ToString(timeOffset);
color iColor = isScoreVolumeNeuturalBullishPowered
? clrAqua
: clrMagenta;
ENUM_LINE_STYLE iStyle = STYLE_DOT;
//
// CChartObjectVLine *iObj;
// iObj = new CChartObjectVLine();
// has = iObj.Create(
// 0,
// iName,
// 0,
// cBar.time //
// );
// if (has)
// {
// //
// iObj.Color(iColor);
// iObj.Style(iStyle);
// }
// //
// Print("Conditions Finder ...");
}
//
// PVPivot Conditions ...
if (isCIsPeakPivot ||
isCIsValePivot)
{
//
ENUM_X_DIRECTION iPVPivotDir =
isCIsValePivot
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
int timeOffset = (int)cBar.time;
string iName = ToString(iPVPivotDir) + "_PVPVT_" + ToString(timeOffset);
color iColor = isCIsValePivot
? clrAqua
: clrMagenta;
ENUM_LINE_STYLE iStyle = STYLE_DOT;
// //
// CChartObjectVLine *iObj;
// iObj = new CChartObjectVLine();
// has = iObj.Create(
// 0,
// iName,
// 0,
// cBar.time //
// );
// if (has)
// {
// //
// iObj.Color(iColor);
// iObj.Style(iStyle);
// }
// //
// Print("Conditions Finder ...");
}
//
// Summarise Result ...
//
bool isBullish = false;
bool isBearish = false;
//
result = isBullish ||
isBearish;
if (result)
{
//
// Do Signal Preparing ...
//
// Check Box is Prepared or Not ...
result = box.IsValid();
}
//
// Cleaning Up ...
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
if (!result)
{
//
box.Clean();
conditions.Clean();
}
//
return result;
}
//
// Cond 2 ...
// - a PV Box is Sweep Liquidity;
@@ -431,7 +960,6 @@ int AddGuard(
//
bool DetectXCAEAConditions(
XCXCAEAPOIDrawer *drawer,
ENUM_X_DIRECTION trend,
XBoxZone &pivots[],
XCAEAConditions &conditions,
XBoxZone &pivotBox,