Константы объектов

Предусмотрено 44 графических объекта, которые можно создавать и отображать на ценовом графике. Все константы для работы с объектами разбиты на 9 групп:

  • Типы объектов – идентификаторы графических объектов;
  • Свойства объектов – работа со свойствами графических объектов;
  • Способы привязки объектов – константы позиционирования объектов на графике;
  • Угол привязки – позволяет установить угла графика, относительно которого  производится позиционирование объекта в пикселях;
  • Видимость объектов – задание таймфреймов, на которых объект является видимым;
  • Уровни волн Эллиотта – градация волновой разметки;
  • Объекты Ганна – константы тренда для веера Ганна и сетки Ганна;
  • Набор Web-цветов – константы предопределенных Web-цветов;
  • Wingdings – коды символов шрифта Wingdings.

Типы объектов

При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.

ENUM_OBJECT

Идентификатор

 

Описание

OBJ_VLINE

vertical_line

Вертикальная линия

OBJ_HLINE

horizonal_line

Горизонтальная линия

OBJ_TREND

trend_line

Трендовая линия

OBJ_TRENDBYANGLE

trend_line)by_angle

Трендовая линия по углу

OBJ_CYCLES

cycle_lines

Циклические линии

OBJ_ARROWED_LINE

arrowed_line

Объект «Линия со стрелкой»

OBJ_CHANNEL

equidistance_channel

Равноудаленный канал

OBJ_STDDEVCHANNEL

stddeviation_channel

Канал стандартного отклонения

OBJ_REGRESSION

regression_channel

Канал на линейной регрессии

OBJ_PITCHFORK

andrewspitchfork

Вилы Эндрюса

OBJ_GANNLINE

gann_line

Линия Ганна

OBJ_GANNFAN

gann_fan

Веер Ганна

OBJ_GANNGRID

gann_grid

Сетка Ганна

OBJ_FIBO

fibonacci_levels

Уровни Фибоначчи

OBJ_FIBOTIMES

fibonacci_time_zones

Временные зоны Фибоначчи

OBJ_FIBOFAN

fibo_fan

Веер Фибоначчи

OBJ_FIBOARC

fibo_arc

Дуги Фибоначчи

OBJ_FIBOCHANNEL

fibo_channel

Канал Фибоначчи

OBJ_EXPANSION

fibo_expansion

Расширение Фибоначчи

OBJ_ELLIOTWAVE5

elliot_impuls

5-волновка Эллиота

OBJ_ELLIOTWAVE3

elliot_correction

3-волновка Эллиота

OBJ_RECTANGLE

rectangle

Прямоугольник

OBJ_TRIANGLE

triangle

Треугольник

OBJ_ELLIPSE

ellipse

Эллипс

OBJ_ARROW_THUMB_UP

THUMB_UP

Знак «Хорошо» (большой палец вверх)

OBJ_ARROW_THUMB_DOWN

THUMB_DOWN

Знак «Плохо» (большой палец вниз)

OBJ_ARROW_UP

arrow_up

Знак «Стрелка вверх»

OBJ_ARROW_DOWN

arrow_down

Знак «Стрелка вниз»

OBJ_ARROW_STOP

stop_signal

Знак «Стоп»

OBJ_ARROW_CHECK

check_signal

Знак «Птичка» (галка)

OBJ_ARROW_LEFT_PRICE

left_price_label

Левая ценовая метка

OBJ_ARROW_RIGHT_PRICE

right_price_label

Правая ценовая метка

OBJ_ARROW_BUY

buy_sign_icon

Знак «Buy»

OBJ_ARROW_SELL

sell_sign_icon

Знак «Sell»

OBJ_ARROW

arrow_symbol

Объект «Стрелка»

OBJ_TEXT

text_object

Объект «Текст»

OBJ_LABEL

label_object

Объект «Текстовая метка»

OBJ_BUTTON

button_object

Объект «Кнопка»

OBJ_CHART

chart_object

Объект «График»

OBJ_BITMAP

picture_object

Объект «Рисунок»

OBJ_BITMAP_LABEL

bitmap_object

Объект «Графическая метка»

OBJ_EDIT

edit_object

Объект «Поле ввода»

OBJ_EVENT

obj_event

Объект «Событие», соответствующий событию в экономическом календаре

OBJ_RECTANGLE_LABEL

rectangle_label

Объект «Прямоугольная метка»для создания и оформления пользовательского графического интерфейса.

Свойства объектов

Графические объекты могут иметь множество свойств в зависимости от типа объекта. Установка и получение значений свойств объектов производится соответствующими функциями по работе с графическими объектами.

Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов):

Объект

Идентификатор

X/Y

Width/Height

Date/Price

OBJPROP_CORNER

OBJPROP_ANCHOR

OBJPROP_ANGLE

Text

OBJ_TEXT

Да

Да

Да

Label

OBJ_LABEL

Да

Да (только для чтения)

Да

Да

Да

Button

OBJ_BUTTON

Да

