Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5
Шрифт:
ObjectsDeleteAll (0, -1, -1);
}
Более подробно о создании объектов на графике символа мы поговорим далее.
Графические объекты
Как уже было показано ранее, мы можем рисовать на графике символа не только диаграммы индикатора, но и добавлять различные графические объекты с помощью функции ObjectCreate:
bool ObjectCreate (
long chart_id, // идентификатор графика
string name, // имя объекта
ENUM_OBJECT type, // тип объекта
int sub_window, //
datetime time1, // время первой точки привязки
double price1, // цена первой точки привязки
datetime timeN=0, // время N-ой точки привязки
double priceN=0, // цена N-ой точки привязки
datetime time30=0, // время 30-й точки привязки
double price30=0 // цена 30-точки привязки
);
Здесь параметр sub_window это индекс главного окна графика символа со значением 0 или индекс подокна другого индикатора, присоединенного к графику символа.
Например, если в предыдущем примере мы изменим код, и присоединим к графику символа, скажем, индикатор ADX, мы увидим следующее:
for (int i=start; i <rates_total &&!IsStopped ;i++)
{
if (close [i-1]> open [i-1] &&close [i-1]> EMA34HBuffer [i-1] &&close [i-1]> EMA34LBuffer [i-1] &&low [i-1]> EMA125Buffer [i-1] &&low [i-1]> PSARBuffer [i-1] &&EMA125Buffer [i-1] <EMA34LBuffer [i-1] &&EMA125Buffer [i-1] <EMA34HBuffer [i-1]) {
if (!ObjectCreate (0,«Buy»+i, OBJ_ARROW,0,time [i-1],high [i-1]))
{
return (false);
}
if (!ObjectCreate (0,«Buy1»+i, OBJ_ARROW,1,time [i-1],high [i-1]))
{
return (false);
}
ObjectSetInteger (0,«Buy»+i, OBJPROP_COLOR, clrGreen);
ObjectSetInteger (0,«Buy»+i, OBJPROP_ARROWCODE,233);
ObjectSetInteger (0,«Buy»+i, OBJPROP_WIDTH,2);
ObjectSetInteger (0,«Buy»+i, OBJPROP_ANCHOR, ANCHOR_UPPER);
ObjectSetInteger (0,«Buy»+i, OBJPROP_HIDDEN, true);
ObjectSetString (0,«Buy»+i, OBJPROP_TOOLTIP, close [i-1]);
ObjectSetInteger (0,«Buy1»+i, OBJPROP_COLOR, clrGreen);
ObjectSetInteger (0,«Buy1»+i, OBJPROP_ARROWCODE,233);
ObjectSetInteger (0,«Buy1»+i, OBJPROP_WIDTH,2);
ObjectSetInteger (0,«Buy1»+i, OBJPROP_ANCHOR, ANCHOR_UPPER);
ObjectSetInteger (0,«Buy1»+i, OBJPROP_HIDDEN, true);
ObjectSetString (0,«Buy1»+i, OBJPROP_TOOLTIP, close [i-1]);
}
if (close [i-1] <open [i-1] &&close [i-1] <EMA34HBuffer [i-1] &&close [i-1] <EMA34LBuffer [i-1] &&high [i-1] <EMA125Buffer [i-1] &&high [i-1] <PSARBuffer [i-1] &&EMA125Buffer [i-1]> EMA34LBuffer [i-1] &&EMA125Buffer [i-1]> EMA34HBuffer [i-1]) {
if (!ObjectCreate (0,«Sell»+i, OBJ_ARROW,0,time [i-1],low [i-1]))
{
return (false);
}
if (!ObjectCreate (0,«Sell1»+i, OBJ_ARROW,1,time [i-1],low [i-1]))
{
return (false);
}
ObjectSetInteger (0,«Sell»+i, OBJPROP_COLOR, clrRed);
ObjectSetInteger (0,«Sell»+i, OBJPROP_ARROWCODE,234);
ObjectSetInteger (0,«Sell»+i, OBJPROP_WIDTH,2);
ObjectSetInteger (0,«Sell»+i, OBJPROP_ANCHOR, ANCHOR_LOWER);
ObjectSetInteger (0,«Sell»+i, OBJPROP_HIDDEN, true);
ObjectSetString (0,«Sell»+i, OBJPROP_TOOLTIP, close [i-1]);
ObjectSetInteger (0,«Sell1»+i, OBJPROP_COLOR, clrRed);
ObjectSetInteger (0,«Sell1»+i, OBJPROP_ARROWCODE,234);
ObjectSetInteger (0,«Sell1»+i, OBJPROP_WIDTH,2);
ObjectSetInteger (0,«Sell1»+i, OBJPROP_ANCHOR, ANCHOR_LOWER)
ObjectSetInteger (0,«Sell1»+i, OBJPROP_HIDDEN, true);
ObjectSetString (0,«Sell1»+i, OBJPROP_TOOLTIP, close [i-1]);
}
}
Нумерация
подокон идет сверху вниз в порядке отображения.Тип отображаемого объекта задается перечислением ENUM_OBJECT, которое можно посмотреть в справочнике.
После добавления графических объектов, не забываем их удалять в функции обратного вызова OnDeinit , используя функцию ObjectDelete:
bool ObjectDelete (
long chart_id, // chart identifier
string name // object name
);
Или используя функцию ObjectsDeleteAll:
int ObjectsDeleteAll (
long chart_id, // chart identifier
int sub_window=-1, // window index
int type=-1 // object type
);
Помимо вышеупомянутых функций ObjectCreate, ObjectDelete и ObjectsDeleteAll, MQL5 предлагает набор функций для работы с графическими объектами: ObjectName, ObjectFind, ObjectGetTimeByValue, ObjectGetValueByTime, ObjectMove, ObjectsTotal, ObjectGetDouble, ObjectGetInteger, ObjectGetString, ObjectSetDouble, ObjectSetInteger, ObjectSetString, TextSetFont, TextOut, TextGetSize.
Функции ObjectName, ObjectFind, ObjectGetTimeByValue, ObjectGetValueByTime, ObjectsTotal, ObjectGetDouble, ObjectGetInteger, ObjectGetString, TextGetSize – это функции возвращающие информацию.
Функции ObjectSetDouble, ObjectSetInteger, ObjectSetString, TextSetFont – это функции устанавливающие свойства объекта.
Функция ObjectMove перемещает объект в окне.
Функция TextOut выводит текст в пиксельный массив для отображения объектом OBJ_BITMAP_LABEL или OBJ_BITMAP.
После добавления графических объектов рекомендуется принудительно перерисовать график символа с помощью функции ChartRedraw:
void ChartRedraw (
long chart_id=0 // идентификатор графика