Definir el punto de anclaje en un objeto

Algunos tipos de objetos permiten seleccionar un punto de anclaje. Los tipos que entran en esta categoría incluyen la etiqueta de texto (OBJ_TEXT) y la imagen de mapa de bits (OBJ_BITMAP) vinculadas a cotizaciones, así como la leyenda (OBJ_LABEL) y el panel con imagen (OBJ_BITMAP_LABEL), posicionados en coordenadas de pantalla.

Para leer y establecer el punto de anclaje, utilice las funciones ObjectGetInteger y ObjectSetInteger con la propiedad OBJPROP_ANCHOR.

Todas las opciones de selección de puntos se recogen en la enumeración ENUM_ANCHOR_POINT.

Identificador

Localización del punto de anclaje

ANCHOR_LEFT_UPPER

En la esquina superior izquierda

ANCHOR_LEFT

Centro izquierda

ANCHOR_LEFT_LOWER

En la esquina inferior izquierda

ANCHOR_LOWER

Centro inferior

ANCHOR_RIGHT_LOWER

En la esquina inferior derecha

ANCHOR_RIGHT

Centro derecha

ANCHOR_RIGHT_UPPER

En la esquina superior derecha

ANCHOR_UPPER

Centro superior

ANCHOR_CENTER

Estrictamente en el centro del objeto

Los puntos se muestran claramente en la imagen siguiente, donde se aplican varios objetos de etiqueta al gráfico.

Objetos de texto OBJ_LABEL con diferentes puntos de anclaje

Objetos de texto OBJ_LABEL con diferentes puntos de anclaje

El grupo superior de cuatro etiquetas tiene el mismo par de coordenadas (X,Y); sin embargo, debido al anclaje en diferentes esquinas del objeto, están situadas en diferentes lados del punto. Una situación similar se da en el segundo grupo de cuatro etiquetas de texto; sin embargo, allí el anclaje se realiza en los puntos medios de diferentes lados de los objetos. Por último, la leyenda se muestra por separado en la parte inferior, anclada en su centro, de modo que el punto quede dentro del objeto.

El botón (OBJ_BUTTON), el panel rectangular (OBJ_RECTANGLE_LABEL), el campo de entrada (OBJ_EDIT) y el objeto gráfico (OBJ_CHART) tienen un punto de anclaje fijo en la esquina superior izquierda (ANCHOR_LEFT_UPPER).

Algunos objetos gráficos del grupo de marcas de precio simples (OBJ_ARROW, OBJ_ARROW_THUMB_UP, OBJ_ARROW_THUMB_DOWN, OBJ_ARROW_UP, OBJ_ARROW_DOWN, OBJ_ARROW_STOP, OBJ_ARROW_CHECK) tienen dos formas de anclar sus coordenadas, especificadas por identificadores de otra enumeración ENUM_ARROW_ANCH OR.

Identificador

Localización del punto de anclaje

ANCHOR_TOP

Centro superior

ANCHOR_BOTTOM

Centro inferior

El resto de los objetos de este grupo tienen puntos de anclaje predefinidos: las flechas de compra (OBJ_ARROW_BUY) y venta (OBJ_ARROW_SELL) están en el centro de los lados superior e inferior, respectivamente, y las etiquetas de precio (OBJ_ARROW_PRICE_RIGHT, OBJ_ARROW_LEFT_PRICE) están a izquierda y derecha.

De forma similar al script ObjectCornerLabel.mq5 de la sección anterior, vamos a crear el script ObjectAnchorLabel.mq5. En la nueva versión, además de mover la inscripción, cambiaremos aleatoriamente el punto de anclaje de la misma.

La esquina de la ventana para el anclaje será seleccionada, como antes, por el usuario al lanzar el script.

input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;

Mostraremos el nombre del ángulo en el gráfico como comentario.

void OnStart()
{
   Comment(EnumToString(Corner));
   ...

En un bucle infinito se genera uno de los 9 posibles valores del punto de anclaje en los momentos seleccionados.

   ENUM_ANCHOR_POINT anchor = 0;
   for( ;!IsStopped(); ++pass)
   {
      if(pass % 50 == 0)
      {
        ...
         anchor = (ENUM_ANCHOR_POINT)(rand() * 9 / 32768);
         ObjectSetInteger(0nameOBJPROP_ANCHORanchor);
      }
      ...

El nombre del punto de anclaje se convierte en el contenido del texto de la etiqueta, junto con las coordenadas actuales.

      ObjectSetString(0nameOBJPROP_TEXTEnumToString(anchor)
         + "[" + (string)x + "," + (string)y + "]");

El resto de los fragmentos de código se ha mantenido prácticamente sin cambios.

Tras compilar y ejecutar el script, observe cómo la inscripción cambia su posición respecto a las coordenadas actuales (x, y) en función del punto de anclaje seleccionado.

Por ahora, controlamos e impedimos que el propio punto de anclaje salga de la ventana. No obstante, el objeto tiene algunas dimensiones, por lo que puede resultar que la mayor parte de la inscripción esté cortada. En el futuro, tras estudiar las propiedades pertinentes, nos ocuparemos de este problema (véase el ejemplo ObjectSizeLabel.mq5 en la sección sobre Determinar ancho y alto del objeto).