Files
MQL4Data/Libraries/x-saherelm.draw.lib.mq4
2024-01-25 04:05:58 +03:30

2010 lines
49 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL4 Draw Global Library
// ---------------------------------------------
// saherelm useful tools and definitions ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Includes our shared library ...
#include "../Libraries/x-saherelm.log.lib.mq4"
//
// Draw Highest High ...
bool DrawHighestHigh(
const int bar_index,
const int marketLen,
const string tag,
const int drawUntilBarIndex = 0,
const long chartID = 0,
const int subWindow = 0,
const color clr = clrAqua,
const ENUM_LINE_STYLE style = STYLE_DOT,
const int width = 1,
const bool back = false,
const bool selection = false,
const bool hidden = false,
const long zOrder = 0
) {
//
bool result = false;
//
// Calculate Highest High ...
int hhIdx = iHighest(
_Symbol,
_Period,
MODE_HIGH,
marketLen,
bar_index
);
//
datetime hhTime = iTime(
_Symbol,
_Period,
hhIdx
);
//
datetime barTime = iTime(
_Symbol,
_Period,
bar_index
);
//
datetime drawUntilTime =
drawUntilBarIndex != bar_index ?
iTime(
_Symbol,
_Period,
drawUntilBarIndex
) :
barTime
;
//
double hh = iHigh(
_Symbol,
_Period,
hhIdx
);
//
int rnd = rand();
//
// Define Label ...
string lbl = StringConcatenate(
tag,
"_HH(", marketLen ,")_",
hh,
"_", rnd
);
//
result = ObjectDelete(
chartID,
lbl
);
//
// Draw a Trend Line ...
result = DrawTrendLine(
chartID,
lbl,
subWindow,
hhTime,
hh,
drawUntilTime,
hh,
clr,
style,
width,
back,
selection,
hidden,
zOrder
);
//
return result;
}
//
// Draw Lowest Low ...
bool DrawLowestLow(
const int bar_index,
const int marketLen,
const string tag,
const int drawUntilBarIndex = 0,
const long chartID = 0,
const int subWindow = 0,
const color clr = clrFuchsia,
const ENUM_LINE_STYLE style = STYLE_DOT,
const int width = 1,
const bool back = false,
const bool selection = false,
const bool hidden = false,
const long zOrder = 0
) {
//
bool result = false;
//
// Calculate Highest High ...
int llIdx = iLowest(
_Symbol,
_Period,
MODE_LOW,
marketLen,
bar_index
);
//
datetime llTime = iTime(
_Symbol,
_Period,
llIdx
);
//
datetime barTime = iTime(
_Symbol,
_Period,
bar_index
);
//
datetime drawUntilTime =
drawUntilBarIndex != bar_index ?
iTime(
_Symbol,
_Period,
drawUntilBarIndex
) :
barTime
;
//
double ll = iLow(
_Symbol,
_Period,
llIdx
);
//
int rnd = rand();
//
// Define Label ...
string lbl = StringConcatenate(
tag,
"_LL(", marketLen ,")_",
ll,
"_", rnd
);
//
result = ObjectDelete(
chartID,
lbl
);
//
// Draw a Trend Line ...
result = DrawTrendLine(
chartID,
lbl,
subWindow,
llTime,
ll,
drawUntilTime,
ll,
clr,
style,
width,
back,
selection,
hidden,
zOrder
);
//
return result;
}
//
// Draw Market Middle ...
bool DrawMarketMiddle(
const int bar_index,
const int marketLen,
const string tag,
const int drawUntilBarIndex = 0,
const long chartID = 0,
const int subWindow = 0,
const color clr = clrYellow,
const ENUM_LINE_STYLE style = STYLE_DOT,
const int width = 1,
const bool back = false,
const bool selection = false,
const bool hidden = false,
const long zOrder = 0
) {
//
bool result = false;
//
// Calculate Highest High ...
int llIdx = iLowest(
_Symbol,
_Period,
MODE_LOW,
marketLen,
bar_index
);
//
datetime llTime = iTime(
_Symbol,
_Period,
llIdx
);
//
double ll = iLow(
_Symbol,
_Period,
llIdx
);
//
// Calculate Highest High ...
int hhIdx = iHighest(
_Symbol,
_Period,
MODE_HIGH,
marketLen,
bar_index
);
//
datetime hhTime = iTime(
_Symbol,
_Period,
hhIdx
);
//
double hh = iHigh(
_Symbol,
_Period,
hhIdx
);
//
double middle = ll + ((hh - ll) / 2);
datetime middleTime = hhIdx < llIdx
? hhTime
: llTime
;
//
datetime barTime = iTime(
_Symbol,
_Period,
bar_index
);
//
datetime drawUntilTime =
drawUntilBarIndex != bar_index ?
iTime(
_Symbol,
_Period,
drawUntilBarIndex
) :
barTime
;
//
int rnd = rand();
//
// Define Label ...
string lbl = StringConcatenate(
tag,
"_MID(", marketLen ,")_",
middle,
"_", rnd
);
//
result = ObjectDelete(
chartID,
lbl
);
//
// Draw a Trend Line ...
result = DrawTrendLine(
chartID,
lbl,
subWindow,
middleTime,
middle,
drawUntilTime,
middle,
clr,
style,
width,
back,
selection,
hidden,
zOrder
);
//
return result;
}
//
// Start Arrow Functions ...
//
//
// Draw an Arrow Object on Chart ...
bool DrawArrow(
const long chartID = 0, // chart's ID
const string name = "Arrow", // arrow name
const int subWindow = 0, // subwindow index
datetime time = 0, // anchor point time
double price = 0, // anchor point price
const uchar arrowCode = OBJ_ARROW_UP, // arrow code
const ENUM_ARROW_ANCHOR anchor = ANCHOR_BOTTOM, // anchor point position
const color clr = clrAqua, // arrow color
const ENUM_LINE_STYLE style = STYLE_SOLID, // border line style
const int width = 3, // arrow size
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = false, // hidden in the object list
const long zOrder = 0 // Order Object ...
) {
//
// set anchor point coordinates if they are not set ...
ChangeArrowEmptyPoint(time, price);
//
// reset the error value ...
ResetLastError();
//
// create an arrow ...
if(!ObjectCreate(chartID, name, OBJ_ARROW, subWindow, time, price)) {
//
string message = StringConcatenate(__FUNCTION__,
": failed to create an arrow! Error code = ",
GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set the arrow code ...
ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, arrowCode);
//
// set anchor type ...
ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor);
//
// set the arrow color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set the border line style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set the arrow's size ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the arrow by mouse
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is false by default, if you want making it possible to highlight and move the object
// change it to true ...
ObjectSetInteger(chartID,name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID,name, OBJPROP_SELECTED, selection);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Move the anchor point of Arrow ...
bool MoveArrow(
const long chartID = 0, // chart's ID
const string name = "Arrow", // object name
datetime time = 0, // anchor point time coordinate
double price = 0 // anchor point price coordinate
) {
//
// if point position is not set, move it to the current bar having Bid price ...
if(!time) {
time = TimeCurrent();
}
//
if(!price) {
price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
//
// reset the error value
ResetLastError();
//
// move the anchor point ...
if(!ObjectMove(chartID, name, 0, time, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the anchor point! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete an arrow ...
bool DeleteArrow(
const long chartID = 0, // chart's ID
const string name = "Arrow" // arrow name
) {
//
// reset the error value ...
ResetLastError();
//
// delete an arrow ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete an arrow! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Change the arrow code ...
bool ArrowCodeChange(
const long chartID = 0, // chart's ID
const string name = "Arrow", // object name
const uchar code = 252 // arrow code
) {
//
// reset the error value ...
ResetLastError();
//
// change the arrow code ...
if(!ObjectSetInteger(chartID, name, OBJPROP_ARROWCODE, code)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change the arrow code! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Change anchor type ...
bool ArrowAnchorChange(
const long chartID = 0, // chart's ID
const string name="Arrow", // object name
const ENUM_ARROW_ANCHOR anchor = ANCHOR_TOP // anchor type
) {
//
// reset the error value ...
ResetLastError();
//
// change anchor type ...
if(!ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change anchor type! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Check anchor point values and set default values
// for empty ones ...
void ChangeArrowEmptyPoint(
datetime &time,
double &price
) {
//
// if the point's time is not set, it will be on the current bar ...
if(!time) {
time = TimeCurrent();
}
//
// if the point's price is not set, it will have Bid value ...
if(!price) {
price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
}
//
// End Arrow Functions ...
//
//
// Start Horizontal Line Functions ...
//
//
// Create, Draw the horizontal line ...
bool DrawHorizontalLine(
const long chartID = 0, // chart's ID
const string name = "HLine", // line name
const int subWindow = 0, // subwindow index
double price = 0, // line price
const color clr = clrRed, // line color
const ENUM_LINE_STYLE style = STYLE_SOLID, // line style
const int width = 1, // line width
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = false, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// if the price is not set, set it at the current Bid price level ...
if(!price) {
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//
// reset the error value ...
ResetLastError();
//
// create a horizontal line ...
if(!ObjectCreate(chartID, name, OBJ_HLINE, subWindow, 0, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create a horizontal line! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set line color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set line display style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set line width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the line by mouse
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is true by default making it possible to highlight and move the object
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Move horizontal line ...
bool MoveHorizontalLine(
const long chartID = 0, // chart's ID
const string name = "HLine", // line name
double price = 0 // line price
) {
//
// if the line price is not set, move it to the current Bid price level ...
if(!price) {
price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//
// reset the error value ...
ResetLastError();
//
// move a horizontal line ...
if(!ObjectMove(chartID, name, 0, 0, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the horizontal line! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete a horizontal line ...
bool DeleteHorizontalLine(
const long chartID = 0, // chart's ID
const string name = "HLine" // line name
) {
//
// reset the error value ...
ResetLastError();
//
// delete a horizontal line ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete a horizontal line! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// End Horizontal Line Functions ...
//
//
// Start Vertical Line Functions ...
//
//
// Create the vertical line ...
bool DrawVerticalLine(
const long chartID = 0, // chart's ID
const string name = "VLine", // line name
const int sub_window = 0, // subwindow index
datetime time = 0, // line time
const color clr=clrRed, // line color
const ENUM_LINE_STYLE style = STYLE_SOLID, // line style
const int width = 1, // line width
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = false, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// if the line time is not set, draw it via the last bar ...
if (!time) {
time = TimeCurrent();
}
//
// reset the error value
ResetLastError();
//
// create a vertical line ...
if (!ObjectCreate(chartID, name, OBJ_VLINE, sub_window, time, 0)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create a vertical line! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return false;
}
//
// set line color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set line display style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set line width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the line by mouse
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is true by default making it possible to highlight and move the object ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return true;
}
//
// Move the vertical line ...
bool MoveVerticalLine(
const long chartID = 0, // chart's ID
const string name = "VLine", // line name
datetime time = 0 // line time
) {
//
// if line time is not set, move the line to the last bar ...
if (!time) {
time = TimeCurrent();
}
//
// reset the error value ...
ResetLastError();
//
// move the vertical line ...
if(!ObjectMove(chartID, name, 0, time, 0)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the vertical line! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete the vertical line ...
bool DeleteVerticalLine(
const long chartID = 0, // chart's ID
const string name = "VLine" // line name
) {
//
// reset the error value ...
ResetLastError();
//
// delete the vertical line ...
if (!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete the vertical line! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return false;
}
//
// successful execution ...
return true;
}
//
// End Vertical Line Functions ...
//
//
// Start RectangleLabel Functions ...
//
//
// Create Rectangle Label Object ...
bool DrawRectangleLabel(
const long chartID = 0, // chart's ID
const string name = "RectLabel", // label name
const int subWindow = 0, // subwindow index
const int x = 0, // X coordinate
const int y = 0, // Y coordinate
const int width = 50, // width
const int height = 18, // height
const color back_clr = C'236,233,216', // background color
const ENUM_BORDER_TYPE border = BORDER_SUNKEN, // border type
const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring
const color clr = clrRed, // flat border color (Flat)
const ENUM_LINE_STYLE style = STYLE_SOLID, // flat border style
const int lineWidth = 1, // flat border width
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = false, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// reset the error value ...
ResetLastError();
//
//--- create a rectangle label
if(!ObjectCreate(chartID, name, OBJ_RECTANGLE_LABEL, subWindow, 0, 0)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create a rectangle label! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set label coordinates ...
ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y);
//
// set label size ...
ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width);
ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height);
//
// set background color ...
ObjectSetInteger(chartID, name, OBJPROP_BGCOLOR, back_clr);
//
// set border type ...
ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border);
//
// set the chart's corner, relative to which point coordinates are defined ...
ObjectSetInteger(chartID, name, OBJPROP_CORNER, corner);
//
// set flat border color (in Flat mode) ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set flat border line style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set flat border width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, lineWidth);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the label by mouse ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, selection);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Move Rectangle Label ..
bool MoveRectangleLabel(
const long chartID = 0, // chart's ID
const string name = "RectLabel", // label name
const int x = 0, // X coordinate
const int y=0 // Y coordinate
) {
//
// reset the error value ...
ResetLastError();
//
// move the rectangle label ...
if(!ObjectSetInteger(chartID, name, OBJPROP_XDISTANCE, x)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move X coordinate of the label! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
if(!ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, y)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move Y coordinate of the label! Error code = ",GetLastError()
);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete the rectangle label ...
bool DeleteRectangleLabel(
const long chartID = 0, // chart's ID
const string name = "RectLabel" // label name
) {
//
// reset the error value ...
ResetLastError();
//
// delete the label ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete a rectangle label! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Change Rectangle Label Size ...
bool ChangeSizeRectangleLabel(
const long chartID = 0, // chart's ID
const string name = "RectLabel", // label name
const int width = 50, // label width
const int height = 18 // label height
) {
//
// reset the error value ...
ResetLastError();
//
// change label size ...
if(!ObjectSetInteger(chartID, name, OBJPROP_XSIZE, width)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change the label's width! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
if(!ObjectSetInteger(chartID, name, OBJPROP_YSIZE, height)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change the label's height! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Change rectangle label border type ...
bool RectLabelChangeBorderType(
const long chartID = 0, // chart's ID
const string name = "RectLabel", // label name
const ENUM_BORDER_TYPE border = BORDER_SUNKEN // border type
) {
//
// reset the error value ...
ResetLastError();
//
// change border type ...
if(!ObjectSetInteger(chartID, name, OBJPROP_BORDER_TYPE, border)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change the border type! Error code = ",GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// End RectangleLabel Functions ...
//
//
// Start TrendLine Funcions ...
//
// Create a trend line by the given coordinates ...
bool DrawTrendLine(
const long chartID = 0, // chart's ID
const string name = "TrendLine", // line name
const int subWindow = 0, // subwindow index
datetime time1 = 0, // first point time
double price1 = 0, // first point price
datetime time2 = 0, // second point time
double price2 = 0, // second point price
const color clr = clrYellow, // line color
const ENUM_LINE_STYLE style = STYLE_SOLID, // line style
const int width = 1, // line width
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool rayRight = false, // line's continuation to the right
const bool hidden = false, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// set anchor points' coordinates if they are not set ...
ChangeTrendLineEmptyPoints(
time1,
price1,
time2,
price2
);
//
// reset the error value ...
ResetLastError();
//
// create a trend line by the given coordinates ...
if(!ObjectCreate(chartID, name, OBJ_TREND, subWindow, time1, price1, time2, price2)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create a trend line! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set line color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set line display style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set line width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the line by mouse
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is true by default making it possible to highlight and move the object ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// enable (true) or disable (false) the mode of continuation of the line's display to the right ...
ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Move trend line anchor point ... |
bool ChangeTrendLinePoint(
const long chartID = 0, // chart's ID
const string name = "TrendLine", // line name
const int pointindex = 0, // anchor point index
datetime time = 0, // anchor point time coordinate
double price = 0 // anchor point price coordinate
) {
//
// if point position is not set, move it to the current bar having Bid price ...
if (!time) {
time = TimeCurrent();
}
//
if (!price) {
price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//
// reset the error value ...
ResetLastError();
//
// move trend line's anchor point ...
if(!ObjectMove(chartID, name, pointindex, time, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the anchor point! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// The function deletes the trend line from the chart ...
bool DeleteTrendLine(
const long chartID = 0, // chart's ID
const string name = "TrendLine" // line name
) {
//
// reset the error value ...
ResetLastError();
//
// delete a trend line ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete a trend line! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Check the values of trend line's anchor points and set default ...
// values for empty ones ...
void ChangeTrendLineEmptyPoints(
datetime &time1,
double &price1,
datetime &time2,
double &price2
) {
//
// if the first point's time is not set, it will be on the current bar ...
if (!time1) {
time1 = TimeCurrent();
}
//
// if the first point's price is not set, it will have Bid value ...
if (!price1) {
price1 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
}
//
// if the second point's time is not set, it is located 9 bars left from the second one ...
if (!time2) {
//
// array for receiving the open time of the last 10 bars ...
datetime temp[10];
CopyTime(Symbol(), Period(), time1, 10, temp);
//
// set the second point 9 bars left from the first one ...
time2 = temp[0];
}
//
// if the second point's price is not set, it is equal to the first point's one ...
if (!price2) {
price2 = price1;
}
}
//
// End TrendLine Functions ...
//
//
// Start Text Functions ...
//
// Create and Draw a Text Object ...
bool DrawText(
const long chartID = 0, // chart's ID
const string name = "Text", // object name
const int subWindow = 0, // subwindow index
datetime time = 0, // anchor point time
double price = 0, // anchor point price
const string text = "Text", // the text itself
const string font = "Arial", // font
const int fontSize = 10, // font size
const color clr = clrRed, // color
const double angle = 0.0, // text slope
const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = true, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// set anchor point coordinates if they are not set ...
ChangeTextEmptyPoint(time,price);
//
// reset the error value ...
ResetLastError();
//
//--- create Text object
if(!ObjectCreate(chartID, name, OBJ_TEXT, subWindow, time, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create \"Text\" object! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set the text ...
ObjectSetString(chartID, name , OBJPROP_TEXT, text);
//
// set text font ...
ObjectSetString(chartID, name, OBJPROP_FONT, font);
//
// set font size ...
ObjectSetInteger(chartID, name, OBJPROP_FONTSIZE, fontSize);
//
// set the slope angle of the text ...
ObjectSetDouble(chartID, name, OBJPROP_ANGLE, angle);
//
// set anchor type ...
ObjectSetInteger(chartID, name, OBJPROP_ANCHOR, anchor);
//
// set color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of moving the object by mouse ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID ,name, OBJPROP_SELECTED, selection);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Move the anchor point ...
bool MoveText(
const long chartID = 0, // chart's ID
const string name = "Text", // object name
datetime time = 0, // anchor point time coordinate
double price = 0 // anchor point price coordinate
) {
//
//--- if point position is not set, move it to the current bar having Bid price
if (!time) {
time = TimeCurrent();
}
//
if (!price) {
price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
//
// reset the error value ...
ResetLastError();
//
// move the anchor point ..
if(!ObjectMove(chartID, name, 0, time, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the anchor point! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Change the object text ...
bool ChangeText(
const long chartID = 0, // chart's ID
const string name = "Text", // object name
const string text = "Text" // text
) {
//
// reset the error value ...
ResetLastError();
//
// change object text ...
if(!ObjectSetString(chartID, name, OBJPROP_TEXT, text)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to change the text! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete Text object ...
bool DeleteText(
const long chartID = 0, // chart's ID
const string name = "Text" // object name
) {
//
// reset the error value ...
ResetLastError();
//
// delete the object ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete \"Text\" object! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution
return(true);
}
//
// Check anchor point values and set default values
// for empty ones ...
void ChangeTextEmptyPoint(
datetime &time,
double &price
) {
//
// if the point's time is not set, it will be on the current bar ...
if(!time) {
time = TimeCurrent();
}
//
// if the point's price is not set, it will have Bid value ...
if(!price) {
price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
}
//
// End Text Functions ...
//
//
// Start Fibonacchi Functions ...
//
//
// Create Fibonacci Retracement by the given coordinates ...
bool DrawFibonacci(
const long chartID = 0, // chart's ID
const string name="Fibonacci", // object name
const int subWindow = 0, // subwindow index
datetime time1 = 0, // first point time
double price1 = 0, // first point price
datetime time2 = 0, // second point time
double price2 = 0, // second point price
const color clr = clrRed, // object color
const ENUM_LINE_STYLE style = STYLE_SOLID, // object line style
const int width = 1, // object line width
const bool back = false, // in the background
const bool selection = true, // highlight to move
const bool rayRight = false, // object's continuation to the right
const bool hidden = true, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// set anchor points' coordinates if they are not set ...
ChangeFibonacciEmptyPoints(time1, price1, time2, price2);
//
// reset the error value ...
ResetLastError();
//
// Create Fibonacci Retracement by the given coordinates ...
if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create \"Fibonacci Retracement\"! Error code = " , GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set line style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set line width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of highlighting the channel for moving
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is true by default making it possible to highlight and move the object ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// enable (true) or disable (false) the mode of continuation of the object's display to the right ...
ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// successful execution ...
return(true);
}
//
// Create Fibonacci Retracement by the given coordinates ...
bool DrawCustomFibonacci(
//
int levels, // number of level lines
double &values[], // values of level lines
color &colors[], // color of level lines
ENUM_LINE_STYLE &styles[], // style of level lines
int &widths[], // width of level lines
string &descriptions[], // level Descriptions
//
const long chartID = 0, // chart's ID
const string name = "Fibonacci", // object name
const int subWindow = 0, // subwindow index
datetime time1 = 0, // first point time
double price1 = 0, // first point price
datetime time2 = 0, // second point time
double price2 = 0, // second point price
const color clr = clrAqua, // object color
const ENUM_LINE_STYLE style = STYLE_DOT, // object line style
const int width = 1, // object line width
const bool back = false, // in the background
const bool selection = true, // highlight to move
const bool rayRight = false, // object's continuation to the right
const bool hidden = true, // hidden in the object list
const long zOrder = 0 // priority for mouse click
) {
//
// set anchor points' coordinates if they are not set ...
ChangeFibonacciEmptyPoints(time1, price1, time2, price2);
//
// reset the error value ...
ResetLastError();
//
// Create Fibonacci Retracement by the given coordinates ...
if (!ObjectCreate(chartID, name, OBJ_FIBO, subWindow, time1, price1, time2, price2)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to create \"Fibonacci Retracement\"! Error code = " , GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// set color ...
ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);
//
// set line style ...
ObjectSetInteger(chartID, name, OBJPROP_STYLE, style);
//
// set line width ...
ObjectSetInteger(chartID, name, OBJPROP_WIDTH, width);
//
// display in the foreground (false) or background (true) ...
ObjectSetInteger(chartID, name, OBJPROP_BACK, back);
//
// enable (true) or disable (false) the mode of highlighting the channel for moving
// when creating a graphical object using ObjectCreate function, the object cannot be
// highlighted and moved by default. Inside this method, selection parameter
// is true by default making it possible to highlight and move the object ...
ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, true);
ObjectSetInteger(chartID, name, OBJPROP_SELECTED, selection);
//
// enable (true) or disable (false) the mode of continuation of the object's display to the right ...
ObjectSetInteger(chartID, name, OBJPROP_RAY_RIGHT, rayRight);
//
// hide (true) or display (false) graphical object name in the object list ...
ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, hidden);
//
// set the priority for receiving the event of a mouse click in the chart ...
ObjectSetInteger(chartID, name, OBJPROP_ZORDER, zOrder);
//
// Change Levels Of Fibonacci ...
bool result = FibonacciLevelsSet(
levels,
values,
colors,
styles,
widths,
descriptions,
chartID,
name
);
//
// successful execution ...
return result;
}
//
// Set number of levels and their parameters ...
bool FibonacciLevelsSet(
int levels, // number of level lines
double &values[], // values of level lines
color &colors[], // color of level lines
ENUM_LINE_STYLE &styles[], // style of level lines
int &widths[], // width of level lines
string &descriptions[], // level Descriptions
const long chartID = 0, // chart's ID
const string name = "Fibonacci" // object name
) {
//
// check array sizes ...
if(
levels!=ArraySize(colors) ||
levels!=ArraySize(styles) ||
levels!=ArraySize(widths) ||
levels!=ArraySize(widths)
) {
//
string message = StringConcatenate(
__FUNCTION__,
": array length does not correspond to the number of levels, error!"
);
//
LogMessage(message);
//
return(false);
}
//
// set the number of levels ...
ObjectSetInteger(chartID, name, OBJPROP_LEVELS, levels);
//
// set the properties of levels in the loop ...
for(int i = 0; i < levels; i++) {
//
// level value ...
ObjectSetDouble(chartID, name, OBJPROP_LEVELVALUE, i, values[i]);
//
// level color ...
ObjectSetInteger(chartID, name, OBJPROP_LEVELCOLOR, i, colors[i]);
//
// level style ...
ObjectSetInteger(chartID, name, OBJPROP_LEVELSTYLE, i, styles[i]);
//
// level width ...
ObjectSetInteger(chartID, name, OBJPROP_LEVELWIDTH, i, widths[i]);
//
// level description ...
// ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, DoubleToString(100 * values[i], 1));
ObjectSetString(chartID, name, OBJPROP_LEVELTEXT, i, descriptions[i]);
}
//
// successful execution ...
return(true);
}
//
// Move Fibonacci Retracement anchor point ...
bool FibonacciPointChange(
const long chartID = 0, // chart's ID
const string name = "Fibonacci", // object name
const int pointIndex = 0, // anchor point index
datetime time = 0, // anchor point time coordinate
double price = 0 // anchor point price coordinate
) {
//
// if point position is not set, move it to the current bar having Bid price ...
if (!time) {
time = TimeCurrent();
}
//
if (!price) {
price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
//
// reset the error value ...
ResetLastError();
//
// move the anchor point ...
if(!ObjectMove(chartID, name, pointIndex, time, price)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to move the anchor point! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Delete Fibonacci Retracement ...
bool DeleteFibonachi(
const long chartID = 0, // chart's ID
const string name = "Fibonacci" // object name
) {
//
// reset the error value ...
ResetLastError();
//
// delete the object ...
if(!ObjectDelete(chartID, name)) {
//
string message = StringConcatenate(
__FUNCTION__,
": failed to delete \"Fibonacci Retracement\"! Error code = ", GetLastError()
);
//
LogMessage(message);
//
return(false);
}
//
// successful execution ...
return(true);
}
//
// Check the values of Fibonacci Retracement anchor points and set
// default values for empty ones ...
void ChangeFibonacciEmptyPoints(
datetime &time1,
double &price1,
datetime &time2,
double &price2
) {
//
// if the second point's time is not set, it will be on the current bar ...
if (!time2) {
time2 = TimeCurrent();
}
//
// if the second point's price is not set, it will have Bid value ...
if (!price2) {
price2 = SymbolInfoDouble(_Symbol, SYMBOL_BID);
}
//
// if the first point's time is not set, it is located 9 bars left from the second one ...
if (!time1) {
//
// array for receiving the open time of the last 10 bars ...
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//
// set the first point 9 bars left from the second one ...
time1 = temp[0];
}
//
// if the first point's price is not set, move it 200 points below the second one ...
if (!price1) {
price1 = price2 - 200 * SymbolInfoDouble(_Symbol, SYMBOL_POINT);
}
}
//
// End Fibonacci Functions ...
//
//
// Start General Functions ...
//
//
// Remove all Drawn Objects ...
void RemoveDraws(const string &tag) {
//
for(int iObj=ObjectsTotal()-1; iObj >= 0; iObj--) {
//
string on = ObjectName(iObj);
if (StringFind(on, tag) == 0) {
ObjectDelete(on);
}
}
}
//
// End General Functions ...
//