Да

Да

Bitmap

OBJ_BITMAP

Да (только для чтения)

Да

Да

Bitmap Label

OBJ_BITMAP_LABEL

Да

Да (только для чтения)

Да

Да

Edit

OBJ_EDIT

Да

Да

Да

Rectangle Label

OBJ_RECTANGLE_LABEL

Да

Да

Да

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано «только для чтения», то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Функции, задающие свойства графических объектов, а также операции создания ObjectCreate() и перемещения ObjectMove() объектов на графике фактически служат для отправки команд графику. При успешном выполнении этих функций команда попадает в общую очередь событий графика. Визуальное изменение свойств графических объектов производится в процессе обработки очереди событий данного графика.

По этой причине не следует ожидать немедленного визуального обновления графических объектов после вызова данных функций. В общем случае обновление графических объектов на чарте производится терминалом автоматически по событиям изменения — поступление новой котировки, изменения размера окна графика и т.д. Для принудительного обновления графических объектов используйте команду на перерисовку графика ChartRedraw().

Для функций ObjectSetInteger() и ObjectGetInteger()

ENUM_OBJECT_PROPERTY_INTEGER

Идентификатор

Описание

Тип свойства

OBJPROP_COLOR

Цвет

color

OBJPROP_STYLE

Стиль

ENUM_LINE_STYLE

OBJPROP_WIDTH

Толщина линии

int

OBJPROP_BACK

Объект на заднем плане

bool

OBJPROP_ZORDER

Приоритет графического объекта на получение события нажатия мышки на графике (CHARTEVENT_CLICK). По умолчанию при создании значение выставляется равным нулю, но при необходимости можно повысить приоритет. При наложении объектов друг на друга событие CHARTEVENT_CLICK получит только один объект, чей приоритет выше остальных.

long

OBJPROP_FILL

Заливка объекта цветом (для OBJ_RECTANGLE, OBJ_TRIANGLE, OBJ_ELLIPSE, OBJ_CHANNEL, OBJ_STDDEVCHANNEL, OBJ_REGRESSION)

bool

OBJPROP_HIDDEN

Запрет на показ имени графического объекта в списке объектов из меню терминала «Графики» — «Объекты» — «Список объектов». Значение true позволяет скрыть ненужный для пользователя объект из списка. По умолчанию true устанавливается для объектов, которые отображают события календаря, историю торговли, а также для созданных из MQL5-программы. Для того чтобы увидеть такие графические объекты и получить доступ к их свойствам, нужно нажать кнопку «Все» в окне «Список объектов».

bool

OBJPROP_SELECTED

Выделенность объекта

bool

OBJPROP_READONLY

Возможность редактирования текста в объекте Edit

bool

OBJPROP_TYPE

Тип объекта

ENUM_OBJECT   r/o

OBJPROP_TIME

Координата времени

datetime   модификатор=номер точки привязки

OBJPROP_SELECTABLE

Доступность объекта

bool

OBJPROP_CREATETIME

Время создания объекта

datetime    r/o

OBJPROP_LEVELS

Количество уровней

int

OBJPROP_LEVELCOLOR

Цвет линии-уровня

color   модификатор=номер уровня

OBJPROP_LEVELSTYLE

Стиль линии-уровня

ENUM_LINE_STYLE модификатор=номер уровня

OBJPROP_LEVELWIDTH

Толщина линии-уровня

int      модификатор=номер уровня

OBJPROP_ALIGN

Горизонтальное выравнивание текста в объекте «Поле ввода» (OBJ_EDIT)

ENUM_ALIGN_MODE

OBJPROP_FONTSIZE

Размер шрифта

int

OBJPROP_RAY_LEFT

Луч продолжается влево

bool

OBJPROP_RAY_RIGHT

Луч продолжается вправо

bool

OBJPROP_RAY

Вертикальная линия продолжается на все окна графика

bool

OBJPROP_ELLIPSE

Отображение полного эллипса для объекта «Дуги Фибоначчи» (OBJ_FIBOARC)

bool

OBJPROP_ARROWCODE

Код стрелки для объекта «Стрелка»

char

OBJPROP_TIMEFRAMES

Видимость объекта на таймфреймах

набор флагов flags

OBJPROP_ANCHOR

Положение точки привязки графического объекта

ENUM_ARROW_ANCHOR (для OBJ_ARROW),

ENUM_ANCHOR_POINT (для OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_TEXT)

OBJPROP_XDISTANCE

Дистанция в пикселях по оси X от угла привязки

int

OBJPROP_YDISTANCE

Дистанция в пикселях по оси Y от угла привязки

int

OBJPROP_DIRECTION

Тренд объекта Ганна

ENUM_GANN_DIRECTION

OBJPROP_DEGREE

Уровень волновой разметки Эллиота

ENUM_ELLIOT_WAVE_DEGREE

OBJPROP_DRAWLINES

Отображение линий для волновой разметки Эллиота

bool

OBJPROP_STATE

Состояние кнопки (Нажата/Отжата)

bool

OBJPROP_CHART_ID

Идентификатор объекта «График» (OBJ_CHART). Позволяет работать со свойствами этого объекта как с обычным графиком с помощью функций из раздела Операции с графиками, но есть некоторые исключения.

long  r/o

OBJPROP_XSIZE

Ширина объекта по оси X в пикселях. Задается для объектов OBJ_LABEL (read only), OBJ_BUTTON, OBJ_CHART, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL.

int

OBJPROP_YSIZE

Высота объекта по оси Y в пикселях. Задается для объектов OBJ_LABEL (read only), OBJ_BUTTON, OBJ_CHART, OBJ_BITMAP, OBJ_BITMAP_LABEL, OBJ_EDIT, OBJ_RECTANGLE_LABEL.

int

OBJPROP_XOFFSET

X-координата левого верхнего угла прямоугольной области видимости  в графических объектах «Графическая метка» и «Рисунок» (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения.

int

OBJPROP_YOFFSET

Y-координата левого верхнего угла прямоугольной области видимости  в графических объектах «Графическая метка» и «Рисунок» (OBJ_BITMAP_LABEL и OBJ_BITMAP). Значение задается в пикселях относительного верхнего левого угла исходного изображения.

int

OBJPROP_PERIOD

Период для объекта «График»

ENUM_TIMEFRAMES

OBJPROP_DATE_SCALE

Признак отображения шкалы времени для объекта «График»

bool

OBJPROP_PRICE_SCALE

Признак отображения ценовой шкалы для объекта «График»

bool

OBJPROP_CHART_SCALE

Масштаб для объекта «График»

int   значение в диапазоне 0–5

OBJPROP_BGCOLOR

Цвет фона для OBJ_EDIT, OBJ_BUTTON, OBJ_RECTANGLE_LABEL

color

OBJPROP_CORNER

Угол графика для привязки графического объекта

ENUM_BASE_CORNER

OBJPROP_BORDER_TYPE

Тип рамки для объекта «Прямоугольная рамка»

ENUM_BORDER_TYPE

OBJPROP_BORDER_COLOR

Цвет рамки для объекта OBJ_EDIT и OBJ_BUTTON

color

При применении операций с графиками для объекта «График»  (OBJ_CHART) действуют следующие ограничения:

  • нельзя закрыть с помощью ChartClose();
  • нельзя поменять символ/период с помощью функции ChartSetSymbolPeriod();
  • не работают свойства CHART_SCALE, CHART_BRING_TO_TOP, CHART_SHOW_DATE_SCALE и CHART_SHOW_PRICE_SCALE (ENUM_CHART_PROPERTY_INTEGER).

 

Для объектов OBJ_BITMAP_LABEL и OBJ_BITMAP программным путем можно установить специальный режим показа изображения. В этом режиме показывается только та часть исходного изображения, на которую накладывается прямоугольная область видимости, остальная часть картинки становится невидимой. Размеры области видимости необходимо установить с помощью свойств OBJPROP_XSIZE и OBJPROP_YSIZE. Область видимости можно «перемещать» только в пределах исходного изображения с помощью  свойств OBJPROP_XOFFSET и OBJPROP_YOFFSET.

 

Для объектов с фиксированными размерами: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT и OBJ_CHART свойства OBJPROP_XDISTANCE и OBJPROP_YDISTANCE задают положение левой верхней точки объекта относительно угла графика (OBJPROP_CORNER), от которого будут отсчитываться координаты X и Y в пикселях.

 

Для функций ObjectSetDouble() и ObjectGetDouble()

ENUM_OBJECT_PROPERTY_DOUBLE

Идентификатор

Описание

Тип свойства

OBJPROP_PRICE

Координата цены

double    модификатор=номер точки привязки

OBJPROP_LEVELVALUE

Значение уровня

double    модификатор=номер уровня

OBJPROP_SCALE

Масштаб (свойство объектов Ганна и объекта «Дуги Фибоначчи»)

double

OBJPROP_ANGLE

Угол. Для объектов с еще не заданным углом, созданных из программы, значение равно EMPTY_VALUE

double

OBJPROP_DEVIATION

Отклонение для канала стандартного отклонения

double

 

Для функций ObjectSetString() и ObjectGetString()

ENUM_OBJECT_PROPERTY_STRING

Идентификатор

Описание

Тип свойства

OBJPROP_NAME

Имя объекта

string

OBJPROP_TEXT

Описание объекта (текст, содержащийся в объекте)

string

OBJPROP_TOOLTIP

Текст всплывающей подсказки. Если свойство не задано, то показывается подсказка, автоматически сформированная терминалом. Можно  отключить показ подсказки, установив для нее значение «\n» (перевод строки)

string

OBJPROP_LEVELTEXT

Описание уровня

string    модификатор=номер уровня

OBJPROP_FONT

Шрифт

string

OBJPROP_BMPFILE

Имя BMP-файла для объекта «Графическая метка».

string   модификатор: 0-состояние ON, 1-состояние OFF

OBJPROP_SYMBOL

Символ для объекта «График»

string

 

Для объекта OBJ_RECTANGLE_LABEL («Прямоугольная метка») можно задать один из трех видов отображения, которым соответствуют значения из перечисления ENUM_BORDER_TYPE.

ENUM_BORDER_TYPE

Идентификатор

Описание

BORDER_FLAT

Плоский вид

BORDER_RAISED

Выпуклый вид

BORDER_SUNKEN

Вогнутый вид

 

Для объекта OBJ_EDIT («Поле ввода») и для функции ChartScreenShot() можно указать тип выравнивания по горизонтали с помощью значений перечисления ENUM_ALIGN_MODE.

ENUM_ALIGN_MODE

Идентификатор

Описание

ALIGN_LEFT

Выравнивание по левой границе

ALIGN_CENTER

Выравнивание по центру (только для объекта «Поле ввода»)

ALIGN_RIGHT

Выравнивание по правой границе

Пример:

#define UP "\x0431"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
   //---
   string label_name="my_OBJ_LABEL_object";
   if(ObjectFind(0,label_name)<0)
   {
      Print("Object ",label_name," not found. Error code = ",GetLastError());
      //--- создадим объект Label
      ObjectCreate(0,label_name,OBJ_LABEL,0,0,0); 
      //--- установим координату X
      ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
      //--- установим координату Y
      ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
      //--- зададим цвет текста
      ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrWhite);
      //--- установим текст для объекта Label
      ObjectSetString(0,label_name,OBJPROP_TEXT,UP);
      //--- установим шрифт надписи
      ObjectSetString(0,label_name,OBJPROP_FONT,"Wingdings");
      //--- установим размер шрифта
      ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,10);
      //--- повернем на 45 градусов по часовой стрелке
      ObjectSetDouble(0,label_name,OBJPROP_ANGLE,-45);
      //--- запретим выделение объекта мышкой
      ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
      //--- отрисуем на графике
      ChartRedraw(0); 
   }
}

 

