Mira cómo descargar robots gratis
¡Búscanos en Telegram!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Emulador de Objeto - librería para MetaTrader 5

Visualizaciones:
1069
Ranking:
(38)
Publicado:
2014.01.14 14:38
Actualizado:
2014.12.16 14:14
\MQL5\Indicators\ \MQL5\Scripts\ \MQL5\Include\
objectemul.mqh (34.25 KB) ver
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Descripción:

MetaTrader 4 permite utilizar objetos en el Asesor Experto durante la ejecución de las pruebas. El gráfico se abre al final de la simulación, mostrando los objetos. Las flechas hacen observaciones donde el Asesor Experto puede realizar operaciones convenientes, pero tal o cual condición no lo permitió. Hay muchos ejemplos de uso.

A diferencia de la versión 4, en MetaTrader 5 no es posible utilizar objetos en las pruebas. Esta situación no se adapta bien a mis necesidades, así que a continuación intento resolverla.

Nota:

En MetaTrader 5 los Asesores Expertos se crean sin utilizar objetos. El Emulador de Objeto permite obtener datos del objeto, pero no recomiendo hacer esto, porque el proceso de testing puede ralentizarse, y hay algunas diferencias con respecto a las funciones oficiales.

Utiliza el emulador de objetos sólo para mostrar los objetos en el gráfico después de realizar las pruebas.

Configuración

Añade el indicador ObjectEmul_indicator en el template de pruebas tester.tpl.

Estas indicaciones son para todos aquellos que no sabéis cómo hacerlo:

  • Abre el gráfico de cualquier par de divisas.
  • Ejecuta el indicador ObjectEmul_indicator.
  • Haz clic derecho en el gráfico.
  • Templates => Guarda el template especificando el nombre de archivo "tester".

Utilización

Se ha eliminado el botón "Abrir gráfico" de la pestaña "Configuración" del Probador de Estrategias de MetaTrader 5; por lo tanto, si el Asesor Experto no realiza ninguna operación comercial durante las pruebas, el gráfico no aparecerá automáticamente. En ese caso habrá que cambiar a "Back-testing", hacer clic derecho con el ratón, y seleccionar "Abrir gráfico".

Antes de utilizarlo, lanza el ObjectEmul_UnitTest_script en el gráfico vacío y lee el log de la pestaña "Expertos" para saber las diferencias de las funciones oficiales para trabajar con objetos.

Hay que incluir la librería en el archivo principal del Asesor Experto:

#include <ObjectEmul.mqh>
CObjectEmul _objs;

Y cambiar Object a _objs.Objct para las funciones estándar.

Para ejecutar la Ayuda de las funciones de objeto en el editor tan sólo hay que añadir la letra "e" de "Object" y presionar F1.

Ejemplo

EURUSD, H1, MetaQuotes Software Corp., MetaTrader 5, Demo

//+------------------------------------------------------------------+
//|    Ejemplo de uso del Emulador de Objeto                         |
//+------------------------------------------------------------------+
#include <ObjectEmul.mqh>
CObjectEmul _objs;

int ZigZag;
datetime lastbar=0;

double trianglePrice[3];
datetime triangleTime[3];
int triangleIndex=0;

int OnInit()
  {
   ZigZag=iCustom(_Symbol,_Period,"Examples\\ZigZag",5,5,3);
   MathSrand(GetTickCount());
   return(0);
  }

