This commit is contained in:
2025-10-19 01:00:24 +03:30
parent d24610c47b
commit ba492bf205
4 changed files with 330 additions and 16 deletions
+8 -8
View File
@@ -1882,7 +1882,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Doji Pattern or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param shadowMultiplier: double, Specified Shadow Multiplier ...
*
* @return ( bool )
@@ -1938,7 +1938,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Swing or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param loopback: int, Specified Loopback ...
*
* @return ( bool )
@@ -2062,7 +2062,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar's Prev Bar is Simple Swing or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to it's Prev Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
*
* @return ( bool )
*/
@@ -2145,7 +2145,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Hammer Pattern or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param bodyMultiplier: double, Specified Body Multiplier ...
*
* @return ( bool )
@@ -2205,7 +2205,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Engulfed Prev Bar or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
*
* @return ( bool )
*/
@@ -2286,7 +2286,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Momentum Bar or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param forceBarType: bool, Force Apply Bar Type ...
* @param forceFiboPressure: bool, Force Apply Bar Type ...
*
@@ -2431,7 +2431,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Momentum Bar or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param loopback: int, Specified Loopback ...
*
* @return ( bool )
@@ -2538,7 +2538,7 @@ class XCBarAnalyser : public XCBase
* Check Specified Bar is Pullback or not ...
*
* @param bar: XOHCL instance reference, Specified Bar to Check ...
* @param dir: ENUM_X_DIRECTION member, Specified Doji Direction ...
* @param dir: ENUM_X_DIRECTION member, Specified Direction ...
* @param loopback: int, Specified Loopback ...
* @param forceBody: bool, Force Using Body ...
*
@@ -1300,6 +1300,137 @@ class XCMarketPatternDetector : public XCBase
return result;
}
/**
* Check Specified Bar has Pullback Bar Pattern or not ...
*
* @param bar: XOHCL, Specified Bar ...
* @param zone: XBoxZone, refrence to hold pullback zone ...
* @param dir: ENUM_X_DIRECTION a reference for Direction ...
* @param pullbackLength: int, min required indirectional bars to confirm pullback ...
* @param forceBreak: bool, force pullback bar breaks peak or vale of Zone ...
*
* @return ( bool )
*/
bool IsPullbackPattern(
XOHCL &bar,
XBoxZone &zone,
ENUM_X_DIRECTION &dir,
int pullbackLength = 2,
bool forceBreak = false //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
CleanDirection(dir);
//
// Normalize ...
pullbackLength = NormalizeInt(pullbackLength, 2);
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
// First Bar Direction ...
dir = bar.GetDirection();
result = HasDirection(dir);
if (!result)
{
return result;
}
//
// Loop through Pullback Length ...
XOHCL iBar;
datetime from = NULL;
double max = EMPTY_VALUE;
double min = EMPTY_VALUE;
int start = bar.Index() + 1;
int end = start + pullbackLength;
for (int i = start; i < end; i++)
{
//
// Initialize Indexed Bar ...
iBar.Clean();
result = bar.BarAt(i, iBar) &&
iBar.GetDirection() == Opposit(dir);
if (!result)
{
break;
}
//
// Calculate Max and Min ...
max =
!NotEmptyZero(max)
? iBar.high
: MathMax(max, iBar.high);
min =
!NotEmptyZero(min)
? iBar.low
: MathMin(min, iBar.low);
from = iBar.time;
}
//
// Apply Force Break ...
if (result &&
forceBreak)
{
//
result =
result &&
NotEmptyZero(min) &&
NotEmptyZero(max) &&
(IsXBullish(dir)
? bar.close > max
: bar.close < min);
}
//
// Prepare Zone ...
if (result)
{
//
ToBox(
bar,
zone,
dir,
ToXString(X_BAR_PATTERN_PULLBACK) //
);
zone.upper = max;
zone.lower = min;
zone.from = from;
zone.at = bar.time;
zone.to = bar.time;
//
result = zone.IsValid();
}
//
// Cleanup ...
if (!result)
{
//
zone.Clean();
CleanDirection(dir);
}
iBar.Clean();
//
return result;
}
//
// FVG ...
+10
View File
@@ -49,6 +49,7 @@ enum ENUM_X_BAR_PATTERN
X_BAR_PATTERN_FVG = 13,
X_BAR_PATTERN_SUPPORT = 14,
X_BAR_PATTERN_RESISTANCE = 15,
X_BAR_PATTERN_PULLBACK = 16,
};
/**
@@ -157,6 +158,11 @@ string ToXString(ENUM_X_BAR_PATTERN value)
case X_BAR_PATTERN_RESISTANCE:
result = "XRESISTANCE";
break;
//
case X_BAR_PATTERN_PULLBACK:
result = "XPULLBACK";
break;
}
//
@@ -247,6 +253,10 @@ ENUM_X_BAR_PATTERN ToBarPattern(string value)
{
result = X_BAR_PATTERN_RESISTANCE;
}
else if (value == ToXString(X_BAR_PATTERN_PULLBACK))
{
result = X_BAR_PATTERN_PULLBACK;
}
//
return result;
@@ -406,11 +406,26 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
//
// Strategy 3 ...
if (!has)
{
//
// has = Strategy3HasSignal(
// iBar,
// iZone,
// iTargets,
// iDir,
// iFIMAConditions,
// structure //
// );
}
//
// Strategy 4 ...
has = false;
if (!has)
{
//
has = Strategy3HasSignal(
has = Strategy4HasSignal(
iBar,
iZone,
iTargets,
@@ -423,13 +438,13 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
//
has = HasDirection(iDir) &&
iZone.IsValid();
// if (has)
// {
// //
// has = false;
// iZone.Clean();
// iDir = X_DIRECTION_NONE;
// }
if (has)
{
//
has = false;
iZone.Clean();
iDir = X_DIRECTION_NONE;
}
//
if (has)
@@ -1478,6 +1493,164 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
return result;
}
/**
* Check Bar Has Signal Based on Strategy 4 ...
*
* @param bar: XOHCL, reference to Bar ...
* @param zone: XBoxZone, reference to holds affected zone ...
* @param targets: XTarget, reference to detected Signal's Targets collections ...
* @param dir: ENUM_X_DIRECTION, detected Signal's direction ...
* @param conditions: XFIMAConditions, reference to Bar Specified XFIMA Conditions ...
* @param structure: XFIMAMarketStructure, refrence to Provides Market Structure ...
*
* @return ( bool )
*/
bool Strategy4HasSignal(
XOHCL &bar,
XBoxZone &zone,
XTarget &targets[],
ENUM_X_DIRECTION &dir,
XFIMAConditions &conditions,
XFIMAMarketStructure &_structure //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
// Define Requirements ...
bool isBullish = false;
bool isBearish = false;
//
XOHCL pBar;
int barIndex = bar.Index();
int pBarIndex = barIndex + 1;
result = bar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
// Do Conditions Checking ...
//
// Reading HK Bond ...
double hkBondUpper = fimaHelper.GetHKBondUpper(pBarIndex);
double hkBondLower = fimaHelper.GetHKBondLower(pBarIndex);
bool hasHKBoundary =
NotEmptyZero(hkBondUpper) &&
NotEmptyZero(hkBondLower);
//
// Pullback Detection ...
bool isPullback = poiDetector.IsPullbackPattern(
pBar,
zone,
dir,
2,
false //
);
//
isBullish =
isPullback &&
hasHKBoundary &&
IsXBullish(dir) &&
zone.lower > hkBondLower;
//
isBearish =
isPullback &&
hasHKBoundary &&
IsXBearish(dir) &&
zone.upper < hkBondUpper;
//
result =
isBullish ||
isBearish;
//
// Do Validations ...
if (result)
{
//
// Direction Assignment ...
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
// TEMP ...
poiDrawer.DrawZone(
zone,
structureDrawConfig.drawConfig //
);
}
//
// Prepare Decision Zone ...
if (result)
{
//
// Zone Detection ...
zone.Clean();
//
// zone.dir = dir;
// zone.type = name;
// zone.to = bar.time;
// zone.at = pBar.time;
// zone.from = pBar.time;
// zone.symbol = bar.symbol;
// zone.period = bar.period;
// zone.lower = MathMin(pBar.low, bar.low);
// zone.upper = MathMax(pBar.high, bar.high);
//
result = zone.IsValid();
}
//
// Prepare Targets ...
if (result)
{
//
// Target Handling ...
}
//
// Cleanup ...
if (!result)
{
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
}
pBar.Clean();
//
return result;
}
//
};