This commit is contained in:
2025-04-17 01:46:46 +03:30
parent d912210e68
commit c6e3c78e06
9 changed files with 3038 additions and 37 deletions
File diff suppressed because it is too large Load Diff
+112
View File
@@ -163,6 +163,10 @@ struct XCAEAConditions
ENUM_TIMEFRAMES period;
datetime time;
//
datetime to;
datetime from;
//
// XCA ...
@@ -171,6 +175,7 @@ struct XCAEAConditions
//
double kiBuffer[];
double tkiBuffer[];
double sHHBuffer[];
double sLLBuffer[];
double mHHBuffer[];
@@ -185,6 +190,7 @@ struct XCAEAConditions
double trendBuffer[];
double kiStateBuffer[];
double supportBuffer[];
double tkiStateBuffer[];
double swingLowBuffer[];
double swingHighBuffer[];
double resistanceBuffer[];
@@ -213,6 +219,21 @@ struct XCAEAConditions
bool isKISwitchedToBullish;
bool isKISwitchedToBearish;
//
// TKI ...
//
bool isTKIRejectUp;
bool isTKIRejectDown;
//
bool isTKIBullish;
bool isTKIBearish;
//
bool isTKISwitchedToBullish;
bool isTKISwitchedToBearish;
//
// SAR ...
@@ -577,6 +598,10 @@ struct XCAEAConditions
// Commons ...
symbol = NULL;
period = NULL;
//
to = NULL;
from = NULL;
time = NULL;
//
@@ -587,6 +612,7 @@ struct XCAEAConditions
//
Clean(kiBuffer);
Clean(tkiBuffer);
Clean(sHHBuffer);
Clean(sLLBuffer);
Clean(mHHBuffer);
@@ -601,6 +627,7 @@ struct XCAEAConditions
Clean(trendBuffer);
Clean(kiStateBuffer);
Clean(supportBuffer);
Clean(tkiStateBuffer);
Clean(swingLowBuffer);
Clean(swingHighBuffer);
Clean(resistanceBuffer);
@@ -613,6 +640,7 @@ struct XCAEAConditions
//
ArraySetAsSeries(kiBuffer, true);
ArraySetAsSeries(tkiBuffer, true);
ArraySetAsSeries(sHHBuffer, true);
ArraySetAsSeries(sLLBuffer, true);
ArraySetAsSeries(mHHBuffer, true);
@@ -627,6 +655,7 @@ struct XCAEAConditions
ArraySetAsSeries(trendBuffer, true);
ArraySetAsSeries(kiStateBuffer, true);
ArraySetAsSeries(supportBuffer, true);
ArraySetAsSeries(tkiStateBuffer, true);
ArraySetAsSeries(swingLowBuffer, true);
ArraySetAsSeries(swingHighBuffer, true);
ArraySetAsSeries(resistanceBuffer, true);
@@ -655,6 +684,21 @@ struct XCAEAConditions
isKISwitchedToBullish = false;
isKISwitchedToBearish = false;
//
// TKI ...
//
isTKIRejectUp = false;
isTKIRejectDown = false;
//
isTKIBullish = false;
isTKIBearish = false;
//
isTKISwitchedToBullish = false;
isTKISwitchedToBearish = false;
//
// SAR ...
@@ -1008,6 +1052,37 @@ struct XCAEAConditions
bearishScore += minScore;
}
//
// TKI ...
//
if (isTKIBullish)
{
bullishScore += minScore;
}
if (isTKIRejectUp)
{
bullishScore += minScore;
}
if (isTKISwitchedToBullish)
{
bullishScore += minScore;
}
//
if (isTKIBearish)
{
bearishScore += minScore;
}
if (isTKIRejectDown)
{
bearishScore += minScore;
}
if (isTKISwitchedToBearish)
{
bearishScore += minScore;
}
//
// SAR ...
@@ -1695,6 +1770,12 @@ struct XCAEAConditions
ToString("isKIBearish", isKIBearish, ignoreFalseConditions, separator) +
ToString("isKISwitchedToBullish", isKISwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isKISwitchedToBearish", isKISwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isTKIRejectUp", isTKIRejectUp, ignoreFalseConditions, separator) +
ToString("isTKIRejectDown", isTKIRejectDown, ignoreFalseConditions, separator) +
ToString("isTKIBullish", isTKIBullish, ignoreFalseConditions, separator) +
ToString("isTKIBearish", isTKIBearish, ignoreFalseConditions, separator) +
ToString("isTKISwitchedToBullish", isTKISwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isTKISwitchedToBearish", isTKISwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isSarBullish", isSarBullish, ignoreFalseConditions, separator) +
ToString("isSarBearish", isSarBearish, ignoreFalseConditions, separator) +
ToString("isSarSwitchedToBullish", isSarSwitchedToBullish, ignoreFalseConditions, separator) +
@@ -2396,6 +2477,7 @@ class XCXCAEAHelper : XCBase
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL fromBar;
//
X121XCAConditions xcaConditions;
@@ -2413,6 +2495,12 @@ class XCXCAEAHelper : XCBase
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
fromBar.Init(
zBar.symbol,
zBar.period,
zIndex + loopback);
//
// Conditions Retriever ...
@@ -2445,6 +2533,7 @@ class XCXCAEAHelper : XCBase
zBar.Clean();
cBar.Clean();
pBar.Clean();
fromBar.Clean();
//
xcaConditions.Clean();
@@ -2454,6 +2543,10 @@ class XCXCAEAHelper : XCBase
return result;
}
//
conditions.to = zBar.time;
conditions.from = fromBar.time;
//
// Fill X121 Conditions Reference by Using
// Retrieved Conditions ...
@@ -2474,6 +2567,12 @@ class XCXCAEAHelper : XCBase
conditions.kiBuffer //
);
//
Copy(
xcaConditions.tkiBuffer,
conditions.tkiBuffer //
);
//
Copy(
xcaConditions.sHHBuffer,
@@ -2552,6 +2651,12 @@ class XCXCAEAHelper : XCBase
conditions.kiStateBuffer //
);
//
Copy(
xcaConditions.tkiStateBuffer,
conditions.tkiStateBuffer //
);
//
Copy(
xcaConditions.supportBuffer,
@@ -2619,8 +2724,11 @@ class XCXCAEAHelper : XCBase
conditions.isKIBullish = xcaConditions.isKIBullish;
conditions.isKIBearish = xcaConditions.isKIBearish;
conditions.isKIRejectUp = xcaConditions.isKIRejectUp;
conditions.isTKIBullish = xcaConditions.isTKIBullish;
conditions.isTKIBearish = xcaConditions.isTKIBearish;
conditions.isSarBullish = xcaConditions.isSarBullish;
conditions.isSarBearish = xcaConditions.isSarBearish;
conditions.isTKIRejectUp = xcaConditions.isTKIRejectUp;
conditions.isPeakIsPivot = xcaConditions.isPeakIsPivot;
conditions.isValeIsPivot = xcaConditions.isValeIsPivot;
conditions.isKIRejectDown = xcaConditions.isKIRejectDown;
@@ -2630,6 +2738,7 @@ class XCXCAEAHelper : XCBase
conditions.isValeOverLast = xcaConditions.isValeOverLast;
conditions.isTrendBullish = xcaConditions.isTrendBullish;
conditions.isTrendBearish = xcaConditions.isTrendBearish;
conditions.isTKIRejectDown = xcaConditions.isTKIRejectDown;
conditions.isPeakUnderLast = xcaConditions.isPeakUnderLast;
conditions.isValeUnderLast = xcaConditions.isValeUnderLast;
conditions.isTrendRejectUp = xcaConditions.isTrendRejectUp;
@@ -2654,6 +2763,8 @@ class XCXCAEAHelper : XCBase
conditions.isKISwitchedToBearish = xcaConditions.isKISwitchedToBearish;
conditions.isLastSwingLowBreaked = xcaConditions.isLastSwingLowBreaked;
conditions.isSwingHighSameAsPeak = xcaConditions.isSwingHighSameAsPeak;
conditions.isTKISwitchedToBullish = xcaConditions.isTKISwitchedToBullish;
conditions.isTKISwitchedToBearish = xcaConditions.isTKISwitchedToBearish;
conditions.isLastSwingLowRejected = xcaConditions.isLastSwingLowRejected;
conditions.isSarSwitchedToBullish = xcaConditions.isSarSwitchedToBullish;
conditions.isSarSwitchedToBearish = xcaConditions.isSarSwitchedToBearish;
@@ -2866,6 +2977,7 @@ class XCXCAEAHelper : XCBase
zBar.Clean();
cBar.Clean();
pBar.Clean();
fromBar.Clean();
//
xcaConditions.Clean();
+167
View File
@@ -598,9 +598,176 @@ bool DetectXCAEAConditions(
isCBarBearishMomentum ||
isCBarBearishEngulfed);
//
// Score ...
//
double bullishScore = 0;
double bearishScore = 0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
//
bool isScoreBullish =
bullishScore > bearishScore;
//
bool isScoreBearish =
bearishScore > bullishScore;
//
string summary =
conditions
.GenerateSummary();
//
// Conditions ...
//
// Reading Values ...
//
// KI ...
//
double cKI = conditions.kiBuffer[cIDX];
double pKI = conditions.kiBuffer[pIDX];
double p2KI = conditions.kiBuffer[ppIDX];
//
double cKIState = conditions.kiStateBuffer[cIDX];
double pKIState = conditions.kiStateBuffer[pIDX];
double p2KIState = conditions.kiStateBuffer[ppIDX];
//
// TKI ...
//
double cTKI = conditions.tkiBuffer[cIDX];
double pTKI = conditions.tkiBuffer[pIDX];
double p2TKI = conditions.tkiBuffer[ppIDX];
//
double cTKIState = conditions.tkiStateBuffer[cIDX];
double pTKIState = conditions.tkiStateBuffer[pIDX];
double p2TKIState = conditions.tkiStateBuffer[ppIDX];
//
// TREND ...
//
double cTrend = conditions.trendBuffer[cIDX];
double pTrend = conditions.trendBuffer[pIDX];
double p2Trend = conditions.trendBuffer[ppIDX];
//
double ctrendState = conditions.trendStateBuffer[cIDX];
double ptrendState = conditions.trendStateBuffer[pIDX];
double p2trendState = conditions.trendStateBuffer[ppIDX];
//
// SWING Low ...
//
double cSWL = conditions.swingLowBuffer[cIDX];
double pSWL = conditions.swingLowBuffer[pIDX];
double p2SWL = conditions.swingLowBuffer[ppIDX];
//
// SWING High ...
//
double cSWH = conditions.swingHighBuffer[cIDX];
double pSWH = conditions.swingHighBuffer[pIDX];
double p2SWH = conditions.swingHighBuffer[ppIDX];
//
// PEAK ...
//
double cPeak = conditions.peakBuffer[cIDX];
double pPeak = conditions.peakBuffer[pIDX];
double p2Peak = conditions.peakBuffer[ppIDX];
//
// VALE ...
//
double cVale = conditions.valeBuffer[cIDX];
double pVale = conditions.valeBuffer[pIDX];
double p2Vale = conditions.valeBuffer[ppIDX];
//
// COMPLEX ...
//
double iKTIRNDs[] = {
cKI,
cTKI,
cTrend //
};
//
double iKTIRNDMax = GetMax(iKTIRNDs);
double iKTIRNDMin = GetMin(iKTIRNDs);
//
// Conditions Preparing ...
//
bool isTKITRNDBullish =
cKIState > 0 &&
cTKIState > 0 &&
ctrendState > 0;
//
bool isTKITRNDBullishPrev =
pKIState > 0 &&
pTKIState > 0 &&
ptrendState > 0;
//
bool isTKITRNDBearish =
cKIState < 0 &&
cTKIState < 0 &&
ctrendState < 0;
//
bool isTKITRNDBearishPrev =
pKIState < 0 &&
pTKIState < 0 &&
ptrendState < 0;
//
bool isTKITRNDSwitchedToBullish =
isTKITRNDBullish &&
!isTKITRNDBullishPrev;
//
bool isTKITRNDSwitchedToBearish =
isTKITRNDBearish &&
!isTKITRNDBearishPrev;
//
bool isCond1Bullish =
conditions.isValeIsPivot &&
isTKITRNDSwitchedToBullish;
//
bool isCond1Bearish =
conditions.isPeakIsPivot &&
isTKITRNDSwitchedToBearish;
//
if (isCond1Bullish ||
isCond1Bearish)
{
//
Print("Cond1");
}
//
// Summarise Conditions ...
+194 -9
View File
@@ -23,6 +23,7 @@
// Imports ...
#include "../../Classes/x-saherelm.base.class.mq5"
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
#include "../Classes/xcaea.x-poi.detector.class.mq5"
#include "../Helpers/xcaea.helper.mq5"
#include "../Libraries/xcaea.signaller.lib.mq5"
@@ -41,6 +42,7 @@ class XCXCAEASignaller : XCBase
XBarTracker barTraker;
XCXCAEAHelper *helper;
bool continuesRFTillTarget;
XCXCAEAPOIDetector *detector;
XCAEAStrategyConditions mConditions;
XCAEAStrategyConditions mConditionsCollection[];
@@ -115,6 +117,11 @@ class XCXCAEASignaller : XCBase
//
int loopback = 10;
//
int idx = -1;
int count = 0;
bool has = false;
//
double ask = GetAsk(symbol);
double bid = GetBid(symbol);
@@ -159,7 +166,180 @@ class XCXCAEASignaller : XCBase
ENUM_X_DIRECTION signalBoxDir = X_DIRECTION_NONE;
//
// Checking Conditions ...
// Detecting Pivots ...
detector.Update(
zIndex //
);
//
bool drawSWHPivots = true;
bool drawSWLPivots = true;
bool drawPeakPivots = false;
bool drawValePivots = false;
//
// Draw Peak SWH Res Pivots ...
if (drawPeakPivots)
{
//
has = detector.HasPeakSWHResPivots();
if (has)
{
//
count = detector.CountPeakSWHResPivots();
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox;
has = detector
.peakSWHResPivots[i]
.AsBox(iBox);
if (has)
{
//
iBox.to = cTime;
//
XCBoxObject *iObj;
has = helper.poiDrawer.DrawBox(
iBox,
iObj //
);
if (has)
{
mObjects.Add(iObj);
}
}
//
iBox.Clean();
}
//
Print("Draw Peak SWH Res Pivots ...");
}
}
//
// Draw Vale SWL Sup Pivots ...
if (drawValePivots)
{
//
has = detector.HasValeSWLSupPivots();
if (has)
{
//
count = detector.CountValeSWLSupPivots();
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox;
has = detector
.valeSWLSupPivots[i]
.AsBox(iBox);
if (has)
{
//
iBox.to = cTime;
//
XCBoxObject *iObj;
has = helper.poiDrawer.DrawBox(
iBox,
iObj //
);
if (has)
{
mObjects.Add(iObj);
}
}
//
iBox.Clean();
}
//
Print("Draw Vale SWL Sup Pivots ...");
}
}
//
// Draw SWH Pvots ...
if (drawSWHPivots)
{
//
has = detector.HasSWHPivots();
if (has)
{
//
count = detector.CountSWHPivots();
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox;
has = detector
.swhPivots[i]
.AsBox(iBox);
if (has)
{
//
iBox.to = cTime;
//
XCBoxObject *iObj;
has = helper
.poiDrawer
.DrawBox(
iBox,
iObj //
);
if (has)
{
mObjects.Add(iObj);
}
}
}
}
}
//
// Draw SWL Pvots ...
if (drawSWLPivots)
{
//
has = detector.HasSWLPivots();
if (has)
{
//
count = detector.CountSWLPivots();
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox;
has = detector
.swlPivots[i]
.AsBox(iBox);
if (has)
{
//
iBox.to = cTime;
//
XCBoxObject *iObj;
has = helper
.poiDrawer
.DrawBox(
iBox,
iObj //
);
if (has)
{
mObjects.Add(iObj);
}
}
}
}
}
//
XCAEAConditions conditions;
@@ -232,7 +412,8 @@ class XCXCAEASignaller : XCBase
? entry - sl
: sl - entry;
risk += spread;
if (risk >= maxAllowedSLDistanceInPoint * points) {
if (risk >= maxAllowedSLDistanceInPoint * points)
{
//
// Fix Risk in Big Distances ...
double hh5 = zBar.FindHighest(5, MODE_HIGH);
@@ -541,23 +722,23 @@ class XCXCAEASignaller : XCBase
//
inputs.caInputs.supResSmoothingLength = 7;
inputs.caInputs.supResSmoothingMode = X_MA_MODE_NONE;
inputs.caInputs.supResSmoothingMode = X_MA_MODE_NONE;
//
inputs.caInputs.showKI = true;
inputs.caInputs.showSar = true;
inputs.caInputs.showSar = false;
inputs.caInputs.showTrend = true;
inputs.caInputs.showSwings = false;
inputs.caInputs.showSwings = true;
inputs.caInputs.showLongCycle = false;
inputs.caInputs.showHindCycle = false;
inputs.caInputs.showFiboLevel1 = false;
inputs.caInputs.showFiboLevel1 = true;
inputs.caInputs.showFiboLevel2 = false;
inputs.caInputs.showFiboLevel3 = false;
inputs.caInputs.showFiboLevel3 = true;
inputs.caInputs.showShortCycle = false;
inputs.caInputs.showMediumCycle = false;
inputs.caInputs.showPeaksAndVales = true;
inputs.caInputs.showPeakAndValeGolden = true;
inputs.caInputs.showSupportAndResistance = true;
inputs.caInputs.showPeakAndValeGolden = false;
inputs.caInputs.showSupportAndResistance = false;
//
// XOSCS ...
@@ -582,6 +763,9 @@ class XCXCAEASignaller : XCBase
period,
inputs //
);
//
detector = new XCXCAEAPOIDetector(helper);
}
/**
@@ -592,6 +776,7 @@ class XCXCAEASignaller : XCBase
//
inputs.Clean();
ZeroMemory(helper);
ZeroMemory(detector);
//
mConditions.Clean();