This commit is contained in:
2025-10-08 18:47:29 +03:30
parent 96972931a7
commit d963ce8acf
10 changed files with 6108 additions and 3372 deletions
+557 -287
View File
@@ -23,8 +23,8 @@
// Imports ...
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Classes/x-saherelm.x-bar.analyser.class.mq5"
#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
#include "../Libraries/x-saherelm.x-pivot.analysis.lib.mq5"
#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
#include "../Libraries/x-saherelm.x-poi.lib.mq5"
//
@@ -1995,36 +1995,37 @@ class XCMarketPatternDetector : public XCBase
bool AnalyseBarPatterns(
XOHCL &bar,
XPatternAnalysis &analysis,
//
// PV ...
int pvValidationLength = 7,
ENUM_X_PRICE peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE valePriceType = X_PRICE_LOW,
//
// Momentum ...
int momentumBarValidationLength = 3,
double momentumBarApprovedMultiplier = 3,
//
// TrueGap ...
double trueGapApprovedStrength = 1,
//
// Pin ...
double pinBarShadowApprovedMultiplier = 3,
double pinBarRangeMultiplier = 4,
bool pinBarForceDirection = false,
//
// Flag ...
int flagPatternPullbackLength = 3,
//
// FVG ...
bool fvgForceType = false,
//
// OB ...
bool obForceTwoBar = false,
//
// Support and Resistance ...
int supportAndResistanceValidationLength = 21,
int supportAndResistanceLoopbackLength = 50 //
XPatternAnalysisConfig &config //
// //
// // PV ...
// int pvValidationLength = 7,
// ENUM_X_PRICE peakPriceType = X_PRICE_HIGH,
// ENUM_X_PRICE valePriceType = X_PRICE_LOW,
// //
// // Momentum ...
// int momentumBarValidationLength = 3,
// double momentumBarApprovedMultiplier = 3,
// //
// // TrueGap ...
// double trueGapApprovedStrength = 1,
// //
// // Pin ...
// double pinBarShadowApprovedMultiplier = 3,
// double pinBarRangeMultiplier = 4,
// bool pinBarForceDirection = false,
// //
// // Flag ...
// int flagPatternPullbackLength = 3,
// //
// // FVG ...
// bool fvgForceType = false,
// //
// // OB ...
// bool obForceTwoBar = false,
// //
// // Support and Resistance ...
// int supportAndResistanceValidationLength = 21,
// int supportAndResistanceLoopbackLength = 50 //
//
)
{
@@ -2035,28 +2036,28 @@ class XCMarketPatternDetector : public XCBase
// Prepare ...
analysis.Clean();
//
// Normalize ...
//
pvValidationLength = NormalizeInt(pvValidationLength, 2);
// //
// // Normalize ...
// //
// config.pvValidationLength = NormalizeInt(config.pvValidationLength, 2);
//
momentumBarValidationLength = NormalizeInt(momentumBarValidationLength, 2);
momentumBarApprovedMultiplier = NormalizeDouble(momentumBarApprovedMultiplier, 1);
// //
// config.momentumBarValidationLength = NormalizeInt(config.momentumBarValidationLength, 2);
// momentumBarApprovedMultiplier = NormalizeDouble(momentumBarApprovedMultiplier, 1);
//
trueGapApprovedStrength = NormalizeDouble(trueGapApprovedStrength, 1);
// //
// trueGapApprovedStrength = NormalizeDouble(trueGapApprovedStrength, 1);
//
pinBarRangeMultiplier = NormalizeDouble(pinBarRangeMultiplier, 4);
pinBarShadowApprovedMultiplier = NormalizeDouble(pinBarShadowApprovedMultiplier, 3);
// //
// pinBarRangeMultiplier = NormalizeDouble(pinBarRangeMultiplier, 4);
// pinBarShadowApprovedMultiplier = NormalizeDouble(pinBarShadowApprovedMultiplier, 3);
//
flagPatternPullbackLength = NormalizeInt(flagPatternPullbackLength, 3);
// //
// flagPatternPullbackLength = NormalizeInt(flagPatternPullbackLength, 3);
//
supportAndResistanceLoopbackLength = NormalizeInt(supportAndResistanceLoopbackLength, 10);
supportAndResistanceValidationLength = NormalizeInt(supportAndResistanceValidationLength, 10);
// //
// supportAndResistanceLoopbackLength = NormalizeInt(supportAndResistanceLoopbackLength, 10);
// supportAndResistanceValidationLength = NormalizeInt(supportAndResistanceValidationLength, 10);
//
// Validate ...
@@ -2076,129 +2077,245 @@ class XCMarketPatternDetector : public XCBase
ENUM_X_DIRECTION iDir;
ENUM_X_BAR_PATTERN iPattern;
//
bool has;
bool isBullish;
bool isBearish;
//
bool canDetect;
bool canDetectBullish;
bool canDetectBearish;
//
// Bars Detectors ...
//
// XPV High Low Detection ...
bool isPV = IsPV(
bar,
iDir,
pvValidationLength,
peakPriceType,
valePriceType //
);
bool isHigh = isPV &&
IsXBearish(iDir);
bool isLow = isPV &&
IsXBullish(iDir);
if (isPV)
canDetect = config.CanDetect(X_BAR_PATTERN_HIGH) ||
config.CanDetect(X_BAR_PATTERN_LOW);
if (canDetect)
{
//
iPattern =
isHigh
? X_BAR_PATTERN_HIGH
: X_BAR_PATTERN_LOW;
has = IsPV(
bar,
iDir,
config.pvValidationLength,
config.peakPriceType,
config.valePriceType //
);
//
analysis.AddPattern(
iPattern,
iDir //
);
canDetectBullish = config.CanDetect(X_BAR_PATTERN_LOW);
canDetectBearish = config.CanDetect(X_BAR_PATTERN_HIGH);
//
isBullish =
has &&
IsXBullish(iDir) &&
canDetectBullish;
//
isBearish =
has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
iPattern =
isBearish
? X_BAR_PATTERN_HIGH
: X_BAR_PATTERN_LOW;
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Momentum ...
bool isMomentum = IsMomentumBar(
bar,
iDir,
momentumBarValidationLength,
momentumBarApprovedMultiplier //
);
bool isBullishMomentum = isMomentum &&
IsXBullish(iDir);
bool isBearishMomentum = isMomentum &&
IsXBearish(iDir);
if (isMomentum)
iPattern = X_BAR_PATTERN_MOMENTUM;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_MOMENTUM;
has = IsMomentumBar(
bar,
iDir,
config.momentumBarValidationLength,
config.momentumBarApprovedMultiplier //
);
//
analysis.AddPattern(
canDetectBullish = config.CanDetect(
iPattern,
iDir //
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Engulfed ...
bool isEngulfed = IsEngulfedBar(
bar,
iDir //
);
bool isBullishEngulfed = isEngulfed &&
IsXBullish(iDir);
bool isBearishEngulfed = isEngulfed &&
IsXBearish(iDir);
if (isEngulfed)
iPattern = X_BAR_PATTERN_ENGULFED;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_ENGULFED;
//
analysis.AddPattern(
iPattern,
has = IsEngulfedBar(
bar,
iDir //
);
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// TrueGap ...
bool isTrueGaped = IsTrueGapedBar(
bar,
iDir,
trueGapApprovedStrength //
);
bool isBullishTrueGaped = isTrueGaped &&
IsXBullish(iDir);
bool isBearishTrueGaped = isTrueGaped &&
IsXBearish(iDir);
if (isTrueGaped)
iPattern = X_BAR_PATTERN_TRUE_GAPED;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_TRUE_GAPED;
has = IsTrueGapedBar(
bar,
iDir,
config.trueGapApprovedStrength //
);
//
analysis.AddPattern(
canDetectBullish = config.CanDetect(
iPattern,
iDir //
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Pinned ...
bool isPinned = IsPinnedBar(
bar,
iDir,
pinBarShadowApprovedMultiplier,
pinBarRangeMultiplier,
pinBarForceDirection //
);
bool isBullishPinned = isPinned &&
IsXBullish(iDir);
bool isBearishPinned = isPinned &&
IsXBearish(iDir);
if (isPinned)
iPattern = X_BAR_PATTERN_PINNED;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_PINNED;
has = IsPinnedBar(
bar,
iDir,
config.pinBarShadowApprovedMultiplier,
config.pinBarRangeMultiplier,
config.pinBarForceDirection //
);
//
analysis.AddPattern(
canDetectBullish = config.CanDetect(
iPattern,
iDir //
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
@@ -2206,120 +2323,225 @@ class XCMarketPatternDetector : public XCBase
//
// Star ...
bool isStar = IsStarPattern(
bar,
iDir //
);
bool isBullishStar = isStar &&
IsXBullish(iDir);
bool isBearishStar = isStar &&
IsXBearish(iDir);
if (isStar)
iPattern = X_BAR_PATTERN_STAR;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_STAR;
//
analysis.AddPattern(
iPattern,
has = IsStarPattern(
bar,
iDir //
);
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Piercing ...
bool isPiercing = IsPiercingPattern(
bar,
iDir //
);
bool isBullishPiercing = isPiercing &&
IsXBullish(iDir);
bool isBearishPiercing = isPiercing &&
IsXBearish(iDir);
if (isPiercing)
iPattern = X_BAR_PATTERN_PIERCING;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_PIERCING;
//
analysis.AddPattern(
iPattern,
has = IsPiercingPattern(
bar,
iDir //
);
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Rising ...
bool isRising = IsRisingPattern(
bar,
iDir //
);
bool isBullishRising = isRising &&
IsXBullish(iDir);
bool isBearishRising = isRising &&
IsXBearish(iDir);
if (isRising)
iPattern = X_BAR_PATTERN_RISING;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_RISING;
//
analysis.AddPattern(
iPattern,
has = IsRisingPattern(
bar,
iDir //
);
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
// Flag ...
bool isFlag = IsFlagPattern(
bar,
iDir,
iSwing,
flagPatternPullbackLength //
);
bool isBullishFlag = isFlag &&
IsXBullish(iDir);
bool isBearishFlag = isFlag &&
IsXBearish(iDir);
if (isFlag)
iPattern = X_BAR_PATTERN_FLAG;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_FLAG;
//
analysis.AddPattern(
iPattern,
iDir //
has = IsFlagPattern(
bar,
iDir,
iSwing,
config.flagPatternPullbackLength //
);
//
analysis.flagSwing = iSwing;
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
//
analysis.flagSwing = iSwing;
}
}
//
// SignalKey ...
bool isSignalKey = IsSignalKeyBarPattern(
bar,
iDir,
pinBarShadowApprovedMultiplier,
pinBarRangeMultiplier,
pinBarForceDirection //
);
bool isBullishSignalKey = isSignalKey &&
IsXBullish(iDir);
bool isBearishSignalKey = isSignalKey &&
IsXBearish(iDir);
if (isSignalKey)
iPattern = X_BAR_PATTERN_SIGNALKEY;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_SIGNALKEY;
has = IsSignalKeyBarPattern(
bar,
iDir,
config.pinBarShadowApprovedMultiplier,
config.pinBarRangeMultiplier,
config.pinBarForceDirection //
);
//
analysis.AddPattern(
canDetectBullish = config.CanDetect(
iPattern,
iDir //
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
IsXBullish(iDir) &&
canDetectBullish;
isBearish = has &&
IsXBearish(iDir) &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iDir //
);
}
}
//
@@ -2327,78 +2549,40 @@ class XCMarketPatternDetector : public XCBase
//
// OB ...
bool isOB = barAnalyser.IsOB(
bar,
iZone,
fvgForceType,
obForceTwoBar //
);
bool isBullishOB = isOB &&
iZone.IsBullish();
bool isBearishOB = isOB &&
iZone.IsBearish();
if (isOB)
iPattern = X_BAR_PATTERN_OB;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_OB;
//
analysis.AddPattern(
iPattern,
iZone.dir //
);
//
analysis.ob = iZone;
}
//
// FVG ...
bool isFVG = barAnalyser.IsFVG(
bar,
iZone,
fvgForceType //
);
bool isBullishFVG = isFVG &&
iZone.IsBullish();
bool isBearishFVG = isFVG &&
iZone.IsBearish();
if (isFVG)
{
//
iPattern = X_BAR_PATTERN_FVG;
//
analysis.AddPattern(
iPattern,
iZone.dir //
);
//
analysis.fvg = iZone;
}
//
// Support ...
bool isSupport = HasSupport(
bar,
iSwing,
supportAndResistanceValidationLength,
supportAndResistanceLoopbackLength //
);
if (isSupport)
{
//
iPattern = X_BAR_PATTERN_SUPPORT;
//
bool has = ToSupportBox(
iSwing,
has = barAnalyser.IsOB(
bar,
iZone,
bar.time,
supportAndResistanceValidationLength //
config.fvgForceType,
config.obForceTwoBar //
);
if (has)
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
iZone.IsBullish() &&
canDetectBullish;
isBearish = has &&
iZone.IsBearish() &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
@@ -2407,40 +2591,126 @@ class XCMarketPatternDetector : public XCBase
);
//
analysis.support = iZone;
analysis.ob = iZone;
}
}
//
// FVG ...
iPattern = X_BAR_PATTERN_FVG;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
has = barAnalyser.IsFVG(
bar,
iZone,
config.fvgForceType //
);
//
canDetectBullish = config.CanDetect(
iPattern,
X_DIRECTION_BULLISH //
);
canDetectBearish = config.CanDetect(
iPattern,
X_DIRECTION_BEARISH //
);
//
isBullish = has &&
iZone.IsBullish() &&
canDetectBullish;
isBearish = has &&
iZone.IsBearish() &&
canDetectBearish;
//
canDetect = isBullish ||
isBearish;
if (canDetect)
{
//
analysis.AddPattern(
iPattern,
iZone.dir //
);
//
analysis.fvg = iZone;
}
}
//
// Support ...
iPattern = X_BAR_PATTERN_SUPPORT;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
has = HasSupport(
bar,
iSwing,
config.supportAndResistanceValidationLength,
config.supportAndResistanceLoopbackLength //
);
if (has)
{
//
has = ToSupportBox(
iSwing,
iZone,
bar.time,
config.supportAndResistanceValidationLength //
);
if (has)
{
//
analysis.AddPattern(
iPattern,
iZone.dir //
);
//
analysis.support = iZone;
}
}
}
//
// Resistance ...
bool isResistance = HasResistance(
bar,
iSwing,
supportAndResistanceValidationLength,
supportAndResistanceLoopbackLength //
);
if (isResistance)
iPattern = X_BAR_PATTERN_RESISTANCE;
canDetect = config.CanDetect(iPattern);
if (canDetect)
{
//
iPattern = X_BAR_PATTERN_RESISTANCE;
//
bool has = ToResistanceBox(
has = HasResistance(
bar,
iSwing,
iZone,
bar.time,
supportAndResistanceValidationLength //
config.supportAndResistanceValidationLength,
config.supportAndResistanceLoopbackLength //
);
if (has)
{
//
analysis.AddPattern(
iPattern,
iZone.dir //
has = ToResistanceBox(
iSwing,
iZone,
bar.time,
config.supportAndResistanceValidationLength //
);
if (has)
{
//
analysis.AddPattern(
iPattern,
iZone.dir //
);
//
analysis.resistance = iZone;
//
analysis.resistance = iZone;
}
}
}