martes, 22 de septiembre de 2009

Expert advisor cesarz_v01

Bien, según he entendido en uno de los mensajes se me pedía un asesor experto que introdujese tres órdenes del tipo:

  • Una operacion de venta a las 12pm hora EST y cierre con ganacias de 2pip con stop lose de 50pip para el EUR/USD
  • Que abra una operacion de compra a las 2pm hora EST con los mismo parametros, 2pip de ganacias 50 de stop los con EUR/USD
  • Y finalmente que active otra operacion a las 7pm EST de compra con lo mismo.
Bien, como la programación es un mundo en el cual las cosas se pueden hacer de muchas maneras y no hay una única forma de solucionar un problema, yo he optado por los siguiente, aunque quizás no sea la mejor forma.

He optado por poner tres variables externas por cada una de las órdenes que se van ha ejecutar, de manera que podamos introducir la hora en formato (0 - 23), el stop loss y el take profit para cada una de las tres órdenes independientemente. Esto se modificará cuando se coloca el expert advisor en la gráfica correspondiente de manera que en la pestaña entradas tendremos:

  • Para la primera orden tendremos: hora1, sl1, tp1.
  • Para la segunda orden tendremos: hora2, sl2, tp2.
  • Para la tercera orden tendremos: hora3, sl3, tp3.
Por ejemplo: si ponemos en hora1 el valor de 12, tan solo se nos ejecutará una orden a partir de las 12 (hora local, que es la que te aparece en el metatrader).

Bueno, creo que es bastante sencillo, probarlo y jugar con él. Os dejo el código para que lo modifiqueis a vuestro antojo.

Ojo el expert advisor no ha sido probado en cuenta real, así que si lo probais en cuenta real es bajo vuestra responsabilidad.

Saludos, y buen trading

jueves, 17 de septiembre de 2009

Crear un archivo CSV con metatrader.

Bien, voy a explicar aquí como realizar un archivo CSV con metatrader, pero antes deberíamos saber que es un archivo CSV, para ello buscamos un poco de información en google, en mi caso la wikipedia:

Archivos csv.

Pues lo siguiente es realizar una función que nos que nos introduzca una línea en formato csv a un archivo.

int crearcsv(string cadena)
{
int handle = FileOpen("prueba.csv", FILE_CSV|FILE_WRITE, ' ');
string str;
if(handle < 1)
{
Print("Error:", GetLastError());
return(handle);
}
else
{
if(size==0)
{
str = cadena;
FileWrite(handle, PrepareString(str));
}
}
FileClose(handle);
return(0);
}


La función anterior crea un archivo con el nombre prueba he introduce en el la cadena que se le ha pasado a la función. Ojo si el archivo ya existía se borrará toda la información que contenía y creará un nuevo archivo con la cadena.

Claro está que si deseas abrir con otro programa este tipo de archivos, en la cadena deberás introducir el formato adecuado.

Por ejemplo, desde otro lugar del programa llamamos a la función de la siguiente manera:

string linea="orden; Margen; precio;";
crearcsv(linea);

Si abres el archivo con un editor de textos deberías observar una línea con:
orden; Margen; precio;

Bueno, con esto y un poco de imaginación se pueden hacer muchas cosas.

Solo falta decir que los archivos creados con el metatrader por defecto se hacen en el directorio: \experts\files\

Saludos, buen trading.

martes, 15 de septiembre de 2009

Nueva version de pabpozzi.

Bien os adjunto los nuevos archivos para el indicador, espero que os sirva, he corregido algunos errores que tenia la versión anterior, además el nuevo indicador almacena los datos en un archivo.

Cuando adjuntas el asesor experto, en la ventana de entradas teneis una variable que se llama estrategia, esta variable se usa para dar un nombre al archivo de la estrategia. Este archivo se creará en la carpeta experts/files/nombredelaestrategia.csv , con este archivo se pueden exportar datos a una hoja de excel, yo uso openoffice no se si funcionará con microsoft.

Por último, os comento donde debéis colocar los archivos:


Espero que os sea de utilidad.

Saludos, que tengais un buen trading.

viernes, 11 de septiembre de 2009

Indicador mejorado.

Bien, ayer hice un indicador a todo correr, mal asunto ese.

Pues dejo aquí una mejora del mismo, además le voy a poner un nombre en honor al que me dío la idea, así que si no le importa Sr. le llamaré pabpozzi.

No cuelgo el código porque se hace muy tedioso, así que tan solo dejo una imagen del indicador, así como los enlaces correspondientes a la versión pabpozzi.



Enlaces de descarga:


Saludos a todos.

jueves, 10 de septiembre de 2009

El margen libre.

Contestando al comentario del señor Anonimo, manuales del metatrader no dispongo de ellos, me apoyo en las explicaciones de las funciones que trae el programa, en la subcarpeta de Dictionary, por supuesto estan en ingles.

Si te vale unos manuales rudimentarios pincha en el siguiente enlace e iras a un blog que tiene dos manuales básicos traducidos al español.

Programado en Forex.

A tu otra cuestion, mira la función:

double AccountFreeMargin( )

No se si te vale para lo que tú deseas.

Te dejo el código para que lo compiles del siguiente indicador, si modificas la variable esquina puedes dibujarlo en la esquina superior, inferior, derecha o izquierda. Al final dejo un enlace desde donde te puedes bajar el indicador.

//+------------------------------------------------------------------+
//| Margen libre.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
extern int esquina=2;
double margenlibre;
double maximaganancia;
double maximaperdida;
double inicio;

