last ...
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user