martes, 22 de diciembre de 2009

Como crear un archivo "log" para registrar operaciones de forex

Cuando consideramos necesario tener un registro histórico de datos ( .log) de un indicador o un expert advisor, podemos usar la siguiente técnica

Desarrollo de un Registro .LOG

a) Función de Registro

La función de registro necesita un (destino), la (información a registrar) y la (rutina de registración)

b) Disparo o ejecución de la función

Denominamos así a la orden que se utiliza para acceder a la función de registro.


Requerimientos:


Primero necesitamos definir variables globales, estas son variables cuyo contenido se sostiene o mantiene independietemente del lugar o parte o función del programa donde la usemos.

en los EA (Expert Advisor) o (indicadores) estas deficiniones se realizan en la sección comprendida entre: El principio del "programa" hasta la primera función (que usualmente suele ser Init().

Ejemplo:

//+------------------------------------------------------------------+
//|                                             InfoTrade_v2.mq4
//|                            Copyright 2009, Fulano de tal
//|                                    Modificado x Perengano

//|               sintesis de lo que hace este programa
//+------------------------------------------------------------------+
#property copyright "Copyright 2009 Fulano de tal"

#property copyright "alteraciones de Perengano"
#property link      "http://analizandoforex.blogspot.com/"

#property indicator_chart_window
 

// ----------------------------------------
// Para el log de control
// ----------------------------------------
string       filenameReg          = "";
string       filename                = "";
string       TradeLog               = "Fenix ";
string       miTimeServ           = "";
string       miTimeLocal          = "";

string       messParaLog        = "";




int init()
{

    // la programación propia del indicador o expert

   // --------------------------------------------------------------------
   // Definir nombre de Registro de log
   // --------------------------------------------------------------------
   filename      = TradeLog + "- " + Symbol() + "-" + Month() ;
   filenameReg= filename+ ".log";

   return(0);
}


int deinit()
{

    // la programación propia del indicador o expert
}


int start()
{

    // la programación principal del indicador  o expert


    messParaLog="mi mensaje a registrar";

    WriteLog(filenameReg,","+Symbol()+", 0000000, F2SSig "+messParaLog);
      // cuidado debe haber una sola , COMA fuera de los ""
      // ejemplo: WriteLog(algo,algo)
}





//+########################################################################
//| Función: WriteLog 

//|       uso: grabar archivo
//| requiere:  Nombre del archivo destino (QueFile) y mensaje (str)
//+########################################################################
int WriteLog(string QueFile,string str)
{
   // Obtener tiempo de la Pc y del Broker

   miTimeLocal = TimeToStr(TimeLocal(), TIME_SECONDS);
   miTimeServ  = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
 

   // abrir un archivo de texto plano (se puede editar con Notepade, etc)


   int handle = FileOpen(QueFile,FILE_READ|FILE_WRITE|FILE_CSV,"/t");
 

   // Ir al final del archivo .log

   FileSeek(handle, 0, SEEK_END);     
 

   // Escribir la informción

   FileWrite(handle,"Time " + miTimeServ +": " + miTimeLocal + ": " + str);
 

   // Cerrar archivo de texto plano

   FileClose(handle);
 

  // Opcion especial, mostrar datos en pestaña "Expertos" de Metatrader

   Print(str);
}


A este ejemplo, le falta la parte primordial que es el disparo (o sea la llamada a la función WriteLog)

Esto se hace con una orden que va  en la sección start(), ubicada de acuerdo a los deseos del usuario. Tener en cuanta de no ubicarla dentro de algun bucle o ciclo (while, for) ya que por cada ticks analiza todas la velas, si tienes tu META seteado en 5000 velas, te pondrá 5.000 lineas dentro del archivo .log

Entonces "NUNCA" dentro de un ciclo, a menos que sea algo muy pensado.

> Donde estará mi archvio .log

El sistema automaticamente guarda en dos lugares, según estes ONCHART ( o sea ONLINE sobre el mercado) o BACKTEST ( haciendo pruebas de estrategia).

ONCHART los datos van a c:\archivos de programa\tubroker\expert\files
BACKTEST los datos van a c:\archivos de programa\tubroker\tester\files

> Como se llamará el archivo


En este caso hemos compuesto un nombre que identifica la estrategia, el par de divisa y el Mes en curso. Entonces nuestro log sera:

Fenix2 - USDCAD - 12.log

Ejemplos:


Disparo de la orden

messParaLog="mi mensaje a registrar";
WriteLog(filenameReg,","+Symbol()+", 0000000, F2SSig "+messParaLog);

WriteLog es el nombre de la función a la que hacemos la llamada.
FilenameReg, es el nombre del Archivo, ya definido en init()
Symbol() es el nombre del par que ponemos dentro del .log, ya que esto nos permite unir varios log, sin perder la referencia del par.
0000000, en mi caso particular es cero o toma el valor del la orden (operación abierta o cerrada)
F2SSig    es mi referencia personal al indicador que realizó el disparo, ya que uso combinaciones de expert e indicadores, asi puedo ver quien disparó, el momento, la secuencia, muy util para determinar errores.

messParaLog bueno es el mensaje que deseo registrar, usualemente el contenido de Alert(); o un mensaje mas personalizado,

> COMO SE VERIA UN REGISTRO REAL

Nombre:
Fenix2 - AUDUSD - 12.log

Contenido:
Time 2009.12.22 15:46:06: 12:46:07: ,AUDUSD, 0000000, F2SSig AUDUSD-H1-CLOSESELL
Time 2009.12.22 15:46:06: 12:46:08: ,AUDUSD, 0000000, Fenix2 AUDUSD-H1-CLOSESELL (deteccción)  H1
Time 2009.12.22 15:46:18: 12:46:20: ,AUDUSD, 2322073, Fenix2 ticket SELL encontrado  H1
Time 2009.12.22 15:46:20: 12:46:22: ,AUDUSD, 2322073 , Fenix2 a cerrado SELL c/profit= 46.00000000  H1

Fecha y hora del servidor
Luego Hora local ( de la pc del operador)
Par en cuestion
0000000 Numero de ticket
F2SSIG o Fenix2 para referencias, 1) al indicador que detecta la acción 2) al segundo siguiente el Expert llamado Fenix2 ha tomado la orden, esto es leido externamente por eso dice (detección) proveniente del indicador F2SSig en un timeframe H1
AUDUSD-H1-CLOSESELL es el nombre del archivo que genera F2SSig indicando de manera automatizada que ha detectado un cambio de tendencia y si hay orden que la cierre ( en este punto el indicador, no sabe si hay orden abierta)
Ticket SELL encontrado H1, me dice que el expert ha encontrado un ticket y activa la rutina de cerrado
a cerrado SELL c/profit= 46.00000000  H1, para indicarme que el ticket 2322073 ha generado un beneficio de 46 pips al momento de ser cerrado.

