Gráficos de tres dimensiones - una herramienta profesional de análisis del mercado

Antoniuk Oleg | 11 mayo, 2016


Introducción


Todos los trades operan con cambios y recotizaciones que cambian constantemente. Cada uno busca correspondencias y regularidades. Anazliamos los volúmenes, valores de diferentes indicadores, y muchos otros parámetros. No creo que sea necesario convencerle de los beneficios de MQL4 en términos de análisis de mercado. Simplemente escriba un script y saque conclusiones basadas en los resultados. Normalmente el análisis se realiza sobre los gráficos que reflejan varias correspondencias de dos variables. Todo esto está bien, por supuesto, pero a veces necesitamos encontrar las correspondencias de tres variables y visualizarlas. Con este propósito, los gráficos en 3D y su análisis se usan por todo el mundo. Este enfoque le ahorra tiempo y dinero.

En este artículo escribiremos una biblioteca simple para la construcción de gráficos en 3D, y su visualización futura en Microsoft Excel. Se utilizarán las opciones estándar de MQL4 para prerarlo y exportar los datos en un archivo *.csv

¿Qué es el archivo de formato *.csv?


Es un archivo de texto que almacena la sucesión de los valores, separados por un separador pre establecido, en este caso es un punto y coma - ";". Para dibujar una tabla, sólo hay que escribir varias series de códigos. La ventaja de este formato es que Microsoft Excel lo reconoce e interpreta fácilmente en forma de tabla. Y en este programa se puede crear y analizar fácilmente un gráfico en 3D basado en los datos adquiridos.

Biblioteca generateCsv.


Crearemos una biblioteca para la entrada de datos rápida y fácil. Para crear una nueva biblioteca e instar el código de abajo, guárdela con el nombre de generateCsv.mq4 en la carpeta "...MetaTrader\experts\libraries". Después confeccione la biblioteca.

//+------------------------------------------------------------------+
//|                                                  generateCsv.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
#property library
 
//+------------------------------------------------------------------+
//| PrepareString                                                    |
//+------------------------------------------------------------------+
 
string PrepareString(string s)
  {
   bool exit = false;
   int index = 0;
   string str = s;
   
   while(!exit)
     {
       index = StringFind(str, ".", index);
      
       if(index > -1)
           str = StringSetChar(str, index, ',');
       else
           exit = true;
     }
   return(str);
  }
 
 
//+------------------------------------------------------------------+
//| GenerateCsv                                                      |
//+------------------------------------------------------------------+
int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
                double arrayIndexX[], double arrayIndexY[], double arrayZ[][])
  {
   int handle = FileOpen(fileName, FILE_CSV|FILE_WRITE, ' '), x, y;
   string str;
   
   if(handle1)
     {
       Print("Error:", GetLastError());
       return(handle);
     }
   else
     {
       str = ";";
       for(x = 0; x < arraySizeX; x++)
         {
           str = str + arrayIndexX[x];
           str = str + ";";         
         }
       FileWrite(handle,PrepareString(str));
      
       for(y = 0; y < arraySizeY; y++)
         {
           str = "";   
           str = str + arrayIndexY[y] + ";";
         
           for(x = 0; x < arraySizeX; x++)
             {
               str = str + arrayZ[x,y];
               str = str + ";";         
             }
           FileWrite(handle, PrepareString(str));
         }
     }
      
   FileClose(handle);   
   return(handle);
  }



Ahora cree un nuevo archivo de cabecera para las funciones de la biblioteca, que se llame generateCsv.mqh, inserte el código de abajo y guárdelo en la carpeta "...MetaTrader\experts\include".



//+------------------------------------------------------------------+
//|                                                  generateCsv.mqh |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link "banderassa@ukr.net"
 
#import "generateCsv.ex4"
 
string PrepareString(string s);
int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
double arrayIndexX[], double arrayIndexY[],double arrayZ[][]);



Esta biblioteca simple consta de dos funciones. Vamos a ver el significado de cada función. La primera función, PrepareString, está destinada a sustituir los puntos de una serie por comas. El hecho es que, cuando se están escribiendo los datos en un archivo utilizando la función estándar FileWrite, las partes entera y fraccionada están separadas por un punto. Y no podemos aceptarlo, porque Microsoft Excel reconoce los decimales sólo si las partes están separadas por una coma. Por eso cuando se están colocando los datos en el archivo *.csv, llamamos a esta función al cuerpo de la función GenerateCsv. El único parámetro de la función es una serie, en la que necesitamos reemplazar los puntos por comas. Retorno del valor - una nueva serie sin puntos. Por favor, tenga en cuenta que no necesita llamar a esta función, se hace mediante una segunda función automática cuando se necesita.

La función GenerateCsv se utiliza para escribir los datos en formato *.csv en un archivo. Estos son los parámetros:


int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
                double arrayIndexX[], double arrayIndexY[], double arrayZ[][]);



string fileName - nombre del archivo a escribir, no olvide indicar el formato *.csv;
int arraySizeX - profundidad de la gama con datos;
int arraySizeY - altura de la gama con datos;
double arrayIndexX[] - gama de los primeros valores variables;
double arrayIndexY[] - gama de los segundos valores variables;
double arrayZ[][] - gama bi dimensional de los terceros valores variables;

Para entender el propósito de cada parámetro, mire la imagen:



Todo lo que necesita para escribir estos datos son tres gamas de valores para cada variable. Vamos a ver cómo funciona.

Utilizar la biblioteca generateCsv


Cree un nuevo script con el nombre 3dGraphicOut e inserte el código de abajo.


//+------------------------------------------------------------------+
//|                                                 3dGraphicOut.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
 
#include <generateCsv.mqh>
 
#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16
 
//+------------------------------------------------------------------+
//| start                                                            |
//+------------------------------------------------------------------+
int start()
  {
  
   int x,y;
   
   double arrayIndexX[ARRAY_SIZE_X];
   double arrayIndexY[ARRAY_SIZE_Y];
   double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
   
   
   for(x=0;x<ARRAY_SIZE_X;x++)
      arrayIndexX[x]=x/10.0; 
      
   for(y=0;y<ARRAY_SIZE_Y;y++)
      arrayIndexY[y]=y/10.0;
   
   for(x=0;x<ARRAY_SIZE_X;x++)
      for(y=0;y<ARRAY_SIZE_Y;y++)
         arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]);
 
   GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ); 
   return(0);
  }



Esto es una plantilla estádar desde la que deberían empezar todos los gráficos 3D. Vamos a ver cada línea por separado:


#include <generateCsv.mqh> 


Inicie la biblioteca generateCsv

#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16 


Aquí se definen las dimensiones de la tabla: ARRAY_SIZE_X - profundidad de la tabla; ARRAY_SIZE_Y - altura.

int x,y; 


Estos son dos índices de gama. Como se usan muy a menudo, los coloco fuera del cuerpo del ciclo.

double arrayIndexX[ARRAY_SIZE_X]; 


Esta es una gama de los valores de la primera variable. Suponga que analiza la influencia de dos indicadores sobre beneficio. En este caso, los valores del primer indicador se colocarán en esta gama. Por favor, tenga en cuenta que debe iniciar con algún valor de inicio, por ejemplo desde cero, y luego aumentarlo con varios pasos, por ejemplo 0. 5.
double arrayIndexY[ARRAY_SIZE_Y]; 


Los valores del segundo indicador se colocan en esta gama. También elija el valor de inicio y pasos apropiados.
double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y]; 


Y este debería contener el valor de beneficio, dependiendo en los valores del indicador. Una vez más, mire la imagen de arriba para comprender los valores.

Asegúrese de que el tipo de gama es doble. Esto las hace universales. Si utiliza integradores (int) como elementos de las gamas, también funciona, porque MQL4 tiene una transformación de tipo implícito.

for(x = 0; xARRAY_SIZE_X; x++)
  {
    // arrayIndexX[x]= ... ;
  } 


En este bloque rellenaremos la primera gama de variable con valores. No olvide que deben aumentarse con varios pasos.

 for(y = 0; y < ARRAY_SIZE_Y; y++)
   {
      // arrayIndexY[y]= ... ;
   } 


Lo mismo para la segunda variable.

 for(x = 0; x < ARRAY_SIZE_X; x++)
   {
     for(y = 0; y < ARRAY_SIZE_Y; y++)
       {
         // arrayZ[x,y]= ... ;
       }
   } 


Y esta es la parte más interesante de la plantilla: se rellenan la gama bi dimensional con valores dependiendo de dos variables.

GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ); 

Y finalmente se escriben los datos en el archivo para un futuro análisis en Microsoft Excel. Ahora guarde la plantilla para su uso próximo.


Un simple ejemplo


Vamos a ver un simple ejemplo del uso de la biblioteca. No escribí el ejemplo intencionadamente, conectado con trading, para hacer que el código fuera lo más simple y disponible posible.

//+------------------------------------------------------------------+
//|                                                 3dGraphicOut.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
 
#include <generateCsv.mqh>
 
#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16
 
//+------------------------------------------------------------------+
//| start                                                            |
//+------------------------------------------------------------------+
int start()
  {
   int x,y;
 
   double arrayIndexX[ARRAY_SIZE_X];
   double arrayIndexY[ARRAY_SIZE_Y];
   double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
 
 
   for(x=0;x<ARRAY_SIZE_X;x++)
      arrayIndexX[x]=x/10.0;
 
   for(y=0;y<ARRAY_SIZE_Y;y++)
      arrayIndexY[y]=y/10.0;
 
   for(x=0;x<ARRAY_SIZE_X;x++)
      for(y=0;y<ARRAY_SIZE_Y;y++)
         arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]);
 
   GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ);
 
   return(0);
  }



Guarde el texto del script, confeccionelo e inicie la terminal. Ahora abra la carpeta "...MetaTrader\experts\files\", y aparece un nuevo archivo "test.csv" Ábralo con Microsoft Excel. El archivo se transformará en una tabla bi dimentional, como se muestra abajo:



Ahora seleccione las celdas (CTRL+A) e introduzca Insert -> Chart (ALT+I,H):



Luego elija Tipo de gráfico -> superficie, sub-tipo de gráfico -> Superficie 3D y haga clic en "Finalizar".



Aparecerá un gráfico en 3D:



Conclusión


Ahora tiene a su alcance una herramienta para exportar datos de forma rápida desde la terminal de trading MetaTrader a Microsoft Excel para una elaboración rápida de gráficos 3D y sus siguientes análisis. Ahora puede analizar las correspondencias Forex y las regularidades entre tres variables de forma simultánea. Intente analizar histogramas en 3D de dependencia de beneficios con estos parámetros como TakeProfit o StopLoss, o vea cómo es un gráfico de dependencia de volúmenes en el día de la semana y hora actual. Creo que encontrará correspondencias muy útiles e interesantes.