last works ...
This commit is contained in:
@@ -1468,6 +1468,8 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
* @param chart_id: Long, Specified Chart ID ...
|
||||
* @param window: Integer, Specified Chart Window ID ...
|
||||
* @param model: XPivotAnalysis, reference model ...
|
||||
* @param drawTrends: Specified to Draw Trends or not ...
|
||||
* @param drawZones: Specified to Draw Support and Resistance Zones or not ...
|
||||
* @param drawPivots: Specified to Draw Pivots or not ...
|
||||
* @param peakArrow: int, Specified Arrow Code for Peak Pivots ...
|
||||
* @param valeArrow: int, Specified Arrow Code for Vale Pivots ...
|
||||
@@ -1479,6 +1481,8 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
long chart_id,
|
||||
int window,
|
||||
XPivotAnalysis &model,
|
||||
bool drawTrends = true,
|
||||
bool drawZones = true,
|
||||
bool drawPivots = true,
|
||||
int peakArrow = 159,
|
||||
int valeArrow = 159,
|
||||
@@ -1502,14 +1506,24 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
//
|
||||
// Generate Object ID ...
|
||||
string objID = model.GetObjectID();
|
||||
|
||||
//
|
||||
// Draw Trend Lines ...
|
||||
mUpper = NULL;
|
||||
mLower = NULL;
|
||||
if (drawTrends)
|
||||
{
|
||||
//
|
||||
string upperName = model.GetUpperObjectID();
|
||||
string lowerName = model.GetLowerObjectID();
|
||||
|
||||
//
|
||||
// Extract Recent Pivots ...
|
||||
RemoveObjects(upperName, chart_id, window);
|
||||
RemoveObjects(lowerName, chart_id, window);
|
||||
|
||||
//
|
||||
// Creating Upper ...
|
||||
mUpper = new CChartObjectTrend();
|
||||
result = mUpper.Create(
|
||||
chart_id,
|
||||
upperName,
|
||||
@@ -1521,11 +1535,18 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
// Destroy Trending Objects ...
|
||||
DestroyObject(mUpper);
|
||||
DestroyObject(mLower);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Create Lower ...
|
||||
mLower = new CChartObjectTrend();
|
||||
result = mLower.Create(
|
||||
chart_id,
|
||||
lowerName,
|
||||
@@ -1538,25 +1559,33 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
mUpper.Detach();
|
||||
mUpper.Delete();
|
||||
// Destroy Trending Objects ...
|
||||
DestroyObject(mUpper);
|
||||
DestroyObject(mLower);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Draw Zones ...
|
||||
mSupportBox = NULL;
|
||||
mResistanceBox = NULL;
|
||||
if (drawZones)
|
||||
{
|
||||
//
|
||||
// Support ...
|
||||
XBoxZone tmpBox;
|
||||
mSupportBox = NULL;
|
||||
has = model.HasSupportBox(tmpBox);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
datetime to = TimeCurrent();
|
||||
string name = model.GetSupportBoxObjectID();
|
||||
RemoveObjects(name, chart_id, window);
|
||||
mSupportBox = new XCBoxObject();
|
||||
has = mSupportBox.Create(
|
||||
result = mSupportBox.Create(
|
||||
chart_id,
|
||||
window,
|
||||
name,
|
||||
@@ -1565,20 +1594,30 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
tmpBox.from,
|
||||
to //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
DestroyObject(mUpper);
|
||||
DestroyObject(mLower);
|
||||
DestroyObject(mSupportBox);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Resistance ...
|
||||
tmpBox.Clean();
|
||||
mResistanceBox = NULL;
|
||||
has = model.HasResistanceBox(tmpBox);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
datetime to = TimeCurrent();
|
||||
string name = model.GetResistanceBoxObjectID();
|
||||
RemoveObjects(name, chart_id, window);
|
||||
mResistanceBox = new XCBoxObject();
|
||||
has = mResistanceBox.Create(
|
||||
result = mResistanceBox.Create(
|
||||
chart_id,
|
||||
window,
|
||||
name,
|
||||
@@ -1587,6 +1626,18 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
tmpBox.from,
|
||||
to //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
DestroyObject(mUpper);
|
||||
DestroyObject(mLower);
|
||||
DestroyObject(mSupportBox);
|
||||
DestroyObject(mResistanceBox);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1615,6 +1666,7 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
? peakArrow
|
||||
: valeArrow;
|
||||
name = model.pivots[i].GetObjectID();
|
||||
RemoveObjects(name, chart_id, window);
|
||||
type = model.pivots[i].IsPeak()
|
||||
? X_PRICE_HIGH
|
||||
: X_PRICE_LOW;
|
||||
@@ -1686,6 +1738,8 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
Delete();
|
||||
|
||||
//
|
||||
DestroyObject(mUpper);
|
||||
DestroyObject(mLower);
|
||||
DestroyObject(mSupportBox);
|
||||
DestroyObject(mResistanceBox);
|
||||
}
|
||||
@@ -1706,6 +1760,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
value = 1;
|
||||
}
|
||||
|
||||
//
|
||||
if (mUpper == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mUpper.Width(value);
|
||||
}
|
||||
@@ -1717,6 +1777,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void UpperColor(color value)
|
||||
{
|
||||
//
|
||||
if (mUpper == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mUpper.Color(value);
|
||||
}
|
||||
@@ -1728,6 +1794,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void UpperStyle(ENUM_LINE_STYLE value)
|
||||
{
|
||||
//
|
||||
if (mUpper == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mUpper.Style(value);
|
||||
}
|
||||
@@ -1739,6 +1811,13 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void UpperRayLeft(bool value)
|
||||
{
|
||||
//
|
||||
if (mUpper == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mUpper.RayLeft(value);
|
||||
}
|
||||
|
||||
@@ -1749,6 +1828,13 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void UpperRayRight(bool value)
|
||||
{
|
||||
//
|
||||
if (mUpper == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mUpper.RayRight(value);
|
||||
}
|
||||
|
||||
@@ -1765,6 +1851,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
value = 1;
|
||||
}
|
||||
|
||||
//
|
||||
if (mLower == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mLower.Width(value);
|
||||
}
|
||||
@@ -1776,6 +1868,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void LowerColor(color value)
|
||||
{
|
||||
//
|
||||
if (mLower == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mLower.Color(value);
|
||||
}
|
||||
@@ -1787,6 +1885,12 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void LowerStyle(ENUM_LINE_STYLE value)
|
||||
{
|
||||
//
|
||||
if (mLower == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mLower.Style(value);
|
||||
}
|
||||
@@ -1798,6 +1902,13 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void LowerRayLeft(bool value)
|
||||
{
|
||||
//
|
||||
if (mLower == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mLower.RayLeft(value);
|
||||
}
|
||||
|
||||
@@ -1808,6 +1919,13 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
*/
|
||||
void LowerRayRight(bool value)
|
||||
{
|
||||
//
|
||||
if (mLower == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
mLower.RayRight(value);
|
||||
}
|
||||
|
||||
@@ -2100,8 +2218,8 @@ class XCPivotAnalysisObject : public XCBaseObject
|
||||
//
|
||||
CArrayObj mPeaks;
|
||||
CArrayObj mVales;
|
||||
CChartObjectTrend mUpper;
|
||||
CChartObjectTrend mLower;
|
||||
CChartObjectTrend *mUpper;
|
||||
CChartObjectTrend *mLower;
|
||||
XCBoxObject *mSupportBox;
|
||||
XCBoxObject *mResistanceBox;
|
||||
};
|
||||
@@ -2140,11 +2258,13 @@ void AddObjects(
|
||||
*
|
||||
* @param object: pointer refrence to Destroy ...
|
||||
*/
|
||||
void DestroyObject(XCBoxObject *&object) {
|
||||
void DestroyObject(XCBoxObject *&object)
|
||||
{
|
||||
//
|
||||
// Validate ...
|
||||
bool has = object != NULL;
|
||||
if (!has) {
|
||||
if (!has)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2165,11 +2285,13 @@ void DestroyObject(XCBoxObject *&object) {
|
||||
*
|
||||
* @param object: pointer refrence to Destroy ...
|
||||
*/
|
||||
void DestroyObject(XCPivotAnalysisObject *&object) {
|
||||
void DestroyObject(XCPivotAnalysisObject *&object)
|
||||
{
|
||||
//
|
||||
// Validate ...
|
||||
bool has = object != NULL;
|
||||
if (!has) {
|
||||
if (!has)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2185,4 +2307,82 @@ void DestroyObject(XCPivotAnalysisObject *&object) {
|
||||
ZeroMemory(object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy Object if Exists ...
|
||||
*
|
||||
* @param object: pointer refrence to Destroy ...
|
||||
*/
|
||||
void DestroyObject(CChartObjectTrend *&object)
|
||||
{
|
||||
//
|
||||
// Validate ...
|
||||
bool has = object != NULL;
|
||||
if (!has)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
object.Detach();
|
||||
object.Delete();
|
||||
|
||||
//
|
||||
delete object;
|
||||
ZeroMemory(object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove Drawn Objects from Chart ...
|
||||
*
|
||||
* @param tag: Specified Object Name, if NULL remove all Objects ...
|
||||
* @param chartId: long, Specified Chart ...
|
||||
* @param subWindow: int Specified Sub Window ...
|
||||
*/
|
||||
void RemoveObjects(
|
||||
string tag = NULL,
|
||||
long chartId = -1,
|
||||
int subWindow = -1 //
|
||||
)
|
||||
{
|
||||
//
|
||||
// Normalize Args ...
|
||||
|
||||
//
|
||||
if (chartId == -1)
|
||||
{
|
||||
chartId = 0;
|
||||
}
|
||||
|
||||
//
|
||||
if (subWindow == -1)
|
||||
{
|
||||
subWindow = 0;
|
||||
}
|
||||
|
||||
//
|
||||
bool has = false;
|
||||
string iName = NULL;
|
||||
for (int iObj = ObjectsTotal(chartId, subWindow) - 1; iObj >= 0; iObj--)
|
||||
{
|
||||
//
|
||||
// Retrieve Object Name ...
|
||||
iName = ObjectName(chartId, iObj, subWindow);
|
||||
|
||||
//
|
||||
// Check Can Delete Object or not ...
|
||||
has =
|
||||
!IsSpecifiedValid(tag)
|
||||
? true
|
||||
: StringFind(iName, tag) >= 0;
|
||||
if (has)
|
||||
{
|
||||
ObjectDelete(chartId, iName);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Redraw Chart ...
|
||||
ChartRedraw();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -835,6 +835,7 @@ class XCPOIDrawer : public XCBase
|
||||
ulong chartId = ChartIdentification();
|
||||
int subWindow = SubWindowIdentification();
|
||||
string name = ToXString(dir) + "_Trend_" + ToXString(price1) + "_" + ToXString(price2);
|
||||
RemoveObjects("_Trend_", chartId, subWindow);
|
||||
|
||||
//
|
||||
object = new CChartObjectTrend();
|
||||
@@ -872,6 +873,8 @@ class XCPOIDrawer : public XCBase
|
||||
*
|
||||
* @param analysis: XPivotAnalysis, referece Specified Pivot Analysis ...
|
||||
* @param object: XCPivotAnalysisObject, pointer reference for Drawn Object ...
|
||||
* @param drawTrends: Specified to Draw Trends or not ...
|
||||
* @param drawZones: Specified to Draw Support and Resistance Zones or not ...
|
||||
* @param drawPivots: Specified to Draw Pivots or not ...
|
||||
* @param peakArrow: int, Specified Arrow Code for Peak Pivots ...
|
||||
* @param valeArrow: int, Specified Arrow Code for Vale Pivots ...
|
||||
@@ -882,6 +885,8 @@ class XCPOIDrawer : public XCBase
|
||||
bool DrawPivotAnalysis(
|
||||
XPivotAnalysis &analysis,
|
||||
XCPivotAnalysisObject *&object,
|
||||
bool drawTrends = true,
|
||||
bool drawZones = true,
|
||||
bool drawPivots = true,
|
||||
int peakArrow = 159,
|
||||
int valeArrow = 159,
|
||||
@@ -913,6 +918,8 @@ class XCPOIDrawer : public XCBase
|
||||
ChartIdentification(),
|
||||
SubWindowIdentification(),
|
||||
analysis,
|
||||
drawTrends,
|
||||
drawZones,
|
||||
drawPivots,
|
||||
peakArrow,
|
||||
valeArrow,
|
||||
|
||||
@@ -993,7 +993,6 @@ if (has)
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
bool has = cBar.GetPreviousBar(pBar);
|
||||
@@ -1037,8 +1036,6 @@ if (has)
|
||||
}
|
||||
pBar.Clean();
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
@@ -1106,11 +1103,8 @@ if (has)
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
// //
|
||||
// // Here We Apply Custom Detecting ...
|
||||
// detectorConfig.OffDetectors();
|
||||
@@ -1150,7 +1144,133 @@ if (has)
|
||||
// );
|
||||
// }
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
eaIsNewBar = eaBarTracker.IsNewBar();
|
||||
bool canProcess = eaProcessAllTicks
|
||||
? true
|
||||
: eaIsNewBar;
|
||||
//
|
||||
eaExpert.HandleOnTick();
|
||||
|
||||
//
|
||||
if (!canProcess)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
fima1Signaller.OnTick();
|
||||
fima2Signaller.OnTick();
|
||||
|
||||
//
|
||||
// Initial Bar for Analysis ...
|
||||
XOHCL cBar;
|
||||
bool isInited = cBar.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
0 //
|
||||
);
|
||||
|
||||
//
|
||||
// Here We Apply Custom Detecting ...
|
||||
detectorConfig.OffDetectors();
|
||||
detectorConfig.detectSupport = true;
|
||||
detectorConfig.detectResistance = true;
|
||||
detectorConfig.detectSignalKeyBarPattern = false;
|
||||
detectorConfig.supportAndResistanceValidationLength = 21;
|
||||
|
||||
//
|
||||
// Analyse Market ...
|
||||
fima2Signaller.poiDetector.AnalyseMarket(
|
||||
cBar,
|
||||
marketStructure,
|
||||
detectorConfig //
|
||||
);
|
||||
CArrayObj *iObjects;
|
||||
int drawnsCount = fima2Signaller.poiDrawer.DrawMarketStructure(
|
||||
marketStructure,
|
||||
marketStructureDrawerConfig,
|
||||
iObjects //
|
||||
);
|
||||
if (IsValidSize(drawnsCount))
|
||||
{
|
||||
//
|
||||
AddObjects(
|
||||
iObjects,
|
||||
eaDraws //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// TODO: Remove this ...
|
||||
XOHCL pBar;
|
||||
bool has = cBar.GetPreviousBar(pBar);
|
||||
if (marketStructure.fakeBreakedZone.IsValid())
|
||||
{
|
||||
//
|
||||
// Check For PrevZoneExistanse ...
|
||||
has = marketStructure.fakeBreakedZone.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Draw Prev Zone ...
|
||||
XCBoxObject *iPrevZoneObj;
|
||||
marketStructure.fakeBreakedZone.to = pBar.time;
|
||||
has = fima2Signaller.poiDrawer.DrawBox(
|
||||
marketStructure.fakeBreakedZone,
|
||||
iPrevZoneObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
XPOIStyle style;
|
||||
fima2Signaller.poiDrawer.GetBoxStyle(
|
||||
style,
|
||||
marketStructure.fakeBreakedZone.dir //
|
||||
);
|
||||
style.clr = clrYellow;
|
||||
fima2Signaller.poiDrawer.ApplyBoxStyle(
|
||||
iPrevZoneObj,
|
||||
style //
|
||||
);
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
eaDraws.Add(iPrevZoneObj);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
Print("Fake Breaked Detection ...");
|
||||
}
|
||||
if (HasChild(marketStructure.recentlyTestedZones))
|
||||
{
|
||||
//
|
||||
int idx = GetYoungest(marketStructure.recentlyTestedZones);
|
||||
bool has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
has = IsTested(
|
||||
pBar,
|
||||
marketStructure.recentlyTestedZones[idx] //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (has)
|
||||
{
|
||||
Print("PrevZone Exists ...");
|
||||
}
|
||||
}
|
||||
pBar.Clean();
|
||||
|
||||
//
|
||||
cBar.Clean();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,826 @@
|
||||
|
||||
/**
|
||||
* Analyse Market based on Specified Bar ...
|
||||
*
|
||||
* @param forBar: XOHCL, reference Specified Bar for Analyse Market ...
|
||||
* @param structure: XFIMAMarketStructure, reference to holds result ...
|
||||
* @param config: XFIMAPatternDetectorConfig, reference to Configure Detector ...
|
||||
*/
|
||||
void AnalyseMarket(
|
||||
XOHCL &forBar,
|
||||
XFIMAMarketStructure &structure,
|
||||
XFIMAPatternDetectorConfig &config //
|
||||
)
|
||||
{
|
||||
//
|
||||
// Prepare ...
|
||||
structure.Clean();
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
if (!forBar.IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Do Analysis ...
|
||||
|
||||
//
|
||||
structure.bar = forBar;
|
||||
|
||||
//
|
||||
int idx = -1;
|
||||
bool has = false;
|
||||
int maxAllowedCollecting = 50;
|
||||
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
// Detecting POI Based on Config ...
|
||||
|
||||
//
|
||||
// Order Block ...
|
||||
if (config.detectOB)
|
||||
{
|
||||
//
|
||||
bool isOB = HasOB(
|
||||
forBar,
|
||||
iDir,
|
||||
structure.ob,
|
||||
config.obLoopback //
|
||||
);
|
||||
bool isBullishOB = isOB &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishOB = isOB &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (!isOB)
|
||||
{
|
||||
structure.ob.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Touches ...
|
||||
if (isOB)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
structure.ob,
|
||||
obs,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
bool has = forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isOBTouched =
|
||||
isBullishOB
|
||||
? pBar.low < structure.ob.upper
|
||||
: pBar.high > structure.ob.lower;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Fair Value Gap ...
|
||||
if (config.detectFVG)
|
||||
{
|
||||
//
|
||||
bool isFVG = HasFVG(
|
||||
forBar,
|
||||
iDir,
|
||||
structure.fvg,
|
||||
config.fvgLoopback //
|
||||
);
|
||||
bool isBullishFVG = isFVG &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishFVG = isFVG &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (!isFVG)
|
||||
{
|
||||
structure.fvg.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Touches ...
|
||||
if (isFVG)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
structure.fvg,
|
||||
fvgs,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
bool has = forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isFVGTouched =
|
||||
isBullishFVG
|
||||
? pBar.low < structure.fvg.upper
|
||||
: pBar.high > structure.fvg.lower;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Momentum Bar ...
|
||||
if (config.detectMomentum)
|
||||
{
|
||||
//
|
||||
bool isMomentum = IsMomentumBar(
|
||||
forBar,
|
||||
iDir,
|
||||
config.momentumBarRangeLength,
|
||||
config.momentumBarApprovedMultiplier //
|
||||
);
|
||||
bool isBullishMomentum = isMomentum &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishMomentum = isMomentum &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isMomentum)
|
||||
{
|
||||
structure.momentumDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Engulfed Bar ...
|
||||
if (config.detectEngulfed)
|
||||
{
|
||||
//
|
||||
bool isEngulfed = IsEngulfedBar(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
bool isBullishEngulfed = isEngulfed &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishEngulfed = isEngulfed &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isEngulfed)
|
||||
{
|
||||
structure.engulfedDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking TruGaped Bar ...
|
||||
if (config.detectTrueGaped)
|
||||
{
|
||||
//
|
||||
bool isTrueGaped = IsTrueGapedBar(
|
||||
forBar,
|
||||
iDir,
|
||||
config.truwGapApprovedPointMultiplier //
|
||||
);
|
||||
bool isBullishTrueGaped = isTrueGaped &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishTrueGaped = isTrueGaped &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isTrueGaped)
|
||||
{
|
||||
structure.trueGapedDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Pinned Bar ...
|
||||
if (config.detectPinned)
|
||||
{
|
||||
//
|
||||
bool isPinned = IsPinnedBar(
|
||||
forBar,
|
||||
iDir,
|
||||
config.pinnedBaarShadowApprovedMultiplier,
|
||||
config.pinnedBarMinimumPinBarRangeMultiplier,
|
||||
config.pinnedBarForceDirection //
|
||||
);
|
||||
bool isBullishPinned = isPinned &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishPinned = isPinned &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isPinned)
|
||||
{
|
||||
structure.pinnedDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Star Pattern ...
|
||||
if (config.detectStarPattern)
|
||||
{
|
||||
//
|
||||
bool isStarPattern = IsStartPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
bool isBullishStarPattern = isStarPattern &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishStarPattern = isStarPattern &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isStarPattern)
|
||||
{
|
||||
structure.starPatternDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Piercing Pattern ...
|
||||
if (config.detectPiercingPattern)
|
||||
{
|
||||
//
|
||||
bool isPiercingPattern = IsPiercingPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
bool isBullishPiercingPattern = isPiercingPattern &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishPiercingPattern = isPiercingPattern &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isPiercingPattern)
|
||||
{
|
||||
structure.piercingPatternDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Rising Pattern ...
|
||||
if (config.detectRisingPattern)
|
||||
{
|
||||
//
|
||||
bool isRisingPattern = IsRisingPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
bool isBullishRisingPattern = isRisingPattern &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishRisingPattern = isRisingPattern &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isRisingPattern)
|
||||
{
|
||||
structure.risingPatternDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Flag Pattern ...
|
||||
if (config.detectFlagPattern)
|
||||
{
|
||||
//
|
||||
XOHCL swingBar;
|
||||
bool isFlagPattern = IsFlagPattern(
|
||||
forBar,
|
||||
iDir,
|
||||
swingBar,
|
||||
config.flagPatternMinimumPullbackBars //
|
||||
);
|
||||
bool isBullishFlagPattern = isFlagPattern &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishFlagPattern = isFlagPattern &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isFlagPattern)
|
||||
{
|
||||
//
|
||||
structure.flagSwing = swingBar;
|
||||
structure.flagPatternDir = iDir;
|
||||
}
|
||||
swingBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Detect SignalKey Bar Pattern ...
|
||||
if (config.detectSignalKeyBarPattern)
|
||||
{
|
||||
//
|
||||
bool isSignalKeyBar = IsSignalKeyBarPattern(
|
||||
forBar,
|
||||
iDir,
|
||||
config.signalKeyBarShadowApprovedMultiplier,
|
||||
config.signalKeyBarMinimumPinBarRangeMultiplier,
|
||||
config.signalKeyBarForceDirection //
|
||||
);
|
||||
bool isBullishSignalKeyBar = isSignalKeyBar &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool isBearishSignalKeyBar = isSignalKeyBar &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (isSignalKeyBar)
|
||||
{
|
||||
structure.signalKeyBarPatternDir = iDir;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Swing Trend ...
|
||||
if (config.detectSwingTrend)
|
||||
{
|
||||
//
|
||||
XOHCL swings[];
|
||||
bool hasSwingTrend = HasSwingTrend(
|
||||
forBar,
|
||||
iDir,
|
||||
swings,
|
||||
config.trendingNumberOfSwings,
|
||||
config.trendingSwingShoulders //
|
||||
);
|
||||
bool hasBullishSwingTrend = hasSwingTrend &&
|
||||
IsSpecifiedBullish(iDir);
|
||||
bool hasBearishSwingTrend = hasSwingTrend &&
|
||||
IsSpecifiedBearish(iDir);
|
||||
if (hasSwingTrend)
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
swings,
|
||||
structure.trendSwings //
|
||||
);
|
||||
structure.trendDir = iDir;
|
||||
}
|
||||
SpecifiedClean(swings);
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Supports ...
|
||||
if (config.detectSupport)
|
||||
{
|
||||
//
|
||||
XOHCL support;
|
||||
bool hasSupport = HasSupport(
|
||||
forBar,
|
||||
support,
|
||||
config.supportAndResistanceValidationLength,
|
||||
config.supportAndResistanceMaxAllowedLoopback //
|
||||
);
|
||||
if (hasSupport)
|
||||
{
|
||||
//
|
||||
XBoxZone supportBox;
|
||||
has = ToSupportBox(support, supportBox);
|
||||
|
||||
//
|
||||
// Validate Zone Strength if Provided ...
|
||||
if (config.minAllowdSupportAndResistanceStrength > 0)
|
||||
{
|
||||
//
|
||||
has = has &&
|
||||
ValidateStrength(
|
||||
supportBox,
|
||||
config.minAllowdSupportAndResistanceStrength //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
supportBox,
|
||||
supports,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
structure.support = supportBox;
|
||||
}
|
||||
|
||||
//
|
||||
// Check for Support Touches ...
|
||||
XOHCL pBar;
|
||||
has = has &&
|
||||
forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
structure.isSupportTouched = pBar.low < supportBox.upper;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
supportBox.Clean();
|
||||
}
|
||||
support.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Resistance ...
|
||||
if (config.detectResistance)
|
||||
{
|
||||
//
|
||||
XOHCL resistance;
|
||||
bool hasResistance = HasResistance(
|
||||
forBar,
|
||||
resistance,
|
||||
config.supportAndResistanceValidationLength,
|
||||
config.supportAndResistanceMaxAllowedLoopback //
|
||||
);
|
||||
if (hasResistance)
|
||||
{
|
||||
//
|
||||
XBoxZone resistanceBox;
|
||||
has = ToResistanceBox(resistance, resistanceBox);
|
||||
|
||||
//
|
||||
// Validate Zone Strength if Provided ...
|
||||
if (config.minAllowdSupportAndResistanceStrength > 0)
|
||||
{
|
||||
//
|
||||
has = has &&
|
||||
ValidateStrength(
|
||||
resistanceBox,
|
||||
config.minAllowdSupportAndResistanceStrength //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
resistanceBox,
|
||||
resistances,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
structure.resistance = resistanceBox;
|
||||
}
|
||||
|
||||
//
|
||||
// Check for Resistance Touches ...
|
||||
XOHCL pBar;
|
||||
has = has &&
|
||||
forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
structure.isResistanceTouched = pBar.high > resistanceBox.upper;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
resistanceBox.Clean();
|
||||
}
|
||||
resistance.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Analysers ...
|
||||
|
||||
//
|
||||
// Analyse Based on PV ...
|
||||
if (config.analyseFIMAPVPivots)
|
||||
{
|
||||
//
|
||||
XPivotAnalysis analysis;
|
||||
has = AnalysePVPivots(
|
||||
analysis, // Result ...
|
||||
forBar.Index(), // Bar Index ...
|
||||
config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
||||
config.maxAllowedLoopbackLengthForAnalysis, // Max Allowed Loopback ...
|
||||
config.pvPivotsValidationLength // Validation Length ...
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
structure.pvAnalysis = analysis;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Analyse Based on MA ...
|
||||
if (config.analyseFIMAMAPivots)
|
||||
{
|
||||
//
|
||||
XPivotAnalysis analysis;
|
||||
has = AnalyseMAPivots(
|
||||
analysis, // Result ...
|
||||
forBar.Index(), // Bar Index ...
|
||||
config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
||||
config.maxAllowedLoopbackLengthForAnalysis, // Max Allowed Loopback ...
|
||||
config.pvPivotsValidationLength // Validation Length ...
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
structure.maAnalysis = analysis;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Analyse Based on SAR ...
|
||||
if (config.analyseFIMASARPivots)
|
||||
{
|
||||
//
|
||||
XPivotAnalysis analysis;
|
||||
has = AnalyseSARPivots(
|
||||
analysis, // Result ...
|
||||
forBar.Index(), // Bar Index ...
|
||||
config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
||||
config.maxAllowedLoopbackLengthForAnalysis // Max Allowed Loopback ...
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
structure.sarAnalysis = analysis;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Analyse Based on ZigZag ...
|
||||
if (config.analyseFIMAZigZagPivots)
|
||||
{
|
||||
//
|
||||
XPivotAnalysis analysis;
|
||||
has = AnalyseZigZagPivots(
|
||||
analysis, // Result ...
|
||||
forBar.Index(), // Bar Index ...
|
||||
config.numberOfRequiredPivotsForAnalysis, // Required Number of Pivots ...
|
||||
config.maxAllowedLoopbackLengthForAnalysis // Max Allowed Loopback ...
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
structure.zigzagAnalysis = analysis;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// COMPLEX Actions ...
|
||||
|
||||
//
|
||||
// Lockup For Previous Zone ...
|
||||
has = structure.isSupportTouched ||
|
||||
structure.isResistanceTouched;
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
if (structure.isSupportTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.support.from,
|
||||
supports //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = supports[idx];
|
||||
}
|
||||
}
|
||||
else if (structure.isResistanceTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.resistance.from,
|
||||
resistances //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = resistances[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Recently Tested Zones ...
|
||||
if ((config.detectSupport ||
|
||||
config.detectResistance) &&
|
||||
config.recentlyTestedZonesMaxLookup > 0)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
int idx = -1;
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
int start = forBar.Index() + 1;
|
||||
int end = start + config.recentlyTestedZonesMaxLookup;
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
// Initialize Indexed Bar ...
|
||||
has = forBar.BarAt(i, iBar);
|
||||
if (!has)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Selecting Support and Resistances ...
|
||||
|
||||
//
|
||||
// Supports ...
|
||||
idx = GetYoungestBefore(iBar.time, supports);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Check Testing ...
|
||||
has = IsTested(iBar, supports[idx]);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
supports[idx],
|
||||
structure.recentlyTestedZones //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Resistances ...
|
||||
idx = GetYoungestBefore(iBar.time, resistances);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Check Testing ...
|
||||
has = IsTested(iBar, resistances[idx]);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
resistances[idx],
|
||||
structure.recentlyTestedZones //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checkup for FakeBreaked Zones ...
|
||||
if (config.detectSupport ||
|
||||
config.detectResistance)
|
||||
{
|
||||
//
|
||||
// Retrieve Previous Bar ...
|
||||
int idx = -1;
|
||||
XOHCL pForBar;
|
||||
XOHCL breakerBar;
|
||||
XBoxZone pSupport;
|
||||
XOHCL pBreakerBar;
|
||||
XBoxZone pResistance;
|
||||
|
||||
//
|
||||
// Selecting Previously Touched Support / Resistance ...
|
||||
has = forBar.GetPreviousBar(pForBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Detecting Nearest Above Lows Support ...
|
||||
idx = GetYoungestAbove(
|
||||
pForBar.low,
|
||||
supports //
|
||||
);
|
||||
has = IsValidIndex(idx) &&
|
||||
IsBreaked(
|
||||
forBar,
|
||||
supports[idx] //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
pSupport = supports[idx];
|
||||
}
|
||||
|
||||
//
|
||||
// Detecting Nearest Below Highs Resistance ...
|
||||
idx = GetYoungestBelow(
|
||||
pForBar.high,
|
||||
resistances //
|
||||
);
|
||||
has = IsValidIndex(idx) &&
|
||||
IsBreaked(
|
||||
forBar,
|
||||
resistances[idx] //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
pResistance = resistances[idx];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check at least a zone Exists ...
|
||||
// Selecting pTestedZone ...
|
||||
has = pSupport.IsValid() ||
|
||||
pResistance.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Support ...
|
||||
has = pSupport.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = true;
|
||||
structure.pTestedZone = pSupport;
|
||||
}
|
||||
|
||||
//
|
||||
// Resistance ...
|
||||
has = pResistance.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = true;
|
||||
structure.pTestedZone = pResistance;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check pTestedZone Existance ...
|
||||
has = structure.isPTest &&
|
||||
structure.pTestedZone.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Get Breaker Bars ...
|
||||
XOHCL breakerBars[];
|
||||
int breakerBarsCount = GetBreakerBars(
|
||||
structure.pTestedZone,
|
||||
breakerBars //
|
||||
);
|
||||
has = IsValidSize(breakerBarsCount);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBar(breakerBars);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
breakerBar = breakerBars[idx];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
SpecifiedClean(breakerBars);
|
||||
}
|
||||
|
||||
//
|
||||
// Check Zone Breaker Bar Exists ...
|
||||
// Validate Zone Fake Breake Langth ...
|
||||
has = breakerBar.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Validate Breake Length ...
|
||||
has = (breakerBar.Index() - pForBar.Index()) <= config.supportAndResistanceBreakeValidationLength;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
//
|
||||
if (!has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = false;
|
||||
structure.pTestedZone.Clean();
|
||||
}
|
||||
pForBar.Clean();
|
||||
pSupport.Clean();
|
||||
breakerBar.Clean();
|
||||
pBreakerBar.Clean();
|
||||
pResistance.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Lockup For Previous Zone ...
|
||||
has = structure.isSupportTouched ||
|
||||
structure.isResistanceTouched;
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
if (structure.isSupportTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.support.from,
|
||||
supports //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = supports[idx];
|
||||
}
|
||||
}
|
||||
else if (structure.isResistanceTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.resistance.from,
|
||||
resistances //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = resistances[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -387,6 +387,7 @@ int OnInit()
|
||||
//
|
||||
// Configure XFIMA POI Detector / Drawer ...
|
||||
detectorConfig.Default();
|
||||
detectorConfig.FullDetect();
|
||||
marketStructureDrawerConfig.FullDraw();
|
||||
|
||||
//
|
||||
@@ -456,91 +457,8 @@ void OnTick()
|
||||
fima1Signaller.OnTick();
|
||||
fima2Signaller.OnTick();
|
||||
|
||||
//
|
||||
// Initial Bar for Analysis ...
|
||||
XOHCL cBar;
|
||||
bool isInited = cBar.Init(
|
||||
_Symbol,
|
||||
_Period,
|
||||
0 //
|
||||
);
|
||||
|
||||
//
|
||||
// Here We Apply Custom Detecting ...
|
||||
detectorConfig.OffDetectors();
|
||||
detectorConfig.detectSupport = true;
|
||||
detectorConfig.detectResistance = true;
|
||||
detectorConfig.detectSignalKeyBarPattern = false;
|
||||
detectorConfig.supportAndResistanceValidationLength = 21;
|
||||
|
||||
//
|
||||
// Analyse Market ...
|
||||
fima2Signaller.poiDetector.AnalyseMarket(
|
||||
cBar,
|
||||
marketStructure,
|
||||
detectorConfig //
|
||||
);
|
||||
CArrayObj *iObjects;
|
||||
int drawnsCount = fima2Signaller.poiDrawer.DrawMarketStructure(
|
||||
marketStructure,
|
||||
marketStructureDrawerConfig,
|
||||
iObjects //
|
||||
);
|
||||
if (IsValidSize(drawnsCount))
|
||||
{
|
||||
//
|
||||
AddObjects(
|
||||
iObjects,
|
||||
eaDraws //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// TODO: Remove this ...
|
||||
XOHCL pBar;
|
||||
bool has = cBar.GetPreviousBar(pBar);
|
||||
if (marketStructure.isPTest)
|
||||
{
|
||||
//
|
||||
// Check For PrevZoneExistanse ...
|
||||
has = marketStructure.pTestedZone.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Draw Prev Zone ...
|
||||
XCBoxObject *iPrevZoneObj;
|
||||
marketStructure.pTestedZone.to = pBar.time;
|
||||
has = fima2Signaller.poiDrawer.DrawBox(
|
||||
marketStructure.pTestedZone,
|
||||
iPrevZoneObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
XPOIStyle style;
|
||||
fima2Signaller.poiDrawer.GetBoxStyle(
|
||||
style,
|
||||
marketStructure.pTestedZone.dir //
|
||||
);
|
||||
style.clr = clrYellow;
|
||||
fima2Signaller.poiDrawer.ApplyBoxStyle(
|
||||
iPrevZoneObj,
|
||||
style //
|
||||
);
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
eaDraws.Add(iPrevZoneObj);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
Print("Previous Tested ...");
|
||||
}
|
||||
pBar.Clean();
|
||||
|
||||
//
|
||||
cBar.Clean();
|
||||
// //
|
||||
// AnalyseMarket(0);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -694,9 +612,6 @@ void OnSignalTriggered(XSignal &signal)
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
return;
|
||||
|
||||
//
|
||||
// Draw Signal Vertical Line ...
|
||||
|
||||
@@ -727,6 +642,14 @@ void OnSignalTriggered(XSignal &signal)
|
||||
//
|
||||
// Alert Issued Signal ...
|
||||
string message = signal.GetMessage();
|
||||
|
||||
//
|
||||
int signalBarIndex = GetBarIndex(
|
||||
signal.symbol,
|
||||
signal.period,
|
||||
signal.time //
|
||||
);
|
||||
AnalyseMarket(signalBarIndex);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -856,3 +779,147 @@ void OnTradeStateChanged(const XOnTradeHandlerState &state)
|
||||
}
|
||||
|
||||
//
|
||||
void AnalyseMarket(int barIndex = 0)
|
||||
{
|
||||
//
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
barIndex = NormalizeInt(barIndex, 0);
|
||||
|
||||
//
|
||||
string symbol = fima2Signaller.symbol;
|
||||
ENUM_TIMEFRAMES period = fima2Signaller.period;
|
||||
|
||||
//
|
||||
// Retrieve Signal Bar ...
|
||||
XOHCL bar;
|
||||
has = bar.Init(
|
||||
symbol,
|
||||
period,
|
||||
barIndex //
|
||||
);
|
||||
if (!has)
|
||||
{
|
||||
//
|
||||
bar.Clean();
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// TODO: Remove this and add in OnInit() Method ...
|
||||
|
||||
//
|
||||
// Configuring Detector ...
|
||||
|
||||
//
|
||||
detectorConfig.detectOB = true;
|
||||
detectorConfig.detectFVG = true;
|
||||
|
||||
//
|
||||
detectorConfig.detectSupport = true;
|
||||
detectorConfig.detectResistance = true;
|
||||
detectorConfig.detectSwingTrend = true;
|
||||
|
||||
//
|
||||
detectorConfig.detectPinned = true;
|
||||
detectorConfig.detectMomentum = true;
|
||||
detectorConfig.detectEngulfed = true;
|
||||
detectorConfig.detectTrueGaped = true;
|
||||
|
||||
//
|
||||
detectorConfig.detectStarPattern = true;
|
||||
detectorConfig.detectFlagPattern = true;
|
||||
detectorConfig.detectRisingPattern = true;
|
||||
detectorConfig.detectPiercingPattern = true;
|
||||
detectorConfig.detectSignalKeyBarPattern = true;
|
||||
|
||||
//
|
||||
detectorConfig.analyseFIMAPVPivots = true;
|
||||
detectorConfig.analyseFIMAMAPivots = false;
|
||||
detectorConfig.analyseFIMASARPivots = false;
|
||||
detectorConfig.analyseFIMAZigZagPivots = false;
|
||||
|
||||
//
|
||||
// Configure Drawer ...
|
||||
|
||||
//
|
||||
// Recents ...
|
||||
marketStructureDrawerConfig.drawFakeBreakedZone = true;
|
||||
marketStructureDrawerConfig.drawRecentlyTestedZones = true;
|
||||
marketStructureDrawerConfig.drawRecentlyBreakedZones = true;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
marketStructureDrawerConfig.drawFIMAPVPivotsAnalysis = true;
|
||||
marketStructureDrawerConfig.drawFIMAPVPivotsAnalysisZones = true;
|
||||
marketStructureDrawerConfig.drawFIMAPVPivotsAnalysisTrends = true;
|
||||
marketStructureDrawerConfig.drawFIMAPVPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
// XMA ...
|
||||
marketStructureDrawerConfig.drawFIMAMAPivotsAnalysis = false;
|
||||
marketStructureDrawerConfig.drawFIMAMAPivotsAnalysisZones = false;
|
||||
marketStructureDrawerConfig.drawFIMAMAPivotsAnalysisTrends = false;
|
||||
marketStructureDrawerConfig.drawFIMAMAPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
// XSAR ...
|
||||
marketStructureDrawerConfig.drawFIMASARPivotsAnalysis = false;
|
||||
marketStructureDrawerConfig.drawFIMASARPivotsAnalysisZones = false;
|
||||
marketStructureDrawerConfig.drawFIMASARPivotsAnalysisTrends = false;
|
||||
marketStructureDrawerConfig.drawFIMASARPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
// XZigZag ...
|
||||
marketStructureDrawerConfig.drawFIMAZigZagPivotsAnalysis = false;
|
||||
marketStructureDrawerConfig.drawFIMAZigZagPivotsAnalysisZones = false;
|
||||
marketStructureDrawerConfig.drawFIMAZigZagPivotsAnalysisTrends = false;
|
||||
marketStructureDrawerConfig.drawFIMAZigZagPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
// Analyse Market on Signalling Bar ...
|
||||
fima2Signaller.poiDetector.AnalyseMarket(
|
||||
bar,
|
||||
marketStructure,
|
||||
detectorConfig //
|
||||
);
|
||||
|
||||
//
|
||||
// Draw Market Structure ...
|
||||
CArrayObj *marketStructureObjects;
|
||||
int marketStructureObjectsCount = fima2Signaller.poiDrawer.DrawMarketStructure(
|
||||
marketStructure,
|
||||
marketStructureDrawerConfig,
|
||||
marketStructureObjects //
|
||||
);
|
||||
if (IsValidIndex(marketStructureObjectsCount))
|
||||
{
|
||||
//
|
||||
// Add Drawn Objects if Necessary ...
|
||||
}
|
||||
|
||||
//
|
||||
if (HasChild(marketStructure.recentlyTestedZones))
|
||||
{
|
||||
Print("Recently Tested Zones ...");
|
||||
}
|
||||
|
||||
//
|
||||
if (HasChild(marketStructure.recentlyBreakedZones))
|
||||
{
|
||||
Print("Recently Breaked Zones ...");
|
||||
}
|
||||
|
||||
//
|
||||
if (marketStructure.fakeBreakedZone.IsValid())
|
||||
{
|
||||
Print("Fake Breaked Zone ...");
|
||||
}
|
||||
|
||||
//
|
||||
bar.Clean();
|
||||
marketStructureObjects.Clear();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -7124,7 +7124,26 @@ int CalculateSlopeAndIntercept(
|
||||
|
||||
//
|
||||
int n = end;
|
||||
_slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
|
||||
double _dividedBy = (n * sumX2 - sumX * sumX);
|
||||
// if (_dividedBy <= 0 || n <= 0)
|
||||
// {
|
||||
// //
|
||||
// _slope = 0;
|
||||
// _intercept = 0;
|
||||
|
||||
// //
|
||||
// result = 0;
|
||||
// } else {
|
||||
// //
|
||||
// _slope = (n * sumXY - sumX * sumY) / _dividedBy;
|
||||
// _intercept = (sumY - _slope * sumX) / n;
|
||||
|
||||
// //
|
||||
// result = n;
|
||||
// }
|
||||
|
||||
//
|
||||
_slope = (n * sumXY - sumX * sumY) / _dividedBy;
|
||||
_intercept = (sumY - _slope * sumX) / n;
|
||||
|
||||
//
|
||||
|
||||
@@ -1140,7 +1140,7 @@ struct XPivotAnalysis
|
||||
}
|
||||
|
||||
//
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_" + ToXString(TimeToSeconds(time));
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period);
|
||||
|
||||
//
|
||||
return result;
|
||||
@@ -1163,7 +1163,7 @@ struct XPivotAnalysis
|
||||
}
|
||||
|
||||
//
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_UPPER_" + ToXString(TimeToSeconds(time));
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_UPPER";
|
||||
|
||||
//
|
||||
return result;
|
||||
@@ -1186,7 +1186,7 @@ struct XPivotAnalysis
|
||||
}
|
||||
|
||||
//
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_LOWER_" + ToXString(TimeToSeconds(time));
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_LOWER";
|
||||
|
||||
//
|
||||
return result;
|
||||
@@ -1209,7 +1209,7 @@ struct XPivotAnalysis
|
||||
}
|
||||
|
||||
//
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_SUPPORT_" + ToXString(TimeToSeconds(time));
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_SUPPORT";
|
||||
|
||||
//
|
||||
return result;
|
||||
@@ -1232,7 +1232,7 @@ struct XPivotAnalysis
|
||||
}
|
||||
|
||||
//
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_RESISTANCE_" + ToXString(TimeToSeconds(time));
|
||||
result = GetTag() + "_" + symbol + "_" + ToXString(period) + "_RESISTANCE";
|
||||
|
||||
//
|
||||
return result;
|
||||
|
||||
@@ -3790,6 +3790,245 @@ void ValidateBoxes(
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Bar to Pivot ...
|
||||
*
|
||||
* @param bar: XOHCL, reference to Specified Bar ...
|
||||
* @param pivot: XPivot, reference to holds result ...
|
||||
* @param forDir: ENUM_X_DIRECTION, specified Pivot Direction ...
|
||||
* @param prefix: string, Specified Pivot Prefix (used for Object Type) ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool ToPivot(
|
||||
XOHCL &bar,
|
||||
XPivot &pivot,
|
||||
ENUM_X_DIRECTION forDir,
|
||||
string prefix = NULL //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
pivot.Clean();
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = bar.IsValid() &&
|
||||
HasDirection(forDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Direction ...
|
||||
bool isBullish = IsSpecifiedBullish(forDir);
|
||||
|
||||
//
|
||||
// Prepare Value of Pivot ...
|
||||
double iValue =
|
||||
isBullish
|
||||
? bar.low
|
||||
: bar.high;
|
||||
|
||||
//
|
||||
// Prepare Pivot Type ...
|
||||
ENUM_X_PIVOT_TYPE iType =
|
||||
isBullish
|
||||
? X_PIVOT_TYPE_VALE
|
||||
: X_PIVOT_TYPE_PEAK;
|
||||
|
||||
//
|
||||
// Initialize Pivot ...
|
||||
result = pivot.Init(
|
||||
iValue,
|
||||
bar.time,
|
||||
bar.symbol,
|
||||
forDir,
|
||||
bar.period,
|
||||
iType //
|
||||
);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
// Set Prefix if Pivot initialized successfully ...
|
||||
pivot.prefix = prefix;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = pivot.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
pivot.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts POI Patterns to Box ...
|
||||
*
|
||||
* @param bar: XOHCL, reference to Specified Pattern ...
|
||||
* @param box: XBoxZone, reference to holds result ...
|
||||
* @param forDir: ENUM_X_DIRECTION, Specified Pattern Direction ...
|
||||
* @param prefix: string, Specified Pattern Type ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool ToBox(
|
||||
XOHCL &bar,
|
||||
XBoxZone &box,
|
||||
ENUM_X_DIRECTION forDir,
|
||||
string prefix = NULL //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
box.Clean();
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = bar.IsValid() &&
|
||||
HasDirection(forDir);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Flags for Patterns ...
|
||||
|
||||
//
|
||||
bool isStar =
|
||||
IsSpecifiedValid(prefix) &&
|
||||
prefix == "Star";
|
||||
|
||||
//
|
||||
bool isPiercing =
|
||||
IsSpecifiedValid(prefix) &&
|
||||
prefix == "Piercing";
|
||||
|
||||
//
|
||||
bool isRising =
|
||||
IsSpecifiedValid(prefix) &&
|
||||
prefix == "Rising";
|
||||
|
||||
//
|
||||
bool isFlag =
|
||||
IsSpecifiedValid(prefix) &&
|
||||
prefix == "Flag";
|
||||
|
||||
//
|
||||
bool isSignalKeyBar =
|
||||
IsSpecifiedValid(prefix) &&
|
||||
prefix == "SignalKeyBar";
|
||||
|
||||
//
|
||||
// Validate Pattern ...
|
||||
result = isStar ||
|
||||
isFlag ||
|
||||
isRising ||
|
||||
isPiercing ||
|
||||
isSignalKeyBar;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Now Try to Initialized Box ...
|
||||
|
||||
//
|
||||
// Common Configs ...
|
||||
box.dir = forDir;
|
||||
box.type = prefix;
|
||||
box.at = bar.time;
|
||||
box.from = bar.time;
|
||||
box.to = TimeCurrent();
|
||||
box.symbol = bar.symbol;
|
||||
box.period = bar.period;
|
||||
|
||||
//
|
||||
double upper = 0;
|
||||
double lower = 0;
|
||||
datetime from = NULL;
|
||||
bool isBullish = IsSpecifiedBullish(forDir);
|
||||
|
||||
//
|
||||
int loopback = 0;
|
||||
ENUM_SERIESMODE uMode = MODE_HIGH;
|
||||
ENUM_SERIESMODE lMode = MODE_LOW;
|
||||
|
||||
//
|
||||
// Specified Configs ...
|
||||
if (isStar)
|
||||
{
|
||||
loopback = 2;
|
||||
}
|
||||
else if (isPiercing)
|
||||
{
|
||||
loopback = 1;
|
||||
}
|
||||
else if (isRising)
|
||||
{
|
||||
loopback = 5;
|
||||
}
|
||||
else if (isFlag)
|
||||
{
|
||||
loopback = 1;
|
||||
}
|
||||
else if (isSignalKeyBar)
|
||||
{
|
||||
loopback = 1;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsValidSize(loopback);
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
from = GetBarTime(
|
||||
bar.symbol,
|
||||
bar.period,
|
||||
bar.Index() + loopback //
|
||||
);
|
||||
upper = bar.FindHighest(
|
||||
loopback,
|
||||
uMode //
|
||||
);
|
||||
lower = bar.FindLowest(
|
||||
loopback,
|
||||
lMode //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
box.from = from;
|
||||
box.upper = upper;
|
||||
box.lower = lower;
|
||||
|
||||
//
|
||||
// Validate result ...
|
||||
result = box.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
box.Clean();
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Bar to Support Box ...
|
||||
*
|
||||
@@ -3921,8 +4160,8 @@ bool IsBreaked(
|
||||
// Check Break ...
|
||||
result =
|
||||
zone.IsBullish()
|
||||
? bar.close > zone.upper
|
||||
: bar.close < zone.lower;
|
||||
? bar.close < zone.lower
|
||||
: bar.close > zone.upper;
|
||||
|
||||
//
|
||||
// Apply Force Bar Edge ...
|
||||
@@ -3966,7 +4205,7 @@ bool IsTested(
|
||||
}
|
||||
|
||||
//
|
||||
// Check Break ...
|
||||
// Check Test ...
|
||||
result =
|
||||
zone.IsBullish()
|
||||
? bar.low < zone.upper
|
||||
@@ -3976,6 +4215,44 @@ bool IsTested(
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Specified Bar is Inside Specified Zone or not ...
|
||||
*
|
||||
* @param bar: Specified Bar ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsInside(
|
||||
XOHCL &bar,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
result = bar.IsValid() &&
|
||||
zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Inside ...
|
||||
result =
|
||||
zone.IsBullish()
|
||||
? bar.low < zone.upper &&
|
||||
bar.low > zone.lower
|
||||
: bar.high > zone.lower &&
|
||||
bar.high < zone.upper;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect all Bars which Breakes Specified Zone ...
|
||||
*
|
||||
@@ -4051,6 +4328,156 @@ int GetBreakerBars(
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect all Bars which Inside Specified Zone ...
|
||||
*
|
||||
* @param zone: reference to Specified Zone ...
|
||||
* @param dest: reference Collection to hold result ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int GetInsideBars(
|
||||
XBoxZone &zone,
|
||||
XOHCL &dest[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool has = zone.IsValid();
|
||||
if (!has)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
SpecifiedClean(dest);
|
||||
|
||||
//
|
||||
// Do Action ...
|
||||
XOHCL iBar;
|
||||
int start = zone.ToIndex();
|
||||
int end = zone.FromIndex();
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
// Initialize indexed Bar ...
|
||||
has = iBar.Init(
|
||||
zone.symbol,
|
||||
zone.period,
|
||||
i //
|
||||
);
|
||||
if (!has)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
has = IsInside(
|
||||
iBar,
|
||||
zone //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBar,
|
||||
dest //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(dest);
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect all Bars which Tested Specified Zone ...
|
||||
*
|
||||
* @param zone: reference to Specified Zone ...
|
||||
* @param dest: reference Collection to hold result ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int GetTesterBars(
|
||||
XBoxZone &zone,
|
||||
XOHCL &dest[] //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
// Validate ...
|
||||
bool has = zone.IsValid();
|
||||
if (!has)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare ...
|
||||
SpecifiedClean(dest);
|
||||
|
||||
//
|
||||
// Do Action ...
|
||||
XOHCL iBar;
|
||||
int start = zone.ToIndex();
|
||||
int end = zone.FromIndex();
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
// Initialize indexed Bar ...
|
||||
has = iBar.Init(
|
||||
zone.symbol,
|
||||
zone.period,
|
||||
i //
|
||||
);
|
||||
if (!has)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
has = IsTested(
|
||||
iBar,
|
||||
zone //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBar,
|
||||
dest //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(dest);
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
//
|
||||
@@ -42,6 +42,9 @@ struct XPivot
|
||||
ENUM_TIMEFRAMES period; // Period
|
||||
ENUM_X_PIVOT_TYPE type; // Type
|
||||
|
||||
//
|
||||
string prefix; // Object Prefix
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
XPivot()
|
||||
@@ -108,6 +111,7 @@ struct XPivot
|
||||
time = NULL;
|
||||
symbol = NULL;
|
||||
period = NULL;
|
||||
prefix = NULL;
|
||||
dir = X_DIRECTION_NONE;
|
||||
type = X_PIVOT_TYPE_NONE;
|
||||
|
||||
@@ -429,7 +433,21 @@ struct XPivot
|
||||
*/
|
||||
string GetTag()
|
||||
{
|
||||
return GetToken(this);
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
string token = GetToken(this);
|
||||
|
||||
//
|
||||
result =
|
||||
(IsSpecifiedValid(prefix)
|
||||
? prefix + "_"
|
||||
: "") +
|
||||
token;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -564,21 +564,6 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
obs,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
bool has = forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isOBTouched =
|
||||
isBullishOB
|
||||
? pBar.low < structure.ob.upper
|
||||
: pBar.high > structure.ob.lower;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -612,21 +597,6 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
fvgs,
|
||||
maxAllowedCollecting //
|
||||
);
|
||||
|
||||
//
|
||||
XOHCL pBar;
|
||||
bool has = forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isFVGTouched =
|
||||
isBullishFVG
|
||||
? pBar.low < structure.fvg.upper
|
||||
: pBar.high > structure.fvg.lower;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -891,16 +861,6 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
|
||||
//
|
||||
// Check for Support Touches ...
|
||||
XOHCL pBar;
|
||||
has = has &&
|
||||
forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
structure.isSupportTouched = pBar.low < supportBox.upper;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
supportBox.Clean();
|
||||
}
|
||||
support.Clean();
|
||||
@@ -951,17 +911,6 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
}
|
||||
|
||||
//
|
||||
// Check for Resistance Touches ...
|
||||
XOHCL pBar;
|
||||
has = has &&
|
||||
forBar.GetPreviousBar(pBar);
|
||||
if (has)
|
||||
{
|
||||
structure.isResistanceTouched = pBar.high > resistanceBox.upper;
|
||||
}
|
||||
|
||||
//
|
||||
pBar.Clean();
|
||||
resistanceBox.Clean();
|
||||
}
|
||||
resistance.Clean();
|
||||
@@ -1047,46 +996,11 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
//
|
||||
// COMPLEX Actions ...
|
||||
|
||||
//
|
||||
// Lockup For Previous Zone ...
|
||||
has = structure.isSupportTouched ||
|
||||
structure.isResistanceTouched;
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
if (structure.isSupportTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.support.from,
|
||||
supports //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = supports[idx];
|
||||
}
|
||||
}
|
||||
else if (structure.isResistanceTouched)
|
||||
{
|
||||
//
|
||||
idx = GetYoungestBefore(
|
||||
structure.resistance.from,
|
||||
resistances //
|
||||
);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
structure.prevZone = resistances[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Recently Tested Zones ...
|
||||
if ((config.detectSupport ||
|
||||
config.detectResistance) &&
|
||||
config.recentlyTestedZonesMaxLookup > 0)
|
||||
config.recentlyZonesMaxLookupLength > 0)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
@@ -1094,13 +1008,15 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
int start = forBar.Index() + 1;
|
||||
int end = start + config.recentlyTestedZonesMaxLookup;
|
||||
for (int i = start; i < end; i++) {
|
||||
int start = forBar.Index();
|
||||
int end = start + config.recentlyZonesMaxLookupLength;
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
// Initialize Indexed Bar ...
|
||||
has = forBar.BarAt(i, iBar);
|
||||
if (!has) {
|
||||
if (!has)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1111,129 +1027,114 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
// Supports ...
|
||||
idx = GetYoungestBefore(iBar.time, supports);
|
||||
has = IsValidIndex(idx);
|
||||
if (has) {
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Check Testing ...
|
||||
has = IsTested(iBar, supports[idx]);
|
||||
if (has) {
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
supports[idx],
|
||||
structure.recentlyTestedZones //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Check Breaked ...
|
||||
has = IsBreaked(iBar, supports[idx]);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
supports[idx],
|
||||
structure.recentlyBreakedZones //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Resistances ...
|
||||
idx = GetYoungestBefore(iBar.time, resistances);
|
||||
has = IsValidIndex(idx);
|
||||
if (has) {
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Check Testing ...
|
||||
has = IsTested(iBar, resistances[idx]);
|
||||
if (has) {
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
resistances[idx],
|
||||
structure.recentlyTestedZones //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Check Breaked ...
|
||||
has = IsBreaked(iBar, resistances[idx]);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
resistances[idx],
|
||||
structure.recentlyBreakedZones //
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Checkup for FakeBreaked Zones ...
|
||||
if (config.detectSupport ||
|
||||
config.detectResistance)
|
||||
if ((config.detectSupport ||
|
||||
config.detectResistance) &&
|
||||
HasChild(structure.recentlyBreakedZones))
|
||||
{
|
||||
//
|
||||
// Retrieve Previous Bar ...
|
||||
int idx = -1;
|
||||
XOHCL pForBar;
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
// Detect Youngest Recently Breaked Zones ...
|
||||
idx = GetYoungest(structure.recentlyBreakedZones);
|
||||
has = IsValidIndex(idx);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.fakeBreakedZone = structure.recentlyBreakedZones[idx];
|
||||
|
||||
//
|
||||
// Update To Time ...
|
||||
structure.fakeBreakedZone.to = forBar.time;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Price Going Back to Zone Area ...
|
||||
has = structure.fakeBreakedZone.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Check Current Bar Acted Based on Zone ...
|
||||
has = structure.fakeBreakedZone.IsBullish()
|
||||
? forBar.close > structure.fakeBreakedZone.upper
|
||||
: forBar.close < structure.fakeBreakedZone.lower;
|
||||
}
|
||||
|
||||
//
|
||||
// Try to Validate Breake Length ...
|
||||
|
||||
//
|
||||
// Get Youngest Breaker Bar ...
|
||||
XOHCL breakerBar;
|
||||
XBoxZone pSupport;
|
||||
XOHCL pBreakerBar;
|
||||
XBoxZone pResistance;
|
||||
|
||||
//
|
||||
// Selecting Previously Touched Support / Resistance ...
|
||||
has = forBar.GetPreviousBar(pForBar);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Detecting Nearest Above Lows Support ...
|
||||
idx = GetYoungestAbove(
|
||||
pForBar.low,
|
||||
supports //
|
||||
);
|
||||
has = IsValidIndex(idx) &&
|
||||
IsBreaked(
|
||||
forBar,
|
||||
supports[idx] //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
pSupport = supports[idx];
|
||||
}
|
||||
|
||||
//
|
||||
// Detecting Nearest Below Highs Resistance ...
|
||||
idx = GetYoungestBelow(
|
||||
pForBar.high,
|
||||
resistances //
|
||||
);
|
||||
has = IsValidIndex(idx) &&
|
||||
IsBreaked(
|
||||
forBar,
|
||||
resistances[idx] //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
pResistance = resistances[idx];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check at least a zone Exists ...
|
||||
// Selecting pTestedZone ...
|
||||
has = pSupport.IsValid() ||
|
||||
pResistance.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Support ...
|
||||
has = pSupport.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = true;
|
||||
structure.pTestedZone = pSupport;
|
||||
}
|
||||
|
||||
//
|
||||
// Resistance ...
|
||||
has = pResistance.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = true;
|
||||
structure.pTestedZone = pResistance;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check pTestedZone Existance ...
|
||||
has = structure.isPTest &&
|
||||
structure.pTestedZone.IsValid();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Get Breaker Bars ...
|
||||
XOHCL breakerBars[];
|
||||
int breakerBarsCount = GetBreakerBars(
|
||||
structure.pTestedZone,
|
||||
structure.fakeBreakedZone,
|
||||
breakerBars //
|
||||
);
|
||||
has = IsValidSize(breakerBarsCount);
|
||||
@@ -1247,36 +1148,381 @@ class XCXFIMAPOIDetector : public XCMarketPatternDetector
|
||||
breakerBar = breakerBars[idx];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
SpecifiedClean(breakerBars);
|
||||
}
|
||||
has = breakerBar.IsValid();
|
||||
|
||||
//
|
||||
// Check Zone Breaker Bar Exists ...
|
||||
// Validate Zone Fake Breake Langth ...
|
||||
has = breakerBar.IsValid();
|
||||
// Validate BreakerBars Length ...
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Validate Breake Length ...
|
||||
has = (breakerBar.Index() - pForBar.Index()) <= config.supportAndResistanceBreakeValidationLength;
|
||||
int diff = breakerBar.Index() - forBar.Index();
|
||||
|
||||
//
|
||||
has =
|
||||
config.supportAndResistanceBreakeValidationLength <= 0
|
||||
? true
|
||||
: diff <= config.supportAndResistanceBreakeValidationLength;
|
||||
}
|
||||
|
||||
//
|
||||
if (!has)
|
||||
{
|
||||
structure.fakeBreakedZone.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
breakerBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Recently Patterns ...
|
||||
if (config.recentlyPatternsMaxLookupLength > 0)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
XPivot iPivot;
|
||||
XBoxZone iBox;
|
||||
bool has = false;
|
||||
string iPrefix = NULL;
|
||||
int start = forBar.Index();
|
||||
ENUM_X_SORT_BY iSortBy = X_SORT_BY_DATE;
|
||||
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
|
||||
ENUM_X_DIRECTION iSortDir = X_DIRECTION_BULLISH;
|
||||
int end = start + config.recentlyPatternsMaxLookupLength;
|
||||
|
||||
//
|
||||
// Order Blocks ...
|
||||
if (config.detectOB)
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
obs,
|
||||
structure.obs //
|
||||
);
|
||||
Sort(
|
||||
structure.obs,
|
||||
iSortBy,
|
||||
iSortDir,
|
||||
config.recentlyPatternsMaxAllowedCollecting //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Fair Value Gaps ...
|
||||
if (config.detectFVG)
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
fvgs,
|
||||
structure.fvgs //
|
||||
);
|
||||
Sort(
|
||||
structure.fvgs,
|
||||
iSortBy,
|
||||
iSortDir,
|
||||
config.recentlyPatternsMaxAllowedCollecting //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Loop through Items ...
|
||||
for (int i = start; i < end; i++)
|
||||
{
|
||||
//
|
||||
iPivot.Clean();
|
||||
|
||||
//
|
||||
// Initialize Indexed Bar ...
|
||||
has = forBar.BarAt(i, iBar);
|
||||
if (!has)
|
||||
{
|
||||
//
|
||||
structure.isPTest = false;
|
||||
structure.pTestedZone.Clean();
|
||||
iBar.Clean();
|
||||
continue;
|
||||
}
|
||||
pForBar.Clean();
|
||||
pSupport.Clean();
|
||||
breakerBar.Clean();
|
||||
pBreakerBar.Clean();
|
||||
pResistance.Clean();
|
||||
|
||||
//
|
||||
// Bars Detecting ...
|
||||
|
||||
//
|
||||
// Momentum Bars ...
|
||||
if (config.detectMomentum)
|
||||
{
|
||||
//
|
||||
iPrefix = "MomentumBar";
|
||||
has = IsMomentumBar(
|
||||
iBar,
|
||||
iDir,
|
||||
config.momentumBarRangeLength,
|
||||
config.momentumBarApprovedMultiplier //
|
||||
);
|
||||
has = has &&
|
||||
ToPivot(
|
||||
iBar,
|
||||
iPivot,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iPivot,
|
||||
structure.momentumBars //
|
||||
);
|
||||
}
|
||||
iPivot.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Engulfed Bars ...
|
||||
if (config.detectEngulfed)
|
||||
{
|
||||
//
|
||||
iPrefix = "EngulfedBar";
|
||||
has = IsEngulfedBar(
|
||||
iBar,
|
||||
iDir //
|
||||
);
|
||||
has = has &&
|
||||
ToPivot(
|
||||
iBar,
|
||||
iPivot,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iPivot,
|
||||
structure.engulfBars //
|
||||
);
|
||||
}
|
||||
iPivot.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// TruGaped Bars ...
|
||||
if (config.detectTrueGaped)
|
||||
{
|
||||
//
|
||||
iPrefix = "TruGapedBar";
|
||||
has = IsTrueGapedBar(
|
||||
forBar,
|
||||
iDir,
|
||||
config.truwGapApprovedPointMultiplier //
|
||||
);
|
||||
has = has &&
|
||||
ToPivot(
|
||||
iBar,
|
||||
iPivot,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iPivot,
|
||||
structure.trueGapBars //
|
||||
);
|
||||
}
|
||||
iPivot.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Pin Bars ...
|
||||
if (config.detectTrueGaped)
|
||||
{
|
||||
//
|
||||
iPrefix = "PinBar";
|
||||
has = IsPinnedBar(
|
||||
forBar,
|
||||
iDir,
|
||||
config.pinnedBaarShadowApprovedMultiplier,
|
||||
config.pinnedBarMinimumPinBarRangeMultiplier,
|
||||
config.pinnedBarForceDirection //
|
||||
);
|
||||
has = has &&
|
||||
ToPivot(
|
||||
iBar,
|
||||
iPivot,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iPivot,
|
||||
structure.pinBars //
|
||||
);
|
||||
}
|
||||
iPivot.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Patterns Detecting ...
|
||||
|
||||
//
|
||||
// Star Pattern ...
|
||||
if (config.detectStarPattern)
|
||||
{
|
||||
//
|
||||
iPrefix = "Star";
|
||||
has = IsStartPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
has = has &&
|
||||
ToBox(
|
||||
forBar,
|
||||
iBox,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBox,
|
||||
structure.starPatterns //
|
||||
);
|
||||
}
|
||||
iBox.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Piercing Pattern ...
|
||||
if (config.detectPiercingPattern)
|
||||
{
|
||||
//
|
||||
iPrefix = "Piercing";
|
||||
has = IsPiercingPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
has = has &&
|
||||
ToBox(
|
||||
forBar,
|
||||
iBox,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBox,
|
||||
structure.piercingPatterns //
|
||||
);
|
||||
}
|
||||
iBox.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Rising Pattern ...
|
||||
if (config.detectRisingPattern)
|
||||
{
|
||||
//
|
||||
iPrefix = "Rising";
|
||||
has = IsRisingPattern(
|
||||
forBar,
|
||||
iDir //
|
||||
);
|
||||
has = has &&
|
||||
ToBox(
|
||||
forBar,
|
||||
iBox,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBox,
|
||||
structure.risingPatterns //
|
||||
);
|
||||
}
|
||||
iBox.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Flag Pattern ...
|
||||
if (config.detectFlagPattern)
|
||||
{
|
||||
//
|
||||
iPrefix = "Flag";
|
||||
XOHCL swingBar;
|
||||
has = IsFlagPattern(
|
||||
forBar,
|
||||
iDir,
|
||||
swingBar,
|
||||
config.flagPatternMinimumPullbackBars //
|
||||
);
|
||||
has = has &&
|
||||
ToBox(
|
||||
forBar,
|
||||
iBox,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBox,
|
||||
structure.flagPatterns //
|
||||
);
|
||||
}
|
||||
iBox.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// SignalKey Bar Pattern ...
|
||||
if (config.detectSignalKeyBarPattern)
|
||||
{
|
||||
//
|
||||
iPrefix = "SignalKeyBar";
|
||||
has = IsSignalKeyBarPattern(
|
||||
forBar,
|
||||
iDir,
|
||||
config.signalKeyBarShadowApprovedMultiplier,
|
||||
config.signalKeyBarMinimumPinBarRangeMultiplier,
|
||||
config.signalKeyBarForceDirection //
|
||||
);
|
||||
has = has &&
|
||||
ToBox(
|
||||
forBar,
|
||||
iBox,
|
||||
iDir,
|
||||
iPrefix //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
AddIfNotExists(
|
||||
iBox,
|
||||
structure.signalKeyBarPatterns //
|
||||
);
|
||||
}
|
||||
iBox.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
iBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
iBar.Clean();
|
||||
iBox.Clean();
|
||||
iPivot.Clean();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,22 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
//
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Tested Zones ...
|
||||
color testedBullishColor;
|
||||
color testedBearishColor;
|
||||
|
||||
//
|
||||
// Breaked Zones ...
|
||||
color breakedBullishColor;
|
||||
color breakedBearishColor;
|
||||
|
||||
//
|
||||
// FakeBreaked Zones ...
|
||||
color fakeBreakedBullishColor;
|
||||
color fakeBreakedBearishColor;
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
@@ -75,6 +91,16 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
//
|
||||
boxBullishStyle = defaultBullishStyle;
|
||||
boxBearishStyle = defaultBearishStyle;
|
||||
|
||||
//
|
||||
testedBullishColor = clrLime;
|
||||
breakedBullishColor = clrGreen;
|
||||
fakeBreakedBullishColor = clrYellow;
|
||||
|
||||
//
|
||||
testedBearishColor = clrRed;
|
||||
breakedBearishColor = clrDarkRed;
|
||||
fakeBreakedBearishColor = clrDarkOrange;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -161,6 +187,135 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Tested Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetTestedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? testedBullishColor
|
||||
: testedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Breaked Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetBreakedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? breakedBullishColor
|
||||
: breakedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Fake Breaked Zone Style ...
|
||||
*
|
||||
* @param style: reference to hold result ...
|
||||
* @param zone: Specified Zone ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool GetFakeBreakedStyle(
|
||||
XPOIStyle &style,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
style.Clean();
|
||||
|
||||
//
|
||||
result = zone.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
GetBoxStyle(
|
||||
style,
|
||||
zone.dir //
|
||||
);
|
||||
|
||||
//
|
||||
style.width = 3;
|
||||
style.clr =
|
||||
zone.IsBullish()
|
||||
? fakeBreakedBullishColor
|
||||
: fakeBreakedBearishColor;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill Arrow Based Drawing Specs ...
|
||||
*
|
||||
@@ -199,6 +354,102 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Tested Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyTestedStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetTestedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Breaked Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyBreakedStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetBreakedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply Tested Style ...
|
||||
*
|
||||
* @param object: reference pointer to Object ...
|
||||
* @param zone: reference to Zone ...
|
||||
*/
|
||||
void ApplyFakeBreakStyle(
|
||||
XCBoxObject *&object,
|
||||
XBoxZone &zone //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!zone.IsValid() ||
|
||||
object == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
XPOIStyle style;
|
||||
if (!GetFakeBreakedStyle(style, zone))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
ApplyBoxStyle(
|
||||
object,
|
||||
style //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw Specified Market Structure Based on Given Configs ...
|
||||
*
|
||||
@@ -229,6 +480,7 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
objects.Clear();
|
||||
|
||||
//
|
||||
int count = 0;
|
||||
bool has = false;
|
||||
int arrowCode = -1;
|
||||
int arrowWidth = 3;
|
||||
@@ -729,6 +981,8 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
has = DrawPivotAnalysis(
|
||||
structure.pvAnalysis,
|
||||
iObj,
|
||||
config.drawFIMAPVPivotsAnalysisTrends,
|
||||
config.drawFIMAPVPivotsAnalysisZones,
|
||||
config.drawFIMAPVPivotsAnalysisPivots,
|
||||
bearArrowCode,
|
||||
bullArrowCode //
|
||||
@@ -754,6 +1008,8 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
has = DrawPivotAnalysis(
|
||||
structure.pvAnalysis,
|
||||
iObj,
|
||||
config.drawFIMAMAPivotsAnalysisTrends,
|
||||
config.drawFIMAMAPivotsAnalysisZones,
|
||||
config.drawFIMAMAPivotsAnalysisPivots,
|
||||
bearArrowCode,
|
||||
bullArrowCode //
|
||||
@@ -779,6 +1035,8 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
has = DrawPivotAnalysis(
|
||||
structure.pvAnalysis,
|
||||
iObj,
|
||||
config.drawFIMASARPivotsAnalysisTrends,
|
||||
config.drawFIMASARPivotsAnalysisZones,
|
||||
config.drawFIMASARPivotsAnalysisPivots,
|
||||
bearArrowCode,
|
||||
bullArrowCode //
|
||||
@@ -804,6 +1062,8 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
has = DrawPivotAnalysis(
|
||||
structure.pvAnalysis,
|
||||
iObj,
|
||||
config.drawFIMAZigZagPivotsAnalysisTrends,
|
||||
config.drawFIMAZigZagPivotsAnalysisZones,
|
||||
config.drawFIMAZigZagPivotsAnalysisPivots,
|
||||
bearArrowCode,
|
||||
bullArrowCode //
|
||||
@@ -815,6 +1075,186 @@ class XCXFIMAPOIDrawer : public XCPOIDrawer
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Fake Breaked Zone ...
|
||||
if (config.drawFakeBreakedZone &&
|
||||
structure.fakeBreakedZone.IsValid())
|
||||
{
|
||||
//
|
||||
XCBoxObject *iObj;
|
||||
has = DrawBox(
|
||||
structure.fakeBreakedZone,
|
||||
iObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
// Apply Style ...
|
||||
ApplyFakeBreakStyle(
|
||||
iObj,
|
||||
structure.fakeBreakedZone //
|
||||
);
|
||||
|
||||
//
|
||||
objects.Add(iObj);
|
||||
}
|
||||
|
||||
//
|
||||
ZeroMemory(iObj);
|
||||
}
|
||||
|
||||
//
|
||||
// Recently Tested Zones ...
|
||||
if (config.drawRecentlyTestedZones &&
|
||||
HasChild(structure.recentlyTestedZones))
|
||||
{
|
||||
//
|
||||
XCBoxObject *iObj;
|
||||
count = ArraySize(structure.recentlyTestedZones);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
// Draw Box ...
|
||||
has = DrawBox(
|
||||
structure.recentlyTestedZones[i],
|
||||
iObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
ApplyTestedStyle(
|
||||
iObj,
|
||||
structure.recentlyTestedZones[i] //
|
||||
);
|
||||
|
||||
//
|
||||
objects.Add(iObj);
|
||||
}
|
||||
|
||||
//
|
||||
ZeroMemory(iObj);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Recently Breaked Zones ...
|
||||
if (config.drawRecentlyBreakedZones &&
|
||||
HasChild(structure.recentlyBreakedZones))
|
||||
{
|
||||
//
|
||||
XCBoxObject *iObj;
|
||||
count = ArraySize(structure.recentlyBreakedZones);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
// Draw Box ...
|
||||
has = DrawBox(
|
||||
structure.recentlyBreakedZones[i],
|
||||
iObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
ApplyBreakedStyle(
|
||||
iObj,
|
||||
structure.recentlyBreakedZones[i] //
|
||||
);
|
||||
|
||||
//
|
||||
objects.Add(iObj);
|
||||
}
|
||||
|
||||
//
|
||||
ZeroMemory(iObj);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Draw Recent Patterns ...
|
||||
if (config.drawRecentPatterns)
|
||||
{
|
||||
//
|
||||
// Pin Bars ...
|
||||
if (config.drawPinned &&
|
||||
HasChild(structure.pinBars))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Engulf Bars ...
|
||||
if (config.drawEngulfed &&
|
||||
HasChild(structure.engulfBars))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// TrueGap Bars ...
|
||||
if (config.drawTrueGaped &&
|
||||
HasChild(structure.trueGapBars))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// TrueGap Bars ...
|
||||
if (config.drawMomentum &&
|
||||
HasChild(structure.momentumBars))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Flag Pattern ...
|
||||
if (config.drawFlagPattern &&
|
||||
HasChild(structure.flagPatterns))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Star Pattern ...
|
||||
if (config.drawStarPattern &&
|
||||
HasChild(structure.starPatterns))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Rising Pattern ...
|
||||
if (config.drawRisingPattern &&
|
||||
HasChild(structure.risingPatterns))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// Piercing Pattern ...
|
||||
if (config.drawPiercingPattern &&
|
||||
HasChild(structure.piercingPatterns))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
|
||||
//
|
||||
// SignalKeyBar Pattern ...
|
||||
if (config.drawSignalKeyBarPattern &&
|
||||
HasChild(structure.signalKeyBarPatterns))
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = objects.Total();
|
||||
|
||||
|
||||
@@ -83,9 +83,13 @@ struct XFIMAPatternDetectorConfig
|
||||
int trendingNumberOfSwings;
|
||||
int trendingSwingShoulders;
|
||||
|
||||
//
|
||||
int recentlyPatternsMaxLookupLength;
|
||||
int recentlyPatternsMaxAllowedCollecting;
|
||||
|
||||
//
|
||||
// Support and Resistance ...
|
||||
int recentlyTestedZonesMaxLookup;
|
||||
int recentlyZonesMaxLookupLength;
|
||||
int supportAndResistanceValidationLength;
|
||||
int minAllowdSupportAndResistanceStrength;
|
||||
int supportAndResistanceMaxAllowedLoopback;
|
||||
@@ -163,7 +167,9 @@ struct XFIMAPatternDetectorConfig
|
||||
fvgLoopback = 0;
|
||||
trendingNumberOfSwings = 0;
|
||||
trendingSwingShoulders = 0;
|
||||
recentlyTestedZonesMaxLookup = 0;
|
||||
recentlyZonesMaxLookupLength = 0;
|
||||
recentlyPatternsMaxLookupLength = 0;
|
||||
recentlyPatternsMaxAllowedCollecting = 0;
|
||||
supportAndResistanceValidationLength = 0;
|
||||
minAllowdSupportAndResistanceStrength = 0;
|
||||
supportAndResistanceMaxAllowedLoopback = 0;
|
||||
@@ -237,11 +243,13 @@ struct XFIMAPatternDetectorConfig
|
||||
|
||||
//
|
||||
// Support and Resistance ...
|
||||
recentlyTestedZonesMaxLookup = 100;
|
||||
recentlyZonesMaxLookupLength = 100;
|
||||
recentlyPatternsMaxLookupLength = 50;
|
||||
recentlyPatternsMaxAllowedCollecting = 20;
|
||||
supportAndResistanceValidationLength = 100;
|
||||
minAllowdSupportAndResistanceStrength = 1;
|
||||
supportAndResistanceMaxAllowedLoopback = 1500;
|
||||
supportAndResistanceBreakeValidationLength = 3;
|
||||
supportAndResistanceBreakeValidationLength = 4;
|
||||
|
||||
//
|
||||
// TrueGap ...
|
||||
@@ -372,25 +380,33 @@ struct XFIMAMarketStructure
|
||||
XBoxZone support;
|
||||
XBoxZone resistance;
|
||||
|
||||
//
|
||||
XBoxZone obs[];
|
||||
XBoxZone fvgs[];
|
||||
|
||||
//
|
||||
XPivot pinBars[];
|
||||
XPivot engulfBars[];
|
||||
XPivot trueGapBars[];
|
||||
XPivot momentumBars[];
|
||||
|
||||
//
|
||||
XBoxZone flagPatterns[];
|
||||
XBoxZone starPatterns[];
|
||||
XBoxZone risingPatterns[];
|
||||
XBoxZone piercingPatterns[];
|
||||
XBoxZone signalKeyBarPatterns[];
|
||||
|
||||
//
|
||||
// Previous Support or Resistance based on current ...
|
||||
//
|
||||
// Current Support is Touched => Prev Support;
|
||||
// Current Resistance is Touched => Prev Resistance;
|
||||
XBoxZone prevZone;
|
||||
XBoxZone fakeBreakedZone;
|
||||
|
||||
//
|
||||
bool isOBTouched;
|
||||
bool isFVGTouched;
|
||||
bool isSupportTouched;
|
||||
bool isResistanceTouched;
|
||||
|
||||
//
|
||||
// TODO: For Test ...
|
||||
bool isPTest;
|
||||
XOHCL pBreakerBar;
|
||||
XBoxZone pTestedZone;
|
||||
XBoxZone recentlyTestedZones[];
|
||||
XBoxZone recentlyBreakedZones[];
|
||||
|
||||
//
|
||||
// Analysis ...
|
||||
@@ -441,13 +457,7 @@ struct XFIMAMarketStructure
|
||||
resistance.Clean();
|
||||
|
||||
//
|
||||
isOBTouched = false;
|
||||
isFVGTouched = false;
|
||||
isSupportTouched = false;
|
||||
isResistanceTouched = false;
|
||||
|
||||
//
|
||||
prevZone.Clean();
|
||||
fakeBreakedZone.Clean();
|
||||
|
||||
//
|
||||
bar.Clean();
|
||||
@@ -471,9 +481,23 @@ struct XFIMAMarketStructure
|
||||
piercingPatternDir = X_DIRECTION_NONE;
|
||||
signalKeyBarPatternDir = X_DIRECTION_NONE;
|
||||
|
||||
//
|
||||
SpecifiedClean(obs);
|
||||
SpecifiedClean(fvgs);
|
||||
SpecifiedClean(pinBars);
|
||||
SpecifiedClean(engulfBars);
|
||||
SpecifiedClean(trueGapBars);
|
||||
SpecifiedClean(momentumBars);
|
||||
SpecifiedClean(flagPatterns);
|
||||
SpecifiedClean(starPatterns);
|
||||
SpecifiedClean(risingPatterns);
|
||||
SpecifiedClean(piercingPatterns);
|
||||
SpecifiedClean(signalKeyBarPatterns);
|
||||
|
||||
//
|
||||
SpecifiedClean(trendSwings);
|
||||
SpecifiedClean(recentlyTestedZones);
|
||||
SpecifiedClean(recentlyBreakedZones);
|
||||
|
||||
//
|
||||
ZeroMemory(this);
|
||||
@@ -494,17 +518,26 @@ struct XFIMAMarketStructureDrawerConfig
|
||||
// Props ...
|
||||
|
||||
//
|
||||
bool drawSupports;
|
||||
bool drawResistance;
|
||||
bool drawOB; // Current Order Block ...
|
||||
bool drawFVG; // Current Fair Value Gap ...
|
||||
|
||||
//
|
||||
bool drawSwingTrend;
|
||||
bool swingTrendRayLeft;
|
||||
bool swingTrendRayRight;
|
||||
bool drawSupports; // Detected Supports ...
|
||||
bool drawResistance; // Detected Resistances ...
|
||||
|
||||
//
|
||||
bool drawOB;
|
||||
bool drawFVG;
|
||||
bool drawSwingTrend; // Swing Trend ...
|
||||
bool swingTrendRayLeft; // Ray Left Swing Trend ...
|
||||
bool swingTrendRayRight; // Ray Right Swing Trend ...
|
||||
|
||||
//
|
||||
// Draw Current Detected Patterns ...
|
||||
|
||||
//
|
||||
bool drawPinned;
|
||||
bool drawMomentum;
|
||||
bool drawEngulfed;
|
||||
bool drawTrueGaped;
|
||||
|
||||
//
|
||||
bool drawStarPattern;
|
||||
@@ -514,25 +547,41 @@ struct XFIMAMarketStructureDrawerConfig
|
||||
bool drawSignalKeyBarPattern;
|
||||
|
||||
//
|
||||
bool drawPinned;
|
||||
bool drawMomentum;
|
||||
bool drawEngulfed;
|
||||
bool drawTrueGaped;
|
||||
// Draw Recently Zones ...
|
||||
bool drawRecentPatterns;
|
||||
bool drawFakeBreakedZone;
|
||||
bool drawRecentlyTestedZones;
|
||||
bool drawRecentlyBreakedZones;
|
||||
|
||||
//
|
||||
// Draw Analysis Pivots ...
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
bool drawFIMAPVPivotsAnalysis;
|
||||
bool drawFIMAPVPivotsAnalysisZones;
|
||||
bool drawFIMAPVPivotsAnalysisTrends;
|
||||
bool drawFIMAPVPivotsAnalysisPivots;
|
||||
|
||||
//
|
||||
// XMA ...
|
||||
bool drawFIMAMAPivotsAnalysis;
|
||||
bool drawFIMAMAPivotsAnalysisZones;
|
||||
bool drawFIMAMAPivotsAnalysisTrends;
|
||||
bool drawFIMAMAPivotsAnalysisPivots;
|
||||
|
||||
//
|
||||
// XSAR ...
|
||||
bool drawFIMASARPivotsAnalysis;
|
||||
bool drawFIMASARPivotsAnalysisZones;
|
||||
bool drawFIMASARPivotsAnalysisTrends;
|
||||
bool drawFIMASARPivotsAnalysisPivots;
|
||||
|
||||
//
|
||||
// XZIGZAG ...
|
||||
bool drawFIMAZigZagPivotsAnalysis;
|
||||
bool drawFIMAZigZagPivotsAnalysisZones;
|
||||
bool drawFIMAZigZagPivotsAnalysisTrends;
|
||||
bool drawFIMAZigZagPivotsAnalysisPivots;
|
||||
|
||||
//
|
||||
@@ -567,13 +616,35 @@ struct XFIMAMarketStructureDrawerConfig
|
||||
swingTrendRayRight = false;
|
||||
drawPiercingPattern = false;
|
||||
drawSignalKeyBarPattern = false;
|
||||
|
||||
//
|
||||
drawRecentPatterns = false;
|
||||
drawFakeBreakedZone = false;
|
||||
drawRecentlyTestedZones = false;
|
||||
drawRecentlyBreakedZones = false;
|
||||
|
||||
//
|
||||
drawFIMAPVPivotsAnalysis = false;
|
||||
drawFIMAMAPivotsAnalysis = false;
|
||||
drawFIMASARPivotsAnalysis = false;
|
||||
drawFIMAZigZagPivotsAnalysis = false;
|
||||
drawFIMAPVPivotsAnalysisZones = false;
|
||||
drawFIMAPVPivotsAnalysisTrends = false;
|
||||
drawFIMAPVPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
drawFIMAMAPivotsAnalysis = false;
|
||||
drawFIMAMAPivotsAnalysisZones = false;
|
||||
drawFIMAMAPivotsAnalysisTrends = false;
|
||||
drawFIMAMAPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
drawFIMASARPivotsAnalysis = false;
|
||||
drawFIMASARPivotsAnalysisZones = false;
|
||||
drawFIMASARPivotsAnalysisTrends = false;
|
||||
drawFIMASARPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
drawFIMAZigZagPivotsAnalysis = false;
|
||||
drawFIMAZigZagPivotsAnalysisZones = false;
|
||||
drawFIMAZigZagPivotsAnalysisTrends = false;
|
||||
drawFIMAZigZagPivotsAnalysisPivots = false;
|
||||
|
||||
//
|
||||
@@ -601,14 +672,36 @@ struct XFIMAMarketStructureDrawerConfig
|
||||
swingTrendRayLeft = false;
|
||||
swingTrendRayRight = true;
|
||||
drawSignalKeyBarPattern = true;
|
||||
|
||||
//
|
||||
drawRecentPatterns = true;
|
||||
drawFakeBreakedZone = true;
|
||||
drawRecentlyTestedZones = true;
|
||||
drawRecentlyBreakedZones = true;
|
||||
|
||||
//
|
||||
drawFIMAPVPivotsAnalysis = true;
|
||||
drawFIMAPVPivotsAnalysisZones = true;
|
||||
drawFIMAPVPivotsAnalysisTrends = true;
|
||||
drawFIMAPVPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMAMAPivotsAnalysis = true;
|
||||
drawFIMAMAPivotsAnalysisZones = true;
|
||||
drawFIMAMAPivotsAnalysisTrends = true;
|
||||
drawFIMAMAPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMASARPivotsAnalysis = true;
|
||||
drawFIMASARPivotsAnalysisZones = true;
|
||||
drawFIMASARPivotsAnalysisTrends = true;
|
||||
drawFIMASARPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMAZigZagPivotsAnalysis = true;
|
||||
drawFIMAPVPivotsAnalysisPivots = false;
|
||||
drawFIMAMAPivotsAnalysisPivots = false;
|
||||
drawFIMASARPivotsAnalysisPivots = false;
|
||||
drawFIMAZigZagPivotsAnalysisPivots = false;
|
||||
drawFIMAZigZagPivotsAnalysisZones = true;
|
||||
drawFIMAZigZagPivotsAnalysisTrends = true;
|
||||
drawFIMAZigZagPivotsAnalysisPivots = true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -636,13 +729,35 @@ struct XFIMAMarketStructureDrawerConfig
|
||||
swingTrendRayRight = true;
|
||||
drawPiercingPattern = true;
|
||||
drawSignalKeyBarPattern = true;
|
||||
|
||||
//
|
||||
drawRecentPatterns = true;
|
||||
drawFakeBreakedZone = true;
|
||||
drawRecentlyTestedZones = true;
|
||||
drawRecentlyBreakedZones = true;
|
||||
|
||||
//
|
||||
drawFIMAPVPivotsAnalysis = true;
|
||||
drawFIMAMAPivotsAnalysis = true;
|
||||
drawFIMASARPivotsAnalysis = true;
|
||||
drawFIMAZigZagPivotsAnalysis = true;
|
||||
drawFIMAPVPivotsAnalysisZones = true;
|
||||
drawFIMAPVPivotsAnalysisTrends = true;
|
||||
drawFIMAPVPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMAMAPivotsAnalysis = true;
|
||||
drawFIMAMAPivotsAnalysisZones = true;
|
||||
drawFIMAMAPivotsAnalysisTrends = true;
|
||||
drawFIMAMAPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMASARPivotsAnalysis = true;
|
||||
drawFIMASARPivotsAnalysisZones = true;
|
||||
drawFIMASARPivotsAnalysisTrends = true;
|
||||
drawFIMASARPivotsAnalysisPivots = true;
|
||||
|
||||
//
|
||||
drawFIMAZigZagPivotsAnalysis = true;
|
||||
drawFIMAZigZagPivotsAnalysisZones = true;
|
||||
drawFIMAZigZagPivotsAnalysisTrends = true;
|
||||
drawFIMAZigZagPivotsAnalysisPivots = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user