This commit is contained in:
2026-01-06 11:48:16 +03:30
parent fb03a1c88a
commit e6165f44f2
4 changed files with 1308 additions and 566 deletions
+550
View File
@@ -533,3 +533,553 @@
// //
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 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)
{
return result;
}
// #region Swings/OrderFlow ...
//
// Swings ...
XBoxZone swingLow;
XBoxZone swingHigh;
bool hasSwings = poiDetector.DetectRecentSwings(
swingHigh,
swingLow,
barIndex //
);
//
// Order Flow ...
//
XBoxZone bullishOrderFlow[];
result = poiDetector.HasOrderFlow(bullishOrderFlow, barIndex, 4, X_DIRECTION_BULLISH, 15);
//
XBoxZone bearishOrderFlow[];
result = poiDetector.HasOrderFlow(bearishOrderFlow, barIndex, 4, X_DIRECTION_BEARISH, 15);
// #endregion
// #region Reading Conditions and Scoring ...
//
// ATR ...
bool isATRUp = kiParser.IsVolatilityHigh(barIndex) ||
kiParser.IsVolatilitySwitchdToHigh(barIndex);
// #region KI ...
//
bool isKIReadyForBullish = ((kiParser.IsKIFastBearish(barIndex) ||
(kiParser.IsKIFastBullish(barIndex) &&
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BULLISH))) &&
kiParser.IsKISlowBullish(barIndex));
//
bool isKIReadyForBearish = ((kiParser.IsKIFastBullish(barIndex) ||
(kiParser.IsKIFastBearish(barIndex) &&
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BEARISH))) &&
kiParser.IsKISlowBearish(barIndex));
//
bool isKIBandBullish = (kiHelper.GetKIUpper(barIndex) > kiHelper.GetKIUpper(barIndex + 1) ||
kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1));
//
bool isKIBandBearish = (kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1) ||
kiHelper.GetKILower(barIndex) < kiHelper.GetKILower(barIndex + 1));
//
bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) ||
kiParser.IsKIFastSwitchedToBullish(barIndex)) &&
(kiParser.IsKISlowBullish(barIndex) ||
kiParser.IsKISlowSwitchedToBullish(barIndex));
if (isKIBullish)
{
scoreBullish++;
}
//
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++;
}
//
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
// #endregion
// #region Summarize Directional Conditions ...
//
isBullish =
isATRUp &&
isLowerTFBullish &&
isKIReadyForBullish &&
isCandlestickBullish &&
scoreBullish >= 2 &&
(isKIBullish ||
isMaBullish ||
isKIWaveBullish ||
isKIBandBullish);
//
isBearish =
isATRUp &&
isLowerTFBearish &&
isKIReadyForBearish &&
isCandlestickBearish &&
scoreBearish >= 2 &&
(isKIBearish ||
isMaBearish ||
isKIWaveBearish ||
isKIBandBearish);
// #endregion
//
// Validate Conditions ...
result = isBullish || isBearish;
if (!result)
{
//
iBar.Clean();
//
return result;
}
//
// Select Operational Zone ...
ENUM_X_DIRECTION patternsDir[];
ENUM_X_BAR_PATTERN patterns[];
//
// GetAllBarPatters(patterns, patternsDir);
//
// XAUUSD ...
//
// FVG ...
Add(X_BAR_PATTERN_FVG, patterns);
Add(X_DIRECTION_NONE, patternsDir);
//
// Piercing ...
Add(X_BAR_PATTERN_PIERCING, patterns);
Add(X_DIRECTION_NONE, patternsDir);
//
// EURUSD ...
//
// Add(X_BAR_PATTERN_STAR, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
// //
// Add(X_BAR_PATTERN_SUPPORT, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
// //
// Add(X_BAR_PATTERN_RESISTANCE, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
//
// Add(X_BAR_PATTERN_SIGNALKEY, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
//
int nearestOrderFlowIDX = -1;
if (isBullish)
{
//
// Looking Bar Patterns to Detect Zone ...
isBullish =
isBullish &&
HasChild(bullishOrderFlow) &&
// bullishOrderFlow[0].lower == iBar.low &&
// poiDetector.HasNearZone(
// nearestOrderFlowIDX,
// iBar.close,
// 5,
// bullishOrderFlow //
// ) &&
poiDetector.HasRecentPatternTouched(
zone,
patterns,
patternsDir,
iBar.close,
barIndex,
5,
5,
iBar.period,
X_DIRECTION_BULLISH //
);
}
else if (isBearish)
{
//
// Looking Bar Patterns to Detect Zone ...
isBearish =
isBearish &&
HasChild(bearishOrderFlow) &&
// bearishOrderFlow[0].upper == iBar.high &&
// poiDetector.HasNearZone(
// nearestOrderFlowIDX,
// iBar.close,
// 5,
// bearishOrderFlow //
// ) &&
poiDetector.HasRecentPatternTouched(
zone,
patterns,
patternsDir,
iBar.close,
barIndex,
5,
5,
iBar.period,
X_DIRECTION_BEARISH //
);
}
//
// Refactor Result ...
result = result &&
zone.IsValid();
if (result)
{
//
// Refine Zone ...
poiDetector.RefineZone(zone);
//
// SL Refactoring ...
//
XOHCL toBar;
if (zone.ToBar(toBar))
{
//
int to = zone.ToIndex();
int from = zone.FromIndex();
int length = from - to;
double iValue =
isBullish
? toBar.FindLowest(length, MODE_LOW)
: isBearish
? toBar.FindHighest(length, MODE_HIGH)
: EMPTY_VALUE;
if (NotEmptyZero(iValue))
{
//
if (isBullish)
{
zone.lower = MathMin(zone.lower, iValue);
}
//
if (isBearish)
{
zone.upper = MathMax(zone.upper, iValue);
}
}
}
toBar.Clean();
}
//
// 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();
//
return result;
}
//
// Draws ...
bool draw = true;
if (draw && result)
{
//
int drawn = 0;
//
XPOIDrawConfig config;
config.Default();
//
if (zone.IsValid())
{
//
drawn++;
//
config.zonesWidth = 3;
config.bullishColor = clrYellow;
config.bearishColor = clrOrange;
//
poiDrawer.DrawZone(zone, config);
//
config.Default();
}
//
if (swingLow.IsValid())
{
//
drawn++;
poiDrawer.DrawZone(swingLow, config);
}
//
if (swingHigh.IsValid())
{
//
drawn++;
poiDrawer.DrawZone(swingHigh, config);
}
//
if (HasChild(bullishOrderFlow))
{
//
drawn += ArraySize(bullishOrderFlow);
poiDrawer.DrawZones(bullishOrderFlow, config);
}
//
if (HasChild(bearishOrderFlow))
{
//
drawn += ArraySize(bearishOrderFlow);
poiDrawer.DrawZones(bearishOrderFlow, config);
}
//
if (drawn > 0)
{
// DebugBreak();
}
//
config.Clean();
}
//
// Check and Prepare Direction ...
dir =
isBullish
? X_DIRECTION_BULLISH
: isBearish ? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
result = result &&
HasDirection(dir);
if (result)
{
//
// Prepare Zone ...
double entry = GetEntry(iBar.symbol, dir);
//
double upper = isBullish
? entry
: zone.upper;
double lower = isBullish
? zone.lower
: entry;
datetime to = bar.time;
datetime from = isBullish
? zone.from
: zone.from;
result = zone.Init(
iBar.symbol,
iBar.period,
upper,
lower,
from,
to,
dir,
"XS1" //
);
}
//
// Cleanup Resources ...
iBar.Clean();
swingLow.Clean();
XClean(patterns);
swingHigh.Clean();
XClean(patternsDir);
XClean(bullishOrderFlow);
XClean(bearishOrderFlow);
//
result =
result &&
zone.IsValid() &&
HasDirection(dir);
//
return result;
}
+445 -251
View File
@@ -2181,7 +2181,7 @@ template <typename T>
void Sort( void Sort(
T &source[], T &source[],
ENUM_X_SORT_BY sortBy = X_SORT_BY_DATE, ENUM_X_SORT_BY sortBy = X_SORT_BY_DATE,
ENUM_X_DIRECTION sortDir = X_DIRECTION_BULLISH, ENUM_X_DIRECTION sortDir = X_DIRECTION_BEARISH,
int maxAllowed = 0 // int maxAllowed = 0 //
) )
{ {
@@ -3866,6 +3866,129 @@ void UpdateToTime(
} }
} }
/**
* Remove Breaked Zones from a Collection ...
*
* @param source: XBoxZone, reference to Specified Collection ...
*
* @return ( int )
*/
int RemoveBreakedZones(
XBoxZone &source[],
bool forceBreak = false //
)
{
//
int result = 0;
//
// Validate ...
bool has = HasChild(source);
if (!has)
{
return result;
}
//
XBoxZone iZone;
XBoxZone tmps[];
Copy(
source,
tmps //
);
XClean(source);
XOHCL tmpBars[];
int breakerBars = 0;
while (HasChild(tmps))
{
//
iZone.Clean();
iZone = tmps[0];
ArrayRemove(tmps, 0, 1);
has = IsXValid(iZone.breakAt);
if (has)
{
continue;
}
//
if (forceBreak)
{
//
breakerBars = GetBreakerBars(iZone, tmpBars);
has = IsValidSize(breakerBars);
}
if (has)
{
continue;
}
//
AddIfNotExists(
iZone,
source //
);
}
//
result = ArraySize(source);
//
return result;
}
/**
* Remove Filled Zones ...
*
* @param source: XBoxZone, collection reference to Provide Data Source ...
* @param zoneRangeFilledFactor: double, Filling Factor ...
*
* @return ( int )
*/
int RemoveFilledZones(
XBoxZone &source[],
double zoneRangeFilledFactor = 0.8 //
)
{
//
int result = 0;
//
// Validate ...
bool has = HasChild(source);
if (!has)
{
return result;
}
//
XBoxZone iTMP;
XBoxZone tmp[];
Copy(source, tmp);
XClean(source);
while (HasChild(tmp))
{
//
iTMP.Clean();
iTMP = tmp[0];
ArrayRemove(tmp, 0, 1);
//
has = IsFilled(iTMP, zoneRangeFilledFactor);
if (!has)
{
AddIfNotExists(iTMP, source);
}
}
//
result = ArraySize(source);
//
return result;
}
// #region Zone Converters ...
/** /**
* Converts a Bar to Pivot ... * Converts a Bar to Pivot ...
* *
@@ -5076,7 +5199,6 @@ bool ToResistanceBox(
box.lower = bar.GetUp(); box.lower = bar.GetUp();
box.dir = X_DIRECTION_BEARISH; box.dir = X_DIRECTION_BEARISH;
box.type = ToXString(X_BAR_PATTERN_RESISTANCE); box.type = ToXString(X_BAR_PATTERN_RESISTANCE);
;
// //
result = box.IsValid(); result = box.IsValid();
@@ -5088,129 +5210,9 @@ bool ToResistanceBox(
// //
return result; return result;
} }
// #endregion
/** // #region Zone Checkers ...
* Remove Breaked Zones from a Collection ...
*
* @param source: XBoxZone, reference to Specified Collection ...
*
* @return ( int )
*/
int RemoveBreakedZones(
XBoxZone &source[],
bool forceBreak = false //
)
{
//
int result = 0;
//
// Validate ...
bool has = HasChild(source);
if (!has)
{
return result;
}
//
XBoxZone iZone;
XBoxZone tmps[];
Copy(
source,
tmps //
);
XClean(source);
XOHCL tmpBars[];
int breakerBars = 0;
while (HasChild(tmps))
{
//
iZone.Clean();
iZone = tmps[0];
ArrayRemove(tmps, 0, 1);
has = IsXValid(iZone.breakAt);
if (has)
{
continue;
}
//
if (forceBreak)
{
//
breakerBars = GetBreakerBars(iZone, tmpBars);
has = IsValidSize(breakerBars);
}
if (has)
{
continue;
}
//
AddIfNotExists(
iZone,
source //
);
}
//
result = ArraySize(source);
//
return result;
}
/**
* Remove Filled Zones ...
*
* @param source: XBoxZone, collection reference to Provide Data Source ...
* @param zoneRangeFilledFactor: double, Filling Factor ...
*
* @return ( int )
*/
int RemoveFilledZones(
XBoxZone &source[],
double zoneRangeFilledFactor = 0.8 //
)
{
//
int result = 0;
//
// Validate ...
bool has = HasChild(source);
if (!has)
{
return result;
}
//
XBoxZone iTMP;
XBoxZone tmp[];
Copy(source, tmp);
XClean(source);
while (HasChild(tmp))
{
//
iTMP.Clean();
iTMP = tmp[0];
ArrayRemove(tmp, 0, 1);
//
has = IsFilled(iTMP, zoneRangeFilledFactor);
if (!has)
{
AddIfNotExists(iTMP, source);
}
}
//
result = ArraySize(source);
//
return result;
}
/** /**
* Check a Zone is Filled or Not ... * Check a Zone is Filled or Not ...
* *
@@ -5349,8 +5351,46 @@ bool IsTested(
// Check Test ... // Check Test ...
result = result =
zone.IsBullish() zone.IsBullish()
? bar.low < zone.upper ? bar.low < zone.upper && bar.low > zone.lower
: bar.high > zone.lower; : bar.high > zone.lower &&
bar.high < zone.upper;
//
return result;
}
/**
* Check Specified Zone is Rejected by Specified Bar or not ...
*
* @param bar: Specified Bar ...
* @param zone: Specified Zone ...
*
* @return ( bool )
*/
bool IsRejected(
XOHCL &bar,
XBoxZone &zone //
)
{
//
bool result = false;
//
// Validate ...
result = bar.IsValid() &&
zone.IsValid();
if (!result)
{
return result;
}
//
// Check Test ...
result =
IsTested(bar, zone) &&
(zone.IsBullish()
? bar.GetDown() >= zone.upper
: bar.GetUp() <= zone.lower);
// //
return result; return result;
@@ -5461,6 +5501,72 @@ bool IsActed(
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(
XBoxZone &zone,
ENUM_X_PRICE priceType = X_PRICE_CLOSE //
)
{
//
bool result = false;
//
// Validate ...
result = zone.IsValid() &&
IsXValid(priceType);
if (!result)
{
//
result = true;
return result;
}
//
XOHCL iBar;
double iPrice;
bool isBullish;
int start = zone.ToIndex();
int end = zone.FromIndex();
for (int i = start; i < end; i++)
{
//
// Initialize Indexed Bar ...
iBar.Clean();
result = iBar.Init(zone.symbol, zone.period, i);
if (!result)
{
//
result = true;
break;
}
//
isBullish = zone.IsBullish();
iPrice = iBar.GetPrice(priceType);
result = isBullish
? iPrice < zone.lower
: iPrice > zone.upper;
if (result)
{
break;
}
}
//
// Cleanup ...
iBar.Clean();
//
return result;
}
/** /**
* Check Specified Bar is Acted On Specified Zone or not ... * Check Specified Bar is Acted On Specified Zone or not ...
* *
@@ -5607,64 +5713,12 @@ bool IsFakeBreaked(
return result; return result;
} }
/**
* Check a Bar is Inside a Zone or not ...
*
* @param index: int, reference to holds detected index ...
* @param bar: reference to Specified Bar ...
* @param source: reference collection to provide source ...
*
* @return ( bool )
*/
bool HasInside(
int &index,
XOHCL &bar,
XBoxZone &source[] //
)
{
//
bool result = false;
//
// Prepare ...
index = -1;
//
// Validate ...
result = bar.IsValid() &&
HasChild(source);
if (!result)
{
return result;
}
//
int count = ArraySize(source);
for (int i = 0; i < count; i++)
{
//
result = IsInside(
bar,
source[i] //
);
if (result)
{
//
index = i;
break;
}
}
//
return result;
}
/** /**
* Check Specified ZOne is Affected by Specified Bar or not ... * Check Specified ZOne is Affected by Specified Bar or not ...
* *
* @param bar: XOHCL, reference to Specified Bar ... * @param bar: XOHCL, reference to Specified Bar ...
* @param zone: XBoxZone, reference to Specified Zone ... * @param zone: XBoxZone, reference to Specified Zone ...
* *
* @return ( bool ) * @return ( bool )
*/ */
bool IsZoneAffected( bool IsZoneAffected(
@@ -5697,7 +5751,155 @@ bool IsZoneAffected(
// //
return result; return result;
} }
// #endregion
// #region Zones Hasers ...
/**
* Check a Bar is Inside a Zone or not ...
*
* @param index: int, reference to holds detected index ...
* @param bar: reference to Specified Bar ...
* @param source: reference collection to provide source ...
*
* @return ( bool )
*/
bool HasInside(
int &index,
XOHCL &bar,
XBoxZone &source[] //
)
{
//
XBoxZone selected[];
int count = ExtractInsides(bar, selected, source);
bool result = IsValidSize(count);
if (result)
{
//
index = GetYoungest(selected);
if (IsValidIndex(index))
{
result = FindIndex(index, selected[index], source);
}
}
//
XClean(selected);
//
return result;
}
/**
* Check a Bar is Reject a Zone or not ...
*
* @param index: int, reference to holds detected index ...
* @param bar: reference to Specified Bar ...
* @param source: reference collection to provide source ...
*
* @return ( bool )
*/
bool HasRejected(
int &index,
XOHCL &bar,
XBoxZone &source[] //
)
{
//
XBoxZone selected[];
int count = ExtractRejecteds(bar, selected, source);
bool result = IsValidSize(count);
if (result)
{
//
index = GetYoungest(selected);
if (IsValidIndex(index))
{
result = FindIndex(index, selected[index], source);
}
}
//
XClean(selected);
//
return result;
}
/**
* Check a Bar is Break a Zone or not ...
*
* @param index: int, reference to holds detected index ...
* @param bar: reference to Specified Bar ...
* @param source: reference collection to provide source ...
*
* @return ( bool )
*/
bool HasBreaked(
int &index,
XOHCL &bar,
XBoxZone &source[] //
)
{
//
XBoxZone selected[];
int count = ExtractBreakeds(bar, selected, source);
bool result = IsValidSize(count);
if (result)
{
//
index = GetYoungest(selected);
if (IsValidIndex(index))
{
result = FindIndex(index, selected[index], source);
}
}
//
XClean(selected);
//
return result;
}
/**
* Check a Bar is Act a Zone or not ...
*
* @param index: int, reference to holds detected index ...
* @param bar: reference to Specified Bar ...
* @param source: reference collection to provide source ...
*
* @return ( bool )
*/
bool HasActed(
int &index,
XOHCL &bar,
XBoxZone &source[] //
)
{
//
XBoxZone selected[];
int count = ExtractActeds(bar, selected, source);
bool result = IsValidSize(count);
if (result)
{
//
index = GetYoungest(selected);
if (IsValidIndex(index))
{
result = FindIndex(index, selected[index], source);
}
}
//
XClean(selected);
//
return result;
}
// #endregion
// #region Zone Extractors ...
/** /**
* Extract Affected Zones for Specified Bar ... * Extract Affected Zones for Specified Bar ...
* *
@@ -5804,7 +6006,7 @@ int ExtractInsides(
// Validate ... // Validate ...
bool has = bar.IsValid() && bool has = bar.IsValid() &&
HasChild(source); HasChild(source);
if (!result) if (!has)
{ {
return result; return result;
} }
@@ -5861,7 +6063,7 @@ int ExtractActeds(
// Validate ... // Validate ...
bool has = bar.IsValid() && bool has = bar.IsValid() &&
HasChild(source); HasChild(source);
if (!result) if (!has)
{ {
return result; return result;
} }
@@ -5918,7 +6120,7 @@ int ExtractBreakeds(
// Validate ... // Validate ...
bool has = bar.IsValid() && bool has = bar.IsValid() &&
HasChild(source); HasChild(source);
if (!result) if (!has)
{ {
return result; return result;
} }
@@ -5949,6 +6151,63 @@ int ExtractBreakeds(
return result; return result;
} }
/**
* Extract all Items which Specified Bar is Rejected them ...
*
* @param bar: reference to Specified Bar ...
* @param dest: reference to result ...
* @param source: reference collection to provide source ...
*
* @return ( int )
*/
int ExtractRejecteds(
XOHCL &bar,
XBoxZone &dest[],
XBoxZone &source[] //
)
{
//
int result = 0;
//
// Prepare ...
SpecifiedClean(dest);
//
// Validate ...
bool has = bar.IsValid() &&
HasChild(source);
if (!has)
{
return result;
}
//
int count = ArraySize(source);
for (int i = 0; i < count; i++)
{
//
has = IsRejected(
bar,
source[i] //
);
if (has)
{
//
AddIfNotExists(
source[i],
dest //
);
}
}
//
result = ArraySize(dest);
//
return result;
}
/** /**
* Collect all Bars which Breakes Specified Zone ... * Collect all Bars which Breakes Specified Zone ...
* *
@@ -6175,72 +6434,6 @@ 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(
XBoxZone &zone,
ENUM_X_PRICE priceType = X_PRICE_CLOSE //
)
{
//
bool result = false;
//
// Validate ...
result = zone.IsValid() &&
IsXValid(priceType);
if (!result)
{
//
result = true;
return result;
}
//
XOHCL iBar;
double iPrice;
bool isBullish;
int start = zone.ToIndex();
int end = zone.FromIndex();
for (int i = start; i < end; i++)
{
//
// Initialize Indexed Bar ...
iBar.Clean();
result = iBar.Init(zone.symbol, zone.period, i);
if (!result)
{
//
result = true;
break;
}
//
isBullish = zone.IsBullish();
iPrice = iBar.GetPrice(priceType);
result = isBullish
? iPrice < zone.lower
: iPrice > zone.upper;
if (result)
{
break;
}
}
//
// Cleanup ...
iBar.Clean();
//
return result;
}
/** /**
* Validate Zones Range ... * Validate Zones Range ...
* *
@@ -6301,10 +6494,10 @@ int ValidateZonesRange(
/** /**
* Remove Breaked Zones ... * Remove Breaked Zones ...
* *
* @param source: XBoxZone, collection reference to Remove Breaked Zones ... * @param source: XBoxZone, collection reference to Remove Breaked Zones ...
* @param priceType: ENUM_X_PRICE, Specified Price type of Break Detection ... * @param priceType: ENUM_X_PRICE, Specified Price type of Break Detection ...
* *
* @return ( int ) * @return ( int )
*/ */
int RemoveBreakedZones( int RemoveBreakedZones(
@@ -6355,6 +6548,7 @@ int RemoveBreakedZones(
// //
return result; return result;
} }
// #endregion
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
// //
@@ -988,12 +988,44 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
return result; return result;
} }
//
ENUM_X_DIRECTION patternsDir[];
ENUM_X_BAR_PATTERN patterns[];
poiDetector.FillStrategy1Patterns(
patterns,
patternsDir //
);
//
isBullish = poiDetector.HasRecentPatternRejected(
zone,
patterns,
patternsDir,
barIndex,
3, // Loopback ..
iBar.period,
X_DIRECTION_BULLISH //
);
if (!isBullish)
{
//
isBearish = poiDetector.HasRecentPatternRejected(
zone,
patterns,
patternsDir,
barIndex,
3, // Loopback ..
iBar.period,
X_DIRECTION_BEARISH //
);
}
// #region Swings/OrderFlow ... // #region Swings/OrderFlow ...
// //
// Swings ... // Swings ...
XBoxZone swingLow; XBoxZone swingLow;
XBoxZone swingHigh; XBoxZone swingHigh;
bool hasSwings = poiDetector.DetectRecentSwings( poiDetector.DetectRecentSwings(
swingHigh, swingHigh,
swingLow, swingLow,
barIndex // barIndex //
@@ -1004,160 +1036,11 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
// //
XBoxZone bullishOrderFlow[]; XBoxZone bullishOrderFlow[];
result = poiDetector.HasOrderFlow(bullishOrderFlow, barIndex, 4, X_DIRECTION_BULLISH, 15); poiDetector.HasOrderFlow(bullishOrderFlow, barIndex, 4, X_DIRECTION_BULLISH, 15);
// //
XBoxZone bearishOrderFlow[]; XBoxZone bearishOrderFlow[];
result = poiDetector.HasOrderFlow(bearishOrderFlow, barIndex, 4, X_DIRECTION_BEARISH, 15); poiDetector.HasOrderFlow(bearishOrderFlow, barIndex, 4, X_DIRECTION_BEARISH, 15);
// #endregion
// #region Reading Conditions and Scoring ...
//
// ATR ...
bool isATRUp = kiParser.IsVolatilityHigh(barIndex) ||
kiParser.IsVolatilitySwitchdToHigh(barIndex);
// #region KI ...
//
bool isKIReadyForBullish = ((kiParser.IsKIFastBearish(barIndex) ||
(kiParser.IsKIFastBullish(barIndex) &&
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BULLISH))) &&
kiParser.IsKISlowBullish(barIndex));
//
bool isKIReadyForBearish = ((kiParser.IsKIFastBullish(barIndex) ||
(kiParser.IsKIFastBearish(barIndex) &&
iBar.IsRejected(kiHelper.GetKIFast(barIndex), X_DIRECTION_BEARISH))) &&
kiParser.IsKISlowBearish(barIndex));
//
bool isKIBandBullish = (kiHelper.GetKIUpper(barIndex) > kiHelper.GetKIUpper(barIndex + 1) ||
kiHelper.GetKILower(barIndex) > kiHelper.GetKILower(barIndex + 1));
//
bool isKIBandBearish = (kiHelper.GetKIUpper(barIndex) < kiHelper.GetKIUpper(barIndex + 1) ||
kiHelper.GetKILower(barIndex) < kiHelper.GetKILower(barIndex + 1));
//
bool isKIBullish = (kiParser.IsKIFastBullish(barIndex) ||
kiParser.IsKIFastSwitchedToBullish(barIndex)) &&
(kiParser.IsKISlowBullish(barIndex) ||
kiParser.IsKISlowSwitchedToBullish(barIndex));
if (isKIBullish)
{
scoreBullish++;
}
//
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++;
}
//
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
// #endregion
// #region Summarize Directional Conditions ...
//
isBullish =
isATRUp &&
isLowerTFBullish &&
isKIReadyForBullish &&
isCandlestickBullish &&
scoreBullish >= 2 &&
(isKIBullish ||
isMaBullish ||
isKIWaveBullish ||
isKIBandBullish);
//
isBearish =
isATRUp &&
isLowerTFBearish &&
isKIReadyForBearish &&
isCandlestickBearish &&
scoreBearish >= 2 &&
(isKIBearish ||
isMaBearish ||
isKIWaveBearish ||
isKIBandBearish);
// #endregion // #endregion
// //
@@ -1172,168 +1055,33 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
return result; return result;
} }
//
// Select Operational Zone ...
ENUM_X_DIRECTION patternsDir[];
ENUM_X_BAR_PATTERN patterns[];
//
GetAllBarPatters(patterns, patternsDir);
//
// XAUUSD ...
// //
// // FVG ...
// Add(X_BAR_PATTERN_FVG, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
// //
// // Piercing ...
// Add(X_BAR_PATTERN_PIERCING, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
//
// EURUSD ...
//
// Add(X_BAR_PATTERN_STAR, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
// //
// Add(X_BAR_PATTERN_SUPPORT, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
// //
// Add(X_BAR_PATTERN_RESISTANCE, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
//
// Add(X_BAR_PATTERN_SIGNALKEY, patterns);
// Add(X_DIRECTION_NONE, patternsDir);
//
int nearestOrderFlowIDX = -1;
if (isBullish)
{
//
// Looking Bar Patterns to Detect Zone ...
isBullish =
isBullish &&
HasChild(bullishOrderFlow) &&
poiDetector.HasNearZone(
nearestOrderFlowIDX,
iBar.close,
5,
bullishOrderFlow //
) &&
poiDetector.HasRecentPatternTouched(
zone,
patterns,
patternsDir,
iBar.close,
barIndex,
5,
5,
iBar.period,
X_DIRECTION_BULLISH //
);
}
else if (isBearish)
{
//
// Looking Bar Patterns to Detect Zone ...
isBearish =
isBearish &&
HasChild(bearishOrderFlow) &&
poiDetector.HasNearZone(
nearestOrderFlowIDX,
iBar.close,
5,
bearishOrderFlow //
) &&
poiDetector.HasRecentPatternTouched(
zone,
patterns,
patternsDir,
iBar.close,
barIndex,
5,
5,
iBar.period,
X_DIRECTION_BEARISH //
);
}
//
// Refactor Result ...
result = result &&
zone.IsValid();
if (result)
{
//
// Refine Zone ...
poiDetector.RefineZone(zone);
//
// SL Refactoring ...
//
XOHCL toBar;
if (zone.ToBar(toBar))
{
//
int to = zone.ToIndex();
int from = zone.FromIndex();
int length = from - to;
double iValue =
isBullish
? toBar.FindLowest(length, MODE_LOW)
: isBearish
? toBar.FindHighest(length, MODE_HIGH)
: EMPTY_VALUE;
if (NotEmptyZero(iValue))
{
//
if (isBullish)
{
zone.lower = MathMin(zone.lower, iValue);
}
//
if (isBearish)
{
zone.upper = MathMax(zone.upper, iValue);
}
}
}
toBar.Clean();
}
// //
// Do Directional Validation ... // Do Directional Validation ...
if (result) if (result)
{ {
//
poiDetector.RefactorStrategy1OperationalZone(zone);
// //
// Bullish ... // Bullish ...
if (isBullish) if (isBullish)
{ {
// // //
isBullish = // isBullish =
isBullish && // isBullish &&
isLowerTFBullish && // isLowerTFBullish &&
isCandlestickBullish; // isCandlestickBullish;
} }
// //
// Bearish ... // Bearish ...
if (isBearish) if (isBearish)
{ {
// // //
isBearish = // isBearish =
isBearish && // isBearish &&
isLowerTFBearish && // isLowerTFBearish &&
isCandlestickBearish; // isCandlestickBearish;
} }
// //
@@ -1346,17 +1094,6 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
} }
} }
//
// Validate Result ...
if (!result)
{
//
iBar.Clean();
//
return result;
}
// //
// Draws ... // Draws ...
bool draw = true; bool draw = true;
@@ -1365,6 +1102,9 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
// //
int drawn = 0; int drawn = 0;
//
poiDrawer.drawnObjects.Clear();
// //
XPOIDrawConfig config; XPOIDrawConfig config;
config.Default(); config.Default();
@@ -1422,7 +1162,8 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
// //
if (drawn > 0) if (drawn > 0)
{ {
// DebugBreak(); DebugBreak();
return false;
} }
// //
@@ -1493,8 +1234,7 @@ class XCX121XKIStrategy1Signaller : public XCX121XKIBaseSignaller
* *
* @return ( bool ) * @return ( bool )
*/ */
bool bool Strategy2HasSignal(
Strategy2HasSignal(
XOHCL &bar, XOHCL &bar,
XBoxZone &zone, XBoxZone &zone,
XTarget &targets[], XTarget &targets[],
@@ -2391,7 +2391,7 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
// //
return result; return result;
} }
bool HasOrderFlow( bool HasOrderFlow(
XBoxZone &flow[], XBoxZone &flow[],
int barIndex = 0, int barIndex = 0,
@@ -2567,6 +2567,10 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
// //
result = HasChild(flow); result = HasChild(flow);
if (result)
{
Sort(flow);
}
// //
return result; return result;
@@ -2675,6 +2679,84 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
// #endregion // #endregion
// #region Bar Patterns ... // #region Bar Patterns ...
void FillStrategy1Patterns(
ENUM_X_BAR_PATTERN &patterns[],
ENUM_X_DIRECTION &dirs[],
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE,
string forSymbol = NULL,
ENUM_TIMEFRAMES forPeriod = NULL //
)
{
//
XClean(dirs);
XClean(patterns);
//
if (!IsXValid(forSymbol))
{
forSymbol = symbol;
}
if (!IsXValid(forPeriod))
{
forPeriod = period;
}
//
GetAllBarPatters(patterns, dirs);
//
// Add(X_BAR_PATTERN_FVG, patterns);
// Add(forDir, dirs);
}
void RefactorStrategy1OperationalZone(XBoxZone &zone)
{
//
if (!zone.IsValid())
{
return;
}
//
// Refine Zone ...
RefineZone(zone);
//
// SL Refactoring ...
//
XOHCL toBar;
if (zone.ToBar(toBar))
{
//
int to = zone.ToIndex();
int from = zone.FromIndex();
int length = from - to;
double iValue =
zone.IsBullish()
? toBar.FindLowest(length, MODE_LOW)
: zone.IsBearish()
? toBar.FindHighest(length, MODE_HIGH)
: EMPTY_VALUE;
if (NotEmptyZero(iValue))
{
//
if (zone.IsBullish())
{
zone.lower = MathMin(zone.lower, iValue);
}
//
if (zone.IsBearish())
{
zone.upper = MathMax(zone.upper, iValue);
}
}
}
toBar.Clean();
}
/* /*
* Check Recently Pattern Zone is Touched or not ... * Check Recently Pattern Zone is Touched or not ...
* *
@@ -2871,6 +2953,182 @@ class XCX121XKIPOIDetector : public XCMarketPatternDetector
// //
return result; return result;
} }
/*
* Check Recently Pattern Zone is Rejected or not ...
*
* @param zone: XBoxZone, Touched Zone ...
* @param patterns: ENUM_X_BAR_PATTERN, Allowed to Check Patterns ...
* @param patternsDir: ENUM_X_DIRECTION, Allowed Directions ...
* @param price: double, a Price to Check Toch or Reject ...
* @param barIndex: int, Bar Index to Start Checking ...
* @param loopback: int, Loopback for Pattern Formations ...
* @param forPeriod: ENUM_TIMEFRAMES, Time Frame to Check Patterns ...
* @param forDir: ENUM_X_DIRECTION, Directions for Pattern's Formation Check ...
*
* @return ( bool )
*/
bool HasRecentPatternRejected(
XBoxZone &zone,
ENUM_X_BAR_PATTERN &patterns[],
ENUM_X_DIRECTION &patternsDir[],
int barIndex = 0,
int loopback = 5,
ENUM_TIMEFRAMES forPeriod = NULL,
ENUM_X_DIRECTION forDir = X_DIRECTION_NONE //
)
{
//
bool result = false;
//
zone.Clean();
//
// Validate ...
result =
HasChild(patterns) &&
HasChild(patternsDir) &&
ArraySize(patterns) == ArraySize(patternsDir);
if (!result)
{
return result;
}
//
// Normalize ...
loopback = NormalizeInt(loopback, 2);
barIndex = kiParser.NormalizeBarIndex(barIndex);
if (IsXValid(forPeriod))
{
forPeriod = period;
}
//
XOHCL bar;
result = bar.Init(symbol, forPeriod, barIndex);
if (!result)
{
return result;
}
//
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();
//
Copy(
patterns,
iConfig.allowedPatterns //
);
Copy(
patternsDir,
iConfig.allowedDirs //
);
//
// Looping Back ...
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);
isBullish =
HasChild(iBullishZones) &&
HasRejected(iBullishIDX, bar, iBullishZones);
}
//
// Bearish ...
has = iAnalysis.Count(X_DIRECTION_BEARISH) > 0;
if (has)
{
//
iAnalysis.GetPatterns(iBearishZones, X_DIRECTION_BEARISH);
isBearish =
HasChild(iBearishZones) &&
HasRejected(iBearishIDX, bar, iBearishZones);
}
//
// 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;
}
//
// Cleanup Resource ...
iBar.Clean();
iAnalysis.Clean();
XClean(iBullishZones);
XClean(iBearishZones);
}
//
// Cleanup Resources ...
bar.Clean();
iBar.Clean();
iConfig.Clean();
iAnalysis.Clean();
XClean(iBullishZones);
XClean(iBearishZones);
//
result = zone.IsValid();
//
return result;
}
// #endregion // #endregion
// //