last backup ...

This commit is contained in:
2026-01-08 11:39:42 +03:30
parent afafeca00a
commit 963e045e65
249 changed files with 328192 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,843 @@
//
// Order Flow ...
//
bool drawOrderFlow;
XBoxZone orderFlow[];
bool manageOrderFlow;
ENUM_X_DIRECTION orderFlowDir;
//
bool HasOrderFlow()
{
//
return HasChild(orderFlow) &&
HasDirection(orderFlowDir);
}
//
bool HasBullishOrderFlow()
{
return HasOrderFlow() &&
IsXBullish(orderFlowDir);
}
//
bool HasBearishOrderFlow()
{
return HasOrderFlow() &&
IsXBearish(orderFlowDir);
}
//
bool GetOrderFlowBoundary(
double &upper,
double &lower //
)
{
//
bool result = false;
//
// Prepare ...
upper = EMPTY_VALUE;
lower = EMPTY_VALUE;
//
// Validate ...
result = HasOrderFlow();
if (!result)
{
return result;
}
//
int idx = -1;
//
// Upper ...
idx = GetHighest(orderFlow);
if (IsValidIndex(idx))
{
upper = orderFlow[idx].upper;
}
//
// Lower ...
idx = GetLowest(orderFlow);
if (IsValidIndex(idx))
{
lower = orderFlow[idx].lower;
}
//
result = NotEmptyZero(upper) &&
NotEmptyZero(lower) &&
upper > lower;
//
// Cleanup ...
if (!result)
{
//
upper = EMPTY_VALUE;
lower = EMPTY_VALUE;
}
//
return result;
}
//
bool ValidateOrderFlow(XOHCL &bar)
{
//
bool result = false;
//
// Validate ...
result = bar.IsValid() &&
HasOrderFlow();
if (!result)
{
return result;
}
//
double upper = EMPTY_VALUE;
double lower = EMPTY_VALUE;
result = GetOrderFlowBoundary(upper, lower);
result = result &&
HasBullishOrderFlow()
? bar.low > lower
: bar.high < upper;
//
return result;
}
//
void DrawOrderFlow()
{
//
if (!drawOrderFlow || !HasOrderFlow())
{
return;
}
//
poiDrawer.DrawZones(orderFlow, structureDrawConfig.drawConfig);
}
//
void ManageOrderFlow(XOHCL &bar)
{
//
// Validate Exists ...
if (HasOrderFlow())
{
//
if (!ValidateOrderFlow(bar))
{
//
// Invalidate OrderFlow ...
XClean(orderFlow);
orderFlowDir = X_DIRECTION_NONE;
}
}
//
// Detect New ...
if (!HasOrderFlow())
{
//
XPatternAnalysisConfig patternConfig = structureConfig.barsAnalysisConfig;
// patternConfig.Default();
// patternConfig.supportAndResistanceLoopbackLength = 21;
// patternConfig.supportAndResistanceValidationLength = 7;
//
poiDetector.HasOrderFlow(
bar,
orderFlowDir,
orderFlow,
structureConfig.orderFlowValidation,
structureConfig.orderFlowUseOB,
structureConfig.orderFlowUseFVG,
structureConfig.orderFlowUseSupportAndResistance,
patternConfig.supportAndResistanceLoopbackLength,
patternConfig.supportAndResistanceValidationLength,
structureConfig.loopback //
);
}
//
// Update Exists ...
if (HasOrderFlow())
{
//
// Update to Times ...
UpdateToTime(orderFlow, TimeCurrent());
//
DrawOrderFlow();
}
}
//
// Zone ...
//
XBoxZone support;
XBoxZone resistance;
bool drawZones;
bool drawSupport;
bool manageZones;
bool drawResistance;
//
bool HasZones()
{
return HasSupport() ||
HasResistance();
}
//
bool HasSupport()
{
return support.IsValid();
}
//
bool HasResistance()
{
return resistance.IsValid();
}
//
bool ValidateZones(XOHCL &bar)
{
//
bool result = false;
//
// Validate ...
result = bar.IsValid() &&
HasZones();
if (!result)
{
return result;
}
//
// Support ...
bool hasSupport = HasSupport();
if (hasSupport)
{
//
result = bar.close > support.lower &&
!IsBreaked(support, X_PRICE_CLOSE);
if (!result)
{
//
iResistance = support;
iResistance.breakAt = NULL;
iResistance.dir = X_DIRECTION_BEARISH;
iResistance.to = bar.time + (PeriodSeconds(bar.period));
iResistance.from = bar.time - (PeriodSeconds(bar.period));
//
support.breakAt = bar.time;
support.Clean();
}
}
//
// Resistance ...
bool hasResistance = HasResistance();
if (hasResistance)
{
//
result = bar.close < resistance.upper &&
!IsBreaked(resistance, X_PRICE_CLOSE);
if (!result)
{
//
iSupport = resistance;
iSupport.breakAt = NULL;
iSupport.dir = X_DIRECTION_BULLISH;
iSupport.to = bar.time + (PeriodSeconds(bar.period));
iSupport.from = bar.time - (PeriodSeconds(bar.period));
//
resistance.breakAt = bar.time;
resistance.Clean();
}
}
//
result =
(hasSupport && !HasSupport()) ||
(hasResistance && !HasResistance());
//
return result;
}
//
void DrawZones()
{
//
if (!drawZones || !HasZones())
{
return;
}
//
if (drawSupport && HasSupport())
{
poiDrawer.DrawZone(support, structureDrawConfig.drawConfig);
}
//
if (drawResistance && HasResistance())
{
poiDrawer.DrawZone(resistance, structureDrawConfig.drawConfig);
}
}
//
void ManageZones(XOHCL &bar)
{
//
// Validate Exists ...
if (HasZones())
{
//
if (!ValidateZones(bar))
{
//
// Invalidate Zones ...
//
// Support ...
if (IsXValid(support.breakAt))
{
//
iResistance = support;
iResistance.breakAt = NULL;
iResistance.dir = X_DIRECTION_BEARISH;
iResistance.to = bar.time + (PeriodSeconds(bar.period));
iResistance.from = bar.time - (PeriodSeconds(bar.period));
//
support.Clean();
}
//
// Resistance ...
if (IsXValid(resistance.breakAt))
{
//
iSupport = resistance;
iSupport.breakAt = NULL;
iSupport.dir = X_DIRECTION_BULLISH;
iSupport.to = bar.time + (PeriodSeconds(bar.period));
iSupport.from = bar.time - (PeriodSeconds(bar.period));
//
resistance.Clean();
}
}
}
//
// Detect New ...
XOHCL tmpBar;
bool has = false;
//
// Detect Support ...
if (!HasSupport())
{
//
has = poiDetector.HasSupport(
bar,
tmpBar,
structureConfig.barsAnalysisConfig.supportAndResistanceValidationLength,
structureConfig.barsAnalysisConfig.supportAndResistanceLoopbackLength //
);
if (has)
{
//
has = ToSupportBox(tmpBar, support, bar.time);
has =
has &&
!IsBreaked(support, X_PRICE_CLOSE);
if (!has)
{
//
if (support.IsValid())
{
//
iResistance = support;
iResistance.breakAt = NULL;
iResistance.dir = X_DIRECTION_BEARISH;
iResistance.to = bar.time + (PeriodSeconds(bar.period));
iResistance.from = bar.time - (PeriodSeconds(bar.period));
}
//
support.Clean();
}
}
}
//
// Detect Resistance ...
if (!HasResistance())
{
//
has = poiDetector.HasResistance(
bar,
tmpBar,
structureConfig.barsAnalysisConfig.supportAndResistanceValidationLength,
structureConfig.barsAnalysisConfig.supportAndResistanceLoopbackLength //
);
if (has)
{
//
has = ToResistanceBox(tmpBar, resistance, bar.time);
has =
has &&
!IsBreaked(resistance, X_PRICE_CLOSE);
if (!has)
{
//
if (resistance.IsValid())
{
//
iSupport = resistance;
iSupport.breakAt = NULL;
iSupport.dir = X_DIRECTION_BULLISH;
iSupport.to = bar.time + (PeriodSeconds(bar.period));
iSupport.from = bar.time - (PeriodSeconds(bar.period));
}
//
resistance.Clean();
}
}
}
//
// Update Exists ...
if (HasZones())
{
//
if (HasSupport())
{
//
support.to = bar.time;
support.type = "XFIMASup";
}
//
if (HasResistance())
{
//
resistance.to = bar.time;
resistance.type = "XFIMARes";
}
//
DrawZones();
}
//
// Cleanup ...
tmpBar.Clean();
}
//
XBoxZone iSupport;
XBoxZone iResistance;
bool drawIZones;
bool drawISupport;
bool manageIZones;
bool drawIResistance;
//
bool HasIZones()
{
//
return HasISupport() ||
HasIResistance();
}
//
bool HasISupport()
{
return iSupport.IsValid();
}
//
bool HasIResistance()
{
return iResistance.IsValid();
}
//
void DrawIZones()
{
//
if (!drawIZones || !HasIZones())
{
return;
}
//
if (drawISupport && HasISupport())
{
poiDrawer.DrawZone(iSupport, structureDrawConfig.drawConfig);
}
//
if (drawIResistance && HasIResistance())
{
poiDrawer.DrawZone(iResistance, structureDrawConfig.drawConfig);
}
}
//
bool ValidateIZones(XOHCL &bar)
{
//
bool result = false;
//
// Validate ...
result = bar.IsValid() &&
HasIZones();
if (!result)
{
return result;
}
//
//
// Support ...
bool hasSupport = HasISupport();
if (hasSupport)
{
//
result = bar.close > iSupport.lower &&
!IsBreaked(iSupport, X_PRICE_CLOSE);
if (!result)
{
//
iSupport.breakAt = bar.time;
iSupport.Clean();
}
}
//
// Resistance ...
bool hasResistance = HasIResistance();
if (hasResistance)
{
//
result = bar.close < iResistance.upper &&
!IsBreaked(iResistance, X_PRICE_CLOSE);
if (!result)
{
//
iResistance.breakAt = bar.time;
iResistance.Clean();
}
}
//
result =
(hasSupport && !HasISupport()) ||
(hasResistance && !HasIResistance());
//
return result;
}
//
void ManageIZones(XOHCL &bar)
{
//
// Validate Exists ...
if (HasIZones())
{
//
if (!ValidateIZones(bar))
{
//
// Invalidate Zones ...
//
// Support ...
if (IsXValid(iSupport.breakAt))
{
iSupport.Clean();
}
//
// Resistance ...
if (IsXValid(iResistance.breakAt))
{
iResistance.Clean();
}
}
}
//
// Update Exists ...
if (HasIZones())
{
//
if (HasISupport())
{
//
iSupport.to = bar.time;
iSupport.type = "XFIMAISup";
}
//
if (HasIResistance())
{
//
iResistance.to = bar.time;
iResistance.type = "XFIMAIRes";
}
//
DrawIZones();
}
}
//
// Trends ...
//
XTrend scTrend;
XTrend mcTrend;
XTrend lcTrend;
XTrend hcTrend;
//
bool drawTrends;
bool drawSCTrend;
bool drawMCTrend;
bool drawLCTrend;
bool drawHCTrend;
bool manageTrends;
//
bool HasTrend()
{
//
bool result =
HasSCTrend() ||
HasMCTrend() ||
HasLCTrend() ||
HasHCTrend();
//
return result;
}
//
bool HasSCTrend()
{
return scTrend.IsValid() &&
scTrend.HasTrend();
}
//
bool HasMCTrend()
{
return mcTrend.IsValid() &&
mcTrend.HasTrend();
}
//
bool HasLCTrend()
{
return lcTrend.IsValid() &&
lcTrend.HasTrend();
}
//
bool HasHCTrend()
{
return hcTrend.IsValid() &&
hcTrend.HasTrend();
}
//
void DrawTrends()
{
//
if (!drawTrends || !HasTrend())
{
return;
}
//
// SC ...
if (drawSCTrend && HasSCTrend())
{
poiDrawer.DrawTrendLine(scTrend, structureDrawConfig.drawConfig);
}
//
// MC ...
if (drawMCTrend && HasMCTrend())
{
poiDrawer.DrawTrendLine(mcTrend, structureDrawConfig.drawConfig);
}
//
// LC ...
if (drawLCTrend && HasLCTrend())
{
poiDrawer.DrawTrendLine(lcTrend, structureDrawConfig.drawConfig);
}
//
// HC ...
if (drawHCTrend && HasHCTrend())
{
poiDrawer.DrawTrendLine(hcTrend, structureDrawConfig.drawConfig);
}
}
//
void ManageTrends(XOHCL &bar)
{
//
// Validate ...
bool has = bar.IsValid();
if (!has)
{
return;
}
//
XTrend tmpTrend;
//
// SC ...
tmpTrend.Clean();
has = fimaParser.HasSCTrend(tmpTrend, bar.Index());
if (has)
{
scTrend = tmpTrend;
}
//
// MC ...
tmpTrend.Clean();
has = fimaParser.HasMCTrend(tmpTrend, bar.Index());
if (has)
{
mcTrend = tmpTrend;
}
//
// LC ...
tmpTrend.Clean();
has = fimaParser.HasLCTrend(tmpTrend, bar.Index());
if (has)
{
lcTrend = tmpTrend;
}
//
// HC ...
tmpTrend.Clean();
has = fimaParser.HasHCTrend(tmpTrend, bar.Index());
if (has)
{
hcTrend = tmpTrend;
}
//
DrawTrends();
//
// Cleanup ...
tmpTrend.Clean();
}
//
void Manage(XOHCL &bar)
{
//
bool has = bar.IsValid();
if (!has)
{
return;
}
//
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
has = bar.GetPreviousBar(pBar);
has = has &&
pBar.GetPreviousBar(p2Bar);
has = has &&
p2Bar.GetPreviousBar(p3Bar);
if (!has)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
}
//
ManageTrends(bar);
ManageZones(p2Bar);
ManageIZones(p2Bar);
ManageOrderFlow(p3Bar);
//
// Cleanup ...
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
}
//
// Configure ...
drawZones = false;
drawIZones = false;
drawTrends = false;
drawSCTrend = false;
drawMCTrend = false;
drawLCTrend = false;
drawHCTrend = false;
drawSupport = false;
drawISupport = false;
drawOrderFlow = false;
drawResistance = false;
drawIResistance = false;
//
manageZones = true;
manageIZones = true;
manageTrends = false;
manageOrderFlow = true;
//
// Manage ...
Manage(iBar);
@@ -0,0 +1,496 @@
/**
* Check Bar Has Signal Based on Strategy 3 ...
*
* @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;
//
// Prepare ...
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
// Validator Flags ...
bool validateByZones = true;
bool validateByPinBar = true;
bool validateByBarPatterns = true;
bool validateByCyclesTrend = true;
bool validateByMaFastSlowGrows = true;
//
// Define Requirements ...
//
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
bool isBullish = false;
bool isBearish = false;
XPatternAnalysis pBarPatterns;
XPatternAnalysis p2BarPatterns;
XPatternAnalysis p3BarPatterns;
XPatternAnalysisConfig iPatternsConfig;
//
// Reading Bars ...
result = bar.GetPreviousBar(pBar);
result = result &&
pBar.GetPreviousBar(p2Bar);
result = result &&
p2Bar.GetPreviousBar(p3Bar);
if (!result)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
//
return result;
}
//
// Reading Bar Patterns ...
iPatternsConfig.Default();
iPatternsConfig.FullPattern();
result =
result &&
poiDetector.AnalyseBarPatterns(
pBar,
pBarPatterns,
iPatternsConfig //
);
result =
result &&
poiDetector.AnalyseBarPatterns(
p2Bar,
p2BarPatterns,
iPatternsConfig //
);
result =
result &&
poiDetector.AnalyseBarPatterns(
p3Bar,
p3BarPatterns,
iPatternsConfig //
);
if (!result)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
pBarPatterns.Clean();
p2BarPatterns.Clean();
p3BarPatterns.Clean();
iPatternsConfig.Clean();
//
return result;
}
//
// Detect a Cross of MAs ...
bool isFastCrossedOverSlow = fimaParser.IsMAFastCrossedOverSlow(p2Bar.Index());
bool isFastCrossedUnderSlow = fimaParser.IsMAFastCrossedUnderSlow(p2Bar.Index());
//
isBullish = isFastCrossedOverSlow;
isBearish = isFastCrossedUnderSlow;
//
result = isBullish || isBearish;
//
// Validate Cross By Over/Under Last ...
if (result && validateByMaFastSlowGrows)
{
//
// Bullish ...
bool isFastOverLast = fimaParser.IsMAFastOverLast(pBar.Index());
bool isSlowOverLast = fimaParser.IsMASlowOverLast(pBar.Index());
bool isOverLast = isFastOverLast && isSlowOverLast;
//
// Bearish ...
bool isFastUnderLast = fimaParser.IsMAFastUnderLast(pBar.Index());
bool isSlowUnderLast = fimaParser.IsMASlowUnderLast(pBar.Index());
bool isUnderLast = isFastUnderLast && isSlowUnderLast;
//
isBullish =
isBullish &&
isOverLast;
//
isBearish =
isBearish &&
isUnderLast;
//
result = isBullish || isBearish;
}
//
// Validate By Cycles Trend ...
if (result && validateByCyclesTrend)
{
//
// Reading Cycles Trend ...
//
// Bullish ...
//
bool isLCMABullish = fimaParser.IsLCMABullish(pBar.Index());
bool isHCMABullish = fimaParser.IsHCMABullish(pBar.Index());
//
bool isLCMAOverLast = fimaParser.IsLCMAOverLast(pBar.Index());
bool isHCMAOverLast = fimaParser.IsHCMAOverLast(pBar.Index());
//
bool isCyclesMABullish = isLCMABullish && isHCMABullish && isLCMAOverLast && isHCMAOverLast;
//
// Bearish ...
//
bool isLCMABearish = fimaParser.IsLCMABearish(pBar.Index());
bool isHCMABearish = fimaParser.IsHCMABearish(pBar.Index());
//
bool isLCMAUnderLast = fimaParser.IsLCMAUnderLast(pBar.Index());
bool isHCMAUnderLast = fimaParser.IsHCMAUnderLast(pBar.Index());
//
bool isCyclesMABearish = isLCMABearish && isHCMABearish && isLCMAUnderLast && isHCMAUnderLast;
//
isBullish =
isBullish &&
isCyclesMABullish;
//
isBearish =
isBearish &&
isCyclesMABearish;
//
result = isBullish || isBearish;
}
//
// Validate Has a PinBar ...
if (result && validateByPinBar)
{
//
bool isPBarIsPinBar = poiDetector.IsPinnedBar(pBar, dir);
bool isPBarIsPinBarBullish = isPBarIsPinBar && IsXBullish(dir);
bool isPBarIsPinBarBearish = isPBarIsPinBar && IsXBearish(dir);
//
bool isP2BarIsPinBar = poiDetector.IsPinnedBar(p2Bar, dir);
bool isP2BarIsPinBarBullish = isP2BarIsPinBar && IsXBullish(dir);
bool isP2BarIsPinBarBearish = isP2BarIsPinBar && IsXBearish(dir);
//
bool isBullishPin = isPBarIsPinBarBullish || isP2BarIsPinBarBullish;
bool isBearishPin = isPBarIsPinBarBearish || isP2BarIsPinBarBearish;
//
isBullish =
isBullish &&
isBullishPin;
//
isBearish =
isBearish &&
isBearishPin;
//
result = isBullish || isBearish;
}
//
// Validate By Bar Patterns ...
if (result && validateByBarPatterns)
{
//
int count = 0;
int bullishCount = 0;
int bearishCount = 0;
//
count = pBarPatterns.Count(X_DIRECTION_BULLISH);
bullishCount += count;
//
count = p2BarPatterns.Count(X_DIRECTION_BULLISH);
bullishCount += count;
//
count = pBarPatterns.Count(X_DIRECTION_BEARISH);
bearishCount += count;
//
count = p2BarPatterns.Count(X_DIRECTION_BEARISH);
bearishCount += count;
//
bool hasBullishScore = IsValidSize(bullishCount) &&
bullishCount > bearishCount;
//
bool hasBearishScore = IsValidSize(bearishCount) &&
bearishCount > bullishCount;
//
// Reading Bar Patterns ...
//
// Bullish ...
bool isPBarHasBullishPatterns =
(pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH));
bool isP2BarHasBullishPatterns =
(p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BULLISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BULLISH));
bool hasBullishPatterns = isPBarHasBullishPatterns || isP2BarHasBullishPatterns;
//
// Bearish ...
bool isPBarHasBearishPatterns =
(pBarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) ||
pBarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH));
bool isP2BarHasBearishPatterns =
(p2BarPatterns.HasPattern(X_BAR_PATTERN_FLAG, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_STAR, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_PINNED, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_RISING, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_ENGULFED, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_MOMENTUM, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_PIERCING, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_SIGNALKEY, X_DIRECTION_BEARISH) ||
p2BarPatterns.HasPattern(X_BAR_PATTERN_TRUE_GAPED, X_DIRECTION_BEARISH));
bool hasBearishPatterns = isPBarHasBearishPatterns || isP2BarHasBearishPatterns;
//
isBullish =
isBullish &&
hasBullishScore &&
hasBullishPatterns;
//
isBearish =
isBearish &&
hasBearishScore &&
hasBearishPatterns;
//
result = isBullish || isBearish;
}
//
// Validate By Zones ...
if (result && validateByZones)
{
//
XBoxZone zones[];
int count = poiDetector.DetectZones(
pBar,
zones,
true, // Validate Zones ...
false, // OB ...
true, // FVG ...
true, // Supports ...
true, // Resistances ...
X_DIRECTION_NONE, // All Directions ...
X_SORT_BY_DATE, // Sort By ...
X_DIRECTION_BEARISH, // Sort Direction ...
5, // Zones Loopback ...
5, // Zones Validation ...
100 // Loopback ...
);
//
bool has = IsValidSize(count);
if (has)
{
poiDrawer.DrawZones(zones, structureDrawConfig.drawConfig);
}
}
//
if (result)
{
//
DebugBreak();
//
result = false;
isBullish = false;
isBearish = false;
}
//
// Detecting Direction ...
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
result = HasDirection(dir);
}
//
// Prepare Zone ...
if (result)
{
//
// Since Zone Prepared in Above Steps ...
// here we only Validate it ...
result = zone.IsValid();
}
//
// Draws ...
if (result)
{
//
XPOIDrawConfig iConfig = structureDrawConfig.drawConfig;
XPatternAnalysisDrawConfig iPatternsConfig = structureDrawConfig.barAnalysisDrawConfig;
iConfig.trendRayLeft = false;
iConfig.trendRayRight = false;
//
// Draw Zone ...
if (zone.IsValid())
{
//
iConfig.zonesStyle = STYLE_DASHDOT;
iConfig.bullishColor = clrYellow;
iConfig.bearishColor = clrDarkOrange;
//
poiDrawer.DrawZone(zone, iConfig);
}
//
// poiDrawer.DrawZone(mcPVZone, iConfig);
// poiDrawer.DrawZone(lcPVZone, iConfig);
// poiDrawer.DrawZone(hcPVZone, iConfig);
//
// poiDrawer.DrawZone(pinBarZone, iConfig);
// poiDrawer.DrawZone(pullbackZone, iConfig);
// poiDrawer.DrawTrendLine(pinBarZoneTrend, iConfig);
//
poiDrawer.DrawPatternAnalysis(pBarPatterns, iPatternsConfig);
poiDrawer.DrawPatternAnalysis(p2BarPatterns, iPatternsConfig);
poiDrawer.DrawPatternAnalysis(p3BarPatterns, iPatternsConfig);
//
// if (hasATRBox)
// {
// poiDrawer.DrawZone(atrBox, iConfig);
// }
//
// if (hasDoublePatterns)
// {
// //
// poiDrawer.DrawPatternAnalysis(iPatterns, iPatternsConfig);
// poiDrawer.DrawPatternAnalysis(iPPatterns, iPatternsConfig);
// }
//
iConfig.Clean();
iPatternsConfig.Clean();
//
DebugBreak();
// //
// result = false;
// isBullish = false;
// isBearish = false;
// zone.Clean();
}
//
// Prepare Targets ...
if (result)
{
}
//
// Cleanup ...
if (!result)
{
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
}
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
pBarPatterns.Clean();
p2BarPatterns.Clean();
p3BarPatterns.Clean();
iPatternsConfig.Clean();
//
return result;
}
@@ -0,0 +1,949 @@
/**
* Check Bar Has Signal Based on Strategy 4 ...
*
* @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 Strategy3HasSignal(
XOHCL &bar,
XBoxZone &zone,
XTarget &targets[],
ENUM_X_DIRECTION &dir //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
// Validation Flags ...
bool validateByBarPatterns = true;
//
// Define Requirements ...
//
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
bool isBullish = false;
bool isBearish = false;
//
// Read PBar ...
result = bar.GetPreviousBar(pBar);
result = result &&
pBar.GetPreviousBar(p2Bar);
result = result &&
p2Bar.GetPreviousBar(p3Bar);
if (!result)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
//
return result;
}
//
// Do ...
//
// Retrieve pBar Patterns ...
XPatternAnalysis pBarPatterns;
XPatternAnalysisConfig patternConfig = structureConfig.barsAnalysisConfig;
//
poiDetector.AnalyseBarPatterns(
pBar,
pBarPatterns,
patternConfig //
);
//
bool isConsolidation = poiDetector.DetectXPVZone(zone, p2Bar.Index());
//
isBullish =
isConsolidation &&
zone.IsBullish();
//
isBearish =
isConsolidation &&
zone.IsBearish();
//
// Summarize Result ...
result = isBullish || isBearish;
//
// Force PBar Has Pattern ...
if (result && validateByBarPatterns)
{
//
// Analyse Bar Patterns ...
result = pBarPatterns.IsValid();
//
// Bullish ...
bool isPBarHasBullishPatterns =
result &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BULLISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH)
//
);
//
// Bearish ...
bool isPBarHasBearishPatterns =
result &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BEARISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH)
//
);
//
isBullish =
isBullish &&
isPBarHasBullishPatterns &&
!isPBarHasBearishPatterns;
//
isBearish =
isBearish &&
isPBarHasBearishPatterns &&
!isPBarHasBullishPatterns;
//
// Summarize Result ...
result = isBullish || isBearish;
//
// Reset Flags ...
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
if (result)
{
//
poiDrawer.DrawZone(zone, structureDrawConfig.drawConfig);
poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig);
DebugBreak();
//
result = false;
isBullish = false;
isBearish = false;
}
// //
// // Validate based on Bars Patterns ...
// bool validateByBarPatterns = true;
// if (validateByBarPatterns)
// {
// //
// // Reading pBar Patterns ...
// XPatternAnalysis pBarAnalysis;
// poiDetector.AnalyseBarPatterns(
// pBar,
// pBarAnalysis,
// structureConfig.barsAnalysisConfig //
// );
// //
// // Bullish ...
// bool isPBarHasBullishPatterns =
// (bar.close > pBar.low ||
// bar.open > pBar.low) &&
// (
// //
// pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH)
// //
// );
// //
// // Bearish ...
// bool isPBarHasBearishPatterns =
// (bar.close < pBar.high ||
// bar.open < pBar.high) &&
// (
// //
// pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH)
// //
// );
// //
// isBullish =
// isBullish &&
// isPBarHasBullishPatterns &&
// !isPBarHasBearishPatterns;
// //
// isBearish =
// isBearish &&
// isPBarHasBearishPatterns &&
// !isPBarHasBullishPatterns;
// //
// // Summarize Result ...
// result = isBullish ||
// isBearish;
// }
// //
// // Checking PullBack ...
// bool validateByPullback = false;
// if (validateByPullback)
// {
// //
// XBoxZone pullback;
// ENUM_X_DIRECTION pullbackDir;
// bool isPullBack = result &&
// poiDetector.IsPullbackPattern(
// pBar,
// pullback,
// pullbackDir,
// 2,
// false // Force Break ...
// );
// bool isPullbackBullish = isPullBack &&
// IsXBullish(pullbackDir);
// bool isPullbackBearish = isPullBack &&
// IsXBearish(pullbackDir);
// //
// isBullish =
// isBullish &&
// isPullbackBullish;
// //
// isBearish =
// isBearish &&
// isPullbackBearish;
// //
// // Summarize Result ...
// result = isBullish ||
// isBearish;
// }
//
// Validate ...
result = isBullish ||
isBearish;
//
// Prepare Zone ...
if (result)
{
}
//
// Prepare Targets ...
if (result)
{
}
//
// Cleanup ...
if (!result)
{
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
}
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
pBarPatterns.Clean();
//
return result;
}
// //
// bool isConsolidation = poiDetector.DetectXPVZone(zone, p2Bar.Index());
// //
// isBullish =
// isConsolidation &&
// zone.IsBullish();
// //
// isBearish =
// isConsolidation &&
// zone.IsBearish();
// //
// // Summarize Result ...
// result = isBullish || isBearish;
// //
// // Force PBar Has Pattern ...
// if (result && validateByBarPatterns)
// {
// //
// // Analyse Bar Patterns ...
// result = pBarPatterns.IsValid();
// //
// // Bullish ...
// bool isPBarHasBullishPatterns =
// result &&
// (
// //
// pBarPatterns.IsPinned(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH)
// //
// );
// //
// // Bearish ...
// bool isPBarHasBearishPatterns =
// result &&
// (
// //
// pBarPatterns.IsPinned(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH)
// //
// );
// //
// isBullish =
// isBullish &&
// isPBarHasBullishPatterns &&
// !isPBarHasBearishPatterns;
// //
// isBearish =
// isBearish &&
// isPBarHasBearishPatterns &&
// !isPBarHasBullishPatterns;
// //
// // Summarize Result ...
// result = isBullish || isBearish;
// //
// // Reset Flags ...
// if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// //
// if (result)
// {
// //
// poiDrawer.DrawZone(zone, structureDrawConfig.drawConfig);
// poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig);
// DebugBreak();
// //
// result = false;
// isBullish = false;
// isBearish = false;
// }
// //
// // Validate based on Bars Patterns ...
// bool validateByBarPatterns = true;
// if (validateByBarPatterns)
// {
// //
// // Reading pBar Patterns ...
// XPatternAnalysis pBarAnalysis;
// poiDetector.AnalyseBarPatterns(
// pBar,
// pBarAnalysis,
// structureConfig.barsAnalysisConfig //
// );
// //
// // Bullish ...
// bool isPBarHasBullishPatterns =
// (bar.close > pBar.low ||
// bar.open > pBar.low) &&
// (
// //
// pBarAnalysis.IsPinned(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsEngulfed(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsMomentum(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsPiercing(X_DIRECTION_BULLISH) ||
// pBarAnalysis.IsSignalKey(X_DIRECTION_BULLISH)
// //
// );
// //
// // Bearish ...
// bool isPBarHasBearishPatterns =
// (bar.close < pBar.high ||
// bar.open < pBar.high) &&
// (
// //
// pBarAnalysis.IsPinned(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsEngulfed(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsMomentum(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsPiercing(X_DIRECTION_BEARISH) ||
// pBarAnalysis.IsSignalKey(X_DIRECTION_BEARISH)
// //
// );
// //
// isBullish =
// isBullish &&
// isPBarHasBullishPatterns &&
// !isPBarHasBearishPatterns;
// //
// isBearish =
// isBearish &&
// isPBarHasBearishPatterns &&
// !isPBarHasBullishPatterns;
// //
// // Summarize Result ...
// result = isBullish ||
// isBearish;
// }
// //
// // Checking PullBack ...
// bool validateByPullback = false;
// if (validateByPullback)
// {
// //
// XBoxZone pullback;
// ENUM_X_DIRECTION pullbackDir;
// bool isPullBack = result &&
// poiDetector.IsPullbackPattern(
// pBar,
// pullback,
// pullbackDir,
// 2,
// false // Force Break ...
// );
// bool isPullbackBullish = isPullBack &&
// IsXBullish(pullbackDir);
// bool isPullbackBearish = isPullBack &&
// IsXBearish(pullbackDir);
// //
// isBullish =
// isBullish &&
// isPullbackBullish;
// //
// isBearish =
// isBearish &&
// isPullbackBearish;
// //
// // Summarize Result ...
// result = isBullish ||
// isBearish;
// }
/**
* Check Bar Has Signal Based on Strategy 4 ...
*
* @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 Strategy3HasSignal(
XOHCL &bar,
XBoxZone &zone,
XTarget &targets[],
ENUM_X_DIRECTION &dir //
)
{
//
bool result = false;
//
// Prepare ...
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
// Validation Flags ...
bool validateByBarPatterns = false;
//
// Define Requirements ...
//
XOHCL pBar;
XOHCL p2Bar;
XOHCL p3Bar;
bool isBullish = false;
bool isBearish = false;
//
// Read PBar ...
result = bar.GetPreviousBar(pBar);
result = result &&
pBar.GetPreviousBar(p2Bar);
result = result &&
p2Bar.GetPreviousBar(p3Bar);
if (!result)
{
//
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
//
return result;
}
//
// Do ...
//
// Retrieve pBar Patterns ...
XPatternAnalysis pBarPatterns;
XPatternAnalysis p2BarPatterns;
XPatternAnalysisConfig patternConfig = structureConfig.barsAnalysisConfig;
//
poiDetector.AnalyseBarPatterns(
pBar,
pBarPatterns,
patternConfig //
);
poiDetector.AnalyseBarPatterns(
p2Bar,
p2BarPatterns,
patternConfig //
);
//
bool hasSupport = p2BarPatterns.IsValid() &&
p2BarPatterns.IsSupport();
bool hasResistance = p2BarPatterns.IsValid() &&
p2BarPatterns.IsResistance();
//
isBullish =
hasSupport &&
p2BarPatterns.Count(X_DIRECTION_BULLISH) >= 4;
//
isBearish =
hasResistance &&
p2BarPatterns.Count(X_DIRECTION_BEARISH) >= 4;
//
// Summarize Result ...
result = isBullish || isBearish;
//
// Extract Affected Zone ...
if (result)
{
//
XOHCL tmpBar;
XPivot tmpPivot;
XBoxZone tmpZone;
//
if (hasSupport)
{
//
hasSupport = p2BarPatterns.GetSupport(tmpBar, tmpPivot, tmpZone);
isBullish =
isBullish &&
hasSupport &&
(IsActed(pBar, tmpZone) ||
IsTested(pBar, tmpZone));
}
//
if (hasResistance)
{
//
hasResistance = p2BarPatterns.GetResistance(tmpBar, tmpPivot, tmpZone);
isBearish =
isBearish &&
hasResistance &&
(IsActed(pBar, tmpZone) ||
IsTested(pBar, tmpZone));
}
//
// Cleanup ...
tmpBar.Clean();
tmpZone.Clean();
tmpPivot.Clean();
//
// Summarize Result ...
result = isBullish || isBearish;
}
//
// Validate based on Bars Patterns ...
if (result && validateByBarPatterns)
{
//
// Bullish...
bool isPBarHasBullishPatterns =
pBarPatterns.IsValid() &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BULLISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH)
//
);
//
// Bearish ...
bool isPBarHasBearishPatterns =
pBarPatterns.IsValid() &&
(
//
pBarPatterns.IsPinned(X_DIRECTION_BEARISH) ||
pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) ||
pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) ||
pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) ||
pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH)
//
);
//
isBullish =
isBullish &&
isPBarHasBullishPatterns &&
!isPBarHasBearishPatterns;
//
isBearish =
isBearish &&
isPBarHasBearishPatterns &&
!isPBarHasBullishPatterns;
//
// Summarize Result ...
result = isBullish || isBearish;
}
if (result)
{
//
poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig);
poiDrawer.DrawPatternAnalysis(p2BarPatterns, structureDrawConfig.barAnalysisDrawConfig);
DebugBreak();
//
result = false;
isBullish = false;
isBearish = false;
}
// //
// bool isConsolidation = poiDetector.DetectXPVZone(zone, p2Bar.Index());
// //
// isBullish =
// isConsolidation &&
// zone.IsBullish();
// //
// isBearish =
// isConsolidation &&
// zone.IsBearish();
// //
// // Summarize Result ...
// result = isBullish || isBearish;
// //
// // Force PBar Has Pattern ...
// if (result && validateByBarPatterns)
// {
// //
// // Analyse Bar Patterns ...
// result = pBarPatterns.IsValid();
// //
// // Bullish ...
// bool isPBarHasBullishPatterns =
// result &&
// (
// //
// pBarPatterns.IsPinned(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsEngulfed(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsMomentum(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsPiercing(X_DIRECTION_BULLISH) ||
// pBarPatterns.IsSignalKey(X_DIRECTION_BULLISH)
// //
// );
// //
// // Bearish ...
// bool isPBarHasBearishPatterns =
// result &&
// (
// //
// pBarPatterns.IsPinned(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsEngulfed(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsMomentum(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsPiercing(X_DIRECTION_BEARISH) ||
// pBarPatterns.IsSignalKey(X_DIRECTION_BEARISH)
// //
// );
// //
// isBullish =
// isBullish &&
// isPBarHasBullishPatterns &&
// !isPBarHasBearishPatterns;
// //
// isBearish =
// isBearish &&
// isPBarHasBearishPatterns &&
// !isPBarHasBullishPatterns;
// //
// // Summarize Result ...
// result = isBullish || isBearish;
// //
// // Reset Flags ...
// if (!result)
// {
// //
// isBullish = false;
// isBearish = false;
// }
// }
// //
// if (result)
// {
// //
// poiDrawer.DrawZone(zone, structureDrawConfig.drawConfig);
// poiDrawer.DrawPatternAnalysis(pBarPatterns, structureDrawConfig.barAnalysisDrawConfig);
// DebugBreak();
// //
// result = false;
// isBullish = false;
// isBearish = false;
// }
// //
// // Checking PullBack ...
// bool validateByPullback = false;
// if (validateByPullback)
// {
// //
// XBoxZone pullback;
// ENUM_X_DIRECTION pullbackDir;
// bool isPullBack = result &&
// poiDetector.IsPullbackPattern(
// pBar,
// pullback,
// pullbackDir,
// 2,
// false // Force Break ...
// );
// bool isPullbackBullish = isPullBack &&
// IsXBullish(pullbackDir);
// bool isPullbackBearish = isPullBack &&
// IsXBearish(pullbackDir);
// //
// isBullish =
// isBullish &&
// isPullbackBullish;
// //
// isBearish =
// isBearish &&
// isPullbackBearish;
// //
// // Summarize Result ...
// result = isBullish ||
// isBearish;
// }
//
// Validate ...
result = isBullish ||
isBearish;
//
// Prepare Zone ...
if (result)
{
}
//
// Prepare Targets ...
if (result)
{
}
//
// Cleanup ...
if (!result)
{
//
zone.Clean();
XClean(targets);
dir = X_DIRECTION_NONE;
}
pBar.Clean();
p2Bar.Clean();
p3Bar.Clean();
pBarPatterns.Clean();
patternConfig.Clean();
p2BarPatterns.Clean();
//
return result;
}
bool validateByPVChange = false;
bool validateByPVInside = false;
//
// Validate By PV Inside ...
if (result && validateByPVInside)
{
//
double pVale = fimaHelper.GetVale(pBar.Index());
double pPeak = fimaHelper.GetPeak(pBar.Index());
//
bool isValePassed = pVale <= support.upper &&
pVale >= support.upper &&
fimaParser.IsValeSame(pBar.Index());
//
bool isPeakPassed = pPeak <= resistance.upper &&
pPeak >= resistance.upper &&
fimaParser.IsPeakSame(pBar.Index());
//
isBullish =
isBullish &&
isValePassed;
//
isBearish =
isBearish &&
isPeakPassed;
//
// Summarize Result ...
result = isBullish || isBearish;
}
//
// Validate by PV Change ...
if (result && validateByPVChange)
{
//
// bullish => p3, p2 vale under last ...
// bearish => p3, p2 peak over last ...
//
bool isValePassed =
fimaParser.IsValeUnderLast(p2Bar.Index()) ||
fimaParser.IsValeUnderLast(p3Bar.Index());
//
bool isPeakPassed =
fimaParser.IsPeakOverLast(p2Bar.Index()) ||
fimaParser.IsPeakOverLast(p3Bar.Index());
//
isBullish =
isBullish &&
isValePassed;
//
isBearish =
isBearish &&
isPeakPassed;
//
// Summarize Result ...
result = isBullish || isBearish;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff