Demo_FileWriteArray: Cómo Crear un Asesor Experto para MetaTrader 5

Mike 2013.04.09 22:14 10 0 0
Archivos adjuntos

El Asesor Experto obtiene los valores de los precios Bid y Ask en cada tick y los almacena en un arreglo de estructura llamado "precios". Cada veinte ticks, el Asesor escribe los datos de estos objetos estructurados en un archivo utilizando la función FileWriteArray(). Los datos se registrarán en un archivo binario dentro del subdirectorio de la carpeta local del terminal. Puedes obtener la ubicación de esta carpeta local llamando a la función TerminalInfoString.

PrintFormat("La ruta a la carpeta local del terminal: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 

Cuando eliminas el Asesor Experto del gráfico, se escriben los datos que no se habían guardado en el archivo antes de que el Asesor termine su trabajo.

Código:

//--- parámetros de entrada
input string InpFileName="data.bin";
input string InpDirectoryName="AlgunCarpeta";
//+------------------------------------------------------------------+
//| Estructura para almacenar datos de precios                                |
//+------------------------------------------------------------------+
struct precios
  {
   datetime          fecha; // datos
   double            bid;  // Precio Bid
   double            ask;  // Precio Ask
  };
//--- variables globales
int    contador=0;
int    tamaño=20;
string ruta=InpDirectoryName+"//"+InpFileName;
precios arr[];
//+------------------------------------------------------------------+
//| Función de inicialización del Asesor                                    |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- asignar memoria para el arreglo
   ArrayResize(arr,tamaño);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización del Asesor                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int razon)
  {
//--- escribir las cadenas restantes si contador<n
   EscribirDatos(contador);
  }
//+------------------------------------------------------------------+
//| Función de tick del Asesor                                              |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- guardar datos en el arreglo
   arr[contador].fecha=TimeCurrent();
   arr[contador].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   arr[contador].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- mostrar datos actuales
   Print("Fecha = ",arr[contador].fecha," Bid = ",arr[contador].bid," Ask = ",arr[contador].ask);
//--- incrementar el contador
   contador++;
//--- si el arreglo está lleno, escribir datos en el archivo y reiniciarlo
   if(contador==tamaño)
     {
      EscribirDatos(tamaño);
      contador=0;
     }
  }
//+------------------------------------------------------------------+
//| Escribir n elementos del arreglo en el archivo                        |
//+------------------------------------------------------------------+
void EscribirDatos(const int n)
  {
//--- abrir el archivo
   ResetLastError();
   int manejador=FileOpen(ruta,FILE_READ|FILE_WRITE|FILE_BIN);
   if(manejador!=INVALID_HANDLE)
     {
      //--- escribir datos del arreglo al final del archivo
      FileSeek(manejador,0,SEEK_END);
      FileWriteArray(manejador,arr,0,n);
      //--- cerrar el archivo
      FileClose(manejador);
     }
   else
      Print("Error al abrir el archivo, código de error ",GetLastError());
  }
Lista
Comentarios 0