Objeto gráfico

El objeto de gráfico OBJ_CHART permite crear miniaturas de otros gráficos dentro del gráfico para otros instrumentos y marcos temporales. Los objetos de gráfico se incluyen en la lista de gráficos, que hemos obtenido mediante programación utilizando las funciones ChartFirst y ChartNext. Como se menciona en la sección sobre Comprobar el estado de la ventana principal, la propiedad especial del gráfico CHART_IS_OBJECT permite averiguar por identificador si se trata de una ventana completa o de un objeto gráfico. En este último caso, la llamada a ChartGetInteger(id, CHART_IS_OBJECT) devolverá true.

El objeto gráfico tiene un conjunto de propiedades específicas.

Identificador

Descripción

Tipo

OBJPROP_CHART_ID

ID del gráfico (r/o)

long

OBJPROP_PERIOD

Período del gráfico

ENUM_TIMEFRAMES

OBJPROP_DATE_SCALE

Mostrar la escala de tiempo

bool

OBJPROP_PRICE_SCALE

Mostrar la escala de precios

bool

OBJPROP_CHART_SCALE

Escala (valor en el intervalo 0 - 5)

int

OBJPROP_SYMBOL

Símbolo

string

El identificador obtenido a través de la propiedad OBJPROP_CHART_ID permite gestionar el objeto como un gráfico normal utilizando las funciones del capítulo Trabajar con gráficos. Sin embargo, existen algunas limitaciones:

Por defecto, todas las propiedades (excepto OBJPROP_CHART_ID) son iguales a las propiedades correspondientes de la ventana actual.

La demostración de objetos gráficos se implementa como un indicador sin búfer ObjectChart.mq5. Crea una subventana con dos objetos gráficos para el mismo símbolo que el gráfico actual, pero con marcos temporales adyacentes por encima y por debajo del actual.

Los objetos se ajustan a la esquina superior derecha de la subventana y tienen los mismos tamaños predefinidos:

#define SUBCHART_HEIGHT 150
#define SUBCHART_WIDTH  200

Por supuesto, la altura de la subventana debe coincidir con la altura de los objetos, hasta que podamos responder de forma adaptativa a los eventos de cambio de tamaño.

#property indicator_separate_window
#property indicator_height SUBCHART_HEIGHT
#property indicator_buffers 0
#property indicator_plots   0

Un minigráfico se configura en la función SetupSubChart, que toma como entradas el número del objeto, sus dimensiones y el marco temporal requerido. El resultado de SetupSubChart es el identificador del objeto gráfico, que acabamos de introducir en el registro como referencia.

void OnInit()
{
   Print(SetupSubChart(0SUBCHART_WIDTHSUBCHART_HEIGHTPeriodUp(_Period)));
   Print(SetupSubChart(1SUBCHART_WIDTHSUBCHART_HEIGHTPeriodDown(_Period)));
}

Las macros PeriodUp y PeriodDown utilizan la función de ayuda PeriodRelative.

#define PeriodUp(PPeriodRelative(P, +1)
#define PeriodDown(PPeriodRelative(P, -1)
   
ENUM_TIMEFRAMES PeriodRelative(const ENUM_TIMEFRAMES tfconst int step)
{
   static const ENUM_TIMEFRAMES stdtfs[] =
   {
      PERIOD_M1,  // =1 (1)
      PERIOD_M2,  // =2 (2)
      ...
      PERIOD_W1,  // =32769 (8001)
      PERIOD_MN1// =49153 (C001)
   };
   const int x = ArrayBsearch(stdtfstf == PERIOD_CURRENT ? _Period : tf);
   const int needle = x + step;
   if(needle >= 0 && needle < ArraySize(stdtfs))
   {
      return stdtfs[needle];
   }
   return tf;
}

Esta es la principal función de trabajo SetupSubChart.

long SetupSubChart(const int nconst int dxconst int dy,
   ENUM_TIMEFRAMES tf = PERIOD_CURRENTconst string symbol = NULL)
{
   // create an object
   const string name = Prefix + "Chart-"
      + (symbol == NULL ? _Symbol : symbol) + PeriodToString(tf);
   ObjectCreate(0nameOBJ_CHARTChartWindowFind(), 00);
   
   // anchor to the top right corner of the subwindow
   ObjectSetInteger(0nameOBJPROP_CORNERCORNER_RIGHT_UPPER);
   // position and size
   ObjectSetInteger(0nameOBJPROP_XSIZEdx);
   ObjectSetInteger(0nameOBJPROP_YSIZEdy);
   ObjectSetInteger(0nameOBJPROP_XDISTANCE, (n + 1) * dx);
   ObjectSetInteger(0nameOBJPROP_YDISTANCE0);
   
   // specific chart settings
   if(symbol != NULL)
   {
      ObjectSetString(0nameOBJPROP_SYMBOLsymbol);
   }
   
   if(tf != PERIOD_CURRENT)
   {
      ObjectSetInteger(0nameOBJPROP_PERIODtf);
   }
   // disable the display of lines
   ObjectSetInteger(0nameOBJPROP_DATE_SCALEfalse);
   ObjectSetInteger(0nameOBJPROP_PRICE_SCALEfalse);
   // add the MA indicator to the object by its id just for demo
   const long id = ObjectGetInteger(0nameOBJPROP_CHART_ID);
   ChartIndicatorAdd(id0iMA(NULLtf100MODE_EMAPRICE_CLOSE));
   return id;
}

Para un objeto gráfico, el punto de anclaje siempre se fija en la esquina superior izquierda del objeto, por lo que cuando se ancla a la esquina derecha de la ventana, es necesario añadir la anchura del objeto (esto se hace mediante +1 en la expresión(n+1)*dx para OBJPROP_XDISTANCE).

En la siguiente captura de pantalla se muestra el resultado del indicador en el gráfico XAUUSD,H1:

Dos objetos gráficos en la subventana del indicador

Dos objetos gráficos en la subventana del indicador

Como podemos ver, los minigráficos muestran los marcos temporales M30 y H2.

Es importante tener en cuenta que se pueden añadir indicadores a objetos gráficos y aplicar plantillas tpl, incluyendo aquellos con Asesores Expertos. No obstante, no se pueden crear objetos dentro de objetos gráficos.

Cuando el objeto gráfico está oculto debido a una visualización deshabilitada en el marco temporal actual o en todos los marcos temporales, la propiedad CHART_WINDOW_IS_VISIBLE para el gráfico interno sigue devolviendo true.