This commit is contained in:
2026-01-03 17:59:09 +03:30
parent 163259c717
commit 5908d6ded7
3 changed files with 658 additions and 213 deletions
+354
View File
@@ -1332,3 +1332,357 @@ bool Strategy1HasSignal(
// //
return result; return result;
} }
/**
* Check Bar Has Signal Based on Strategy 1 ...
* POI ...
*
* @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 ...
*
* @return ( bool )
*/
bool Strategy1HasSignal(
XOHCL & bar,
XBoxZone & zone,
XTarget & targets[],
ENUM_X_DIRECTION & dir //
)
{
//
bool result = false;
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
int barIndex = bar.Index() + 1;
//
// Retrieve Base Conditions ...
bool isBullish = IsBullishPOILongEntry(barIndex);
bool isBearish = IsBearishPOIShortEntry(barIndex);
//
// Validate Conditions ...
result = isBullish || isBearish;
if (!result)
{
return result;
}
//
XOHCL iBar;
result = iBar.Init(bar.symbol, bar.period, barIndex);
if (!result)
{
return result;
}
//
// Do Validation and Filtering Market Structure if required ...
//
// Validate near Support / Resistance Zones ...
bool validateNearSupRes = true;
if (result && validateNearSupRes)
{
//
// Configs ...
int loopback = 100;
int validationLength = 7;
double nearThreshold = 5;
int validationRetests = 0;
int validationLoopback = 100;
double validationThreshold = 5;
//
// Filling Zones ...
XBoxZone zones[];
if (isBullish)
{
//
// Detect Supports ...
poiDetector.DetectSupports(
zones,
barIndex,
loopback,
true,
validationLength, // Validation Length ...
validationRetests, // Min Retest ...
validationThreshold, // Retest Threshold ...
validationLoopback, // Retest Loopback ...
symbol,
period //
);
}
else if (isBearish)
{
//
// Detect Resistances ...
poiDetector.DetectResistances(
zones,
barIndex,
loopback,
true,
validationLength, // Validation Length ...
validationRetests, // Min Retest ...
validationThreshold, // Retest Threshold ...
validationLoopback, // Retest Loopback ...
symbol,
period //
);
}
//
if (HasChild(zones))
{
//
XPOIDrawConfig iConfig;
iConfig.Default();
//
poiDrawer.DrawZones(zones, iConfig);
iConfig.Clean();
// DebugBreak();
}
//
// Check Has Nearest ...
int nearIDX = -1;
result = poiDetector.HasNearZone(
nearIDX,
bar.close,
nearThreshold,
zones //
);
//
// Validate ...
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Validate by ATR Rising/Falling ...
bool validateByATRRaisFalling = true;
if (result && validateByATRRaisFalling)
{
//
// Bullish:
// - ATR Lower Rising ...
// - ATR Over ATR Ma ...
// Bearsih:
// - ATR Upper Falling ...
// - ATR Over ATR Ma ...
//
isBullish =
isBullish &&
// kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1);
isBearish =
isBearish &&
// kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1);
result = isBullish || isBearish;
//
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Validate by RSI ...
bool validatebyRSI = false;
if (result && validatebyRSI)
{
//
// Bullish:
// - Not in Over Baught;
// - Rising;
// Bearish :
// - Not in Over Sold;
// - Falling;
//
isBullish =
isBullish &&
!kiParser.IsRSIOverbought(barIndex) &&
kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1);
isBearish =
isBearish &&
!kiParser.IsRSIOversold(barIndex) &&
kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1);
result = isBullish || isBearish;
//
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Validate by iBar Pattern ...
// in this Strategy we have PinBar or SignalKeyBar ...
bool validateByBarPatterns = false;
if (result && validateByBarPatterns)
{
//
// Pin ...
bool isPinBar = poiDetector.IsPinnedBar(
iBar,
dir //
);
bool isPinBarBullish =
isPinBar &&
IsXBullish(dir);
bool isPinBarBearish =
isPinBar &&
IsXBearish(dir);
//
// Engulfe ...
bool isEngulfed = poiDetector.IsEngulfedBar(
iBar,
dir //
);
bool isEngulfedBullish =
isEngulfed &&
IsXBullish(dir);
bool isEngulfedBearish =
isEngulfed &&
IsXBearish(dir);
//
// Signal Key Bar ...
bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern(
iBar,
dir //
);
bool isSignalKeyBarBullish =
isSignalKeyBar &&
IsXBullish(dir);
bool isSignalKeyBarBearish =
isSignalKeyBar &&
IsXBearish(dir);
//
isBullish =
isBullish &&
(isEngulfedBullish);
isBearish =
isBearish &&
(isEngulfedBearish);
// //
// isBullish =
// isBullish &&
// (isPinBarBullish ||
// isEngulfedBullish ||
// isSignalKeyBarBullish);
// isBearish =
// isBearish &&
// (isPinBarBearish ||
// isEngulfedBearish ||
// isSignalKeyBarBearish);
//
result = isBullish || isBearish;
//
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Check and Prepare Direction ...
dir =
isBullish
? X_DIRECTION_BULLISH
: isBearish ? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
result = HasDirection(dir);
if (!result)
{
//
iBar.Clean();
return result;
}
//
// Prepare Zone ...
double entry = GetEntry(iBar.symbol, dir);
if (result)
{
//
double upper = isBullish
? entry
: iBar.high;
double lower = isBullish
? iBar.low
: entry;
datetime to = bar.time;
datetime from = iBar.BeforeOn();
result = zone.Init(
iBar.symbol,
iBar.period,
upper,
lower,
from,
to,
dir,
"XS1" //
);
if (result)
{
//
XPOIDrawConfig iConfig;
iConfig.Default();
//
poiDrawer.DrawZone(zone, iConfig);
//
// DebugBreak();
}
}
//
iBar.Clean();
//
result =
result &&
zone.IsValid() &&
HasDirection(dir);
//
return result;
}
@@ -973,21 +973,10 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
} }
// //
bool isBullish = false;
bool isBearish = false;
int barIndex = bar.Index() + 1; int barIndex = bar.Index() + 1;
//
// Retrieve Base Conditions ...
bool isBullish = IsBullishPOILongEntry(barIndex);
bool isBearish = IsBearishPOIShortEntry(barIndex);
//
// Validate Conditions ...
result = isBullish || isBearish;
if (!result)
{
return result;
}
// //
XOHCL iBar; XOHCL iBar;
result = iBar.Init(bar.symbol, bar.period, barIndex); result = iBar.Init(bar.symbol, bar.period, barIndex);
@@ -997,235 +986,326 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
} }
// //
// Do Validation and Filtering Market Structure if required ... XBoxZone supports[];
XBoxZone resistances[];
// XBoxZone minorSupport;
// Validate near Support / Resistance Zones ... XBoxZone majorSupport;
bool validateNearSupRes = true; XBoxZone minorResistance;
if (result && validateNearSupRes) XBoxZone majorResistance;
{ poiDetector.GetCurrentStructure(
// supports,
// Configs ... resistances,
int loopback = 100; minorSupport,
int validationLength = 7; majorSupport,
double nearThreshold = 5; minorResistance,
int validationRetests = 0; majorResistance,
int validationLoopback = 100;
double validationThreshold = 5;
//
// Filling Zones ...
XBoxZone zones[];
if (isBullish)
{
//
// Detect Supports ...
poiDetector.DetectSupports(
zones,
barIndex, barIndex,
loopback, bar.symbol,
true, bar.period, // Minor ...
validationLength, // Validation Length ... PERIOD_H1, // Major ...
validationRetests, // Min Retest ... 50,
validationThreshold, // Retest Threshold ... 14,
validationLoopback, // Retest Loopback ... 21,
symbol, 0 //
period //
); );
} bool draw = true;
else if (isBearish) if (draw)
{ {
// //
// Detect Resistances ... int drawn = 0;
poiDetector.DetectResistances(
zones,
barIndex,
loopback,
true,
validationLength, // Validation Length ...
validationRetests, // Min Retest ...
validationThreshold, // Retest Threshold ...
validationLoopback, // Retest Loopback ...
symbol,
period //
);
}
// //
if (HasChild(zones)) XPOIDrawConfig config;
config.Default();
//
// Minors ...
if (minorSupport.IsValid())
{ {
// //
XPOIDrawConfig iConfig; drawn++;
iConfig.Default(); poiDrawer.DrawZone(minorSupport, config);
//
poiDrawer.DrawZones(zones, iConfig);
iConfig.Clean();
// DebugBreak();
} }
if (minorResistance.IsValid())
//
// Check Has Nearest ...
int nearIDX = -1;
result = poiDetector.HasNearZone(
nearIDX,
bar.close,
nearThreshold,
zones //
);
//
// Validate ...
if (!result)
{ {
// //
isBullish = false; drawn++;
isBearish = false; poiDrawer.DrawZone(minorResistance, config);
}
} }
// //
// Validate by ATR Rising/Falling ... // Majors ...
bool validateByATRRaisFalling = true; config.bullishColor = clrLime;
if (result && validateByATRRaisFalling) config.bearishColor = clrRed;
config.zonesWidth = 4;
//
if (majorSupport.IsValid())
{ {
// //
// Bullish: drawn++;
// - ATR Lower Rising ... poiDrawer.DrawZone(majorSupport, config);
// - ATR Over ATR Ma ... }
// Bearsih: if (majorResistance.IsValid())
// - ATR Upper Falling ...
// - ATR Over ATR Ma ...
//
isBullish =
isBullish &&
// kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1);
isBearish =
isBearish &&
// kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1);
result = isBullish || isBearish;
//
if (!result)
{ {
// //
isBullish = false; drawn++;
isBearish = false; poiDrawer.DrawZone(majorResistance, config);
}
} }
// //
// Validate by RSI ... config.Clean();
bool validatebyRSI = false;
if (result && validatebyRSI)
{
//
// Bullish:
// - Not in Over Baught;
// - Rising;
// Bearish :
// - Not in Over Sold;
// - Falling;
// //
isBullish = if (drawn > 0)
isBullish &&
!kiParser.IsRSIOverbought(barIndex) &&
kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1);
isBearish =
isBearish &&
!kiParser.IsRSIOversold(barIndex) &&
kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1);
result = isBullish || isBearish;
//
if (!result)
{ {
// DebugBreak();
isBullish = false;
isBearish = false;
} }
} }
// // //
// Validate by iBar Pattern ... // // Retrieve Base Conditions ...
// in this Strategy we have PinBar or SignalKeyBar ... // bool isBullish = IsBullishPOILongEntry(barIndex);
bool validateByBarPatterns = false; // bool isBearish = IsBearishPOIShortEntry(barIndex);
if (result && validateByBarPatterns)
{
//
// Pin ...
bool isPinBar = poiDetector.IsPinnedBar(
iBar,
dir //
);
bool isPinBarBullish =
isPinBar &&
IsXBullish(dir);
bool isPinBarBearish =
isPinBar &&
IsXBearish(dir);
// // //
// Engulfe ... // // Validate Conditions ...
bool isEngulfed = poiDetector.IsEngulfedBar( // result = isBullish || isBearish;
iBar, // if (!result)
dir // // {
); // return result;
bool isEngulfedBullish = // }
isEngulfed &&
IsXBullish(dir);
bool isEngulfedBearish =
isEngulfed &&
IsXBearish(dir);
// // //
// Signal Key Bar ... // // Do Validation and Filtering Market Structure if required ...
bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern(
iBar,
dir //
);
bool isSignalKeyBarBullish =
isSignalKeyBar &&
IsXBullish(dir);
bool isSignalKeyBarBearish =
isSignalKeyBar &&
IsXBearish(dir);
// // //
isBullish = // // Validate near Support / Resistance Zones ...
isBullish && // bool validateNearSupRes = true;
(isEngulfedBullish); // if (result && validateNearSupRes)
isBearish = // {
isBearish && // //
(isEngulfedBearish); // // Configs ...
// int loopback = 100;
// int validationLength = 7;
// double nearThreshold = 5;
// int validationRetests = 0;
// int validationLoopback = 100;
// double validationThreshold = 5;
// //
// // Filling Zones ...
// XBoxZone zones[];
// if (isBullish)
// {
// //
// // Detect Supports ...
// poiDetector.DetectSupports(
// zones,
// barIndex,
// loopback,
// true,
// validationLength, // Validation Length ...
// validationRetests, // Min Retest ...
// validationThreshold, // Retest Threshold ...
// validationLoopback, // Retest Loopback ...
// symbol,
// period //
// );
// }
// else if (isBearish)
// {
// //
// // Detect Resistances ...
// poiDetector.DetectResistances(
// zones,
// barIndex,
// loopback,
// true,
// validationLength, // Validation Length ...
// validationRetests, // Min Retest ...
// validationThreshold, // Retest Threshold ...
// validationLoopback, // Retest Loopback ...
// symbol,
// period //
// );
// }
// //
// if (HasChild(zones))
// {
// //
// XPOIDrawConfig iConfig;
// iConfig.Default();
// //
// poiDrawer.DrawZones(zones, iConfig);
// iConfig.Clean();
// // DebugBreak();
// }
// //
// // Check Has Nearest ...
// int nearIDX = -1;
// result = poiDetector.HasNearZone(
// nearIDX,
// bar.close,
// nearThreshold,
// zones //
// );
// //
// // Validate ...
// if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// //
// // Validate by ATR Rising/Falling ...
// bool validateByATRRaisFalling = true;
// if (result && validateByATRRaisFalling)
// {
// //
// // Bullish:
// // - ATR Lower Rising ...
// // - ATR Over ATR Ma ...
// // Bearsih:
// // - ATR Upper Falling ...
// // - ATR Over ATR Ma ...
// // // //
// isBullish = // isBullish =
// isBullish && // isBullish &&
// (isPinBarBullish || // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
// isEngulfedBullish || // kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1);
// isSignalKeyBarBullish);
// isBearish = // isBearish =
// isBearish && // isBearish &&
// (isPinBarBearish || // // kiHelper.GetATR(barIndex) > kiHelper.GetATRSmoothed(barIndex) &&
// isEngulfedBearish || // kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1);
// isSignalKeyBarBearish); // result = isBullish || isBearish;
// // //
result = isBullish || isBearish; // if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// // //
if (!result) // // Validate by RSI ...
{ // bool validatebyRSI = false;
// // if (result && validatebyRSI)
isBullish = false; // {
isBearish = false; // //
} // // Bullish:
} // // - Not in Over Baught;
// // - Rising;
// // Bearish :
// // - Not in Over Sold;
// // - Falling;
// //
// isBullish =
// isBullish &&
// !kiParser.IsRSIOverbought(barIndex) &&
// kiHelper.GetRSI(barIndex) > kiHelper.GetRSI(barIndex + 1);
// isBearish =
// isBearish &&
// !kiParser.IsRSIOversold(barIndex) &&
// kiHelper.GetRSI(barIndex) < kiHelper.GetRSI(barIndex + 1);
// result = isBullish || isBearish;
// //
// if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// //
// // Validate by iBar Pattern ...
// // in this Strategy we have PinBar or SignalKeyBar ...
// bool validateByBarPatterns = false;
// if (result && validateByBarPatterns)
// {
// //
// // Pin ...
// bool isPinBar = poiDetector.IsPinnedBar(
// iBar,
// dir //
// );
// bool isPinBarBullish =
// isPinBar &&
// IsXBullish(dir);
// bool isPinBarBearish =
// isPinBar &&
// IsXBearish(dir);
// //
// // Engulfe ...
// bool isEngulfed = poiDetector.IsEngulfedBar(
// iBar,
// dir //
// );
// bool isEngulfedBullish =
// isEngulfed &&
// IsXBullish(dir);
// bool isEngulfedBearish =
// isEngulfed &&
// IsXBearish(dir);
// //
// // Signal Key Bar ...
// bool isSignalKeyBar = poiDetector.IsSignalKeyBarPattern(
// iBar,
// dir //
// );
// bool isSignalKeyBarBullish =
// isSignalKeyBar &&
// IsXBullish(dir);
// bool isSignalKeyBarBearish =
// isSignalKeyBar &&
// IsXBearish(dir);
// //
// isBullish =
// isBullish &&
// (isEngulfedBullish);
// isBearish =
// isBearish &&
// (isEngulfedBearish);
// // //
// // isBullish =
// // isBullish &&
// // (isPinBarBullish ||
// // isEngulfedBullish ||
// // isSignalKeyBarBullish);
// // isBearish =
// // isBearish &&
// // (isPinBarBearish ||
// // isEngulfedBearish ||
// // isSignalKeyBarBearish);
// //
// result = isBullish || isBearish;
// //
// if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// //
// Check and Prepare Direction ... // Check and Prepare Direction ...
@@ -1617,7 +1617,8 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
XBoxZone &majorResistance, XBoxZone &majorResistance,
int barIndex = 0, int barIndex = 0,
string forSymbol = NULL, string forSymbol = NULL,
ENUM_TIMEFRAMES forPeriod = NULL, ENUM_TIMEFRAMES forMinorPeriod = NULL,
ENUM_TIMEFRAMES forMajorPeriod = NULL,
int loopback = 50, int loopback = 50,
int minorValidation = 7, int minorValidation = 7,
int majorValidation = 14, int majorValidation = 14,
@@ -1644,9 +1645,13 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
{ {
forSymbol = symbol; forSymbol = symbol;
} }
if (!IsXValid(forPeriod)) if (!IsXValid(forMinorPeriod))
{ {
forPeriod = period; forMinorPeriod = period;
}
if (!IsXValid(forMajorPeriod))
{
forMajorPeriod = period;
} }
// //
@@ -1670,7 +1675,7 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
retestThreshold, retestThreshold,
retestLoopback, retestLoopback,
forSymbol, forSymbol,
forPeriod // forMinorPeriod //
); );
if (IsValidSize(supportsCount)) if (IsValidSize(supportsCount))
{ {
@@ -1699,7 +1704,7 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
retestThreshold, retestThreshold,
retestLoopback, retestLoopback,
forSymbol, forSymbol,
forPeriod // forMinorPeriod //
); );
if (IsValidSize(resistancesCount)) if (IsValidSize(resistancesCount))
{ {
@@ -1735,10 +1740,13 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
retestThreshold, retestThreshold,
retestLoopback, retestLoopback,
forSymbol, forSymbol,
forPeriod // forMajorPeriod //
); );
if (IsValidSize(supportsCount)) if (IsValidSize(supportsCount))
{ {
//
UpdateToTime(tmpSupports);
// //
FillNotExists( FillNotExists(
supports, supports,
@@ -1764,10 +1772,13 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
retestThreshold, retestThreshold,
retestLoopback, retestLoopback,
forSymbol, forSymbol,
forPeriod // forMajorPeriod //
); );
if (IsValidSize(resistancesCount)) if (IsValidSize(resistancesCount))
{ {
//
UpdateToTime(tmpResistances);
// //
FillNotExists( FillNotExists(
resistances, resistances,