Способы привязки объектов

Графические объекты Text, Label, Bitmap и Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP и OBJ_BITMAP_LABEL) могут иметь один из 9 различных способов привязки своих координат, задаваемых свойством OBJPROP_ANCHOR.

Объект

Идентификатор

X/Y

Width/Height

Date/Price

OBJPROP_CORNER

OBJPROP_ANCHOR

OBJPROP_ANGLE

Text

OBJ_TEXT

Да

Да

Да

Label

OBJ_LABEL

Да

Да (только для чтения)

Да

Да

Да

Button

OBJ_BUTTON

Да

Да

Да

Bitmap

OBJ_BITMAP

Да (только для чтения)

Да

Да

Bitmap Label

OBJ_BITMAP_LABEL

Да

Да (только для чтения)

Да

Да

Edit

OBJ_EDIT

Да

Да

Да

Rectangle Label

OBJ_RECTANGLE_LABEL

Да

Да

Да

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано «только для чтения», то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Указать нужный вариант можно с помощью функции ObjectSetInteger(handle_графика, имя_объекта, OBJPROP_ANCHOR, способ_привязки), где способ_привязки — одно из значений перечисления ENUM_ANCHOR_POINT.

ENUM_ANCHOR_POINT

Идентификатор

Описание

ANCHOR_LEFT_UPPER

Точка привязки в левом верхнем углу

ANCHOR_LEFT

Точка привязки слева по центру

ANCHOR_LEFT_LOWER

Точка привязки в левом нижнем углу

ANCHOR_LOWER

Точка привязки снизу по центру

ANCHOR_RIGHT_LOWER

Точка привязки в правом нижнем углу

ANCHOR_RIGHT

Точка привязки справа по центру

ANCHOR_RIGHT_UPPER

Точка привязки в правом верхнем углу

ANCHOR_UPPER

Точка привязки сверху по центру

ANCHOR_CENTER

Точка привязки строго по центру объекта

Объекты OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT и OBJ_CHART имеют фиксированную точку привязки в левом верхнем углу (ANCHOR_LEFT_UPPER).

Пример:

 string text_name="my_OBJ_TEXT_object";
 if(ObjectFind(0,text_name)<0)
 {
    Print("Object ",text_name," not found. Error code = ",GetLastError());

    //--- получим максимальную цену графика
    double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);

    //--- создадим объект Label
    ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);

    //--- зададим цвет текста
    ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);

    //--- зададим цвет фона
    ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);

    //--- установим текст для объекта Label
    ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));

    //--- установим шрифт надписи
    ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");

    //--- установим размер шрифта
    ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);

    //--- установим привязку к правому верхнему углу
    ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);

    //--- повернем на 90 градусов против часовой стрелке
    ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);

    //--- запретим выделение объекта мышкой
    ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);

    //--- отрисуем на графике
    ChartRedraw(0);
 }

