This commit is contained in:
2026-01-04 16:00:35 +03:30
parent 3c26c9c418
commit 9fc8892c5d
5 changed files with 1181 additions and 278 deletions
+290
View File
@@ -1686,3 +1686,293 @@ bool Strategy1HasSignal(
//
return result;
}
// //
// isBullish =
// // majorSupport.IsValid() &&
// minorSupport.IsValid() &&
// poiDetector.IsKIBullishPOI(barIndex) &&
// poiDetector.HasCandlestickDirection(
// iBar,
// X_DIRECTION_BULLISH //
// ) &&
// IsTFBullishPattern(barIndex, PERIOD_M5) &&
// // minorSupport.lower <= majorSupport.upper &&
// poiDetector.IsNearZone(iBar.close, minorSupport, 10);
// //
// isBearish =
// // majorResistance.IsValid() &&
// minorResistance.IsValid() &&
// poiDetector.IsKIBearishPOI(barIndex) &&
// poiDetector.HasCandlestickDirection(
// iBar,
// X_DIRECTION_BEARISH //
// ) &&
// IsTFBearishPattern(barIndex, PERIOD_M5) &&
// // minorResistance.upper >= majorResistance.lower &&
// poiDetector.IsNearZone(iBar.close, minorResistance, 10);
//
// Retrieve Base Conditions ...
// isBullish =
// isBullish &&
// IsBullishPOILongEntry(barIndex);
// isBearish =
// isBearish &&
// IsBearishPOIShortEntry(barIndex);
// //
// // 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;
// }
// }
//
// Recent Support ...
// else if (HasChild(supports))
// {
// //
// tmpSupportIDX = GetYoungestBelow(iBar.close, supports);
// if (IsValidIndex(tmpSupportIDX))
// {
// zone = supports[tmpSupportIDX];
// }
// }
//
// Recent Resistance ...
// else if (HasChild(resistances))
// {
// //
// tmpResistanceIDX = GetYoungestAbove(iBar.close, resistances);
// if (IsValidIndex(tmpResistanceIDX))
// {
// zone = resistances[tmpResistanceIDX];
// }
// }
@@ -2379,6 +2379,127 @@ struct XPatternAnalysis
return result;
}
/**
* Extract All Exists Patterns Pivots ...
*
* @param dest: XBoxZone, collection reference to holds Extracted Patterns ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ...
*
* @return ( int )
*/
int GetPatterns(
XBoxZone &dest[],
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
)
{
//
int result = 0;
//
// Prepare ...
XClean(dest);
//
// Validate ...
bool has = IsValid() &&
HasChild(patterns);
if (!has)
{
return result;
}
//
// Do ...
XOHCL iBar;
XPivot iPivot;
XBoxZone iZone;
int count = ArraySize(patterns);
for (int i = 0; i < count; i++)
{
//
has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir);
if (has)
{
AddIfNotExists(iZone, dest);
}
}
//
result = ArraySize(dest);
//
// Cleanup ...
iBar.Clean();
iZone.Clean();
iPivot.Clean();
//
return result;
}
/**
* Extract All Exists Patterns Pivots ...
*
* @param dest: XPivot, collection reference to holds Extracted Patterns ...
* @param zones: XBoxZone, collection reference to holds Extracted Patterns ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction of Extractions ...
*
* @return ( int )
*/
int GetPatterns(
XPivot &dest[],
XBoxZone &zones[],
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
)
{
//
int result = 0;
//
// Prepare ...
XClean(dest);
XClean(zones);
//
// Validate ...
bool has = IsValid() &&
HasChild(patterns);
if (!has)
{
return result;
}
//
// Do ...
XOHCL iBar;
XPivot iPivot;
XBoxZone iZone;
int count = ArraySize(patterns);
for (int i = 0; i < count; i++)
{
//
has = GetPattern(iBar, iPivot, iZone, patterns[i], forDir);
if (has)
{
//
AddIfNotExists(iPivot, dest);
AddIfNotExists(iZone, zones);
}
}
//
result = ArraySize(dest);
//
// Cleanup ...
iBar.Clean();
iZone.Clean();
iPivot.Clean();
//
return result;
}
//
};
@@ -925,6 +925,70 @@ class XCX121XKIHelperParser : XCBase
//
return result;
}
bool IsVolatilitySwitchdToHigh(int barIndex = 0)
{
//
bool result = false;
//
// Normalize ...
barIndex = NormalizeBarIndex(barIndex);
//
// Validate ...
result = IsValid();
if (!result)
{
return result;
}
//
double atr = helper.GetATR(barIndex);
double atrPrev = helper.GetATR(barIndex + 1);
double atrMa = helper.GetATRSmoothed(barIndex);
double atrMaPrev = helper.GetATRSmoothed(barIndex + 1);
//
result =
atr > atrMa &&
atrPrev <= atrMaPrev;
//
return result;
}
bool IsVolatilitySwitchdToLow(int barIndex = 0)
{
//
bool result = false;
//
// Normalize ...
barIndex = NormalizeBarIndex(barIndex);
//
// Validate ...
result = IsValid();
if (!result)
{
return result;
}
//
double atr = helper.GetATR(barIndex);
double atrPrev = helper.GetATR(barIndex + 1);
double atrMa = helper.GetATRSmoothed(barIndex);
double atrMaPrev = helper.GetATRSmoothed(barIndex + 1);
//
result =
atr < atrMa &&
atrPrev >= atrMaPrev;
//
return result;
}
// #endregion
// #region RSI ...
@@ -1251,7 +1315,7 @@ class XCX121XKIHelperParser : XCBase
// MA crossover bullish ...
double maFastNow = helper.GetMAFast(barIndex);
double maSlowNow = helper.GetMASlow(barIndex);
bool maOk = maFastNow > maSlowNow;
bool maOk = maFastNow > maSlowNow;
//
result = rsiFlip && (atrOk || maOk);
@@ -973,11 +973,15 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
}
//
int score = 0;
int scoreBullish = 0;
int scoreBearish = 0;
bool isBullish = false;
bool isBearish = false;
int barIndex = bar.Index() + 1;
//
// Initialize Indexed Bar ...
XOHCL iBar;
result = iBar.Init(bar.symbol, bar.period, barIndex);
if (!result)
@@ -985,7 +989,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
return result;
}
//
// #region Market Structure ...
XBoxZone supports[];
XBoxZone resistances[];
XBoxZone minorSupport;
@@ -1001,8 +1005,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
majorResistance,
barIndex,
bar.symbol,
bar.period, // Minor ...
PERIOD_H1, // Major ...
iBar.period, // Minor ...
PERIOD_H1, // Major ...
50,
14,
21,
@@ -1010,35 +1014,166 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
);
//
isBullish = majorSupport.IsValid() &&
minorSupport.IsValid() &&
poiDetector.HasCandlestickDirection(
iBar,
X_DIRECTION_BULLISH //
) &&
IsTFBullishPattern(barIndex, PERIOD_M5) &&
minorSupport.lower <= majorSupport.upper &&
poiDetector.IsNearZone(iBar.close, minorSupport, 10);
// Refining Zones ...
int refineLoopback = 500;
double refineBreakThreshold = 10;
ENUM_X_PRICE refineBreakBy = X_PRICE_CLOSE;
poiDetector.RefineStructure(
supports,
resistances,
minorSupport,
majorSupport,
minorResistance,
majorResistance,
refineLoopback,
refineBreakThreshold,
refineBreakBy //
);
// #endregion
// #region Reading Conditions and Scoring ...
//
// ATR ...
bool isATRUp = kiParser.IsVolatilityHigh(barIndex) ||
kiParser.IsVolatilitySwitchdToHigh(barIndex);
// #region KI ...
//
bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) ||
kiParser.IsKIFastSwitchedToBullish(barIndex)) &&
(kiParser.IsKISlowBullish(barIndex) ||
kiParser.IsKISlowSwitchedToBullish(barIndex));
if (isKIBullish)
{
scoreBullish++;
}
//
isBearish = majorResistance.IsValid() &&
minorResistance.IsValid() &&
poiDetector.HasCandlestickDirection(
iBar,
X_DIRECTION_BEARISH //
) &&
IsTFBearishPattern(barIndex, PERIOD_M5) &&
minorResistance.upper >= majorResistance.lower &&
poiDetector.IsNearZone(iBar.close, minorResistance, 10);
bool isKIBearish = (kiParser.IsKIFastBearish(barIndex) ||
kiParser.IsKIFastSwitchedToBearish(barIndex)) &&
(kiParser.IsKISlowBearish(barIndex) ||
kiParser.IsKISlowSwitchedToBearish(barIndex));
if (isKIBearish)
{
scoreBearish++;
}
// #endregion
// #region KI Wave ...
//
bool isKIWaveBullish = kiParser.IsKIWaveBullish(barIndex) ||
kiParser.IsKIWaveSwitchedToBullish(barIndex);
if (isKIWaveBullish)
{
scoreBullish++;
}
//
// Retrieve Base Conditions ...
// isBullish =
// isBullish &&
// IsBullishPOILongEntry(barIndex);
// isBearish =
// isBearish &&
// IsBearishPOIShortEntry(barIndex);
bool isKIWaveBearish = kiParser.IsKIWaveBearish(barIndex) ||
kiParser.IsKIWaveSwitchedToBearish(barIndex);
if (isKIWaveBearish)
{
scoreBearish++;
}
// #endregion
// #region MA ...
//
bool isMaBullish = kiParser.IsMACrossoverBullish(barIndex) ||
kiParser.IsMACrossoverSwitchedToBullish(barIndex);
if (isMaBullish)
{
scoreBullish++;
}
//
bool isMaBearish = kiParser.IsMACrossoverBearish(barIndex) ||
kiParser.IsMACrossoverSwitchedToBearish(barIndex);
if (isMaBearish)
{
scoreBearish++;
}
// #endregion
// #region LowerTF Candlstick ...
//
bool isLowerTFBullish = IsTFBullishPattern(barIndex, PERIOD_M5);
if (isLowerTFBullish)
{
scoreBullish++;
}
//
bool isLowerTFBearish = IsTFBearishPattern(barIndex, PERIOD_M5);
if (isLowerTFBearish)
{
scoreBearish++;
}
// #endregion
// #region Candlestick ...
//
bool isCandlestickBullish = poiDetector.HasCandlestickDirection(
iBar,
X_DIRECTION_BULLISH //
);
if (isCandlestickBullish)
{
scoreBullish++;
}
//
bool isCandlestickBearish = poiDetector.HasCandlestickDirection(
iBar,
X_DIRECTION_BEARISH //
);
if (isCandlestickBearish)
{
scoreBearish++;
}
// #endregion
// #region NearInside Support/Resistance ...
//
int tmpSupportIDX = -1;
bool isNearSupport = poiDetector.HasNearZone(tmpSupportIDX, iBar.close, 5, supports);
if (isNearSupport)
{
scoreBullish++;
}
//
int tmpResistanceIDX = -1;
bool isNearResistance = poiDetector.HasNearZone(tmpResistanceIDX, iBar.close, 5, resistances);
if (isNearResistance)
{
scoreBearish++;
}
// #endregion
// #endregion
//
// Summarize Directional Conditions ...
//
isBullish =
isATRUp &&
scoreBullish >= 4 &&
(isMaBullish ||
isNearSupport ||
isKIWaveBullish ||
isLowerTFBullish ||
isCandlestickBullish);
//
isBearish =
isATRUp &&
scoreBearish >= 4 &&
(isMaBearish ||
isNearResistance ||
isKIWaveBearish ||
isLowerTFBearish ||
isCandlestickBearish);
//
// Validate Conditions ...
@@ -1059,8 +1194,110 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
}
//
// Select Operational Zone ...
if (isBullish)
{
//
// Nearest Support ...
if (IsValidIndex(tmpSupportIDX))
{
zone = supports[tmpSupportIDX];
}
//
// Make Sure Zone Exists ...
if (!zone.IsValid())
{
//
// Looking Bar Patterns to Detect Zone ...
poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BULLISH);
}
}
else if (isBearish)
{
//
// Nearest Resistance ...
if (IsValidIndex(tmpResistanceIDX))
{
zone = resistances[tmpResistanceIDX];
}
//
// Make Sure Zone Exists ...
if (!zone.IsValid())
{
//
// Looking Bar Patterns to Detect Zone ...
poiDetector.HasRecentPatternTouched(zone, iBar.close, barIndex, 5, 5, iBar.period, X_DIRECTION_BEARISH);
}
}
//
// Refactor Result ...
result = result &&
zone.IsValid();
if (result)
{
poiDetector.RefineZone(zone);
}
//
// Do Directional Validation ...
if (result)
{
//
// Bullish ...
if (isBullish)
{
//
isBullish =
isBullish &&
isLowerTFBullish &&
isCandlestickBullish;
}
//
// Bearish ...
if (isBearish)
{
//
isBearish =
isBearish &&
isLowerTFBearish &&
isCandlestickBearish;
}
//
result = isBullish || isBearish;
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Validate Result ...
if (!result)
{
//
iBar.Clean();
XClean(supports);
XClean(resistances);
minorSupport.Clean();
majorSupport.Clean();
minorResistance.Clean();
majorResistance.Clean();
//
return result;
}
//
// Draws ...
bool draw = true;
if (draw)
if (draw && result)
{
//
int drawn = 0;
@@ -1069,6 +1306,24 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
XPOIDrawConfig config;
config.Default();
//
if (zone.IsValid())
{
//
drawn++;
//
config.zonesWidth = 3;
config.bullishColor = clrYellow;
config.bearishColor = clrOrange;
//
poiDrawer.DrawZone(zone, config);
//
config.Default();
}
//
// Minors ...
if (minorSupport.IsValid())
@@ -1114,237 +1369,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
}
}
// //
// // 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 =
@@ -1352,7 +1376,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
? X_DIRECTION_BULLISH
: isBearish ? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
result = HasDirection(dir);
result = result &&
HasDirection(dir);
if (!result)
{
//
@@ -1376,14 +1401,14 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
//
double upper = isBullish
? entry
: minorSupport.upper;
: zone.upper;
double lower = isBullish
? minorResistance.lower
? zone.lower
: entry;
datetime to = bar.time;
datetime from = isBullish
? minorSupport.from
: minorResistance.from;
? zone.from
: zone.from;
result = zone.Init(
iBar.symbol,
iBar.period,
@@ -1394,18 +1419,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
dir,
"XS1" //
);
if (result)
{
//
XPOIDrawConfig iConfig;
iConfig.Default();
//
poiDrawer.DrawZone(zone, iConfig);
//
// DebugBreak();
}
}
//
@@ -1123,6 +1123,71 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
// #endregion
// #region XDetectors ...
bool IsKIPOI(
ENUM_X_DIRECTION &dir,
int barIndex = 0 //
)
{
//
bool result = false;
//
dir = X_DIRECTION_NONE;
//
bool isBullish = IsKIBullishPOI(barIndex);
bool isBearish = IsKIBearishPOI(barIndex);
//
dir = isBullish
? X_DIRECTION_BULLISH
: isBearish
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
//
result = HasDirection(dir);
//
return result;
}
bool IsKIBullishPOI(int barIndex = 0)
{
//
bool result = false;
//
barIndex = kiParser.NormalizeBarIndex(barIndex);
//
result =
kiParser.IsValid() &&
kiParser.IsKISlowBullish(barIndex) &&
kiParser.IsKIFastBearish(barIndex);
//
return result;
}
bool IsKIBearishPOI(int barIndex = 0)
{
//
bool result = false;
//
barIndex = kiParser.NormalizeBarIndex(barIndex);
//
result =
kiParser.IsValid() &&
kiParser.IsKISlowBearish(barIndex) &&
kiParser.IsKIFastBullish(barIndex);
//
return result;
}
bool IsKISignal(
ENUM_X_DIRECTION &dir, //
int barIndex = 0 //
@@ -1798,6 +1863,85 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
XClean(tmpResistances);
}
void RefineStructure(
XBoxZone &supports[],
XBoxZone &resistances[],
XBoxZone &minorSupport,
XBoxZone &majorSupport,
XBoxZone &minorResistance,
XBoxZone &majorResistance,
int loopback = 500,
double breakThreshold = 5,
ENUM_X_PRICE breakBy = X_PRICE_CLOSE //
)
{
//
// Support ...
if (HasChild(supports))
{
//
for (int i = 0; i < ArraySize(supports); i++)
{
//
RefineZone(
supports[i],
loopback,
breakThreshold,
breakBy //
);
}
}
//
// Resistance ...
if (HasChild(resistances))
{
//
for (int i = 0; i < ArraySize(resistances); i++)
{
//
RefineZone(
resistances[i],
loopback,
breakThreshold,
breakBy //
);
}
}
//
RefineZone(
minorSupport,
loopback,
breakThreshold,
breakBy //
);
//
RefineZone(
majorSupport,
loopback,
breakThreshold,
breakBy //
);
//
RefineZone(
minorResistance,
loopback,
breakThreshold,
breakBy //
);
//
RefineZone(
majorResistance,
loopback,
breakThreshold,
breakBy //
);
}
int CounteZoneTouches(
XBoxZone &zone,
double threshold = 10,
@@ -1942,6 +2086,277 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
//
return result;
}
void RefineZone(
XBoxZone &zone,
int loopback = 500,
double breakThreshold = 5,
ENUM_X_PRICE breakBy = X_PRICE_CLOSE //
)
{
//
bool has =
zone.IsValid() &&
IsXValid(breakBy);
if (!has)
{
return;
}
//
// Normalize ...
loopback = NormalizeInt(loopback, 1);
breakThreshold = NormalizeDouble(breakThreshold, 0, 50);
//
XOHCL iBar;
int start = zone.FromIndex();
int end = start + loopback;
double point = GetPoints(zone.symbol);
double breakDistance = point * breakThreshold;
for (int i = start; i < end; i++)
{
//
has = iBar.Init(zone.symbol, zone.period, i);
if (has)
{
//
// Check Rejections ...
has = zone.IsBullish()
? iBar.low < zone.upper &&
iBar.GetDown() > zone.upper
: iBar.high > zone.upper &&
iBar.GetUp() < zone.upper;
if (has)
{
//
Add(
iBar.time,
zone.tests //
);
}
//
// Check Break ...
double bPrice = iBar.GetPrice(breakBy);
has =
zone.IsBullish()
? bPrice < zone.lower - breakDistance
: bPrice > zone.upper + breakDistance;
if (has)
{
//
zone.breakAt = iBar.time;
break;
}
}
//
iBar.Clean();
}
//
has = IsXValid(zone.breakAt);
if (has)
{
//
zone.at = zone.from;
zone.from = zone.breakAt;
}
}
// #endregion
// #region VolatilitySwitchedHigh ...
bool IsVolatilitySwitchedHigh(
int barIndex = 0,
int loopback = 3 //
)
{
//
bool result = false;
//
barIndex = kiParser.NormalizeBarIndex(barIndex);
loopback = NormalizeInt(loopback, 1);
//
for (int i = barIndex; i < barIndex + loopback; i++)
{
//
result = kiParser.IsVolatilitySwitchdToHigh(i);
if (result)
{
break;
}
}
//
return result;
}
// #endregion
// #region Bar Patterns ...
bool HasRecentPatternTouched(
XBoxZone &zone,
double price,
int barIndex = 0,
int loopback = 5,
int threshold = 5,
ENUM_TIMEFRAMES forPeriod = NULL,
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
)
{
//
bool result = false;
//
zone.Clean();
//
// Validate ...
result = NotEmptyZero(price);
if (!result)
{
return result;
}
//
// Normalize ...
loopback = NormalizeInt(loopback, 2);
barIndex = kiParser.NormalizeBarIndex(barIndex);
if (IsXValid(forPeriod))
{
forPeriod = period;
}
//
XOHCL iBar;
bool has = false;
int iBullishIDX = -1;
int iBearishIDX = -1;
bool isBullish = false;
bool isBearish = false;
XBoxZone iBullishZones[];
XBoxZone iBearishZones[];
XPatternAnalysis iAnalysis;
XPatternAnalysisConfig iConfig;
//
// Preparing Pattern Analysis Config ...
iConfig.Default();
iConfig.FullPattern();
//
for (int i = barIndex; i < barIndex + loopback; i++)
{
//
// Initialize Bar ...
has = iBar.Init(symbol, forPeriod, i);
if (!has)
{
continue;
}
//
// Analyse Patterns ...
has = AnalyseBarPatterns(iBar, iAnalysis, iConfig);
if (!has)
{
//
iBar.Clean();
continue;
}
//
// Bullish ...
has = iAnalysis.Count(X_DIRECTION_BULLISH) > 0;
if (has)
{
//
iAnalysis.GetPatterns(iBullishZones, X_DIRECTION_BULLISH);
has = HasChild(iBullishZones);
if (has)
{
//
has = HasNearZone(
iBullishIDX,
price,
threshold,
iBullishZones //
);
if (has)
{
isBullish = true;
}
}
}
//
// Bearish ...
has = iAnalysis.Count(X_DIRECTION_BEARISH) > 0;
if (has)
{
//
iAnalysis.GetPatterns(iBearishZones, X_DIRECTION_BEARISH);
has = HasChild(iBearishZones);
if (has)
{
//
has = HasNearZone(
iBearishIDX,
price,
threshold,
iBearishZones //
);
if (has)
{
isBearish = true;
}
}
}
//
// Summarizing Result ...
has =
HasDirection(forDir)
? (isBullish && !isBearish && IsXBullish(forDir)) ||
(isBearish && !isBullish && IsXBearish(forDir))
: (isBullish && !isBearish) || (isBearish && !isBullish);
if (has)
{
//
// Fill Zones ...
if (isBullish)
{
zone = iBullishZones[iBullishIDX];
}
else
{
zone = iBearishZones[iBearishIDX];
}
break;
}
//
iBar.Clean();
iAnalysis.Clean();
XClean(iBullishZones);
XClean(iBearishZones);
}
//
// Next
//
iBar.Clean();
iConfig.Clean();
iAnalysis.Clean();
XClean(iBullishZones);
XClean(iBearishZones);
//
return result;
}
// #endregion
//