Предусмотрено 44 графических объекта, которые можно создавать и отображать на ценовом графике. Все константы для работы с объектами разбиты на 9 групп:
- Типы объектов – идентификаторы графических объектов;
- Свойства объектов – работа со свойствами графических объектов;
- Способы привязки объектов – константы позиционирования объектов на графике;
- Угол привязки – позволяет установить угла графика, относительно которого производится позиционирование объекта в пикселях;
- Видимость объектов – задание таймфреймов, на которых объект является видимым;
- Уровни волн Эллиотта – градация волновой разметки;
- Объекты Ганна – константы тренда для веера Ганна и сетки Ганна;
- Набор Web-цветов – константы предопределенных Web-цветов;
- Wingdings – коды символов шрифта Wingdings.
Типы объектов
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
ENUM_OBJECT
Идентификатор |
|
Описание |
OBJ_VLINE |
Вертикальная линия |
|
OBJ_HLINE |
Горизонтальная линия |
|
OBJ_TREND |
Трендовая линия |
|
OBJ_TRENDBYANGLE |
Трендовая линия по углу |
|
OBJ_CYCLES |
Циклические линии |
|
OBJ_ARROWED_LINE |
Объект «Линия со стрелкой» |
|
OBJ_CHANNEL |
Равноудаленный канал |
|
OBJ_STDDEVCHANNEL |
Канал стандартного отклонения |
|
OBJ_REGRESSION |
Канал на линейной регрессии |
|
OBJ_PITCHFORK |
Вилы Эндрюса |
|
OBJ_GANNLINE |
Линия Ганна |
|
OBJ_GANNFAN |
Веер Ганна |
|
OBJ_GANNGRID |
Сетка Ганна |
|
OBJ_FIBO |
Уровни Фибоначчи |
|
OBJ_FIBOTIMES |
Временные зоны Фибоначчи |
|
OBJ_FIBOFAN |
Веер Фибоначчи |
|
OBJ_FIBOARC |
Дуги Фибоначчи |
|
OBJ_FIBOCHANNEL |
Канал Фибоначчи |
|
OBJ_EXPANSION |
Расширение Фибоначчи |
|
OBJ_ELLIOTWAVE5 |
5-волновка Эллиота |
|
OBJ_ELLIOTWAVE3 |
3-волновка Эллиота |
|
OBJ_RECTANGLE |
Прямоугольник |
|
OBJ_TRIANGLE |
Треугольник |
|
OBJ_ELLIPSE |
Эллипс |
|
OBJ_ARROW_THUMB_UP |
Знак «Хорошо» (большой палец вверх) |
|
OBJ_ARROW_THUMB_DOWN |
Знак «Плохо» (большой палец вниз) |
|
OBJ_ARROW_UP |
Знак «Стрелка вверх» |
|
OBJ_ARROW_DOWN |
Знак «Стрелка вниз» |
|
OBJ_ARROW_STOP |
Знак «Стоп» |
|
OBJ_ARROW_CHECK |
Знак «Птичка» (галка) |
|
OBJ_ARROW_LEFT_PRICE |
Левая ценовая метка |
|
OBJ_ARROW_RIGHT_PRICE |
Правая ценовая метка |
|
OBJ_ARROW_BUY |
Знак «Buy» |
|
OBJ_ARROW_SELL |
Знак «Sell» |
|
OBJ_ARROW |
Объект «Стрелка» |
|
OBJ_TEXT |
Объект «Текст» |
|
OBJ_LABEL |
Объект «Текстовая метка» |
|
OBJ_BUTTON |
Объект «Кнопка» |
|
OBJ_CHART |
Объект «График» |
|
OBJ_BITMAP |
Объект «Рисунок» |
|
OBJ_BITMAP_LABEL |
Объект «Графическая метка» |
|
OBJ_EDIT |
Объект «Поле ввода» |
|
OBJ_EVENT |
Объект «Событие», соответствующий событию в экономическом календаре |
|
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 – задаёт угол поворота объекта против часовой стрелки.
Функции, задающие свойства графических объектов, а также операции создания 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.
Идентификатор |
Описание |
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!"); }