Графические объекты Arrow (OBJ_ARROW) имеют только 2 способа привязки своих координат. Идентификаторы перечислены в ENUM_ARROW_ANCHOR.

ENUM_ARROW_ANCHOR

Идентификатор

Описание

ANCHOR_TOP

Точка привязки для стрелки находится сверху

ANCHOR_BOTTOM

Точка привязки для стрелки находится внизу

Пример:

void OnStart()
{
   //--- служебные массивы
   double Ups[],Downs[];
   datetime Time[];

   //--- установим для массивов признак таймсерии
   ArraySetAsSeries(Ups,true);
   ArraySetAsSeries(Downs,true);
   ArraySetAsSeries(Time,true);

   //--- создадим хэндл индикатора Fractals
   int FractalsHandle=iFractals(NULL,0);
   Print("FractalsHandle = ",FractalsHandle);

   //--- сбросим код ошибки
   ResetLastError();

   //--- попытаемся скопировать значения индикатора
   int copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
   if(copied<=0)
   {
      Print("Не удалось скопировать верхние фракталы. Error = ",GetLastError());
      return;
   }
 
   ResetLastError();

   //--- попытаемся скопировать значения индикатора
   copied=CopyBuffer(FractalsHandle,1,0,1000,Downs);
   if(copied<=0)
   {
      Print("Не удалось скопировать нижние фракталы. Error = ",GetLastError());
      return;
   }
 
   ResetLastError();

   //--- скопируем таймсерию,содержащую время открытия последних 1000 баров
   copied=CopyTime(NULL,0,0,1000,Time);
   if(copied<=0)
   {
      Print("Не удалось скопировать времена открытия за последние 1000 баров");
      return;
   }
 
   int upcounter=0,downcounter=0; // будем в них подсчитывать количество стрелок
   bool created;// будем получать результат попытки создания объекта
   for(int i=2;i<copied;i++)// пробежимся по значениям индикатора iFractals
   {
      if(Ups[i]!=EMPTY_VALUE)// нашли верхний фрактал
      {
         if(upcounter<10)// создаем не более 10 объектов "вверх"
         {
              //--- попробуем создать объект "вверх"
              created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_UP,0,Time[i],Ups[i]);
              if(created)// если создался - сделаем ему тюнинг
              {
                  //--- точка привязки снизу, чтобы не наезжать на бар
                  ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
                  //--- последний штрих - покрасим
                  ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrBlue);
                  upcounter++;
              }
         }
      }

      if(Downs[i]!=EMPTY_VALUE)// нашли нижний фрактал 
      {
          if(downcounter<10)// создаем не более 10 объектов "вниз"
          {
              //--- попробуем создать объект "вниз"
              created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_DOWN,0,Time[i],Downs[i]);
              if(created)// если создался - сделаем ему тюнинг
              {
                  //--- точка привязки сверху, чтобы не наезжать на бар
                  ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
                  //--- последний штрих - покрасим
                  ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrRed);
                  downcounter++;
              }
          }
      }
   }
}

После выполнения скрипта график будет выглядеть примерно как на этом рисунке.

Угол графика, к которому привязан объект

Существует ряд графических объектов, для которых можно задавать угол графика, относительно которого указываются координаты в пикселях. Это следующие типы объектов (в скобках указаны идентификаторы типа объекта):

  • Label (OBJ_LABEL); Текстовая метка
  • Button (OBJ_BUTTON); Кнопка
  • Bitmap Label (OBJ_BITMAP_LABEL); Графическая метка
  • Edit (OBJ_EDIT); Поле ввода
  • Rectangle Label (OBJ_RECTANGLE_LABEL). Прямоугольная метка

Объект

Идентификатор

X/Y

Width/Height

Date/Price

OBJPROP_CORNER

OBJPROP_ANCHOR

OBJPROP_ANGLE

Text

OBJ_TEXT

Да

Да

Да

Label

OBJ_LABEL

Да

Да (только для чтения)

Да

Да

Да

Button

OBJ_BUTTON

Да

Да

Да

Bitmap

OBJ_BITMAP

Да (только для чтения)

Да

Да

Bitmap Label

OBJ_BITMAP_LABEL

Да

Да (только для чтения)

Да

Да

Edit

OBJ_EDIT

Да

Да

Да

Rectangle Label

OBJ_RECTANGLE_LABEL

Да

Да

Да

В таблице использованы следующие обозначения:

  • X/Y – координаты точки привязки задаются в пикселях относительно одного из углов графика;
  • Width/Height – объекты имеет ширину и высоту. Если указано «только для чтения», то это означает, что значения ширины и высоты вычисляются только после отрисовки объекта на графике;
  • Date/Price – координаты точки привязки задаются парой дата/цена;
  • OBJPROP_CORNER – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 4-х значений перечисления ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR – задаёт положение точки привязки в самом объекте, и может быть одним из 9-ти значений перечисления ENUM_ANCHOR_POINT. Именно от этой точки до выбранного угла графика указываются координаты в пикселях;
  • OBJPROP_ANGLE – задаёт угол поворота объекта против часовой стрелки.

