Способы привязки объектов
Графические объекты 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 – задаёт угол графика, относительно которого указываются координаты точки привязки. Может быть одним из 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 имеют фиксированную точку привязки в левом верхнем углу (ANCHOR_LEFT_UPPER).
Пример:
void OnStart()
{
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
|
Точка привязки для стрелки находится внизу
|
Пример:
#property strict
void OnStart()
{
//--- служебные массивы
double Ups[],Downs[];
datetime Times[];
//--- установим для массивов признак таймсерии
ArraySetAsSeries(Ups,true);
ArraySetAsSeries(Downs,true);
ArraySetAsSeries(Times,true);
//--- сбросим код ошибки
ResetLastError();
//--- скопируем таймсерию,содержащую время открытия последних 1000 баров
int copied=CopyTime(NULL,0,0,1000,Times);
if(copied<=0)
{
Print("Не удалось скопировать времена открытия за последние 1000 баров");
return;
}
//--- подготовим массивы Ups и Downs
ArrayResize(Ups,copied);
ArrayResize(Downs,copied);
//--- скопируем значения индикатора iFractals
for(int i=0;i<copied;i++)
{
Ups[i]=iFractals(NULL,0,MODE_UPPER,i);
Downs[i]=iFractals(NULL,0,MODE_LOWER,i);
}
//---
int upcounter=0,downcounter=0; // будем в них подсчитывать количество стрелок
bool created;// будем получать результат попытки создания объекта
for(int i=2;i<copied;i++)// пробежимся по значениям индикатора iFractals
{
if(Ups[i]!=0)// нашли верхний фрактал
{
if(upcounter<10)// создаем не более 10 объектов "вверх"
{
//--- попробуем создать объект "вверх"
created=ObjectCreate(0,string(Times[i]),OBJ_ARROW_THUMB_UP,0,Times[i],Ups[i]);
if(created)// если создался - сделаем ему тюнинг
{
//--- точка привязки снизу, чтобы не наезжать на бар
ObjectSetInteger(0,string(Times[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
//--- последний штрих - покрасим
ObjectSetInteger(0,string(Times[i]),OBJPROP_COLOR,clrBlue);
upcounter++;
}
}
}
if(Downs[i]!=0)// нашли нижний фрактал
{
if(downcounter<10)// создаем не более 10 объектов "вниз"
{
//--- попробуем создать объект "вниз"
created=ObjectCreate(0,string(Times[i]),OBJ_ARROW_THUMB_DOWN,0,Times[i],Downs[i]);
if(created)// если создался - сделаем ему тюнинг
{
//--- точка привязки сверху, чтобы не наезжать на бар
ObjectSetInteger(0,string(Times[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
//--- последний штрих - покрасим
ObjectSetInteger(0,string(Times[i]),OBJPROP_COLOR,clrRed);
downcounter++;
}
}
}
}
} |
После выполнения скрипта график будет выглядеть примерно как на этом рисунке.
|