Modos de enlace de objetos

Los objetos gráficos Text, Label, Bitmap y Bitmap Label (OBJ_TEXT, OBJ_LABEL, OBJ_BITMAP y OBJ_BITMAP_LABEL) pueden tener uno de los 9 métodos diferentes de enlace de sus coordenadas, establecidas por la propiedad OBJPROP_ANCHOR.

Objeto

Identificador

X/Y

Width/Height

Date/Price

OBJPROP_CORNER

OBJPROP_ANCHOR

OBJPROP_ANGLE

Text

OBJ_TEXT

Label

OBJ_LABEL

Sí (sólo lectura)

Button

OBJ_BUTTON

Bitmap

OBJ_BITMAP

Sí (sólo lectura)

Bitmap Label

OBJ_BITMAP_LABEL

Sí (sólo lectura)

Edit

OBJ_EDIT

Rectangle Label

OBJ_RECTANGLE_LABEL

En el recuadro se usan las siguientes denominaciones:

  • X/Y — las coordenadas del punto de enlace se establecen en píxeles con respecto a uno de los ángulos del gráfico;
  • Width/Height — el objeto tiene anchura y altura. Si se indica "sólo lectura", esto significa que los valores de la anchura y la altura se calculan sólo después de que el objeto haya sido dibujado en el gráfico;
  • Date/Price — las coordenadas del punto de enlace se dan con la pareja fecha/hora;
  • OBJPROP_CORNER — establece el ángulo del gráfico con respecto al cual se indican las coordenadas del punto de enlace. Puede ser uno de los 4 valores de la enumeración ENUM_BASE_CORNER;
  • OBJPROP_ANCHOR — establece la posición del punto de enlace en el propio objeto, y puede ser uno de los 9 valores de la enumeración ENUM_ANCHOR_POINT. Precisamente desde este punto hasta el ángulo elegido en el gráfico se indican las coordenadas en píxeles;
  • OBJPROP_ANGLE — establece el ángulo de rotación del objeto en el sentido opuesto a las agujas del reloj.

Se puede definir una opción necesaria usando la función ObjectSetInteger(handle_de_gráfico, nombre_de_objeto, OBJPROP_ANCHOR, modo_de_enlace), donde modo_de_enlace es uno de los valores de la enumeración ENUM_ANCHOR_POINT.

ENUM_ANCHOR_POINT

Identificador

Descripción

ANCHOR_LEFT_UPPER

Punto de enlace en la esquina superior izquierda

ANCHOR_LEFT

Punto de enlace a la izquierda en el centro

ANCHOR_LEFT_LOWER

Punto de enlace en la esquina inferior izquierda

ANCHOR_LOWER

Punto de enlace abajo en el centro

ANCHOR_RIGHT_LOWER

Punto de enlace en la esquina inferior derecha

ANCHOR_RIGHT

Punto de enlace a la derecha en el centro

ANCHOR_RIGHT_UPPER

Punto de enlace  en la esquina superior derecha

ANCHOR_UPPER

Punto de enlace arriba en el centro

ANCHOR_CENTER

Punto de enlace justo en el centro del objeto

Los objetos OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT y OBJ_CHART tienen el punto de anclaje fijo en la esquina superior izquierda (ANCHOR_LEFT_UPPER).

Ejemplo:

   string text_name="my_OBJ_TEXT_object";
   if(ObjectFind(0,text_name)<0)
     {
      Print("Object ",text_name," not found. Error code = ",GetLastError());
      //--- obtenemos el precio máximo del gráfico
      double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
      //--- creamos el objeto Label
      ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
      //--- definimos el color del texto
      ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);
      //--- definimos el color del fondo
      ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);
      //--- definimos el texto para el objeto Label
      ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));
      //--- definimos la fuente
      ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
      //--- definimos el tamaño la fuente 
      ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);
      //--- enlazamos a la esquina superior derecha
      ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
      //--- rotamos a 90 grados contra el sentido de reloj
      ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);
      //--- prohibimos la selección del objeto con el ratón
      ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
      //--- lo dibujamos en el gráfico
      ChartRedraw(0);
     }

Los objetos gráficos Arrow (OBJ_ARROW) tienen sólo 2 opciones de enlazar sus coordinadas. Los identificadores se enumeran en ENUM_ARROW_ANCHOR.

ENUM_ARROW_ANCHOR

Identificador

Descripción

ANCHOR_TOP

Punto de enlace para la flecha se encuentra arriba

ANCHOR_BOTTOM

Punto de enlace para la flecha se encuentra abajo

Ejemplo:

void OnStart()
  {
//--- arrays auxiliares
   double Ups[],Downs[];
   datetime Time[];
//--- definimos los arrays como series temporales
   ArraySetAsSeries(Ups,true);
   ArraySetAsSeries(Downs,true);
   ArraySetAsSeries(Time,true);
//--- creamos el manejador del indicador Fractals
   int FractalsHandle=iFractals(NULL,0);
   Print("FractalsHandle = ",FractalsHandle);
//--- ponemos el último error a cero
   ResetLastError();
//--- intentamos copiar valores del indicador
   int copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
   if(copied<=0)
     {
      Print("Fallo al copiar los fractales superiores. Error = ",GetLastError());
      return;
     }
 
   ResetLastError();
//--- intentamos copiar valores del indicador
   copied=CopyBuffer(FractalsHandle,1,0,1000,Downs);
   if(copied<=0)
     {
      Print("Fallo al copiar los fractales inferiores. Error = ",GetLastError());
      return;
     }
 
   ResetLastError();
//--- copiamos la serie temporal que contiene la hora de apertura de las últimas 1000 barras 
   copied=CopyTime(NULL,0,0,1000,Time);
   if(copied<=0)
     {
      Print("Fallo al copiar la hora de apertura de los últimos 1000 barras");
      return;
     }
 
   int upcounter=0,downcounter=0; // vamos a contar el número de flechas en ellas
   bool created;// vamos a recibir el resultado del intento de creación del objeto
   for(int i=2;i<copied;i++)// repasamos los valores del indicador iFractals
     {
      if(Ups[i]!=EMPTY_VALUE)// encontramos el fractal de arriba
        {
         if(upcounter<10)// creamos no más de 10 objetos "arriba"
           {
            //--- intentamos crear el objeto "arriba"
            created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_UP,0,Time[i],Ups[i]);
            if(created)// si ha salido, vamos a tunearlo 
              {
               //--- punto de enlace abajo para no pisar la barra
               ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_BOTTOM);
               //--- el último retoque - pintamos
               ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrBlue);
               upcounter++;
              }
           }
        }
      if(Downs[i]!=EMPTY_VALUE)// encontramos el fractal de abajo 
        {
         if(downcounter<10)// creamos no más de 10 objetos "abajo"
           {
            //--- intentamos crear el objeto "abajo"
            created=ObjectCreate(0,string(Time[i]),OBJ_ARROW_THUMB_DOWN,0,Time[i],Downs[i]);
            if(created)// si lo conseguimos, vamos a tunearlo  
              {
               //--- punto de enlace arriba para no pisar la barra
               ObjectSetInteger(0,string(Time[i]),OBJPROP_ANCHOR,ANCHOR_TOP);
               //--- el último retoque - pintamos
               ObjectSetInteger(0,string(Time[i]),OBJPROP_COLOR,clrRed);
               downcounter++;
              }
           }
        }
     }
  }

Una vez completado el script, el gráfico será más o menos como se muestra abajo.

La puesta de marcas según los valores de fractales