This commit is contained in:
2025-10-24 08:20:27 +03:30
parent 4ba253b2de
commit 645c179b12
5 changed files with 268 additions and 437 deletions
@@ -1693,12 +1693,19 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
return result;
}
//
// Validation Flags ...
bool validateBarInsideZone = true;
bool validateByBarPatterns = true;
bool validateByBarInsideATRBand = true;
//
// Define Requirements ...
//
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
bool isBullish = false;
bool isBearish = false;
@@ -1707,11 +1714,14 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
result = bar.GetPreviousBar(pBar);
result = result &&
pBar.GetPreviousBar(p2Bar);
result = result &&
p2Bar.GetPreviousBar(p3Bar);
if (!result)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
//
return result;
@@ -1720,11 +1730,20 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
//
// Do ...
//
// Retrieve pBar Patterns ...
XPatternAnalysis pBarPatterns;
poiDetector.AnalyseBarPatterns(
pBar,
pBarPatterns,
structureConfig.barsAnalysisConfig //
);
//
// Detecting OrderFlow ...
XBoxZone orderFlow[];
bool hasOrderFlow = poiDetector.HasOrderFlow(
pBar,
p3Bar,
dir,
orderFlow,
structureConfig.orderFlowValidation,
@@ -1736,6 +1755,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
structureConfig.loopback //
);
//
double atrBandMiddle = EMPTY_VALUE;
//
isBullish = hasOrderFlow &&
IsXBullish(dir);
@@ -1745,11 +1767,157 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
IsXBearish(dir);
//
result = isBullish ||
isBearish;
if (result) {
// Summarize Result ...
result = isBullish || isBearish;
//
// Force Price of p2Bar is Inside Order Flow ...
if (result && validateBarInsideZone)
{
//
double orderFlowUpper = 0;
double orderFlowLower = 0;
//
int idx = GetHighest(orderFlow);
if (IsValidIndex(idx))
{
orderFlowUpper = orderFlow[idx].upper;
}
idx = GetLowest(orderFlow);
if (IsValidIndex(idx))
{
orderFlowLower = orderFlow[idx].lower;
}
//
result = NotEmptyZero(orderFlowUpper) &&
NotEmptyZero(orderFlowLower) &&
orderFlowUpper > orderFlowLower &&
(isBullish
? p2Bar.low < orderFlowUpper
: p2Bar.high > orderFlowLower);
}
//
// Force PBar Has Pattern ...
if (result && validateByBarPatterns)
{
//
// Analyse Bar Patterns ...
result = pBarPatterns.IsValid();
//
// Bullish ...
bool isPBarHasBullishPatterns =
// (bar.close > pBar.low ||
// bar.open > pBar.low) &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BULLISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH)
//
);
//
// Bearish ...
bool isPBarHasBearishPatterns =
// (bar.close < pBar.high ||
// bar.open < pBar.high) &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BEARISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH)
//
);
//
isBullish =
isBullish &&
isPBarHasBullishPatterns &&
!isPBarHasBearishPatterns;
//
isBearish =
isBearish &&
isPBarHasBearishPatterns &&
!isPBarHasBullishPatterns;
//
// Summarize Result ...
result = isBullish || isBearish;
}
//
// Force P2Bar Place Checking based on ATR Band ...
if (result && validateByBarInsideATRBand)
{
//
double atrBandUpper = fimaHelper.GetATRBandUpper(p2Bar.Index());
double atrBandLower = fimaHelper.GetATRBandLower(p2Bar.Index());
//
atrBandMiddle = atrBandLower + ((atrBandUpper - atrBandLower) / 2);
//
isBullish =
isBullish &&
NotEmptyZero(atrBandMiddle) &&
p2Bar.low < atrBandMiddle;
//
isBearish =
isBearish &&
NotEmptyZero(atrBandMiddle) &&
p2Bar.high > atrBandMiddle;
//
// Summarize Result ...
result = isBullish || isBearish;
}
//
if (result)
{
//
UpdateToTime(orderFlow, bar.time);
poiDrawer.DrawZones(orderFlow, structureDrawConfig.drawConfig);
poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig);
//
// Draw ATR Band Middle ...
if (NotEmptyZero(atrBandMiddle))
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.trendRayLeft = false;
iConfig.trendRayRight = false;
//
datetime to = bar.time;
datetime from = p2Bar.BeforeOn();
string trendName = "ATRBandMiddle_" + ToXString(TimeToSeconds(p2Bar.time));
poiDrawer.DrawTrendLine(
trendName,
atrBandMiddle,
from,
atrBandMiddle,
to,
iConfig,
clrYellow //
);
//
iConfig.Clean();
}
//
Print("OrderFlow ...");
}
@@ -1823,6 +1991,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
}
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
XClean(orderFlow);
pBarPatterns.Clean();
//
return result;
+2 -3
View File
@@ -334,7 +334,7 @@ struct XFIMAMarketStructureConfig
// Tools ...
/**
* This function fulfills the will of the developer
* This function fulfills the will of the developer
*/
void Clean()
{
@@ -468,7 +468,7 @@ struct XFIMAMarketStructureDrawerConfig
// Tools ...
/**
* This function fulfills the will of the developer
* This function fulfills the will of the developer
*/
void Clean()
{
@@ -574,7 +574,6 @@ struct XFIMAMarketStructureDrawerConfig
{
//
barAnalysisDrawConfig.drawConfig = drawConfig;
barAnalysisDrawConfig.ConfigureQuarterDraws();
pivotAnalysisDrawConfig.drawConfig = drawConfig;
}