Files
MQL5Data/Classes/x-saherelm.x-poi.drawer.class.mq5
T

2678 lines
66 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XPOIDrawer
// Description: Provides Point of Interests
// Drawing Tools ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Imports ...
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Classes/x-saherelm.x-cobject.class.mq5"
#include "../Libraries/x-saherelm.x-pivot.analysis.lib.mq5"
#include "../Libraries/x-saherelm.x-poi.extensions.lib.mq5"
//
// Definitions ...
//
// Implementations ...
class XCPOIDrawer : public XCBase
{
//
public:
//
// Props ...
//
XPOIStyle defaultBullishStyle;
XPOIStyle defaultBearishStyle;
//
XPOIStyle boxBullishStyle;
XPOIStyle boxBearishStyle;
//
CArrayObj drawnObjects;
//
// Constructor ...
void XCPOIDrawer()
{
//
Default();
}
//
// Deconstructor ...
void ~XCPOIDrawer()
{
//
boxBullishStyle.Clean();
boxBearishStyle.Clean();
defaultBullishStyle.Clean();
defaultBearishStyle.Clean();
}
//
// Setter Getter (s) ...
/**
* Get Prefix ...
*
* @return ( string )
*/
string Prefix()
{
return mPrefix;
}
/**
* Set Prifx ...
*
* @param value: String ...
*/
void Prefix(string value)
{
mPrefix = value;
}
/**
* Get Chart ID ...
*
* @return ( long )
*/
long ChartIdentification()
{
return mChartIdentification;
}
/**
* Set Chart ID ...
*
* @param value: Long ...
*/
void ChartIdentification(long value)
{
//
if (value < 0)
{
value = 0;
}
//
mChartIdentification = value;
}
/**
* Get SubWindow Id ...
*
* @return ( int )
*/
int SubWindowIdentification()
{
return mSubWindowIdentification;
}
/**
* Set SubWindow Id ...
*
* @param value: Integer ...
*/
void SubWindowIdentification(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mSubWindowIdentification = value;
}
//
// Virtuals ...
/**
* Apply Default Configurations ...
*/
virtual void Default()
{
//
// Apply Default Props ...
//
Prefix(NULL);
ChartIdentification(0);
SubWindowIdentification(0);
//
defaultBullishStyle.width = 1;
defaultBullishStyle.clr = clrLime;
defaultBullishStyle.style = STYLE_SOLID;
//
defaultBearishStyle.width = 1;
defaultBearishStyle.clr = clrRed;
defaultBearishStyle.style = STYLE_SOLID;
//
boxBullishStyle = defaultBullishStyle;
boxBearishStyle = defaultBearishStyle;
}
//
// Drawers ...
/**
* Draw Specified Bar ...
*
* @param bar: XOHCL, refrence to Specified Bar ...
* @param object: XCOHCLObject, pointer reference for Drawn Object ...
* @param to: datetime, Specified To Time ...
*
* @return ( bool )
*/
bool DrawBar(
XOHCL &bar,
XCOHCLObject *&object,
datetime to = NULL //
)
{
//
bool result = false;
//
// Prepare ...
object = NULL;
//
// Validate ...
result = bar.IsValid();
if (!result)
{
return result;
}
//
string prefix = Prefix();
ulong chartId = ChartIdentification();
int window = SubWindowIdentification();
to = IsSpecifiedValid(to)
? to
: ((datetime)((int)bar.time) + (PeriodSeconds(bar.period) - 1));
object = new XCOHCLObject();
result = object.Create(
chartId,
window,
bar,
to,
prefix //
);
if (result)
{
//
ApplyBarStyle(
object,
bar //
);
}
//
return result;
}
/**
* Draw Bar Arrow Object ...
*
* @param bar: XOHCL instance Reference ...
* @param object: XCBarArrowObject, pointer reference for Drawn Object ...
* @param priceType: ENUM_X_PRICE member ...
* @param arrow: int, Arrow Code ...
* @param clr: color, Arro Color ...
* @param width: int, Arrow Width ...
* @param anchor: ENUM_ARROW_ANCHOR, anchor of Arrow ...
* @param name: string, name of Arrow ...
*
* @return ( bool )
*/
bool DrawBarArrow(
XOHCL &bar,
XCBarArrowObject *&object,
ENUM_X_PRICE priceType,
int arrow = 159,
color clr = clrYellow,
int width = 3,
ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM,
string name = NULL,
bool ignoreBarTag = true,
int threshold = 5 //
)
{
//
bool result = false;
//
object = NULL;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
string barTag = bar.GetTag(name);
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
prefix =
(IsValid(prefix)
? prefix + "_"
: prefix) +
(IsSpecifiedValid(name)
? name
: "") +
(ignoreBarTag ? "" : ToMD5(barTag));
//
object = new XCBarArrowObject();
result = object
.CreateByBar(
chartID,
prefix,
window,
arrow,
bar,
priceType,
threshold //
);
if (result)
{
//
object.ArrowColor(clr);
object.ArrowWidth(width);
object.ArrowAnchor(anchor);
}
//
return result;
}
/**
* Dar Specified Pivot ...
*
* @param pivot: XPivot, Specified Pivot ...
* @param object: XCBarArrowObject, pointer reference for Drawn Object ...
* @param peakArrow: int, Specified Arrow Code for Peak Pivots ...
* @param valeArrow: int, Specified Arrow Code for Vale Pivots ...
* @param threshold: int, distance between price and arrow in Point ...
*
* @return ( bool )
*/
bool DrawPivot(
XPivot &pivot,
XCBarArrowObject *&object,
int peakArrow = 159,
int valeArrow = 159,
int threshold = 5 //
)
{
//
bool result = false;
//
// Prepare ...
object = NULL;
//
// Normalize ...
threshold = NormalizeInt(threshold, 5);
peakArrow = NormalizeInt(peakArrow, 159);
valeArrow = NormalizeInt(valeArrow, 159);
//
// Validate ...
result = pivot.IsValid();
if (!result)
{
return result;
}
//
// Get Pivot's Bar ...
XOHCL bar;
result = pivot.GetBar(bar);
if (!result)
{
return result;
}
//
int arrow = pivot.IsPeak()
? peakArrow
: valeArrow;
string name = pivot.GetObjectID();
ENUM_X_PRICE type = pivot.IsPeak()
? X_PRICE_HIGH
: X_PRICE_LOW;
XPOIStyle style = pivot.IsPeak()
? defaultBearishStyle
: defaultBullishStyle;
ENUM_ARROW_ANCHOR anchor = pivot.IsPeak()
? ANCHOR_BOTTOM
: ANCHOR_TOP;
object = new XCBarArrowObject();
result = object.CreateByBar(
ChartIdentification(),
name,
SubWindowIdentification(),
arrow,
bar,
type,
threshold //
);
if (result)
{
//
// Apply Styles ...
object.ArrowAnchor(anchor);
ApplyBarArrowStyle(
object,
style //
);
}
//
// Cleanup Resources ...
bar.Clean();
//
return result;
}
/**
* Draw Specified Pivot Collection ...
*
* @param pivots: XPivot, reference Collection to Draw ...
* @param draws: CArrayObj, pointer reference to Hold Drawn Objects ...
* @param peakArrow: int, Specified Arrow Code for Peak Pivots ...
* @param valeArrow: int, Specified Arrow Code for Vale Pivots ...
* @param threshold: int, distance between price and arrow in Point ...
*
* @return ( int )
*/
int DrawPivots(
XPivot &pivots[],
CArrayObj *&draws,
int peakArrow = 159,
int valeArrow = 159,
int threshold = 5 //
)
{
//
int result = 0;
//
// Prepare ...
if (draws == NULL)
{
draws = new CArrayObj();
}
draws.Clear();
//
// Validate ...
if (!HasChild(pivots))
{
return result;
}
//
bool has = false;
XCBarArrowObject *iObj;
int count = ArraySize(pivots);
for (int i = 0; i < count; i++)
{
//
// Draw Indexed Pivot ...
has = DrawPivot(
pivots[i],
iObj,
peakArrow,
valeArrow,
threshold //
);
//
if (has)
{
draws.Add(iObj);
}
//
ZeroMemory(iObj);
}
//
result = draws.Total();
//
return result;
}
/**
* Draw Specified Box ...
*
* @param object: XCBoxObject, pointer reference for Drawn Object ...
* @param name: Box Name ...
* @param upper: double, Box Upper ...
* @param lower: double, Box Lower ...
* @param from: datetime, From Time ...
* @param to: datetime, To Time ...
* @param at: datetime, Specified At Time ...
*
* @return ( bool )
*/
bool DrawBox(
XCBoxObject *&object,
string name,
double upper,
double lower,
datetime from,
datetime to,
datetime at //
)
{
//
bool result = false;
//
// Prepare ...
object = NULL;
//
// Normalize ...
to = NormalizeTime(to);
from = NormalizeTime(from);
//
// Validate ...
result =
upper > 0 &&
lower > 0 &&
to > from &&
IsSpecifiedValid(to) &&
IsSpecifiedValid(name) &&
IsSpecifiedValid(from) &&
upper > lower;
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
object = new XCBoxObject();
result = object.Create(
chartID,
window,
name,
upper,
lower,
from,
to,
at,
prefix //
);
//
return result;
}
/**
* Draw Specific Box ...
*
* @param box: XBoxZone, Specified Box ...
* @param object: XCBarArrowObject, pointer reference for Drawn Object ...
* @param ignoreAt: bool, Ignore Box at or not ...
*
* @return ( bool )
*/
bool DrawBox(
XBoxZone &box,
XCBoxObject *&object,
bool ignoreAt = true,
string name = NULL //
)
{
//
bool result = false;
//
// Prepare ...
object = NULL;
//
// Validate ...
result = box.IsValid();
if (!result)
{
return result;
}
//
datetime at = box.at;
if (ignoreAt)
{
at = NULL;
}
//
name = IsSpecifiedValid(name)
? name
: box.GetTag();
result = DrawBox(
object,
name,
box.upper,
box.lower,
box.from,
box.to,
at //
);
if (result)
{
//
// Apply Style ...
XPOIStyle style;
GetBoxStyle(
style,
box.dir //
);
//
ApplyBoxStyle(
object,
style //
);
//
style.Clean();
}
//
return result;
}
/**
* Draw a Collection of Boxes ...
*
* @param boxes: reference collection to Provide Boxes ...
* @param objects: reference pointer to holds drawn Objects ...
* @param ignoreAt: bool, ignore Box At Drawn ...
*
* @return ( int )
*/
int DrawBoxes(
XBoxZone &boxes[],
CArrayObj *&objects,
bool useTypeName = true,
bool ignoreAt = true //
)
{
//
int result = 0;
//
// Prepare ...
objects = new CArrayObj();
//
// Validate ...
if (!HasChild(boxes))
{
return result;
}
//
bool has = false;
XCBoxObject *iObj;
string name = NULL;
int count = ArraySize(boxes);
for (int i = 0; i < count; i++)
{
//
if (useTypeName)
{
name = boxes[i].type;
}
//
has = DrawBox(
boxes[i],
iObj,
ignoreAt,
name //
);
if (has)
{
objects.Add(iObj);
}
//
ZeroMemory(iObj);
}
//
result = objects.Total();
//
return result;
}
/**
* Draw Specified Signal ...
*
* @param signal: XSignal, Specified Signal ...
* @param object: XCSignalObject, pointer reference for Drawn Object ...
* @param length: int, Signal Length ...
*/
bool DrawSignal(
XSignal &signal,
XCSignalObject *&object,
int length = 3 //
)
{
//
bool result = false;
//
object = NULL;
length = NormalizeInt(length, 3);
//
result = signal.IsValid();
if (!result)
{
return result;
}
//
string prefix = Prefix();
long chartID = ChartIdentification();
int window = SubWindowIdentification();
//
object = new XCSignalObject();
result = object.Create(
chartID,
window,
signal,
length,
prefix //
);
if (!result)
{
return result;
}
//
object.TPWidth(1);
object.TPColor(clrGreen);
object.TPWidth(STYLE_DOT);
//
object.SLWidth(1);
object.SLColor(clrRed);
object.SLWidth(STYLE_DOT);
//
object.TargetWidth(1);
object.TargetColor(clrLightBlue);
object.TargetWidth(STYLE_DOT);
//
object.EntryWidth(1);
object.EntryColor(clrYellow);
object.EntryWidth(STYLE_DOT);
//
return result;
}
/**
* Draw Specified Trend Line ...
*
* @param fromPrice: double, from Price ...
* @param fromTime: datetime, from Time ...
* @param toPrice: double, to Price ...
* @param toTime: datetime, to Time ...
* @param object: CChartObjectTrend, pointer reference for Drawn Object ...
* @param name: Object Name ...
* @param rayRight: bool, ray to Right ...
* @param rayLeft: boo, ray to Left ...
*
* @return ( bool )
*/
bool DrawTrendLine(
double fromPrice,
datetime fromTime,
double toPrice,
datetime toTime,
CChartObjectTrend *&object,
string name,
bool rayRight = false,
bool rayLeft = false //
)
{
//
bool result = false;
//
// Prepare ...
object = new CChartObjectTrend();
//
// Validate ...
result =
toPrice > 0 &&
fromPrice > 0 &&
IsSpecifiedValid(toTime) &&
IsSpecifiedValid(fromTime) &&
toTime > fromTime;
if (!result)
{
return result;
}
//
// Create Object ...
result = object.Create(
ChartIdentification(),
name,
SubWindowIdentification(),
fromTime,
fromPrice,
toTime,
toPrice //
);
if (result)
{
//
ENUM_X_DIRECTION dir =
fromPrice < toPrice
? X_DIRECTION_BULLISH
: fromPrice > toPrice
? X_DIRECTION_BEARISH
: X_DIRECTION_NONE;
ApplyTrendLineStyle(
object,
dir //
);
//
object.RayLeft(rayLeft);
object.RayRight(rayRight);
}
//
return result;
}
/**
* Draw Trend Line based on Swings Points ...
*
* @param swings: XOHCL, Specified Swings ...
* @param dir: ENUM_X_DIRECTION, Specified Trend Direction ...
* @param object: CChartObjectTrend, pointer reference for Drawn Object ...
* @param rayRight: Ray to Right ...
* @param rayLeft: Ray to Left ...
*
* @return ( bool )
*/
bool DrawSwingTrend(
XOHCL &swings[],
ENUM_X_DIRECTION dir,
CChartObjectTrend *&object,
bool rayRight = false,
bool rayLeft = false //
)
{
//
bool result = false;
//
// Prepare ...
object = NULL;
//
int count = ArraySize(swings);
result = HasChild(swings) &&
count >= 2 &&
HasDirection(dir);
if (!result)
{
return result;
}
//
bool isBullish = IsSpecifiedBullish(dir);
//
XOHCL _swings[];
Copy(
swings,
_swings //
);
SortBar(
_swings,
X_SORT_BY_DATE,
X_DIRECTION_BULLISH //
);
//
double price1 =
isBullish
? _swings[0].low
: _swings[0].high;
datetime time1 = _swings[0].time;
//
double price2 =
isBullish
? _swings[count - 1].low
: _swings[count - 1].high;
datetime time2 = _swings[count - 1].time;
//
ulong chartId = ChartIdentification();
int subWindow = SubWindowIdentification();
string name = ToXString(dir) + "_Trend_" + ToXString(price1) + "_" + ToXString(price2);
RemoveObjects("_Trend_", chartId, subWindow);
//
object = new CChartObjectTrend();
result = object.Create(
chartId,
name,
subWindow,
time1,
price1,
time2,
price2 //
);
if (result)
{
//
ApplyTrendLineStyle(
object,
dir //
);
//
object.RayLeft(rayLeft);
object.RayRight(rayRight);
}
//
SpecifiedClean(_swings);
//
return result;
}
//
// Stylers ...
/**
* Get Specified Style for Specified Direction ...
*
* @param style: XPOIStyle, reference to hold result ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction ...
*/
void GetStyle(
XPOIStyle &style,
ENUM_X_DIRECTION forDir //
)
{
//
// Prepare ...
style.Clean();
//
// Validate ...
if (!HasDirection(forDir))
{
return;
}
//
if (IsSpecifiedBullish(forDir))
{
style = defaultBullishStyle;
}
else
{
style = defaultBearishStyle;
}
}
/**
* Get Specified Box Style for Specified Direction ...
*
* @param style: XPOIStyle, reference to hold result ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction ...
*/
void GetBoxStyle(
XPOIStyle &style,
ENUM_X_DIRECTION forDir //
)
{
//
// Prepare ...
style.Clean();
//
// Validate ...
if (!HasDirection(forDir))
{
return;
}
//
if (IsSpecifiedBullish(forDir))
{
style = boxBullishStyle;
}
else
{
style = boxBearishStyle;
}
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: XCBoxObject, pointer reference of Object ...
* @param bar: XOHCL, Specified Bar ...
* @param fill: boolean, Fill Bar's Body or not ...
*/
void ApplyBarStyle(
XCOHCLObject *&object,
XOHCL &bar,
bool fill = false //
)
{
//
// Validate ...
bool has = bar.IsValid() &&
object != NULL;
if (!has)
{
return;
}
//
XPOIStyle style;
GetStyle(
style,
bar.GetDirection() //
);
//
object.BarSpes(
style.width,
style.clr,
style.style,
fill //
);
//
style.Clean();
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: XCBoxObject, pointer reference of Object ...
* @param style: XPOIStyle, Specifed Style to Apply ...
*/
void ApplyBoxStyle(
XCBoxObject *&object,
XPOIStyle &style //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
object.BoxFill(style.fill);
object.BoxColor(style.clr);
object.BoxWidth(style.width);
object.BoxStyle(style.style);
}
/**
* Apply Specified Style to a Collection on Drawn Boxes ...
*
* @param objects: pointer reference of Objects ...
* @param style: XPOIStyle, Specifed Style to Apply ...
*/
void ApplyBoxesStyle(
CArrayObj *&objects,
XPOIStyle &style //
)
{
//
// Validate ...
if (objects == NULL || objects.Total() <= 0)
{
return;
}
//
for (int i = 0; i < objects.Total(); i++)
{
//
XCBoxObject *iObj = ((XCBoxObject *)objects.At(i));
ApplyBoxStyle(
iObj,
style //
);
ZeroMemory(iObj);
}
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: XCBarArrowObject, pointer reference of Object ...
* @param style: XPOIStyle, Specifed Style to Apply ...
*/
void ApplyBarArrowStyle(
XCBarArrowObject *&object,
XPOIStyle &style //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
object.ArrowColor(style.clr);
object.ArrowWidth(style.width);
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: CChartObjectVLine, pointer reference of Object ...
* @param style: XPOIStyle, Specifed Style to Apply ...
*/
void ApplyLineStyle(
CChartObjectVLine *&object,
XPOIStyle &style //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
object.Color(style.clr);
object.Style(style.style);
object.Width(style.width);
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: CChartObjectVLine, pointer reference of Object ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction ...
*/
void ApplyLineStyle(
CChartObjectVLine *&object,
ENUM_X_DIRECTION forDir //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
has = HasDirection(forDir);
if (!has)
{
return;
}
//
XPOIStyle style;
GetStyle(style, forDir);
//
object.Color(style.clr);
object.Style(style.style);
object.Width(style.width);
//
style.Clean();
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: CChartObjectHLine, pointer reference of Object ...
* @param style: XPOIStyle, Specifed Style to Apply ...
*/
void ApplyLineStyle(
CChartObjectHLine *&object,
XPOIStyle &style //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
object.Color(style.clr);
object.Style(style.style);
object.Width(style.width);
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: CChartObjectHLine, pointer reference of Object ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction ...
*/
void ApplyLineStyle(
CChartObjectHLine *&object,
ENUM_X_DIRECTION forDir //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
has = HasDirection(forDir);
if (!has)
{
return;
}
//
XPOIStyle style;
GetStyle(style, forDir);
//
object.Color(style.clr);
object.Style(style.style);
object.Width(style.width);
//
style.Clean();
}
/**
* Apply Specified Style to Specified Object ...
*
* @param object: CChartObjectTrend, pointer reference of Object ...
* @param forDir: ENUM_X_DIRECTION, Specified Direction ...
*/
void ApplyTrendLineStyle(
CChartObjectTrend *&object,
ENUM_X_DIRECTION forDir //
)
{
//
bool has = object != NULL;
if (!has)
{
return;
}
//
if (!HasDirection(forDir))
{
return;
}
//
XPOIStyle style;
GetStyle(style, forDir);
//
object.Color(style.clr);
object.Style(style.style);
object.Width(style.width);
//
style.Clean();
}
//
// SPecial Draws Functions ...
/**
* Draw Specified Pattern Pivot ...
*
* @param _pivot: XPivot, reference to Specified Pivot ...
* @param config: XPOIDrawConfig, Darwing Configuration ...
* @param thresholdMultiplier: int, pivot point threshold ...
*/
void DrawPivot(
XPivot &_pivot,
XPOIDrawConfig &config,
int thresholdMultiplier = 0 //
)
{
//
// Normalize ...
thresholdMultiplier = NormalizeInt(thresholdMultiplier, 1);
//
int arrowThreshold = config.arrowsThreshold * thresholdMultiplier;
arrowThreshold = NormalizeInt(arrowThreshold, 1);
//
// Validate ...
bool has = _pivot.IsValid();
if (!has)
{
return;
}
//
XOHCL _bar;
has = _pivot.GetBar(_bar);
if (!has)
{
//
_bar.Clean();
return;
}
//
XCBarArrowObject *iObj;
has = DrawBarArrow(
_bar,
iObj,
_pivot.IsPeak()
? config.arrowsPeakPriceType
: config.arrowsValePriceType,
_pivot.IsBullish()
? config.bullishArrow
: config.bearishArrow,
_pivot.IsBullish()
? config.bullishColor
: config.bearishColor,
config.arrowsWidth,
_pivot.IsBullish()
? ANCHOR_TOP
: ANCHOR_BOTTOM,
_pivot.prefix + "_Pivot_" + ToXString(TimeToSeconds(_pivot.time)),
true, // Ignore Bar Tag ...
arrowThreshold // Threshold ...
);
if (has)
{
drawnObjects.Add(iObj);
}
//
ZeroMemory(iObj);
}
/**
* Draw Specified Pattern Zone ...
*
* @param _zone: XBozxZone, reference to Specified Zone ...
* @param config: XPOIDrawConfig, Darwing Configuration ...
*/
void DrawZone(
XBoxZone &_zone,
XPOIDrawConfig &config //
)
{
//
// Validate ...
bool has = _zone.IsValid();
if (!has)
{
return;
}
//
XCBoxObject *iObj;
has = DrawBox(
_zone,
iObj,
config.ignoreZonesAt,
_zone.type + "_Zone_" + ToXString(TimeToSeconds(_zone.from)) //
);
if (has)
{
//
XPOIStyle iStyle;
GetBoxStyle(
iStyle,
_zone.dir //
);
//
iStyle.clr =
_zone.IsBullish()
? config.bullishColor
: config.bearishColor;
iStyle.width = config.zonesWidth;
iStyle.style = config.zonesStyle;
//
ApplyBoxStyle(
iObj,
iStyle //
);
//
drawnObjects.Add(iObj);
//
iStyle.Clean();
}
//
ZeroMemory(iObj);
}
/**
* Draw Specified Pattern info ...
*
* @param _bar: XOHCL, reference to Pattern's Bar ...
* @param _pivot: XPivot, reference to Pattern's Pivot ...
* @param _zone: XBoxZone, reference to Pattern's Zone ...
* @param _pattern: ENUM_X_BAR_PATTERN, Specified Bar Pattern ...
* @param _patternDir: ENUM_X_DIRECTION, Specified Bar Pattern's Direction ...
* @param thresholdMultiplier: int, pivot point threshold ...
* @param config: XPOIDrawConfig, Darwing Configuration ...
*/
void DrawPattern(
XOHCL &_bar,
XPivot &_pivot,
XBoxZone &_zone,
ENUM_X_BAR_PATTERN _pattern,
ENUM_X_DIRECTION _patternDir,
XPOIDrawConfig &config,
int thresholdMultiplier = 0 //
)
{
//
// Validate ...
bool has =
_bar.IsValid() &&
IsXValid(_pattern) &&
HasDirection(_patternDir);
if (!has)
{
return;
}
//
datetime cTime = TimeCurrent();
//
// Handle Draws ...
//
// Draw OHCL Bar ...
//
// Draw Pivot ...
DrawPivot(_pivot, config, thresholdMultiplier);
//
// Draw Zone ...
_zone.to = cTime;
DrawZone(_zone, config);
}
/**
* Draw Specified Bar Pattern Analysis ...
*
* @param analysis: XPatternAnalysis, reference to Specified Bar Pattern Analysis ...
* @param config: XPatternAnalysisDrawConfig, reference to Provide Drawing Configuration ...
*/
void DrawPatternAnalysis(
XPatternAnalysis &analysis,
XPatternAnalysisDrawConfig &config //
)
{
//
bool has = analysis.IsValid();
if (!has)
{
return;
}
//
bool canDraw;
bool isBullish;
bool isBearish;
XOHCL patternBar;
bool canDrawZone;
bool canDrawPivot;
XPivot patternPivot;
XBoxZone patternBox;
ENUM_X_BAR_PATTERN pattern;
ENUM_X_DIRECTION patternDir;
//
datetime cTime = TimeCurrent();
int patternsPivotThresholdMultiplier = 0;
//
// Support and Resistance ...
//
// Support ...
isBearish = false;
isBullish = analysis.IsSupport();
has = isBullish;
if (has)
{
//
pattern = X_BAR_PATTERN_SUPPORT;
patternDir = X_DIRECTION_BULLISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Resistance ...
isBullish = false;
isBearish = analysis.IsResistance();
has = isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_RESISTANCE;
patternDir = X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// PV: High and Low ...
//
// Low ...
isBearish = false;
isBullish = analysis.IsLow();
has = isBullish;
if (has)
{
//
pattern = X_BAR_PATTERN_LOW;
patternDir = X_DIRECTION_BULLISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// High ...
isBullish = false;
isBearish = analysis.IsHigh();
has = isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_HIGH;
patternDir = X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// OB ...
isBullish = analysis.IsOB(X_DIRECTION_BULLISH);
isBearish = analysis.IsOB(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_OB;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// FVG ...
isBullish = analysis.IsFVG(X_DIRECTION_BULLISH);
isBearish = analysis.IsFVG(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_FVG;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Momentum ...
isBullish = analysis.IsMomentum(X_DIRECTION_BULLISH);
isBearish = analysis.IsMomentum(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_MOMENTUM;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Engulfed ...
isBullish = analysis.IsEngulfed(X_DIRECTION_BULLISH);
isBearish = analysis.IsEngulfed(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_ENGULFED;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Pinned ...
isBullish = analysis.IsPinned(X_DIRECTION_BULLISH);
isBearish = analysis.IsPinned(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_PINNED;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// TrueGaped ...
isBullish = analysis.IsTrueGaped(X_DIRECTION_BULLISH);
isBearish = analysis.IsTrueGaped(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_TRUE_GAPED;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Star ...
isBullish = analysis.IsStar(X_DIRECTION_BULLISH);
isBearish = analysis.IsStar(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_STAR;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Piercing ...
isBullish = analysis.IsPiercing(X_DIRECTION_BULLISH);
isBearish = analysis.IsPiercing(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_PIERCING;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Rising ...
isBullish = analysis.IsRising(X_DIRECTION_BULLISH);
isBearish = analysis.IsRising(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_RISING;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Flag ...
isBullish = analysis.IsFlag(X_DIRECTION_BULLISH);
isBearish = analysis.IsFlag(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_FLAG;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// SignalKey ...
isBullish = analysis.IsSignalKey(X_DIRECTION_BULLISH);
isBearish = analysis.IsSignalKey(X_DIRECTION_BEARISH);
has = isBullish || isBearish;
if (has)
{
//
pattern = X_BAR_PATTERN_SIGNALKEY;
patternDir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
canDraw = config.CanDraw(pattern);
if (canDraw)
{
//
has = analysis.GetPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
else
{
patternsPivotThresholdMultiplier++;
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir,
config.drawConfig,
patternsPivotThresholdMultiplier //
);
}
}
}
//
// Quarters ...
has = config.drawQuarterZones &&
analysis.IsQuarterReady();
if (has)
{
//
// Draw Majors ...
has = config.drawQuarterMajors;
if (has)
{
//
// Support ...
has = analysis.HasMajorSupport();
if (has)
{
//
analysis.majorSupport.to = cTime;
DrawZone(
analysis.majorSupport,
config.quarterMajorsDrawConfig //
);
}
//
// Resistance ...
has = analysis.HasMajorResistance();
if (has)
{
//
analysis.majorResistance.to = cTime;
DrawZone(
analysis.majorResistance,
config.quarterMajorsDrawConfig //
);
}
}
//
// Draw Minors ...
if (config.drawQuarterMinors)
{
//
// Support ...
has = analysis.HasMinorSupport();
if (has)
{
//
analysis.minorSupport.to = cTime;
DrawZone(
analysis.minorSupport,
config.quarterMinorsDrawConfig //
);
}
//
// Resistance ...
has = analysis.HasMinorResistance();
if (has)
{
//
analysis.minorResistance.to = cTime;
DrawZone(
analysis.minorResistance,
config.quarterMinorsDrawConfig //
);
}
}
//
// Draw Quarter ...
if (config.drawQuarter &&
analysis.quarter > 0)
{
//
double quarter = analysis.quarter;
//
datetime quarterFrom = MathMin(analysis.majorResistance.from,
analysis.majorSupport.from);
datetime quarterTo = cTime;
string quarterName = "XQuarter_" + ToXString(quarter) + "_" + ToXString(TimeToSeconds(quarterFrom));
//
CChartObjectTrend *iObj;
has = DrawTrendLine(
quarter,
quarterFrom,
quarter,
quarterTo,
iObj,
quarterName,
false, // Ray Right ...
false // Ray Left ...
);
if (has)
{
//
iObj.Width(config.quarterWidth);
iObj.Color(config.quarterColor);
iObj.Style(config.quarterStyle);
//
drawnObjects.Add(iObj);
}
}
}
//
// Cleanup Resources ...
patternBar.Clean();
patternBox.Clean();
patternPivot.Clean();
}
/**
* Draw Specified Pivots Analysis ...
*
* @param analysis: XPivotAnalysis, reference to Specified Pivot Analysis ...
* @param config: XPivotAnalysisDrawConfig, reference to Provide Drawing Configuration ...
*/
void DrawPivotAnalysis(
XPivotAnalysis &analysis,
XPivotAnalysisDrawConfig &config //
)
{
//
bool has = analysis.IsValid();
if (!has)
{
return;
}
//
int count = 0;
XBoxZone tmpBox;
datetime cTime = TimeCurrent();
//
// Pivots ...
if (config.drawPivots)
{
//
has = analysis.HasPivots();
if (has)
{
//
count = ArraySize(analysis.pivots);
for (int i = 0; i < count; i++)
{
//
DrawPivot(
analysis.pivots[i],
config.drawConfig //
);
}
}
}
//
// Support ...
if (config.drawSupport)
{
//
tmpBox.Clean();
has = analysis.HasSupportBox(tmpBox);
if (has)
{
//
tmpBox.to = cTime;
DrawZone(
tmpBox,
config.drawConfig //
);
}
}
//
// Resistance ...
if (config.drawResistance)
{
//
tmpBox.Clean();
has = analysis.HasResistanceBox(tmpBox);
if (has)
{
//
tmpBox.to = cTime;
DrawZone(
tmpBox,
config.drawConfig //
);
}
}
//
// Peak Trend ...
if (config.drawPeakTrend)
{
//
has = analysis.IsPeakAnalysed();
if (has)
{
//
string iUpperName = analysis.GetUpperObjectID();
CChartObjectTrend *iObj = new CChartObjectTrend();
has = iObj.Create(
ChartIdentification(),
iUpperName,
SubWindowIdentification(),
analysis.fromTime,
analysis.peakFrom,
analysis.toTime,
analysis.peakTo //
);
if (has)
{
//
// Styling ...
iObj.RayLeft(config.rayLeftTrends);
iObj.RayRight(config.rayRightTrends);
iObj.Width(config.drawConfig.zonesWidth);
iObj.Style(config.drawConfig.zonesStyle);
iObj.Color(IsXBullish(analysis.peakDir)
? config.drawConfig.bullishColor
: config.drawConfig.bearishColor);
//
// Storing ...
drawnObjects.Add(iObj);
}
}
}
//
// Vale Trend ...
if (config.drawValeTrend)
{
//
has = analysis.IsValeAnalysed();
if (has)
{
//
string iLowerName = analysis.GetLowerObjectID();
CChartObjectTrend *iObj = new CChartObjectTrend();
has = iObj.Create(
ChartIdentification(),
iLowerName,
SubWindowIdentification(),
analysis.fromTime,
analysis.valeFrom,
analysis.toTime,
analysis.valeTo //
);
if (has)
{
//
// Styling ...
iObj.RayLeft(config.rayLeftTrends);
iObj.RayRight(config.rayRightTrends);
iObj.Width(config.drawConfig.zonesWidth);
iObj.Style(config.drawConfig.zonesStyle);
iObj.Color(IsXBullish(analysis.valeDir)
? config.drawConfig.bullishColor
: config.drawConfig.bearishColor);
//
// Storing ...
drawnObjects.Add(iObj);
}
}
}
//
// Cleanup ...
tmpBox.Clean();
//
}
protected:
//
//
private:
//
//
// Props ...
//
string mPrefix; // Prefix of Created Objects ...
long mChartIdentification; // Chart Id ...
int mSubWindowIdentification; // Sub Window ...
//
};