This commit is contained in:
2025-05-01 14:22:20 +03:30
parent 22605f46b6
commit 4eb3881672
5 changed files with 169 additions and 23 deletions
+7 -1
View File
@@ -315,6 +315,7 @@ class XCBarAnalyser : public XCBase
* @param ranges: double Collection, Calculated Ranges ...
* @param bar: XOHCL instance Reference, Start Bar ...
* @param forceBody: bool, Force to Calculate Range using Body ...
* @param forceDiff: bool, Force to Calculate Range using Onl Price Diff ...
* @param loopback: int, loopback period for Range Calculations ...
*
* @return ( int )
@@ -323,6 +324,7 @@ class XCBarAnalyser : public XCBase
double &ranges[],
XOHCL &bar,
bool forceBody = false,
bool forceDiff = false,
int loopback = 14 //
)
{
@@ -422,7 +424,11 @@ class XCBarAnalyser : public XCBase
for (int i = 0; i < uppersCount; i++)
{
//
double iValue = lowers[i] + (uppers[i] - lowers[i]);
double iDiff = uppers[i] - lowers[i];
double iValue =
forceDiff
? iDiff
: lowers[i] + iDiff;
//
Add(
+16 -2
View File
@@ -1310,7 +1310,7 @@ class XCXCAEAPOIDetector : public XCBase
has = helper.GetConditions(
conditions,
start,
5 //
10 //
);
if (!has)
{
@@ -1511,6 +1511,19 @@ class XCXCAEAPOIDetector : public XCBase
pCCI < p2CCI &&
pCCI < zCCI;
//
// ATR ...
double zATR = conditions.atrBuffer[zIDX];
double cATR = conditions.atrBuffer[cIDX];
double pATR = conditions.atrBuffer[pIDX];
double p2ATR = conditions.atrBuffer[p2IDX];
//
double atrSum = GetSum(conditions.atrBuffer);
double atrMax = GetMax(conditions.atrBuffer);
double atrMin = GetMin(conditions.atrBuffer);
double atrAvg = GetAverage(conditions.atrBuffer);
//
// Extracting Required Data about Trending ...
@@ -2919,7 +2932,8 @@ class XCXCAEAPOIDetector : public XCBase
//
bool detectBullishSpikePivots = true;
if (detectBullishSpikePivots) {
if (detectBullishSpikePivots)
{
//
// For Spike Detection ...
// [] 80% of Bars Must be Same as Direction ...
+117 -5
View File
@@ -174,6 +174,18 @@ struct XCAEAConditions
datetime to;
datetime from;
//
// Bars ...
XOHCL bars[];
double bodies[];
double ranges[];
double velocities[];
double scoreBullish;
double scoreBearish;
double volumeBullish;
double volumeBearish;
double priceChangeRate;
//
// X3MA ...
@@ -810,6 +822,22 @@ struct XCAEAConditions
from = NULL;
time = NULL;
//
// Bars ...
Clean(bars);
Clean(bodies);
Clean(ranges);
scoreBullish = 0;
scoreBearish = 0;
volumeBullish = 0;
volumeBearish = 0;
Clean(velocities);
priceChangeRate = 0;
ArraySetAsSeries(bars, true);
ArraySetAsSeries(bodies, true);
ArraySetAsSeries(ranges, true);
ArraySetAsSeries(velocities, true);
//
// X3MA ...
@@ -2705,13 +2733,18 @@ struct XCAEAConditions
;
//
if (onlyCommons && !onlyConditions) {
result += commonStr = separator;
} else if (onlyConditions && !onlyCommons) {
if (onlyCommons && !onlyConditions)
{
result += commonStr = separator;
}
else if (onlyConditions && !onlyCommons)
{
result += conditionsStr + separator;
} else {
}
else
{
//
result +=
result +=
//
commonStr + separator +
conditionsStr + separator
@@ -3299,6 +3332,25 @@ class XCXCAEAHelper : XCBase
conditions.period = mPeriod;
conditions.time = TimeCurrent();
//
// Filling Bars ...
int barsCount = GetBars(
conditions.bars,
mSymbol,
mPeriod,
barIndex,
loopback //
);
result = barsCount == loopback;
if (!result)
{
//
conditions.Clean();
//
return result;
}
//
int zIndex = barIndex;
int cIndex = zIndex + 1;
@@ -3990,6 +4042,65 @@ class XCXCAEAHelper : XCBase
conditions.isStochasticCrossedOverSignal = xocsConditions.isStochasticCrossedOverSignal;
conditions.isStochasticCrossedUnderSignal = xocsConditions.isStochasticCrossedUnderSignal;
//
int bodiesCount = barAnalyser.GetPriceRange(
conditions.bodies,
zBar,
true, // Force Body ...
true, // Force Price Diff ...
loopback //
);
int rangesCount = barAnalyser.GetPriceRange(
conditions.ranges,
zBar,
true, // Force Body ...
true, // Force Price Diff ...
loopback //
);
//
int velocitiesCount =
barAnalyser
.GetPriceVelocity(
conditions.velocities,
zBar,
X_PRICE_CLOSE,
loopback //
);
//
double bullishVolume = 0.0;
double bearishVolume = 0.0;
barAnalyser
.CalculateRangeVolume(
zBar,
bullishVolume,
bearishVolume,
loopback //
);
conditions.scoreBullish = bullishVolume;
conditions.scoreBearish = bearishVolume;
//
double bullishScore = 0.0;
double bearishScore = 0.0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
conditions.volumeBullish = bullishScore;
conditions.volumeBearish = bearishScore;
//
double priceChangeRate =
barAnalyser
.GetPriceChangeRate(
zBar,
X_PRICE_CLOSE,
loopback //
);
conditions.priceChangeRate = priceChangeRate;
//
// Cleanup Resource ...
@@ -4002,6 +4113,7 @@ class XCXCAEAHelper : XCBase
//
xcaConditions.Clean();
xocsConditions.Clean();
x3maConditions.Clean();
//
Free();
+15 -1
View File
@@ -660,6 +660,9 @@ bool DetectXCAEAConditions(
bool isScoreBearish =
bearishScore > bullishScore;
//
bool isScoreNeutural = MathAbs(bullishScore - bearishScore) == 0;
//
// Generating Conditions Summary ...
string summary =
@@ -672,7 +675,7 @@ bool DetectXCAEAConditions(
//
double bullishVolume = 0;
double bearishVolume = 0;
int volumeRangeLoopback = 5;
int volumeRangeLoopback = loopback;
helper.barAnalyser.CalculateRangeVolume(
cBar,
bullishVolume,
@@ -680,6 +683,9 @@ bool DetectXCAEAConditions(
volumeRangeLoopback //
);
//
bool isVolumeNeutural = MathAbs(bullishVolume - bearishVolume) == 0;
//
double rangeVolume = bullishVolume = bearishVolume;
double rangeVolumeAvg = rangeVolume / volumeRangeLoopback;
@@ -1009,6 +1015,14 @@ bool DetectXCAEAConditions(
Print(ToString(cBar.GetDirection()), " ATR Growing ...");
}
//
if (isScoreNeutural ||
isVolumeNeutural)
{
//
Print("Zero Volume ...");
}
//
bool isLowOverMax = cBar.low > maxCTrendValue;
bool isHighUnderMin = cBar.high < minCTrendValue;
+14 -14
View File
@@ -888,20 +888,20 @@ class XCXCAEASignaller : XCBase
// Configure Detector ...
detector.detectTickPivots = false;
detector.detectVolumePivots = false;
detector.detectRSIPeakPivots = true;
detector.detectRSIValePivots = true;
detector.detectRSIPeakPivots = false;
detector.detectRSIValePivots = false;
detector.detectCCIPeakPivots = false;
detector.detectCCIValePivots = false;
detector.detectFVGBullishPivots = true;
detector.detectFVGBearishPivots = true;
detector.detectFVGBullishPivots = false;
detector.detectFVGBearishPivots = false;
detector.detectValeSupSWLPivots = true;
detector.detectPeakResSWHPivots = true;
detector.detectTrendBullishPivots = true;
detector.detectTrendBearishPivots = true;
detector.detectCCICrossedOverOSPivots = false;
detector.detectCCICrossedUnderOBPivots = false;
detector.detectRSICrossedOverOSPivots = true;
detector.detectRSICrossedUnderOBPivots = true;
detector.detectRSICrossedOverOSPivots = false;
detector.detectRSICrossedUnderOBPivots = false;
//
// Initialize and Configure Drawer ...
@@ -916,20 +916,20 @@ class XCXCAEASignaller : XCBase
drawer.drawTrendLine = false;
drawer.drawTickPivots = false;
drawer.drawVolumePivots = false;
drawer.drawRSIPeakPivots = true;
drawer.drawRSIValePivots = true;
drawer.drawRSIPeakPivots = false;
drawer.drawRSIValePivots = false;
drawer.drawCCIPeakPivots = false;
drawer.drawCCIValePivots = false;
drawer.drawFVGBullishPivots = true;
drawer.drawFVGBearishPivots = true;
drawer.drawValeSupSWLPivots = true;
drawer.drawPeakResSWHPivots = true;
drawer.drawFVGBullishPivots = false;
drawer.drawFVGBearishPivots = false;
drawer.drawValeSupSWLPivots = false;
drawer.drawPeakResSWHPivots = false;
drawer.drawTrendBullishPivots = false;
drawer.drawTrendBearishPivots = false;
drawer.drawCCICrossedOverOSPivots = false;
drawer.drawCCICrossedUnderOBPivots = false;
drawer.drawRSICrossedOverOSPivots = true;
drawer.drawRSICrossedUnderOBPivots = true;
drawer.drawRSICrossedOverOSPivots = false;
drawer.drawRSICrossedUnderOBPivots = false;
//
// Configure Widths ...