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);
//