Bueno como se puede observar, "mi archivo log" lo utilizo para tener registro del accionar de indicadores y expertos al mismo tiempo, de esta manera puedo depurar la estrategia, etc.

> COMO SE VERIA UN ERROR

Time 2009.12.22 08:28:30: 05:28:31: ,AUDUSD, 0000000, F2SSig AUDUSD-H1-CLOSEBUY
Time 2009.12.22 08:28:30: 05:28:31: ,AUDUSD, 0000000, Fenix2 AUDUSD-H1-CLOSEBUY (deteccción)  H1
Time 2009.12.22 08:28:40: 05:28:41: ,AUDUSD, 2317568, Fenix2 Ticket BUY encontrado  H1
Time 2009.12.22 08:28:42: 05:28:42: ,AUDUSD, 2317568, Fenix2 CLOSEBUY c/profit= 36.00000000  H1

Time 2009.12.22 09:24:57: 06:24:57: ,AUDUSD, 0000000, Fenix2 AUDUSD-H1-CLOSEBUY F2Trix auto-close (deteccción)  H1 H1
Time 2009.12.22 09:25:08: 06:25:08: ,AUDUSD, 0000000, Fenix2 No hay ticket de Compras para cerrar H1

Time 2009.12.22 09:25:09: 06:25:10: ,AUDUSD, 0000000, Fenix2 Detecta señal externa AUDUSD-H1-SELL - Lotes: 0.10000000 Precio: 000000 TP: 0.00000000 SL: 0.00000000 F2Trix H1 H1
Time 2009.12.22 09:25:09:: 05:28:30 ,AUDUSD, ERROR__, Fenix2 Error al establecer SELL Lots=0.10000000 SL=0.00000000 TP=0.00000000 Bid=0.88100000 Ask=0.88110000 ticket=-1 Err=129 invalid price H1

Analisis:

a las 05:28:31 de la madrugada, el indicador detecta un cierre (F2SSig AUDUSD-H1-CLOSEBUY)
el experto ve el pedido a las 05:28: 30 AUDUSD-H1-CLOSEBUY (deteccción)  H1
luego busca si hay tickets  y encuentra a los 10 segundos el ticket 2317568  (Ticket BUY encontrado  H1)
un segundo depues cierra el ticket 2317568 con un profit de 36 pips ( CLOSEBUY c/profit= 36.00000000  H1)

Luego a las 06:24:57, casi una hora despues, (1 vela en este time) detecta un "auto-close" cierre por cambio de tendencia
a los 06:25:08 avisa que no hay COMPRAS para cerrar (No hay ticket de Compras para cerrar H1)

a las 06:25:10 detece una venta y envía la señal de VENDER 0.10 lotes de AUDUSD, orden generada por el indicador "F2Trix"
Pero no la puede poner a las 06:25:30 por previo invalido

En este caso, el Experto tiene todas las herramientas para lidiar con esta situación y vuelve a tomar el precio del mercado e intentar la venta, esto lo hace por una cantidad "n" de veces que estipula el usuario.


Nota: 

Expresamente usaremos un lenguaje coloquial para hacer mas facil la comprensión de este documento.
Lo expuesto en "rojo" es lo que usted deberia copiar, en las correspondientes secciones de su indicador.
el usar como separador de información "," a la coma, permite importar el .log dentro de un archivo tipo excel.

Fuente:


Ruben Dieminger
Programador y Analista de Sistemas de información
Mat.prof 036
Experto en MQ4
Forex Trader
http://analizandoforex.blogspot.com

1 comentario: