This commit is contained in:
2025-10-13 21:34:31 +03:30
parent abd074dffb
commit ba2231664a
7 changed files with 427 additions and 363 deletions
+43 -179
View File
@@ -30,176 +30,6 @@
//
// Definitions ...
enum ENUM_X_DETECTOR_ZONE_ACTION
{
X_DETECTOR_ZONE_ACTION_NONE = 0,
//
// Support ...
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED = 1,
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED = 2,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED = 3,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED = 4,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED = 5,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED = 6,
//
// Resistance ...
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED = 7,
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED = 8,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED = 9,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED = 10,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED = 11,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED = 12,
};
bool IsXValid(ENUM_X_DETECTOR_ZONE_ACTION value)
{
return value != X_DETECTOR_ZONE_ACTION_NONE;
}
string ToXString(ENUM_X_DETECTOR_ZONE_ACTION value)
{
//
string result = NULL;
//
if (!IsXValid(value))
{
return result;
}
//
switch (value)
{
//
case X_DETECTOR_ZONE_ACTION_NONE:
result = "NONE";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED:
result = "MAJOR_SUPPORT_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED:
result = "MAJOR_SUPPORT_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED:
result = "MINOR_SUPPORT_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED:
result = "MINOR_SUPPORT_REFINED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED:
result = "MINOR_SUPPORT_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED:
result = "MINOR_SUPPORT_RETESTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED:
result = "MAJOR_RESISTANCE_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED:
result = "MAJOR_RESISTANCE_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED:
result = "MINOR_RESISTANCE_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED:
result = "MINOR_RESISTANCE_REFINED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED:
result = "MINOR_RESISTANCE_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED:
result = "MINOR_RESISTANCE_RETESTED";
break;
}
//
return result;
}
int XExtractValids(
ENUM_X_DETECTOR_ZONE_ACTION &source[],
ENUM_X_DETECTOR_ZONE_ACTION &dest[] //
)
{
//
int result = 0;
//
// Prepare ...
XClean(dest);
//
// Validate ...
bool has = HasChild(source);
if (!has)
{
return result;
}
//
// Calculations ...
int count = ArraySize(source);
for (int i = 0; i < count; i++)
{
//
has = IsXValid(source[i]);
if (has)
{
//
Add(
source[i],
dest //
);
}
}
//
// Check Size ...
result = ArraySize(dest);
//
return result;
}
bool HasXValid(ENUM_X_DETECTOR_ZONE_ACTION &source[])
{
//
bool result = false;
//
result = HasChild(source);
if (!result)
{
return result;
}
//
for (int i = 0; i < ArraySize(source); i++)
{
//
result = IsXValid(source[i]);
if (result)
{
break;
}
}
//
return result;
}
//
// Implementation ...
class XCMarketPatternDetector : public XCBase
@@ -2850,6 +2680,48 @@ class XCMarketPatternDetector : public XCBase
// Validate Analysis ...
result = analysis.IsValid();
//
// Update Quarter ...
if (result)
{
//
// Update Quarter ...
UpdateZones(
bar,
analysis.quarterActions,
config.quarterZonesValidationLength, // Zones Validation Length ...
config.quarterZonesRequiredToStart, // Zones Count to Start Processing ...
config.quarterZoneDetectionLoopback // Zones Detection Loopback ...
);
//
// Fill Quarter Props ...
analysis.majorSupport = majorSupport;
analysis.minorSupport = minorSupport;
analysis.quarter = CalculateQuarter();
analysis.majorResistance = majorResistance;
analysis.minorResistance = minorResistance;
//
// Update To Times ...
if (analysis.majorSupport.IsValid())
{
analysis.majorSupport.to = bar.time;
}
if (analysis.minorSupport.IsValid())
{
analysis.minorSupport.to = bar.time;
}
if (analysis.majorResistance.IsValid())
{
analysis.majorResistance.to = bar.time;
}
if (analysis.minorResistance.IsValid())
{
analysis.minorResistance.to = bar.time;
}
}
//
// Cleanup Resources ...
iZone.Clean();
@@ -3630,15 +3502,7 @@ class XCMarketPatternDetector : public XCBase
}
//
// Preparing Actions ...
if (!HasChild(actions))
{
//
Add(
X_DETECTOR_ZONE_ACTION_NONE,
actions //
);
}
// Actions Counting ...
result = ArraySize(actions);
//
+1 -1
View File
@@ -512,7 +512,7 @@ void OnTick()
//
// Bar Index ...
int barIndex = 1;
int barIndex = 0;
//
// Signallers Calling OnTick ...
@@ -1300,6 +1300,15 @@ struct XPatternAnalysis
ENUM_X_BAR_PATTERN patterns[]; // All Bars Exists Patterns ...
ENUM_X_DIRECTION patternsDir[]; // Each Exists Patterns Directions ...
//
// Quarter Analysis ...
double quarter; // Premium Discount Verifier ...
XBoxZone majorSupport; // Major Support Zone ...
XBoxZone minorSupport; // Minor Support Zone ...
XBoxZone majorResistance; // Major Resistance Zone ...
XBoxZone minorResistance; // Minor Resistance Zone ...
ENUM_X_DETECTOR_ZONE_ACTION quarterActions[]; // Specified Quarter Actions based on Time ...
//
// Constructor ...
XPatternAnalysis()
@@ -1326,6 +1335,14 @@ struct XPatternAnalysis
resistance.Clean();
XClean(patternsDir);
//
quarter = 0;
XClean(quarterActions);
majorSupport.Clean();
minorSupport.Clean();
majorResistance.Clean();
minorResistance.Clean();
//
ZeroMemory(this);
}
@@ -1348,6 +1365,123 @@ struct XPatternAnalysis
return result;
}
//
// Quarter Actions ...
/**
* Check Has Major Support or not ...
*
* @return ( bool )
*/
bool HasMajorSupport()
{
return IsValid() &&
majorSupport.IsValid();
}
/**
* Check Has Minor Support or not ...
*
* @return ( bool )
*/
bool HasMinorSupport()
{
return IsValid() &&
IsQuarterReady() &&
minorSupport.IsValid();
}
/**
* Check Has Major Resistance or not ...
*
* @return ( bool )
*/
bool HasMajorResistance()
{
return IsValid() &&
majorResistance.IsValid();
}
/**
* Check Has Minor Resistance or not ...
*
* @return ( bool )
*/
bool HasMinorResistance()
{
return IsValid() &&
IsQuarterReady() &&
minorResistance.IsValid();
}
/**
* Check Zones Quarter Initialized ...
*
* @return ( bool )
*/
bool IsQuarterReady()
{
//
return IsValid() &&
HasMajorSupport() &&
HasMajorResistance() &&
quarter > 0;
}
/**
* Check Has Quarter Actions ...
*
* @return ( bool )
*/
bool HasQuarterActions()
{
return HasChild(quarterActions);
}
/**
* Check Contains Specified Quarter Actions or not ...
*
* @param value: ENUM_X_DETECTOR_ZONE_ACTION, Specified Action ...
*
* @return ( bool )
*/
bool HasQuarterAction(ENUM_X_DETECTOR_ZONE_ACTION value)
{
//
bool result = false;
//
result = IsXValid(value) &&
HasQuarterActions() &&
Contains(value, quarterActions);
//
return result;
}
/**
* Check Minor Support Retested or not ...
*
* @return ( bool )
*/
bool IsMinorSupportRetested()
{
return HasQuarterAction(X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED);
}
/**
* Check Minor Resistance Retested or not ...
*
* @return ( bool )
*/
bool IsMinorResistanceRetested()
{
return HasQuarterAction(X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED);
}
//
// Pattern Actions ...
//
int Count(
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
@@ -2308,6 +2442,12 @@ struct XPatternAnalysisConfig
//
// Props ...
//
// Quarter ...
int quarterZonesRequiredToStart;
int quarterZoneDetectionLoopback;
int quarterZonesValidationLength;
//
// PV ...
int pvValidationLength;
@@ -2365,6 +2505,12 @@ struct XPatternAnalysisConfig
*/
void Clean()
{
//
// Quarter ...
quarterZonesRequiredToStart = 0;
quarterZoneDetectionLoopback = 0;
quarterZonesValidationLength = 0;
//
// PV ...
pvValidationLength = 0;
@@ -2416,6 +2562,12 @@ struct XPatternAnalysisConfig
*/
void Default()
{
//
// Quarter ...
quarterZonesRequiredToStart = 20;
quarterZonesValidationLength = 3;
quarterZoneDetectionLoopback = 1500;
//
// PV ...
pvValidationLength = 5;
+115
View File
@@ -285,6 +285,121 @@ int GetAllBarPatters(ENUM_X_BAR_PATTERN &dest[])
return ArraySize(dest);
}
/**
* Quarter Zones Actions ...
**/
enum ENUM_X_DETECTOR_ZONE_ACTION
{
X_DETECTOR_ZONE_ACTION_NONE = 0,
//
// Support ...
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED = 1,
X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED = 2,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED = 3,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED = 4,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED = 5,
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED = 6,
//
// Resistance ...
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED = 7,
X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED = 8,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED = 9,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED = 10,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED = 11,
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED = 12,
};
/**
* Validate an ENUM member ...
*
* @param value: ENUM_X_DETECTOR_ZONE_ACTION ...
*
* @return ( bool )
*/
bool IsXValid(ENUM_X_DETECTOR_ZONE_ACTION value)
{
return value != X_DETECTOR_ZONE_ACTION_NONE;
}
/**
* Converts a Pattern ENUM to String Representation ...
*
* @param value: ENUM_X_DETECTOR_ZONE_ACTION, member ...
*
* @return ( string )
*/
string ToXString(ENUM_X_DETECTOR_ZONE_ACTION value)
{
//
string result = NULL;
//
if (!IsXValid(value))
{
return result;
}
//
switch (value)
{
//
case X_DETECTOR_ZONE_ACTION_NONE:
result = "NONE";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_DETECTED:
result = "MAJOR_SUPPORT_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_SUPPORT_BREAKED:
result = "MAJOR_SUPPORT_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_DETECTED:
result = "MINOR_SUPPORT_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_REFINED:
result = "MINOR_SUPPORT_REFINED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_BREAKED:
result = "MINOR_SUPPORT_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED:
result = "MINOR_SUPPORT_RETESTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_DETECTED:
result = "MAJOR_RESISTANCE_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MAJOR_RESISTANCE_BREAKED:
result = "MAJOR_RESISTANCE_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_DETECTED:
result = "MINOR_RESISTANCE_DETECTED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_REFINED:
result = "MINOR_RESISTANCE_REFINED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_BREAKED:
result = "MINOR_RESISTANCE_BREAKED";
break;
//
case X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED:
result = "MINOR_RESISTANCE_RETESTED";
break;
}
//
return result;
}
//
// Structures ...
@@ -348,187 +348,6 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
return;
}
//
// Manage Zones of Pattern Detector ...
ENUM_X_DETECTOR_ZONE_ACTION zoneActions[];
int zoneActionsCount = poiDetector.UpdateZones(
iBar,
zoneActions,
3, // Validation Length ...
20, // Required Zones ...
1500 // Loopback ...
);
has = IsValidSize(zoneActionsCount);
if (has)
{
//
}
//
// Sample Draws ...
//
// Support ...
if (poiDetector.majorSupport.IsValid())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesWidth = 3;
//
poiDrawer.DrawZone(
poiDetector.majorSupport,
iConfig //
);
}
if (poiDetector.minorSupport.IsValid())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesStyle = STYLE_DASH;
//
poiDrawer.DrawZone(
poiDetector.minorSupport,
iConfig //
);
}
//
// Resistance ...
if (poiDetector.majorResistance.IsValid())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesWidth = 3;
//
poiDrawer.DrawZone(
poiDetector.majorResistance,
iConfig //
);
}
if (poiDetector.minorResistance.IsValid())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesStyle = STYLE_DASH;
//
poiDrawer.DrawZone(
poiDetector.minorResistance,
iConfig //
);
}
//
// Quarter Line ...
if (poiDetector.majorSupport.IsValid() &&
poiDetector.majorResistance.IsValid())
{
//
double quarter = poiDetector.CalculateQuarter();
//
datetime quarterFrom = MathMin(poiDetector.majorResistance.from,
poiDetector.majorSupport.from);
datetime quarterTo = MathMax(poiDetector.majorResistance.to,
poiDetector.majorSupport.to);
string quarterName = "XQuarter_" + ToXString(quarter) + "_" + ToXString(TimeToSeconds(quarterFrom));
//
CChartObjectTrend *iObj;
has = poiDrawer.DrawTrendLine(
quarter,
quarterFrom,
quarter,
quarterTo,
iObj,
quarterName,
false, // Ray Right ...
false // Ray Left ...
);
if (has) {
//
iObj.Width(2);
iObj.Color(clrYellow);
//
poiDrawer.drawnObjects.Add(iObj);
}
}
//
// Check Actions for Debugging ...
has = HasXValid(zoneActions) &&
(Contains(
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED,
zoneActions) ||
Contains(
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED,
zoneActions));
if (has)
{
//
// Draw Bar Arrow Based On Action ...
XPivot msPivot;
XPivot mrPivot;
//
// Support ReTest ...
has = Contains(
X_DETECTOR_ZONE_ACTION_MINOR_SUPPORT_RETESTED,
zoneActions //
);
has =
has &&
ToPivot(
iBar,
msPivot,
X_DIRECTION_BULLISH,
X_BAR_PATTERN_SUPPORT //
);
if (has)
{
//
poiDrawer.DrawPivot(
msPivot,
structureDrawConfig.drawConfig //
);
}
//
// Resistance ReTest ...
has = Contains(
X_DETECTOR_ZONE_ACTION_MINOR_RESISTANCE_RETESTED,
zoneActions //
);
has =
has &&
ToPivot(
iBar,
mrPivot,
X_DIRECTION_BEARISH,
X_BAR_PATTERN_RESISTANCE //
);
if (has)
{
//
poiDrawer.DrawPivot(
mrPivot,
structureDrawConfig.drawConfig //
);
}
//
// Cleanup Pivots ...
msPivot.Clean();
mrPivot.Clean();
//
Print("Hot Zone Actions ...");
}
//
// Retrieve Conditions ...
has = fimaHelper.GetConditions(
@@ -553,6 +372,111 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
structureConfig,
barIndex //
);
//
// Sample Draws ...
//
// Support ...
if (structure.barAnalysis.IsQuarterReady())
{
//
// Majors ...
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesWidth = 3;
//
poiDrawer.DrawZone(
structure.barAnalysis.majorSupport,
iConfig //
);
//
poiDrawer.DrawZone(
structure.barAnalysis.majorResistance,
iConfig //
);
//
// Minors ...
//
if (structure.barAnalysis.HasMinorSupport())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesStyle = STYLE_DASH;
//
poiDrawer.DrawZone(
structure.barAnalysis.minorSupport,
iConfig //
);
}
//
if (structure.barAnalysis.HasMinorResistance())
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
iConfig.zonesStyle = STYLE_DASH;
//
poiDrawer.DrawZone(
structure.barAnalysis.minorResistance,
iConfig //
);
}
//
// Quarter Draw ...
if (structure.barAnalysis.quarter > 0)
{
//
double quarter = structure.barAnalysis.quarter;
//
datetime quarterFrom = MathMin(poiDetector.majorResistance.from,
poiDetector.majorSupport.from);
datetime quarterTo = iBar.time;
string quarterName = "XQuarter_" + ToXString(quarter) + "_" + ToXString(TimeToSeconds(quarterFrom));
//
CChartObjectTrend *iObj;
has = poiDrawer.DrawTrendLine(
quarter,
quarterFrom,
quarter,
quarterTo,
iObj,
quarterName,
false, // Ray Right ...
false // Ray Left ...
);
if (has)
{
//
iObj.Width(2);
iObj.Color(clrYellow);
//
poiDrawer.drawnObjects.Add(iObj);
}
}
}
//
// Resistance ...
//
// Quarter Line ...
if (poiDetector.majorSupport.IsValid() &&
poiDetector.majorResistance.IsValid())
{
}
// poiDrawer.drawnObjects.Clear();
// poiDrawer.DrawMarketStructure(
// structure,
@@ -427,6 +427,12 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
iPatternAnalysis,
structure.barsAnalysis //
);
//
if (i == barIndex)
{
structure.barAnalysis = iPatternAnalysis;
}
}
//
+5 -2
View File
@@ -36,7 +36,8 @@
struct XFIMAMarketStructure
{
//
XOHCL bar; // Spacified Start Bar for Analysing ...
XOHCL bar; // Spacified Start Bar for Analysing ...
XPatternAnalysis barAnalysis; // Structure Bar Pattern Analysis ...
//
XPivotAnalysis pvAnalysis; // PV Pivot Analysis Result ...
@@ -62,6 +63,7 @@ struct XFIMAMarketStructure
{
//
bar.Clean();
barAnalysis.Clean();
//
pvAnalysis.Clean();
@@ -83,7 +85,8 @@ struct XFIMAMarketStructure
bool result = false;
//
result = bar.IsValid();
result = bar.IsValid() &&
barAnalysis.IsValid();
//
return result;