int init()
{
//---- indicators
margenlibre=AccountFreeMargin();
inicio=margenlibre;
maximaganancia=0;
maximaperdida=0;

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----

//if(Fun_NuevaBarra())
// {
if(AccountFreeMargin() >= margenlibre)
maximaganancia=MathAbs(AccountFreeMargin()-margenlibre);
if(AccountFreeMargin() <= margenlibre) maximaperdida=MathAbs(AccountFreeMargin()-margenlibre); // } ObjectDelete("LabelMargen"); ObjectCreate("LabelMargen", OBJ_LABEL, 0,0,0,0,0); ObjectSet("LabelMargen", OBJPROP_CORNER, esquina); ObjectSet("LabelMargen", OBJPROP_XDISTANCE, 70); ObjectSet("LabelMargen", OBJPROP_YDISTANCE, 10); ObjectSet("LabelMargen",OBJPROP_COLOR,Red); ObjectSetText("LabelMargen","Margen libre",10,"Arial",Red); ObjectDelete("Margenlibre"); ObjectCreate("Margenlibre", OBJ_LABEL, 0,0,0,0,0); ObjectSet("Margenlibre", OBJPROP_CORNER, esquina); ObjectSet("Margenlibre", OBJPROP_XDISTANCE, 170); ObjectSet("Margenlibre", OBJPROP_YDISTANCE, 10); ObjectSet("Margenlibre",OBJPROP_COLOR,Red); ObjectSetText("Margenlibre",DoubleToStr(AccountFreeMargin(),4),10,"Arial",Red); ObjectDelete("LabelMaximaganancia"); ObjectCreate("LabelMaximaganancia", OBJ_LABEL, 0,0,0,0,0); ObjectSet("LabelMaximaganancia", OBJPROP_CORNER, esquina); ObjectSet("LabelMaximaganancia", OBJPROP_XDISTANCE, 70); ObjectSet("LabelMaximaganancia", OBJPROP_YDISTANCE, 30); ObjectSet("LabelMaximaganancia",OBJPROP_COLOR,Red); ObjectSetText("LabelMaximaganancia","Max. ganancia",10,"Arial",Green); ObjectDelete("Maximaganancia"); ObjectCreate("Maximaganancia", OBJ_LABEL, 0,0,0,0,0); ObjectSet("Maximaganancia", OBJPROP_CORNER, esquina); ObjectSet("Maximaganancia", OBJPROP_XDISTANCE, 170); ObjectSet("Maximaganancia", OBJPROP_YDISTANCE, 30); ObjectSet("Maximaganancia",OBJPROP_COLOR,Green); ObjectSetText("Maximaganancia",DoubleToStr(maximaganancia,2) ,10,"Arial",Green); ObjectDelete("LabelMaximaperdida"); ObjectCreate("LabelMaximaperdida", OBJ_LABEL, 0,0,0,0,0); ObjectSet("LabelMaximaperdida", OBJPROP_CORNER, esquina); ObjectSet("LabelMaximaperdida", OBJPROP_XDISTANCE, 70); ObjectSet("LabelMaximaperdida", OBJPROP_YDISTANCE, 50); ObjectSet("LabelMaximaperdida",OBJPROP_COLOR,Red); ObjectSetText("LabelMaximaperdida","Max. perdida",10,"Arial",Red); ObjectDelete("Maximaperdida"); ObjectCreate("Maximaperdida", OBJ_LABEL, 0,0,0,0,0); ObjectSet("Maximaperdida", OBJPROP_CORNER, esquina); ObjectSet("Maximaperdida", OBJPROP_XDISTANCE, 170); ObjectSet("Maximaperdida", OBJPROP_YDISTANCE, 50); ObjectSet("Maximaperdida",OBJPROP_COLOR,Red); ObjectSetText("Maximaperdida",DoubleToStr(maximaperdida,4),10,"Arial",Red); ObjectDelete("Labelinicio"); ObjectCreate("Labelinicio", OBJ_LABEL, 0,0,0,0,0); ObjectSet("Labelinicio", OBJPROP_CORNER, esquina); ObjectSet("Labelinicio", OBJPROP_XDISTANCE, 70); ObjectSet("Labelinicio", OBJPROP_YDISTANCE, 70); ObjectSet("Labelinicio",OBJPROP_COLOR,Red); ObjectSetText("Labelinicio","Inicio",10,"Arial",White); ObjectDelete("Inicio"); ObjectCreate("Inicio", OBJ_LABEL, 0,0,0,0,0); ObjectSet("Inicio", OBJPROP_CORNER, esquina); ObjectSet("Inicio", OBJPROP_XDISTANCE, 170); ObjectSet("Inicio", OBJPROP_YDISTANCE, 70); ObjectSet("Inicio",OBJPROP_COLOR,Red); ObjectSetText("Inicio",DoubleToStr(inicio,2),10,"Arial",Red); //---- return(0); } //+++++++ //Funcion para calcular una nueva vela bool Fun_NuevaBarra() { bool BarraNueva; static datetime NuevaHora=0; // Deteccion nueva hora BarraNueva=false; // 0 - misma vela ; 1- vela nueva if(NuevaHora!=Time[0]) // Si el hora es cero comienza vela { NuevaHora=Time[0]; BarraNueva=true; //Alert("Barra nueva"); //Avisa de una barra nueva } return(BarraNueva) ;
}
//+------------------------------------------------------------------+


Descargar el indicador: Saludos a todos.

Nota: Es un indicador y como tal se deberá colocar en la carpeta indicators.