Files
xMQL5/X121-EA/V1.0/Libraries/x-saherelm.tools.lib.mq5
T
2024-10-11 19:46:23 +03:30

2193 lines
40 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Tools Library
// --------------------------------------
// Name: XToolsLib
// Description: provide all commonly used 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 "../Libraries/x-saherelm.draw.lib.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Definitions ...
string XTLSHammerToken = "XHammer";
string XTLSSupportToken = "XSupport";
string XTLSSwingLowToken = "XSwingLow";
string XTLSSwingHighToken = "XSwingHigh";
string XTLSResistanceToken = "XResistance";
string XTLSBullishFVGToken = "XBullishFVG";
string XTLSBearishFVGToken = "XBearishFVG";
string XTLSMorningStarToken = "XMorningStar";
string XTLSEveningStarToken = "XEveningStar";
string XTLSShootingStarToken = "XShootingStar";
string XTLSBullishTrendToken = "XBullishTrend";
string XTLSBearishTrendToken = "XBearishTrend";
string XTLSBullishEngulfingToken = "XBullishEngulfing";
string XTLSBearishEngulfingToken = "XBearishEngulfing";
string XTLSBullishOrderBlockToken = "XBullishOrderBlock";
string XTLSBearishOrderBlockToken = "XBearishOrderBlock";
//
// Helper Tools ...
//
bool HasBullishPattern(
XOHCL &bar,
int loopback = 0,
int verifications = 1,
bool checkHammer = true,
bool checkMorningStar = true,
bool checkBullishMarubozu = true,
bool checkBullishEngulfing = true //
)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
if (verifications <= 0)
{
verifications = 1;
}
//
int founded = 0;
//
int idx = bar.Index();
for (int i = idx; i <= idx + loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
bool isHammer =
!checkHammer
? false
: iBar.IsHammer();
if (isHammer)
{
founded++;
}
//
bool isMorningStar =
!checkMorningStar
? false
: iBar.IsMorningStar();
if (isMorningStar)
{
founded++;
}
//
bool isBullishMarubozu =
!checkBullishMarubozu
? false
: iBar.IsBullishMarubozu();
if (isBullishMarubozu)
{
founded++;
}
//
bool isBullishEngulfing =
!checkBullishEngulfing
? false
: iBar.IsBullishEngulfing();
if (isBullishEngulfing)
{
founded++;
}
//
}
//
result =
result &&
founded >= verifications;
//
return result;
}
//
bool HasBearishPattern(
XOHCL &bar,
int loopback = 0,
int verifications = 1,
bool checkShootingStar = true,
bool checkEveningStar = true,
bool checkBearishMarubozu = true,
bool checkBearishEngulfing = true //
)
{
//
bool result = false;
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
if (verifications <= 0)
{
verifications = 1;
}
//
int founded = 0;
//
int idx = bar.Index();
for (int i = idx - 1; i <= idx + loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
bool isShootingStar =
!checkShootingStar
? false
: iBar.IsShootingStar();
if (isShootingStar)
{
founded++;
}
//
bool isEveningStar =
!checkEveningStar
? false
: iBar.IsEveningStar();
if (isEveningStar)
{
founded++;
}
//
bool isBearishMarubozu =
!checkBearishMarubozu
? false
: iBar.IsBearishMarubozu();
if (isBearishMarubozu)
{
founded++;
}
//
bool isBearishEngulfing =
!checkBearishEngulfing
? false
: iBar.IsBearishEngulfing();
if (isBearishEngulfing)
{
founded++;
}
//
}
//
result =
result &&
founded >= verifications;
//
return result;
}
//
bool IsSupportBreaked(
XOHCL &bar, // Support Bar
bool _verifyPressure = true, // Verify Candlestick Patterns for Prove Pressure
bool checkShootingStar = true, // Check Shooting Star Pattern for Pressure Verifications
bool checkEveningStar = true, // Check Evening Star Pattern for Pressure Verifications
bool checkBearishEngulfingStar = true, // Check Bearish Engulfing Pattern for Pressure Verifications
double _threshold = 0, // Upper and Lower threshold of Pivot
double _breakVerificationPoint = 15, // Price Distance for Verify Pivot Break
int _loopback = 3 // Verification Loopback
)
{
//
bool result = false;
//
if (_breakVerificationPoint < 0)
{
_breakVerificationPoint = 15;
}
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
double points = GetPoints(bar.symbol);
//
double threshold = 0;
if (_threshold > 0)
{
threshold = _threshold * points;
}
//
double price = GetBid(bar.symbol);
//
// Check Price is Below of Support High ...
result = price < bar.high + threshold;
if (!result)
{
return result;
}
//
// Check Break Verification ...
if (_breakVerificationPoint > 0)
{
//
result = (bar.high + threshold) - price >= _breakVerificationPoint * points;
if (!result)
{
return result;
}
}
//
if (_verifyPressure && _loopback > 0)
{
//
// Verify Pressure by Candlestick Patterns ...
// We need last 3 Candle ...
//
for (int i = 0; i < _loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
// Shooting Star ...
bool isShootingStar = !checkShootingStar
? false
: iBar.IsShootingStar();
if (isShootingStar)
{
//
DrawShootingStar(
iBar,
ChartID() //
);
}
//
// Evening Star ...
bool isEveningStar = !checkEveningStar
? false
: iBar.IsEveningStar();
if (isEveningStar)
{
//
DrawEveningStar(
iBar,
ChartID() //
);
}
//
// BearishEngulfing ...
bool isBearishEngulfing = !checkBearishEngulfingStar
? false
: iBar.IsBearishEngulfing();
if (isBearishEngulfing)
{
//
DrawBearishEngulfing(
iBar,
ChartID() //
);
}
//
result =
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
;
if (result)
{
break;
}
}
}
//
return result;
}
//
bool IsSupportRejected(
XOHCL &bar, // Support Bar
bool _verifyPressure = true, // Verify Candlestick Patterns for Prove Pressure
bool checkHammer = true, // Check Hammer Pattern for Pressure Verifications
bool checkMorningStar = true, // Check Morning Star Pattern for Pressure Verifications
bool checkBullishEngulfing = true, // Check Bullish Engulfing Pattern for Pressure Verifications
double _threshold = 0, // Upper and Lower threshold of Pivot
double _breakVerificationPoint = 15, // Price Distance for Verify Pivot Break
int _loopback = 3 // Verification Loopback
)
{
//
bool result = false;
//
if (_breakVerificationPoint < 0)
{
_breakVerificationPoint = 15;
}
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
double points = GetPoints(bar.symbol);
//
double threshold = 0;
if (_threshold > 0)
{
threshold = _threshold * points;
}
//
double price = GetBid(bar.symbol);
//
XOHCL cBar;
result = cBar.Init(
bar.symbol,
bar.period,
0 //
);
if (!result)
{
return result;
}
//
double ll2 = cBar.FindLowest(
2,
MODE_LOW //
);
//
// Check Price is Below of Support High ...
result =
//
price > bar.high + threshold &&
(
//
ll2 < bar.high
//
||
//
ll2 < bar.high - threshold
//
||
//
(threshold > 0 && MathAbs(ll2 - price) > 0 && MathAbs(ll2 - price) <= threshold)
//
)
//
;
if (!result)
{
return result;
}
//
// Check Break Verification ...
if (_breakVerificationPoint > 0)
{
//
result = MathAbs((bar.high + threshold) - price) >= _breakVerificationPoint * points;
if (!result)
{
return result;
}
}
//
if (_verifyPressure && _loopback > 0)
{
//
// Verify Pressure by Candlestick Patterns ...
// We need last 3 Candle ...
//
for (int i = 0; i < _loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
// Hammer ...
bool isHammer = !checkHammer
? false
: iBar.IsHammer();
if (isHammer)
{
//
DrawHammer(
iBar,
ChartID() //
);
}
//
// Morning Star ...
bool isMorningStar = !checkMorningStar
? false
: iBar.IsMorningStar();
if (isMorningStar)
{
//
DrawMorningStar(
iBar,
ChartID() //
);
}
//
// BullishEngulfing ...
bool isBullishEngulfing = !checkBullishEngulfing
? false
: iBar.IsBullishEngulfing();
if (isBullishEngulfing)
{
//
DrawBullishEngulfing(
iBar,
ChartID() //
);
}
//
result =
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishEngulfing
//
;
if (result)
{
break;
}
}
}
//
return result;
}
//
bool IsResistanceBreaked(
XOHCL &bar, // Resistance Bar
bool _verifyPressure = true, // Verify Candlestick Patterns for Prove Pressure
bool checkHammer = true, // Check Hammer Pattern for Pressure Verifications
bool checkMorningStar = true, // Check Morning Star Pattern for Pressure Verifications
bool checkBullishEngulfing = true, // Check Bullish Engulfing Pattern for Pressure Verifications
double _threshold = 0, // Upper and Lower threshold of Pivot
double _breakVerificationPoint = 15, // Price Distance for Verify Pivot Break
int _loopback = 3 // Verification Loopback
)
{
//
bool result = false;
//
if (_breakVerificationPoint < 0)
{
_breakVerificationPoint = 15;
}
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
double points = GetPoints(bar.symbol);
//
double threshold = 0;
if (_threshold > 0)
{
threshold = _threshold * points;
}
//
double price = GetBid(bar.symbol);
//
// Check Price is Below of Support High ...
result = price > bar.low - threshold;
if (!result)
{
return result;
}
//
// Check Break Verification ...
if (_breakVerificationPoint > 0)
{
//
result = price - (bar.low - threshold) >= _breakVerificationPoint * points;
if (!result)
{
return result;
}
}
//
if (_verifyPressure && _loopback > 0)
{
//
// Verify Pressure by Candlestick Patterns ...
// We need last 3 Candle ...
//
for (int i = 0; i < _loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
// Hammer ...
bool isHammer = !checkHammer
? false
: iBar.IsHammer();
if (isHammer)
{
//
DrawHammer(
iBar,
ChartID() //
);
}
//
// Morning Star ...
bool isMorningStar = !checkMorningStar
? false
: iBar.IsMorningStar();
if (isMorningStar)
{
//
DrawMorningStar(
iBar,
ChartID() //
);
}
//
// BullishEngulfing ...
bool isBullishEngulfing = !checkBullishEngulfing
? false
: iBar.IsBullishEngulfing();
if (isBullishEngulfing)
{
//
DrawBullishEngulfing(
iBar,
ChartID() //
);
}
//
result =
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishEngulfing
//
;
if (result)
{
break;
}
}
}
//
return result;
}
//
bool IsResistanceRejected(
XOHCL &bar, // Resistance Bar
bool _verifyPressure = true, // Verify Candlestick Patterns for Prove Pressure
bool checkShootingStar = true, // Check Shooting Star Pattern for Pressure Verifications
bool checkEveningStar = true, // Check Evening Star Pattern for Pressure Verifications
bool checkBearishEngulfingStar = true, // Check Bearish Engulfing Pattern for Pressure Verifications
double _threshold = 0, // Upper and Lower threshold of Pivot
double _breakVerificationPoint = 15, // Price Distance for Verify Pivot Break
int _loopback = 3 // Verification Loopback
)
{
//
bool result = false;
//
if (_breakVerificationPoint < 0)
{
_breakVerificationPoint = 15;
}
//
result = bar.IsValid();
if (!result)
{
return result;
}
//
double points = GetPoints(bar.symbol);
//
double threshold = 0;
if (_threshold > 0)
{
threshold = _threshold * points;
}
//
double price = GetBid(bar.symbol);
//
XOHCL cBar;
result = cBar.Init(
bar.symbol,
bar.period,
0 //
);
if (!result)
{
return result;
}
//
double hh2 = cBar.FindHighest(
2,
MODE_HIGH //
);
//
// Check Price is Below of Support High ...
result =
//
price < bar.low - threshold &&
(
//
hh2 > bar.low
//
||
//
hh2 > bar.low - threshold
//
||
//
(threshold > 0 && MathAbs(hh2 - price) > 0 && MathAbs(hh2 - price) <= threshold))
//
;
if (!result)
{
return result;
}
//
// Check Break Verification ...
if (_breakVerificationPoint > 0)
{
//
result = MathAbs((bar.low - threshold) - price) >= _breakVerificationPoint * points;
if (!result)
{
return result;
}
}
//
if (_verifyPressure && _loopback > 0)
{
//
// Verify Pressure by Candlestick Patterns ...
// We need last 3 Candle ...
//
for (int i = 0; i < _loopback; i++)
{
//
XOHCL iBar;
result = iBar.Init(
bar.symbol,
bar.period,
i //
);
if (!result)
{
break;
}
//
// Shooting Star ...
bool isShootingStar = !checkShootingStar
? false
: iBar.IsShootingStar();
if (isShootingStar)
{
//
DrawShootingStar(
iBar,
ChartID() //
);
}
//
// Evening Star ...
bool isEveningStar = !checkEveningStar
? false
: iBar.IsEveningStar();
if (isEveningStar)
{
//
DrawEveningStar(
iBar,
ChartID() //
);
}
//
// BearishEngulfing ...
bool isBearishEngulfing = !checkBearishEngulfingStar
? false
: iBar.IsBearishEngulfing();
if (isBearishEngulfing)
{
//
DrawBearishEngulfing(
iBar,
ChartID() //
);
}
//
result =
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
;
if (result)
{
break;
}
}
}
//
return result;
}
//
// Drawing Tools ...
//
// Hammer ...
//
string GetHammerTag(XOHCL &bar)
{
return XTLSHammerToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawHammer(
XOHCL &bar,
long chartID,
color clr = clrAqua,
uint width = 1,
uchar arrow = 233 //
)
{
//
bool result = false;
//
string name = GetHammerTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.low,
arrow,
ANCHOR_TOP,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveHammer(XOHCL &bar)
{
RemoveDraws(GetHammerTag(bar));
}
//
// Shooting Star ...
//
string GetShootingStarTag(XOHCL &bar)
{
return XTLSShootingStarToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawShootingStar(
XOHCL &bar,
long chartID,
color clr = clrMagenta,
uint width = 1,
uchar arrow = 234 //
)
{
//
bool result = false;
//
string name = GetShootingStarTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.high,
arrow,
ANCHOR_BOTTOM,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveShootingStar(XOHCL &bar)
{
RemoveDraws(GetShootingStarTag(bar));
}
//
// Bullish Engulfing ...
//
string GetBullishEngulfingTag(XOHCL &bar)
{
return XTLSBullishEngulfingToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBullishEngulfing(
XOHCL &bar,
long chartID,
color clr = clrAqua,
bool fill = false,
uint width = 1,
ENUM_LINE_STYLE style = STYLE_SOLID //
)
{
//
bool result = false;
//
XOHCL pBar;
result = bar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
string name = GetBullishEngulfingTag(bar);
//
DrawRectangle(
chartID,
name,
0,
pBar.time,
pBar.low,
bar.time,
bar.high,
clr,
style,
width,
fill //
);
//
return result;
}
//
void RemoveBullishEngulfing(XOHCL &bar)
{
RemoveDraws(GetBullishEngulfingTag(bar));
}
//
// Bearish Engulfing ...
//
string GetBearishEngulfingTag(XOHCL &bar)
{
return XTLSBearishEngulfingToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBearishEngulfing(
XOHCL &bar,
long chartID,
color clr = clrMagenta,
bool fill = false,
uint width = 1,
ENUM_LINE_STYLE style = STYLE_SOLID //
)
{
//
bool result = false;
//
XOHCL pBar;
result = bar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
string name = GetBearishEngulfingTag(bar);
//
DrawRectangle(
chartID,
name,
0,
pBar.time,
pBar.low,
bar.time,
bar.high,
clr,
style,
width,
fill //
);
//
return result;
}
//
void RemoveBearishEngulfing(XOHCL &bar)
{
RemoveDraws(GetBearishEngulfingTag(bar));
}
//
// Morning Star ...
//
string GetMorningStarTag(XOHCL &bar)
{
return XTLSMorningStarToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawMorningStar(
XOHCL &bar,
long chartID,
color clr = clrAqua,
uint width = 1,
uchar arrow = 233 //
)
{
//
bool result = false;
//
string name = GetMorningStarTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.low,
arrow,
ANCHOR_TOP,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveMorningStar(XOHCL &bar)
{
RemoveDraws(GetMorningStarTag(bar));
}
//
// Evening Star ...
//
string GetEveningStarTag(XOHCL &bar)
{
return XTLSEveningStarToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawEveningStar(
XOHCL &bar,
long chartID,
color clr = clrMagenta,
uint width = 1,
uchar arrow = 234 //
)
{
//
bool result = false;
//
string name = GetEveningStarTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.high,
arrow,
ANCHOR_BOTTOM,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveEveningStar(XOHCL &bar)
{
RemoveDraws(GetEveningStarTag(bar));
}
//
// Swing High ...
//
string GetSwingHighTag(XOHCL &bar)
{
return XTLSSwingHighToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawSwingHigh(
XOHCL &bar,
long chartID,
color clr = clrMagenta,
uint width = 1,
uchar arrow = 108 //
)
{
//
bool result = false;
//
string name = GetSwingHighTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.high,
arrow,
ANCHOR_BOTTOM,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveSwingHigh(XOHCL &bar)
{
RemoveDraws(GetSwingHighTag(bar));
}
//
// Swing Low ...
//
string GetSwingLowTag(XOHCL &bar)
{
return XTLSSwingLowToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawSwingLow(
XOHCL &bar,
long chartID,
color clr = clrAqua,
uint width = 1,
uchar arrow = 108 //
)
{
//
bool result = false;
//
string name = GetSwingLowTag(bar);
//
result = DrawArrow(
chartID,
name,
0,
bar.time,
bar.low,
arrow,
ANCHOR_TOP,
clr,
STYLE_SOLID,
width //
);
//
return result;
}
//
void RemoveSwingLow(XOHCL &bar)
{
RemoveDraws(GetSwingLowTag(bar));
}
//
// Bullish FVG ...
//
string GetBullishFVGTag(XOHCL &bar)
{
return XTLSBullishFVGToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBullishFVG(
XOHCL &bar,
double upper,
double lower,
long chartID,
color clr = clrAqua,
bool fill = false,
uint width = 1,
ENUM_LINE_STYLE style = STYLE_SOLID //
)
{
//
bool result = false;
//
XOHCL pBar;
result = bar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
XOHCL ppBar;
result = pBar.GetPreviousBar(ppBar);
if (!result)
{
return result;
}
//
string name = GetBullishFVGTag(bar);
//
DrawRectangle(
chartID,
name,
0,
ppBar.time,
lower,
bar.time,
upper,
clr,
style,
width,
fill //
);
//
return result;
}
//
void RemoveBullishFVG(XOHCL &bar)
{
RemoveDraws(GetBullishFVGTag(bar));
}
//
// Bearish FVG ...
//
string GetBearishFVGTag(XOHCL &bar)
{
return XTLSBearishFVGToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBearishFVG(
XOHCL &bar,
double upper,
double lower,
long chartID,
color clr = clrMagenta,
bool fill = false,
uint width = 1,
ENUM_LINE_STYLE style = STYLE_SOLID //
)
{
//
bool result = false;
//
XOHCL pBar;
result = bar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
XOHCL ppBar;
result = pBar.GetPreviousBar(ppBar);
if (!result)
{
return result;
}
//
string name = GetBearishFVGTag(bar);
//
DrawRectangle(
chartID,
name,
0,
ppBar.time,
upper,
bar.time,
lower,
clr,
style,
width,
fill //
);
//
return result;
}
//
void RemoveBearishFVG(XOHCL &bar)
{
RemoveDraws(GetBearishFVGTag(bar));
}
//
// Bullish Order Block ...
//
string GetBullishOrderBlockTag(XOHCL &bar)
{
return XTLSBullishOrderBlockToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBullishOrderBlock(
XOHCL &bar,
long chartID,
bool ray = true,
color clr = clrAqua,
ENUM_LINE_STYLE style = STYLE_DOT,
uint width = 1 //
)
{
//
bool result = false;
//
string name = GetBullishOrderBlockTag(bar);
datetime cTime = TimeCurrent();
//
// Draw Upper Line ...
result = DrawTrendLine(
chartID,
name + "-Upper",
0,
bar.time,
bar.high,
cTime,
bar.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
// Draw Lower Line ...
result = DrawTrendLine(
chartID,
name + "-Lower",
0,
bar.time,
bar.low,
cTime,
bar.low,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
return result;
}
//
void RemoveBullishOrderBlock(XOHCL &bar)
{
RemoveDraws(GetBullishOrderBlockTag(bar));
}
//
// Bearish Order Block ...
//
string GetBearishOrderBlockTag(XOHCL &bar)
{
return XTLSBearishOrderBlockToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBearishOrderBlock(
XOHCL &bar,
long chartID,
bool ray = true,
color clr = clrMagenta,
ENUM_LINE_STYLE style = STYLE_DOT,
uint width = 1 //
)
{
//
bool result = false;
//
string name = GetBearishOrderBlockTag(bar);
datetime cTime = TimeCurrent();
//
// Draw Upper Line ...
result = DrawTrendLine(
chartID,
name + "-Upper",
0,
bar.time,
bar.high,
cTime,
bar.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
// Draw Lower Line ...
result = DrawTrendLine(
chartID,
name + "-Lower",
0,
bar.time,
bar.low,
cTime,
bar.low,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
return result;
}
//
void RemoveBearishOrderBlock(XOHCL &bar)
{
RemoveDraws(GetBearishOrderBlockTag(bar));
}
//
// Support ...
//
string GetSupportTag(XOHCL &bar)
{
return XTLSSupportToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawSupport(
XOHCL &bar,
long chartID,
double _threshold = 0,
bool ray = true,
color clr = clrGreen,
ENUM_LINE_STYLE style = STYLE_DASH,
uint width = 1,
color thresholdColor = clrAqua //
)
{
//
bool result = false;
//
datetime time2 = TimeCurrent();
//
string name = GetSupportTag(bar);
//
result = DrawTrendLine(
chartID,
name,
0,
bar.time,
bar.high,
time2,
bar.high,
clr,
style,
width,
false,
false,
ray //
);
//
if (result && _threshold > 0)
{
//
double threshold = GetPoints(bar.symbol) * _threshold;
//
string upThresholdName = name + "UP";
string downThresholdName = name + "DOWN";
//
result = DrawTrendLine(
chartID,
upThresholdName,
0,
bar.time,
bar.high + threshold,
time2,
bar.high + threshold,
thresholdColor,
style,
width,
false,
false,
ray //
);
//
if (result)
{
//
result = DrawTrendLine(
chartID,
downThresholdName,
0,
bar.time,
bar.high - threshold,
time2,
bar.high - threshold,
thresholdColor,
style,
width,
false,
false,
ray //
);
}
}
//
return result;
}
//
void RemoveSupport(XOHCL &bar)
{
RemoveDraws(GetSupportTag(bar));
}
//
// Support ...
//
string GetResistanceTag(XOHCL &bar)
{
return XTLSResistanceToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawResistance(
XOHCL &bar,
long chartID,
double _threshold = 0,
bool ray = true,
color clr = clrRed,
ENUM_LINE_STYLE style = STYLE_DASH,
uint width = 1,
color thresholdColor = clrMagenta //
)
{
//
bool result = false;
//
datetime time2 = TimeCurrent();
//
string name = GetResistanceTag(bar);
//
result = DrawTrendLine(
chartID,
name,
0,
bar.time,
bar.low,
time2,
bar.low,
clr,
style,
width,
false,
false,
ray //
);
//
if (result && _threshold > 0)
{
//
double threshold = GetPoints(bar.symbol) * _threshold;
//
string upThresholdName = name + "UP";
string downThresholdName = name + "DOWN";
//
result = DrawTrendLine(
chartID,
upThresholdName,
0,
bar.time,
bar.low + threshold,
time2,
bar.low + threshold,
thresholdColor,
style,
width,
false,
false,
ray //
);
//
if (result)
{
//
result = DrawTrendLine(
chartID,
downThresholdName,
0,
bar.time,
bar.low - threshold,
time2,
bar.low - threshold,
thresholdColor,
style,
width,
false,
false,
ray //
);
}
}
//
return result;
}
//
void RemoveResistance(XOHCL &bar)
{
RemoveDraws(GetResistanceTag(bar));
}
//
// Bullish Trend ...
//
string GetBullishTrendTag(XOHCL &bar)
{
return XTLSBullishTrendToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBullishTrend(
XOHCL &bar,
XOHCL &highSwingBars[],
XOHCL &lowSwingBars[],
long chartID,
bool ray = true,
bool drawSwings = true,
color clr = clrAqua,
ENUM_LINE_STYLE style = STYLE_DOT,
uint width = 1,
uchar swingHighArrow = 108,
color swingHighColor = clrAqua,
uchar swingLowArrow = 108,
color swingLowColor = clrMagenta //
)
{
//
bool result = false;
//
string name = GetBullishTrendTag(bar);
//
XOHCL first;
XOHCL last;
//
// Draw Upper Trend Line ...
first = highSwingBars[ArraySize(highSwingBars) - 1];
last = highSwingBars[0];
//
result = DrawTrendLine(
chartID,
name + "-Upper",
0,
first.time,
first.high,
last.time,
last.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
// Draw Lower Trend Line ...
first = lowSwingBars[ArraySize(lowSwingBars) - 1];
last = lowSwingBars[0];
//
result = DrawTrendLine(
chartID,
name + "-Lower",
0,
first.time,
first.high,
last.time,
last.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
if (result && drawSwings)
{
//
// High Swings ...
for (int i = 0; i < ArraySize(highSwingBars); i++)
{
//
XOHCL iBar = highSwingBars[i];
//
result = DrawArrow(
chartID,
name + "-SwingHigh-" + ToString(i),
0,
iBar.time,
iBar.high,
swingHighArrow,
ANCHOR_BOTTOM,
swingHighColor,
STYLE_SOLID,
width //
);
if (!result)
{
break;
}
}
//
// Low Swings ...
for (int i = 0; i < ArraySize(lowSwingBars); i++)
{
//
XOHCL iBar = lowSwingBars[i];
//
result = DrawArrow(
chartID,
name + "-SwingLow-" + ToString(i),
0,
iBar.time,
iBar.low,
swingLowArrow,
ANCHOR_TOP,
swingLowColor,
STYLE_SOLID,
width //
);
if (!result)
{
break;
}
}
}
//
return result;
}
//
void RemoveBullishTrend(XOHCL &bar)
{
RemoveDraws(GetBullishTrendTag(bar));
}
//
// Bearish Trend ...
//
string GetBearishTrendTag(XOHCL &bar)
{
return XTLSBearishTrendToken + "-" + GetBarTimeTag(bar);
}
//
bool DrawBearishTrend(
XOHCL &bar,
XOHCL &highSwingBars[],
XOHCL &lowSwingBars[],
long chartID,
bool ray = true,
bool drawSwings = true,
color clr = clrMagenta,
ENUM_LINE_STYLE style = STYLE_DOT,
uint width = 1,
uchar swingHighArrow = 108,
color swingHighColor = clrMagenta,
uchar swingLowArrow = 108,
color swingLowColor = clrAqua //
)
{
//
bool result = false;
//
string name = GetBearishTrendTag(bar);
//
XOHCL first;
XOHCL last;
//
// Draw Upper Trend Line ...
first = highSwingBars[ArraySize(highSwingBars) - 1];
last = highSwingBars[0];
//
result = DrawTrendLine(
chartID,
name + "-Upper",
0,
first.time,
first.high,
last.time,
last.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
// Draw Lower Trend Line ...
first = lowSwingBars[ArraySize(lowSwingBars) - 1];
last = lowSwingBars[0];
//
result = DrawTrendLine(
chartID,
name + "-Lower",
0,
first.time,
first.high,
last.time,
last.high,
clr,
style,
width,
false,
false,
ray //
);
if (!result)
{
return result;
}
//
if (result && drawSwings)
{
//
// High Swings ...
for (int i = 0; i < ArraySize(highSwingBars); i++)
{
//
XOHCL iBar = highSwingBars[i];
//
result = DrawArrow(
chartID,
name + "-SwingHigh-" + ToString(i),
0,
iBar.time,
iBar.high,
swingHighArrow,
ANCHOR_BOTTOM,
swingHighColor,
STYLE_SOLID,
width //
);
if (!result)
{
break;
}
}
//
// Low Swings ...
for (int i = 0; i < ArraySize(lowSwingBars); i++)
{
//
XOHCL iBar = lowSwingBars[i];
//
result = DrawArrow(
chartID,
name + "-SwingLow-" + ToString(i),
0,
iBar.time,
iBar.low,
swingLowArrow,
ANCHOR_TOP,
swingLowColor,
STYLE_SOLID,
width //
);
if (!result)
{
break;
}
}
}
//
return result;
}
//
void RemoveBearishTrend(XOHCL &bar)
{
RemoveDraws(GetBearishTrendTag(bar));
}
//
void RemoveAllToolsDraws()
{
//
RemoveDraws(XTLSHammerToken);
RemoveDraws(XTLSSupportToken);
RemoveDraws(XTLSSwingLowToken);
RemoveDraws(XTLSSwingHighToken);
RemoveDraws(XTLSBullishFVGToken);
RemoveDraws(XTLSBearishFVGToken);
RemoveDraws(XTLSResistanceToken);
RemoveDraws(XTLSMorningStarToken);
RemoveDraws(XTLSEveningStarToken);
RemoveDraws(XTLSShootingStarToken);
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
RemoveDraws(XTLSBullishEngulfingToken);
RemoveDraws(XTLSBearishEngulfingToken);
RemoveDraws(XTLSBullishOrderBlockToken);
RemoveDraws(XTLSBearishOrderBlockToken);
}
//
//
//
//
string GetBarTimeTag(XOHCL &bar)
{
//
string result = NULL;
//
result =
//
ToString((int)bar.time)
//
;
//
return result;
}
//
string GeShootingStarTag(XOHCL &bar)
{
return "ShootingStar-" + GetBarTimeTag(bar);
}
//
// string GeShootingStarTag(XOHCL &bar)
// {
// return "ShootingStar-" + GetBarTimeTag(bar);
// }
//