void OnTick()
  {
   datetime time[];
   CopyTime(_Symbol,_Period,0,15,time);
   if(lastbar==time[0]) return;
   lastbar=time[0];

   double zgbuffer[];
   if(CopyBuffer(ZigZag,0,0,15,zgbuffer)==0) {Print("CopyBuffer(ZigZag) Error"); return;}

   bool first=true;
   for(int x=0,count=ArraySize(zgbuffer);x<count && triangleIndex<3;x++)
     {
      // Aqui hay algo incorrecto, pero me gusta el resultado :)
      if(zgbuffer[x]>0 && first) {first=false; x+=3;}
      else if(zgbuffer[x]>0 && (triangleIndex==0 || trianglePrice[triangleIndex-1]!=zgbuffer[x]))
        {
         trianglePrice[triangleIndex]=zgbuffer[x];
         triangleTime[triangleIndex]=time[x];
         triangleIndex++;
         break;
        }
      else if(zgbuffer[x]>0) break;
     }

   if(triangleIndex<3) return;

   string objname="ObjectEmul_Demo_"+(string)(int)lastbar;

//////////////////////////
// Emulador de Objeto

// análogos Standard Object*()
   if(_objs.ObjctCreate(0,objname,OBJ_TRIANGLE,0,
      triangleTime[0],trianglePrice[0],triangleTime[1],trianglePrice[1]))
     {
      _objs.ObjctSetInteger(0,objname,OBJPROP_TIME,2,triangleTime[2]);
      _objs.ObjctSetDouble(0,objname,OBJPROP_PRICE,2,trianglePrice[2]);
      _objs.ObjctSetInteger(0,objname,OBJPROP_COLOR,(MathRand()%255)*(MathRand()%255)*(MathRand()%255));

      // Ejemplo de uso de índices
      int index=_objs.ObjctFindIndex(0,objname);
      if(index>-1) _objs.ObjctSetIntegerIndex(index,OBJPROP_FILL,0,true);
     }
   else Print("ObjctCreate Error");

// Emulación de Objeto
//////////////////////////

   trianglePrice[0]=trianglePrice[1];
   triangleTime[0]=triangleTime[1];
   trianglePrice[1]=trianglePrice[2];
   triangleTime[1]=triangleTime[2];
   triangleIndex=2;
  }

Variables

  • string FileName - Nombre de archivo. Tiene un valor predeterminado que se puede cambiar.
  • bool SaveAuto = false - ¿Hay que guardar los objetos en un archivo cuando se elimina el objeto de clase? El valor predeterminado "verdadero" es sólo para la prueba sencilla.

Funciones

Se obtienen todos los objetos gráficos Object*(), pero tienen los nombres Objct*(). No hay análogos para TextSetFont(), TextOut() y TextGetSize().

  • int Count() - Número de objetos.
  • void ReleaseAll() - Borra todos los objetos (es más rápido que ObjctDeleteAll).
  • bool LoadFile(string fname = "", bool print_error = false) - Descarga los objetos del archivo.
  • bool SaveFile(string fname = "", bool print_error = false) - Guarda los objetos en el archivo.
  • void DrawAll() - Dibuja todos los objetos en el gráfico.

También hay funciones Objct*Index() para acelerar el trabajo:

  • int ObjctFindIndex(long chart_id, string name) - en comparación con ObjctFind() devuelve el número de serie del objeto.

Para evitar la ambigüedad de la sobrecarga, tuve que seleccionar funciones separadas para los índices. Estas funciones no llaman a ObjctFindIndex() para la búsqueda y ¡los objetos deben ser controlados para su uso!

ObjctSetInteger(0,"objname",OBJPROP_STYLE,STYLE_DASH) == ObjctSetIntegerIndex(ObjctFindIndex(0,"objname"),OBJPROP_STYLE,STYLE_DASH);

La función LoadFile() utiliza estas funciones, pero la función Count() muestra el número de todos los objetos.

En esta implementación particular todavía hay algunas cosas que se tienen que resolver. Por supuesto, voy a dar soporte a esta biblioteca con la ayuda de la comunidad.

Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/1583

Gráficos Sincronizados Gráficos Sincronizados

Este asesor experto realiza sincronización de gráficas.

Librería de funciones hash Librería de funciones hash

La bibrería contiene las siguientes funciones hash: adler32, CRC-32, MaHash8v64. También tiene funciones para la convertir la raíz de un número.

Exportación de Valores del Indicador Exportación de Valores del Indicador

Este script exporta los valores del indicador a un archivo CSV.

Gestor de eventos "New bar" para indicadores Gestor de eventos "New bar" para indicadores

Este indicador permite realizar los cálculos de los datos del indicador solo cuando aparece una nueva barra en el gráfico.