Encontrar objetos

Existen tres funciones para buscar objetos en el gráfico. Los dos primeros, ObjectsTotal y ObjectName, permiten ordenar los objetos por su nombre y, a continuación, si es necesario, utilizar el nombre de cada objeto para analizar sus otras propiedades (describiremos cómo se hace en la siguiente sección). La tercera función, ObjectFind, permite comprobar la existencia de un objeto con un nombre conocido. Lo mismo podría hacerse simplemente solicitando alguna propiedad a través de la función ObjectGet: si no hay ningún objeto con el nombre pasado, obtendremos un error en _LastError, pero esto es menos conveniente que llamar a ObjectFind. Además, la función devuelve inmediatamente el número de la ventana en la que se encuentra el objeto.

int ObjectsTotal(long chartId, int window = -1, int type = -1)

La función devuelve el número de objetos del gráfico con el identificador chartId (0 significa gráfico actual). En el cálculo sólo se tienen en cuenta los objetos de la subventana con el número window especificado (0 representa la ventana principal, -1 representa la ventana principal y todas las subventanas). Observe que sólo se tienen en cuenta los objetos del tipo específico especificado en el parámetro type (-1 indica todos los tipos por defecto). El valor de type puede ser un elemento de la enumeración ENUM_OBJECT.

La función se ejecuta de forma sincrónica, es decir, bloquea la ejecución del programa MQL que llama hasta que se recibe el resultado.

string ObjectName(long chartId, int index, int window = -1, int type = -1)

La función devuelve el nombre del objeto bajo el número index en el gráfico con el identificador chartId. Al compilar la lista interna, dentro de la cual se busca el objeto, se tienen en cuenta el número de subventana (window) y el tipo de objeto (type) especificados. La lista se ordena por nombres de objetos en orden lexicográfico, es decir, en concreto, alfabéticamente, distinguiendo mayúsculas de minúsculas.

Al igual que ObjectsTotal, durante su ejecución, ObjectName espera a que se recupere toda la cola de comandos de gráficos y, a continuación, devuelve el nombre del objeto de la lista actualizada de objetos.

En caso de error, se obtendrá una cadena vacía y el código de error OBJECT_NOT_FOUND (4202) se almacenará en _LastError.

Para probar la funcionalidad de estas dos funciones, vamos a crear un script llamado ObjectFinder.mq5 que registra todos los objetos en todos los gráficos. Utiliza las funciones de iteración del gráfico (ChartFirst y ChartNext), así como funciones para obtener propiedades del gráfico (ChartSymbol, ChartPeriod y ChartGetInteger).

#include <MQL5Book/Periods.mqh>
   
void OnStart()
{
   int count = 0;
   long id = ChartFirst();
   // loop through charts
   while(id != -1)
   {
      PrintFormat("%s %s (%lld)"ChartSymbol(id), PeriodToString(ChartPeriod(id)), id);
      const int win = (int)ChartGetInteger(idCHART_WINDOWS_TOTAL);
      // loop through windows
      for(int k = 0k < win; ++k)
      {
         PrintFormat("  Window %d"k);
         const int n = ObjectsTotal(idk);
         // loop through objects
         for(int i = 0i < n; ++i)
         {
            const string name = ObjectName(idik);
            const ENUM_OBJECT type = (ENUM_OBJECT)ObjectGetInteger(idnameOBJPROP_TYPE);
            PrintFormat("    %s %s"EnumToString(type), name);
            ++count;
         }
      }
      id = ChartNext(id);
   }
   
   PrintFormat("%d objects found"count);
}

Para cada gráfico, determinamos el número de subventanas (ChartGetInteger(id, CHART_WINDOWS_TOTAL)), llamamos a ObjectsTotal para cada subventana, y llamamos a ObjectName en el bucle interno. A continuación, buscamos por nombre el tipo de objeto y los mostramos juntos en el registro.

A continuación se muestra una versión del posible resultado del script (con abreviaturas).

EURUSD H1 (132358585987782873)
  Window 0
    OBJ_FIBO H1 Fibo 58513
    OBJ_TEXT H1 Text 40688
    OBJ_TREND H1 Trendline 3291
    OBJ_VLINE H1 Vertical Line 28732
    OBJ_VLINE H1 Vertical Line 33752
    OBJ_VLINE H1 Vertical Line 35549
  Window 1
  Window 2
EURUSD D1 (132360375330772909)
  Window 0
EURUSD M15 (132544239145024745)
  Window 0
    OBJ_VLINE H1 Vertical Line 27032
...
XAUUSD D1 (132544239145024746)
  Window 0
    OBJ_EVENT ObjShow-2021.11.25 00:00:00
    OBJ_TEXT ObjShow-2021.11.26 00:00:00
    OBJ_ARROW_SELL ObjShow-2021.11.29 00:00:00
    OBJ_ARROW_BUY ObjShow-2021.11.30 00:00:00
    OBJ_ARROW_RIGHT_PRICE ObjShow-2021.12.01 00:00:00
    OBJ_ARROW_LEFT_PRICE ObjShow-2021.12.02 00:00:00
    OBJ_ARROW_CHECK ObjShow-2021.12.03 00:00:00
    OBJ_ARROW_STOP ObjShow-2021.12.06 00:00:00
    OBJ_ARROW_DOWN ObjShow-2021.12.07 00:00:00
    OBJ_ARROW_UP ObjShow-2021.12.08 00:00:00
    OBJ_ARROW_THUMB_DOWN ObjShow-2021.12.09 00:00:00
    OBJ_ARROW_THUMB_UP ObjShow-2021.12.10 00:00:00
    OBJ_HLINE ObjShow-2021.12.13 00:00:00
    OBJ_VLINE ObjShow-2021.12.14 00:00:00
...
35 objects found

Aquí, en particular, puede ver que en el gráfico XAUUSD, D1 hay objetos generados por el script ObjectSimpleShowcase.mq5. No hay objetos en algunos gráficos y en algunas subventanas.

int ObjectFind(long chartId, const string name)

La función busca un objeto por su nombre en el gráfico especificado por el identificador y, si tiene éxito, devuelve el número de la ventana donde se ha encontrado.

Si no se encuentra el objeto, la función devuelve un número negativo. Al igual que las funciones anteriores de esta sección, la función ObjectFind utiliza una llamada sincrónica.

Veremos un ejemplo de uso de esta función en el script ObjectCopy.mq5 en la siguiente sección.