Для того чтобы указать угол графика, от которого будут отсчитываться координаты X и Y в пикселях, необходимо воспользоваться функцией ObjectSetInteger(chartID, name, OBJPROP_CORNER, chart_corner), где:

  • chartID — идентификатор графика;
  • name – имя графического объекта;
  • OBJPROP_CORNER – идентификатор свойства для задания угла привязки;
  • chart_corner – требуемый угол графика, может принимать одно из значений перечисления ENUM_BASE_CORNER.

ENUM_BASE_CORNER

Идентификатор

Описание

CORNER_LEFT_UPPER

Центр координат в левом верхнем углу графика

CORNER_LEFT_LOWER

Центр координат в левом нижнем углу графика

CORNER_RIGHT_LOWER

Центр координат в правом нижнем углу графика

CORNER_RIGHT_UPPER

Центр координат в правом верхнем углу графика

Пример:

void CreateLabel(long chart_id,
                 string name,
                 int chart_corner,
                 int anchor_point,
                 string text_label,
                 int x_ord,
                 int y_ord)
{
    //---
    if(ObjectCreate(chart_id,name,OBJ_LABEL,0,0,0))
    {
       ObjectSetInteger(chart_id,name,OBJPROP_CORNER,chart_corner);
       ObjectSetInteger(chart_id,name,OBJPROP_ANCHOR,anchor_point);
       ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_ord);
       ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_ord);
       ObjectSetString(chart_id,name,OBJPROP_TEXT,text_label);
    }
    else
      Print("Не удалось создать объект OBJ_LABEL ",name,", Код ошибки = ", GetLastError());
}

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
   //---
   int height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
   int width=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
   string arrows[4]={"LEFT_UPPER","RIGHT_UPPER","RIGHT_LOWER","LEFT_LOWER"};
   CreateLabel(0,arrows[0],CORNER_LEFT_UPPER,ANCHOR_LEFT_UPPER,arrows[0],50,50);
   CreateLabel(0,arrows[1],CORNER_RIGHT_UPPER,ANCHOR_RIGHT_UPPER,arrows[1],50,50);
   CreateLabel(0,arrows[2],CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,arrows[2],50,50);
   CreateLabel(0,arrows[3],CORNER_LEFT_LOWER,ANCHOR_LEFT_LOWER,arrows[3],50,50);
}

Видимость объектов

Комбинация флагов видимости объекта определяет таймфреймы графика, на которых объект отображаем. Для установки/получения значения свойства OBJPROP_TIMEFRAMES можно использовать функции ObjectSetInteger()/ObjectGetInteger().

Константа

Значение

Описание

OBJ_NO_PERIODS

0

Объект не показывается ни на одном таймфрейме

OBJ_PERIOD_M1

0x00000001

Объект рисуется на 1-минутных графиках

OBJ_PERIOD_M2

0x00000002

Объект рисуется на 2-минутных графиках

OBJ_PERIOD_M3

0x00000004

Объект рисуется на 3-минутных графиках

OBJ_PERIOD_M4

0x00000008

Объект рисуется на 4-минутных графиках

OBJ_PERIOD_M5

0x00000010

Объект рисуется на 5-минутных графиках

OBJ_PERIOD_M6

0x00000020

Объект рисуется на 6-минутных графиках

OBJ_PERIOD_M10

0x00000040

Объект рисуется на 10-минутных графиках

OBJ_PERIOD_M12

0x00000080

Объект рисуется на 12-минутных графиках

OBJ_PERIOD_M15

0x00000100

Объект рисуется на 15-минутных графиках

OBJ_PERIOD_M20

0x00000200

Объект рисуется на 20-минутных графиках

OBJ_PERIOD_M30

0x00000400

Объект рисуется на 30-минутных графиках

OBJ_PERIOD_H1

0x00000800

Объект рисуется на 1-часовых графиках

OBJ_PERIOD_H2

0x00001000

Объект рисуется на 2-часовых графиках

OBJ_PERIOD_H3

0x00002000

Объект рисуется на 3-часовых графиках

OBJ_PERIOD_H4

0x00004000

Объект рисуется на 4-часовых графиках

OBJ_PERIOD_H6

0x00008000

Объект рисуется на 6-часовых графиках

OBJ_PERIOD_H8

0x00010000

Объект рисуется на 8-часовых графиках

OBJ_PERIOD_H12

0x00020000

Объект рисуется на 12-часовых графиках

OBJ_PERIOD_D1

0x00040000

Объект рисуется на дневных графиках

OBJ_PERIOD_W1

0x00080000

Объект рисуется на недельных графиках

OBJ_PERIOD_MN1

0x00100000

Объект рисуется на месячных графиках

OBJ_ALL_PERIODS

0x001fffff

Объект рисуется на всех таймфреймах

Флаги видимости можно комбинировать с помощью символа «|», например, комбинация флагов OBJ_PERIOD_M10|OBJ_PERIOD_H4 означает, что объект будет видим на 10-минутном и 4-часовом таймфреймах.

