Métodos de Vinculação de Objeto

Os objetos de gráficos Text, Label, Bitmap e Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP e OBJ_BITMAP_LABEL) podem ter uma de 9 maneiras diferentes de vincular suas coordenadas, as quais foram especificadas pela propriedade OBJPROP_ANCHOR.

Objeto

Identificador

X/Y

Largura/Altura

Data/Preço

OBJPROP_CORNER

OBJPROP_ANCHOR

OBJPROP_ANGLE

Texto

OBJ_TEXT

Sim

Sim

Sim

etiqueta

OBJ_LABEL

Sim

Sim (apenas leitura)

Sim

Sim

Sim

Botão

OBJ_BUTTON

Sim

Sim

Sim

Bitmap

OBJ_BITMAP

Sim (apenas leitura)

Sim

Sim

Bitmap Label

OBJ_BITMAP_LABEL

Sim

Sim (apenas leitura)

Sim

Sim

Edit

OBJ_EDIT

Sim

Sim

Sim

etiqueta retangular

OBJ_RECTANGLE_LABEL

Sim

Sim

Sim

Na tabela são utilizadas as seguintes denominações:

  • X/Y — as coordenadas do ponto âncora são especificadas em pixels em relação a um dos cantos do gráfico;
  • Width/Height — os objetos têm largura e altura. Se você definir "apenas leitura", isso significa que os valores para largura e altura são calculados somente após o processamento do objeto no gráfico;
  • Date/Price — as coordenadas do ponto âncora são definidas pelo par data/preço;
  • OBJPROP_CORNER — define o ângulo do gráfico, que especifica as coordenadas do ponto de âncora. Pode ser um dos 4 valores de enumeração ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR — define a posição do ponto de âncora no objeto, e pode ser um dos 9 valores de enumeração ENUM_ANCHOR_POINT. Precisamente a partir desse ponto até ao canto selecionado são expecificadas as cordenadas em pixels;
  • OBJPROP_ANGLE — define o ângulo de rotação do objeto no sentido anti-horário.

A variante necessária pode ser especificada usando a função ObjectSetInteger(chart_handle, object_name, OBJPROP_ANCHOR, anchor_point_mode), onde anchor_point_mode é um dos valores de ENUM_ANCHOR_POINT.

ENUM_ANCHOR_POINT

ID

Descrição

ANCHOR_LEFT_UPPER

Ponto de ancoragem no canto superior esquerdo

ANCHOR_LEFT

Ponto de ancoragem para a esquerda no centro

ANCHOR_LEFT_LOWER

Ponto de ancoragem no canto inferior esquerdo

ANCHOR_LOWER

Ponto de ancoragem abaixo no centro

ANCHOR_RIGHT_LOWER

Ponto de ancoragem no canto inferior direito

ANCHOR_RIGHT

Ponto de ancoragem para a direita no centro

ANCHOR_RIGHT_UPPER

Ponto de ancoragem no canto superior direito

ANCHOR_UPPER

Ponto de ancoragem acima no centro

ANCHOR_CENTER

Ponto de ancoragem rigorosamente no centro do objeto

Os objetos OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT e OBJ_CHART possuem um ponto de ancoragem fixo no canto superior esquerdo (ANCHOR_LEFT_UPPER).

Exemplo:

   string text_name="my_OBJ_TEXT_object";
   if(ObjectFind(0,text_name)<0)
     {
      Print("Objeto ",text_name," não encontrado. Código de erro = ",GetLastError());
      //--- Obtém o preço máximo do gráfico
      double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
      //--- Cria o objeto Label (Rótulo)
      ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
      //--- Define cor do texto
      ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);
      //--- Define cor de fundo
      ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);
      //--- Define texto para o objeto Label (Rótulo)
      ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));
      //--- Define fonte de texto
      ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
      //--- Define tamanho de fonte
      ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);
      //--- Vincula no canto superior direito
      ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
      //--- Gira 90 graus em sentido anti-horário
      ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);
      //--- Proíbe a seleção do objeto pelo mouse
      ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
      //--- redesenha objeto
      ChartRedraw(0);
     }

Objetos gráficos de Seta (OBJ_ARROW) têm somente 2 formas de linkar suas coordenadas. Os identificadores estão listados em ENUM_ARROW_ANCHOR.

ENUM_ARROW_ANCHOR

ID

Descrição

ANCHOR_TOP

Ancoragem no lado de cima

ANCHOR_BOTTOM

Ancoragem no lado de baixo

Exemplo:

void OnStart()
  {
//--- Arrays auxiliares
   double Ups[],Downs[];
   datetime Time[];
//--- Define os arrays como séries de tempo
   ArraySetAsSeries(Ups,true);
   ArraySetAsSeries(Downs,true);
   ArraySetAsSeries(Time,true);
//--- Cria handle do Indicador Fractais
   int FractalsHandle=iFractals(NULL,0);
   Print("FractalsHandle = ",FractalsHandle);
//--- Define valor do último erro para Zero
   ResetLastError();
//--- Tenta copiar os valores do indicador
   int copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
   if(copied<=0)
     {
      Print("Não é possível copiar os fractais de alta. Erro = ",GetLastError());
      return;
     }
 
   ResetLastError();
//--- Tenta copiar os valores do indicador
   copied=CopyBuffer(FractalsHandle,1,0,1000,Downs);
   if(copied<=0)
     {
      Print("Não é possível copiar os fractais de baixa. Erro = ",GetLastError());
      return;
     }
 
   ResetLastError();
//--- Copia a série de tempo contendo as barras de abertura das últimas 1000 barras
   copied=CopyTime(NULL,0,0,1000,Time);
   if(copied<=0)
     {
      Print("Não é possível copiar o tempo de abertura das últimas 1000 barras");
      return;
     }
 
   int upcounter=0,downcounter=0; // conta o número de setas
   bool created;// recebe o resultado das tentativas de criar um objeto
   for(int i=2;i<copied;i++)// Passa pelos valores do indicador iFractals
     {
      if(Ups[i]!=EMPTY_VALUE)// Encontrado o fractal de cima
        {
         if(upcounter<10)// Não cria mais que 10 setas "Up"
           {
            //--- Tenta criar um objeto "Up"
            created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_UP,0,Time[i],Ups[i]);
            if(created)// Se construído - vamos fazer ajuste nele
              {
               //--- Ponto de ancoragem é em baixo, a fim de não cobrir a barra
               ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
               //--- Toque final - colorido
               ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrBlue);
               upcounter++;
              }
           }
        }
      if(Downs[i]!=EMPTY_VALUE)// Encontrado o menor fractal
        {
         if(downcounter<10)// Não cria mais que 10 setas "Down"
           {
            //--- Tenta criar um objeto "Down"
            created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_DOWN,0,Time[i],Downs[i]);
            if(created)// Se construído - vamos fazer ajuste nele
              {
               //--- Ponto de ancoragem é em acima, a fim de não cobrir a barra
               ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
               //--- Toque final - colorido
               ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrRed);
               downcounter++;
              }
           }
        }
     }
  }

Após a execução do script o gráfico se parecerá com esta figura.

Coloca marcas por valores de fractal