last works on Strategy 1 of XFIMA Signaller ...

This commit is contained in:
2025-11-01 20:42:24 +03:30
parent 49f09c2307
commit 121b3ffb5e
3 changed files with 209 additions and 1 deletions
@@ -4244,6 +4244,7 @@ class XCMarketPatternDetector : public XCBase
* @param forDir: ENUM_X_DIRECTION, Specified Zones Direction for Detecting ... * @param forDir: ENUM_X_DIRECTION, Specified Zones Direction for Detecting ...
* @param sortby: ENUM_X_SORT_BY, Specified Zones Sorting Factor ... * @param sortby: ENUM_X_SORT_BY, Specified Zones Sorting Factor ...
* @param sortDir: ENUM_X_DIRECTION, Specified Zones Sorting Direction ... * @param sortDir: ENUM_X_DIRECTION, Specified Zones Sorting Direction ...
* @param zonesRangeValidationFactor: double, Specified Zones Range Validation in Points ...
* @param zonesLoopback: int, loop back for Zones Detection ... * @param zonesLoopback: int, loop back for Zones Detection ...
* @param zonesValidationLength: int, zones Validation Length ... * @param zonesValidationLength: int, zones Validation Length ...
* @param count: int, number of required Zones ... * @param count: int, number of required Zones ...
@@ -4262,6 +4263,7 @@ class XCMarketPatternDetector : public XCBase
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE, ENUM_X_DIRECTION forDir = X_DIRECTION_NONE,
ENUM_X_SORT_BY sortBy = X_SORT_BY_DATE, ENUM_X_SORT_BY sortBy = X_SORT_BY_DATE,
ENUM_X_DIRECTION sortDir = X_DIRECTION_BEARISH, ENUM_X_DIRECTION sortDir = X_DIRECTION_BEARISH,
double zonesRangeValidationFactor = 10,
int zonesLoopback = 5, int zonesLoopback = 5,
int zonesValidationLength = 5, int zonesValidationLength = 5,
int count = 0, int count = 0,
@@ -4410,6 +4412,15 @@ class XCMarketPatternDetector : public XCBase
RemoveBreakedZones(zones, true); RemoveBreakedZones(zones, true);
} }
//
// Validate Zones Range ...
if (zonesRangeValidationFactor > 0) {
//
double points = GetPoints(bar.symbol);
double minAllowedRange = points * zonesRangeValidationFactor;
ValidateZonesRange(zones, minAllowedRange);
}
// //
// Apply Sorting ... // Apply Sorting ...
Sort(zones, sortBy, sortDir); Sort(zones, sortBy, sortDir);
@@ -5659,6 +5659,14 @@ bool HasInside(
return result; return result;
} }
/**
* Check Specified ZOne is Affected by Specified Bar or not ...
*
* @param bar: XOHCL, reference to Specified Bar ...
* @param zone: XBoxZone, reference to Specified Zone ...
*
* @return ( bool )
*/
bool IsZoneAffected( bool IsZoneAffected(
XOHCL &bar, XOHCL &bar,
XBoxZone &zone // XBoxZone &zone //
@@ -6167,6 +6175,14 @@ int GetTesterBars(
return result; return result;
} }
/**
* Check Specified Zone is Breaked or not ...
*
* @param zone: XBoxZone, reference to Specified Zone ...
* @param priceType: ENUM_X_PRICE, Specified Price Type for Zone Break Detection ...
*
* @return ( bool )
*/
bool IsBreaked( bool IsBreaked(
XBoxZone &zone, XBoxZone &zone,
ENUM_X_PRICE priceType = X_PRICE_CLOSE // ENUM_X_PRICE priceType = X_PRICE_CLOSE //
@@ -6225,6 +6241,72 @@ bool IsBreaked(
return result; return result;
} }
/**
* Validate Zones Range ...
*
* @param source: XBoxZone, collection reference to Validate ...
* @param minAllowedRange: double, min allowed range to Validate ...
*
* @return ( int )
*/
int ValidateZonesRange(
XBoxZone &source[],
double minAllowedRange //
)
{
//
int result = 0;
//
// Validate ...
bool has = HasChild(source) &&
minAllowedRange > 0;
if (!has)
{
return result;
}
//
XBoxZone iTMP;
XBoxZone tmps[];
Copy(source, tmps);
XClean(source);
while (HasChild(tmps))
{
//
iTMP.Clean();
iTMP = tmps[0];
ArrayRemove(tmps, 0, 1);
//
// Check Range Validation ...
has = iTMP.GetRange() > minAllowedRange;
if (has)
{
AddIfNotExists(iTMP, source);
}
}
//
result = ArraySize(source);
//
// Cleanup ...
XClean(tmps);
iTMP.Clean();
//
return result;
}
/**
* Remove Breaked Zones ...
*
* @param source: XBoxZone, collection reference to Remove Breaked Zones ...
* @param priceType: ENUM_X_PRICE, Specified Price type of Break Detection ...
*
* @return ( int )
*/
int RemoveBreakedZones( int RemoveBreakedZones(
XBoxZone &source[], XBoxZone &source[],
ENUM_X_PRICE priceType = X_PRICE_CLOSE // ENUM_X_PRICE priceType = X_PRICE_CLOSE //
@@ -1062,7 +1062,9 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
// Validator Flags ... // Validator Flags ...
bool validateByZones = true;
bool validateByXFIMARejected = true; bool validateByXFIMARejected = true;
bool validateByCyclesMATresnding = true;
// //
// Define Requirements ... // Define Requirements ...
@@ -1071,6 +1073,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
XOHCL pBar; XOHCL pBar;
XOHCL p2Bar; XOHCL p2Bar;
XOHCL p3Bar; XOHCL p3Bar;
XBoxZone zones[];
double rejecteds[]; double rejecteds[];
bool isBullish = false; bool isBullish = false;
bool isBearish = false; bool isBearish = false;
@@ -1206,8 +1209,115 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
rejectedBar.Clean(); rejectedBar.Clean();
//
// Reset Flags ...
if (!result)
{
//
zone.Clean();
result = false;
isBullish = false;
isBearish = false;
dir = X_DIRECTION_NONE;
}
} }
//
// Validate Rejection by Cycleas MA Trending ...
if (result && validateByCyclesMATresnding)
{
//
int barIDX = pBar.Index();
//
bool isCyclesMABulliah =
fimaParser.IsHCMABullish(barIDX) &&
fimaParser.IsHCMAOverLast(barIDX);
//
bool isCyclesMABearish =
fimaParser.IsHCMABearish(barIDX) &&
fimaParser.IsHCMAUnderLast(barIDX);
//
isBullish =
isBullish &&
isCyclesMABulliah;
//
isBearish =
isBearish &&
isCyclesMABearish;
//
result = isBullish || isBearish;
}
//
// Detect a Zone ...
// Validate by Has a Zone (FVG, Support, Resistance) ...
if (result && validateByZones)
{
//
int zonesCount = poiDetector.DetectZones(
bar,
zones,
true, // Validated Zones ...
false, // Contains Order Block ...
true, // Contains Fair Value Gaps ...
true, // Contains Supports ...
true, // Contains Resistances ...
X_DIRECTION_ALL, // For All Directions ...
X_SORT_BY_DATE, // Sort by Date ...
X_DIRECTION_BEARISH, // Sorting Direction ...
10, // Zones Validation Points Factor ...
5, // Zones Loopback ...
3, // Zones Validation ...
0, // All Zones ...
50 // Loopback Length ...
);
UpdateToTime(zones, bar.time);
//
result = result && IsValidSize(zonesCount);
if (result)
{
//
XBoxZone tmpZones[];
int bullishCount = ExtractByDirection(
tmpZones,
zones,
X_DIRECTION_BULLISH //
);
int bearishCount = ExtractByDirection(
tmpZones,
zones,
X_DIRECTION_BEARISH //
);
//
result =
result &&
IsValidSize(bullishCount) &&
IsValidSize(bearishCount);
}
//
// Reset Flags ...
if (!result)
{
//
zone.Clean();
result = false;
isBullish = false;
isBearish = false;
dir = X_DIRECTION_NONE;
}
}
//
// TODO: Remove this and Put inside Draws Part ...
if (result) if (result)
{ {
// //
@@ -1250,7 +1360,11 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
} }
// //
DebugBreak(); // Draw Detected Zones ...
if (HasChild(zones))
{
poiDrawer.DrawZones(zones, iConfig);
}
} }
// //
@@ -1373,6 +1487,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
pBar.Clean(); pBar.Clean();
p2Bar.Clean(); p2Bar.Clean();
p3Bar.Clean(); p3Bar.Clean();
XClean(zones);
XClean(rejecteds); XClean(rejecteds);
pBarPatterns.Clean(); pBarPatterns.Clean();
p2BarPatterns.Clean(); p2BarPatterns.Clean();