Пример:

void OnStart()
{
   //---
   string highlevel="PreviousDayHigh";
   string lowlevel="PreviousDayLow";
   double prevHigh; // High предыдущего дня
   double prevLow; // Low предыдущего дня
   double highs[],lows[]; // массивы для получения High и Low
 
   //--- сбросим значение последней ошибки
   ResetLastError();

   //--- получим 2 последних значения High на дневном таймфрейме
   int highsgot=CopyHigh(Symbol(),PERIOD_D1,0,2,highs);
   if(highsgot>0) // если копирование прошло успешно
   {
      Print("Цены High за последние 2 дня получены успешно");
      prevHigh=highs[0]; // High предыдущего дня
      Print("prevHigh = ",prevHigh);

      if(ObjectFind(0,highlevel)<0) // объект с именем highlevel не найден
      {
          ObjectCreate(0,highlevel,OBJ_HLINE,0,0,0); // создадим объект гор. линия
      }

      //--- зададим ценовой уровень для линии highlevel
      ObjectSetDouble(0,highlevel,OBJPROP_PRICE,0,prevHigh);

      //--- установим видимость только для PERIOD_M10 и PERIOD_H4
      ObjectSetInteger(0,highlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M10|OBJ_PERIOD_H4);
   }
   else
   {
      Print("Не удалось получить цены High за последние 2 дня, Error = ",GetLastError());
   }
 
   //--- сбросим значение последней ошибки
   ResetLastError();

   //--- получим 2 последних значения Low на дневном таймфрейме
   int lowsgot=CopyLow(Symbol(),PERIOD_D1,0,2,lows);
   if(lowsgot>0) // если копирование прошло успешно
   {
      Print("Цены Low за последние 2 дня получены успешно");
      prevLow=lows[0]; // Low предыдущего дня
      Print("prevLow = ",prevLow);

      if(ObjectFind(0,lowlevel)<0) // объект с именем lowlevel не найден
      {
         ObjectCreate(0,lowlevel,OBJ_HLINE,0,0,0); // создадим объект гор. линия
      }

      //--- зададим ценовой уровень для линии lowlevel
      ObjectSetDouble(0,lowlevel,OBJPROP_PRICE,0,prevLow);

      //--- установим видимость только для PERIOD_M10 и PERIOD_H4
      ObjectSetInteger(0,lowlevel,OBJPROP_TIMEFRAMES,OBJ_PERIOD_M10|OBJ_PERIOD_H4);
   }
   else Print("Не удалось получить цены Low за последние 2 дня, Error = ",GetLastError());
 
   ChartRedraw(0); // перерисуем график принудительно
}

Уровни волн Эллиотта

Волны Эллиотта представлены двумя графическими объектами типов OBJ_ELLIOTWAVE5 и OBJ_ELLIOTWAVE3. Для задания размера волны (способа маркировки волн) используется свойство OBJPROP_DEGREE, которому можно установить одно из значений перечисления ENUM_ELLIOT_WAVE_DEGREE.

ENUM_ELLIOT_WAVE_DEGREE

Константа

Описание

ELLIOTT_GRAND_SUPERCYCLE

Главный Суперцикл (Grand Supercycle)

ELLIOTT_SUPERCYCLE

Суперцикл (Supercycle)

ELLIOTT_CYCLE

Цикл (Cycle)

ELLIOTT_PRIMARY

Первичный цикл (Primary)

ELLIOTT_INTERMEDIATE

Промежуточное звено (Intermediate)

ELLIOTT_MINOR

Второстепенный цикл (Minor)

ELLIOTT_MINUTE

Минута (Minute)

ELLIOTT_MINUETTE

Секунда (Minuette)

ELLIOTT_SUBMINUETTE

Субсекунда (Subminuette)

Пример:

for(int i=0;i<ObjectsTotal(0);i++)
{
   string currobj=ObjectName(0,i);
   if((ObjectGetInteger(0,currobj,OBJPROP_TYPE)==OBJ_ELLIOTWAVE3) || ((ObjectGetInteger(0,currobj,OBJPROP_TYPE)==OBJ_ELLIOTWAVE5)))
   {
      //--- установим уровень разметки в INTERMEDIATE
      ObjectSetInteger(0,currobj,OBJPROP_DEGREE,ELLIOTT_INTERMEDIATE);

      //--- включим показ линий между вершинами волн
      ObjectSetInteger(0,currobj,OBJPROP_DRAWLINES,true);

      //--- установим цвет линий
      ObjectSetInteger(0,currobj,OBJPROP_COLOR,clrBlue);

      //--- установим толщину линий
      ObjectSetInteger(0,currobj,OBJPROP_WIDTH,5);

      //--- зададим описание
      ObjectSetString(0,currobj,OBJPROP_TEXT,"test script");
   }
}

 

Объекты Ганна

