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

Графические объекты 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++;
              }
           }
        }
     }
  }

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

Установка значков по значениям фракталов