Files
MQL5Data/XFIMAEA/Classes/x-saherelm.xfima.x-poi.drawer.class.mq5
T
2025-09-24 16:25:07 +03:30

828 lines
21 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class
// -------------------------------------------------
// Name: XCXFIMAPoiDrawer ...
// Description: XFIMA POI Drawer Class ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XFIMA POI Drawer Class"
#property strict
//
// Imports ...
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
#include "../Libraries/x-saherelm.xfima.lib.mq5"
//
// Implementation ...
class XCXFIMAPOIDrawer : public XCPOIDrawer
{
//
public:
//
//
// Constructor ...
XCXFIMAPOIDrawer() : XCPOIDrawer()
{
Default();
}
//
// Deconstructor ...
~XCXFIMAPOIDrawer()
{
}
//
// Overrides ...
/**
* Do additional Configurations for Child Classes ...
*/
void virtual Default() override
{
//
// Apply Default Props ...
//
Prefix(NULL);
ChartIdentification(0);
SubWindowIdentification(0);
//
defaultBullishStyle.width = 1;
defaultBullishStyle.clr = clrAqua;
defaultBullishStyle.style = STYLE_SOLID;
//
defaultBearishStyle.width = 1;
defaultBearishStyle.clr = clrMagenta;
defaultBearishStyle.style = STYLE_SOLID;
//
boxBullishStyle = defaultBullishStyle;
boxBearishStyle = defaultBearishStyle;
}
//
// Get Specified Directional Arrow Anchor ...
ENUM_ARROW_ANCHOR GetArrowAnchor(ENUM_X_DIRECTION forDir)
{
//
ENUM_ARROW_ANCHOR result = ANCHOR_BOTTOM;
//
if (HasDirection(forDir))
{
//
result =
IsSpecifiedBullish(forDir)
? ANCHOR_TOP
: ANCHOR_BOTTOM;
}
//
return result;
}
//
// Get Specified Directional Arrow Code ...
int GetArrowCode(ENUM_X_DIRECTION forDir)
{
//
int result = 159;
//
if (HasDirection(forDir))
{
//
result =
IsSpecifiedBullish(forDir)
? 233
: 234;
}
//
return result;
}
//
// Get Specified Directional Arrow Code ...
color GetArrowColor(ENUM_X_DIRECTION forDir)
{
//
color result = clrYellow;
//
if (HasDirection(forDir))
{
//
result =
IsSpecifiedBullish(forDir)
? clrAqua
: clrMagenta;
}
//
return result;
}
//
// Get Specified Directional Arrow Price Type ...
ENUM_X_PRICE GetArrowPriceType(ENUM_X_DIRECTION forDir)
{
//
ENUM_X_PRICE result = X_PRICE_CLOSE;
//
if (HasDirection(forDir))
{
//
result =
IsSpecifiedBullish(forDir)
? X_PRICE_LOW
: X_PRICE_HIGH;
}
//
return result;
}
/**
* Fill Arrow Based Drawing Specs ...
*
* @param forDir: Specified Direction ...
* @param arrowPriceType: ENUM_X_PRICE, refrence for Arrow Price ...
* @param arrowCode: int, reference for Arrow Code ...
* @param arrowWidth: int, reference for Arrow Width ...
* @param arrowColor: color, reference for Arrow Color ...
* @param arrowAnchor: ENUM_ARROW_ANCHOR, reference for Arrow Anchor ...
*/
void FillArrowSpecs(
ENUM_X_DIRECTION forDir,
ENUM_X_PRICE &arrowPriceType,
int &arrowCode,
int &arrowWidth,
color &arrowColor,
ENUM_ARROW_ANCHOR &arrowAnchor //
)
{
//
// Prepare ...
arrowCode = 159;
arrowWidth = 3;
arrowColor = CLR_NONE;
arrowAnchor = ANCHOR_BOTTOM;
arrowPriceType = X_PRICE_CLOSE;
//
if (HasDirection(forDir))
{
//
arrowCode = GetArrowCode(forDir);
arrowColor = GetArrowColor(forDir);
arrowAnchor = GetArrowAnchor(forDir);
arrowPriceType = GetArrowPriceType(forDir);
}
}
/**
* Draw Specified Market Structure Based on Given Configs ...
*
* @param structure: XFIMAMarketStructure, reference to Provide Specifid Market Structure ...
* @param config: XFIMAMarketStructureDrawerConfig, reference to Provide Drawing Configurations ...
* @param objects: CArrayObj, pointer reference to Holds drawn Objects instances ...
*
* @return ( int )
*/
int DrawMarketStructure(
XFIMAMarketStructure &structure,
XFIMAMarketStructureDrawerConfig &config,
CArrayObj *&objects //
)
{
//
int result = 0;
//
// Normalize ...
if (objects == NULL)
{
objects = new CArrayObj();
}
//
// Prepare ...
objects.Clear();
//
bool has = false;
int arrowCode = -1;
int arrowWidth = 3;
string arrowName = NULL;
color arrowColor = CLR_NONE;
ENUM_X_PRICE arrowPriceType = X_PRICE_CLOSE;
ENUM_ARROW_ANCHOR arrowAnchor = ANCHOR_BOTTOM;
//
int bullArrowCode = GetArrowCode(X_DIRECTION_BULLISH);
int bearArrowCode = GetArrowCode(X_DIRECTION_BEARISH);
//
// Validate ...
has = structure.bar.IsValid();
if (!has)
{
return result;
}
//
// Apply Drawing Methods ...
//
// OB ...
if (config.drawOB)
{
//
// Validate ...
has = structure.ob.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.ob,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// FVG ...
if (config.drawFVG)
{
//
// Validate ...
has = structure.fvg.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.fvg,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Support ...
if (config.drawSupports)
{
//
// Validate ...
has = structure.support.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.support,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Resistance ...
if (config.drawResistance)
{
//
// Validate ...
has = structure.resistance.IsValid();
if (has)
{
//
XCBoxObject *iObj;
has = DrawBox(
structure.resistance,
iObj //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Swing Trend ...
if (config.drawSwingTrend)
{
//
// Validate ...
has = HasDirection(structure.trendDir) &&
HasChild(structure.trendSwings);
if (has)
{
//
CChartObjectTrend *iObj;
has = DrawSwingTrend(
structure.trendSwings,
structure.trendDir,
iObj, //
config.swingTrendRayRight, // Ray Right ...
config.swingTrendRayLeft // Ray Left ...
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
}
//
// Start Pattern ...
if (config.drawStarPattern)
{
//
// Validate ...
has = HasDirection(structure.starPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.starPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XStar_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Flag Pattern ...
if (config.drawFlagPattern)
{
//
// Validate ...
has = HasDirection(structure.flagPatternDir) &&
structure.flagSwing.IsValid();
if (has)
{
//
FillArrowSpecs(
structure.flagPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XFlag_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Rising Pattern ...
if (config.drawRisingPattern)
{
//
// Validate ...
has = HasDirection(structure.risingPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.risingPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XRise_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Piercing Pattern ...
if (config.drawPiercingPattern)
{
//
// Validate ...
has = HasDirection(structure.piercingPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.piercingPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XPiercing_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Signal Key Bar Pattern ...
if (config.drawSignalKeyBarPattern)
{
//
// Validate ...
has = HasDirection(structure.signalKeyBarPatternDir);
if (has)
{
//
FillArrowSpecs(
structure.signalKeyBarPatternDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XSignalKey_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Pinned Bar ...
if (config.drawPinned)
{
//
// Validate ...
has = HasDirection(structure.pinnedDir);
if (has)
{
//
FillArrowSpecs(
structure.pinnedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XPin_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Momentum Bar ...
if (config.drawMomentum)
{
//
// Validate ...
has = HasDirection(structure.momentumDir);
if (has)
{
//
FillArrowSpecs(
structure.momentumDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XMomentum_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// Engulfed Bar ...
if (config.drawEngulfed)
{
//
// Validate ...
has = HasDirection(structure.engulfedDir);
if (has)
{
//
FillArrowSpecs(
structure.engulfedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XEngulf_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// True Gaped Bar ...
if (config.drawTrueGaped)
{
//
// Validate ...
has = HasDirection(structure.trueGapedDir);
if (has)
{
//
FillArrowSpecs(
structure.trueGapedDir,
arrowPriceType,
arrowCode,
arrowWidth,
arrowColor,
arrowAnchor //
);
XCBarArrowObject *iObj;
arrowName = "XTrueGap_" + ToMD5(structure.bar.time);
has = DrawBarArrow(
structure.bar,
iObj,
arrowPriceType,
arrowCode,
arrowColor,
arrowWidth,
arrowAnchor,
arrowName //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA PV Analysis ...
if (config.drawFIMAPVPivotsAnalysis)
{
//
// Validate ...
has = structure.pvAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAPVPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA MA Analysis ...
if (config.drawFIMAMAPivotsAnalysis)
{
//
// Validate ...
has = structure.maAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAMAPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA Sar Analysis ...
if (config.drawFIMASARPivotsAnalysis)
{
//
// Validate ...
has = structure.sarAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMASARPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
// XFIMA ZigZag Analysis ...
if (config.drawFIMAZigZagPivotsAnalysis)
{
//
// Validate ...
has = structure.zigzagAnalysis.IsValid();
if (has)
{
//
XCPivotAnalysisObject *iObj;
has = DrawPivotAnalysis(
structure.pvAnalysis,
iObj,
config.drawFIMAZigZagPivotsAnalysisPivots,
bearArrowCode,
bullArrowCode //
);
if (has)
{
objects.Add(iObj);
}
}
}
//
result = objects.Total();
//
return result;
}
//
};
//