Для объектов веер Ганна (OBJ_GANNFAN) и сетка Ганна (OBJ_GANNGRID) можно указать одно из двух значений перечисления ENUM_GANN_DIRECTION, которое задает направление тренда.

ENUM_GANN_DIRECTION

Константа

Описание

GANN_UP_TREND

Линия соответствует восходящему тренду

GANN_DOWN_TREND

Линия соответствует нисходящему тренду

Для установки масштаба основной линии 1×1 используется функция ObjectSetDouble(chart_handle, gann_object_name, OBJPROP_SCALE, scale), где:

  • chart_handle – окно графика, в котором находится объект;
  • gann_object_name – имя объекта;
  • OBJPROP_SCALE – идентификатор свойства «Scale»;
  • scale – требуемый масштаб в единицах Pips/Bar.

Пример создания веера Ганна:

void OnStart()
{
   //---
   string my_gann="OBJ_GANNFAN object";
   if(ObjectFind(0,my_gann)<0)// объект не найден
   {
      //--- сообщим о неудаче 
      Print("Object ",my_gann," not found. Error code = ",GetLastError());

      //--- получим максимальную цену графика
      double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);

      //--- получим минимальную цену графика
      double chart_min_price=ChartGetDouble(0,CHART_PRICE_MIN,0);

      //--- сколько баров на графике показано?
      int bars_on_chart=ChartGetInteger(0,CHART_VISIBLE_BARS);

      //--- создадим массив, куда запишем время открытия каждого бара
      datetime Time[];

      //--- организуем доступ к массиву как в таймсерии
      ArraySetAsSeries(Time,true);

      //--- теперь скопируем в него данные для видимых на графике баров
      int times=CopyTime(NULL,0,0,bars_on_chart,Time);
      if(times<=0)
      {
         Print("Не удалось скопировать массив со временем открытия!");
         return;
      }
      //--- предварительные приготовления закончены
 
      //--- индекс центрального бара на графике
      int center_bar=bars_on_chart/2;

      //--- экватор графика - между максимумом и минимумом
      double mean=(chart_max_price+chart_min_price)/2.0;

      //--- установим координаты первой точки привязки в центр
      ObjectCreate(0,my_gann,OBJ_GANNFAN,0,Time[center_bar],mean,

      //--- вторая точки привязки справа
      Time[center_bar/2],(mean+chart_min_price)/2.0);
      Print("Time[center_bar] = "+(string)Time[center_bar]+" Time[center_bar/2] = "+(string)Time[center_bar/2]);
      //Print("Time[center_bar]/="+Time[center_bar]+" Time[center_bar/2]="+Time[center_bar/2]);

      //--- установим масштаб в единицах Pips/Bar
      ObjectSetDouble(0,my_gann,OBJPROP_SCALE,10);

      //--- установим направление тренда
      ObjectSetInteger(0,my_gann,OBJPROP_DIRECTION,GANN_UP_TREND);

      //--- установим толщину линий
      ObjectSetInteger(0,my_gann,OBJPROP_WIDTH,1);

      //--- зададим стиль линий
      ObjectSetInteger(0,my_gann,OBJPROP_STYLE,STYLE_DASHDOT);

      //--- и цвет линий
      ObjectSetInteger(0,my_gann,OBJPROP_COLOR,clrYellowGreen);

      //--- разрешим пользователю выделять объект 
      ObjectSetInteger(0,my_gann,OBJPROP_SELECTABLE,true);

      //--- выделим его сами
      ObjectSetInteger(0,my_gann,OBJPROP_SELECTED,true);

      //--- отрисуем на графике
      ChartRedraw(0);
   }
}

 

Набор Web-цветов

Для типа color определены следующие цветовые константы:

Задавать цвет можно для объектов с помощью функции ObjectSetInteger() и для пользовательских индикаторов с помощью функции PlotIndexSetInteger(). Для получения значения цвета служат аналогичные функции ObjectGetInteger() и PlotIndexGetInteger().

Пример:

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_color3 clrLime

Wingdings

Символы шрифта Wingdings, используемые с объектом OBJ_ARROW:

Установка нужного символа производится с помощью функции ObjectSetInteger().

Пример:

void OnStart()
{
   //---
   string up_arrow="up_arrow";
   datetime time=TimeCurrent();
   double lastClose[1];
   int close=CopyClose(Symbol(),Period(),0,1,lastClose); // получим цену Close

   //--- если цена получена
   if(close>0)
   {
      ObjectCreate(0,up_arrow,OBJ_ARROW,0,0,0,0,0); // создадим стрелку
      ObjectSetInteger(0,up_arrow,OBJPROP_ARROWCODE,241); // установим код стрелки
      ObjectSetInteger(0,up_arrow,OBJPROP_TIME,time); // зададим время
      ObjectSetDouble(0,up_arrow,OBJPROP_PRICE,lastClose[0]);// зададим цену
      ChartRedraw(0); // перерисуем окно
   }
   else
     Print("Не удалось получить последнюю цену Close!");
}