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.

martes, 11 de agosto de 2009

Expert advisor para indicar los patrones de velas (2).

Dejo aquí los archivos con todo el código que estoy usando para hacer un seguidor de los patrones de velas.

Ojo, aún no se encuentran todos los patrones de velas, además yo no me fiaría de ellos pues la mayoría aún no se han producido, y los que se han producido no son fiables o los tengo que reprogramar. Si lo usas y crees que tengo que modificar algo ponte en contacto conmigo, pero si lo usas para realizar entradas al mercado yo no me responsabilizo del expert.

Os dejo un enlace para que os descargueis los tres archivos y los podáis compilar en vuestro sistema.

oscar01
Grafios
Patronvelas

Saludos a todos.

miércoles, 22 de julio de 2009

La funcion tipo de vela II.

Bueno, despues de revisar las velas he añadido alguna más a la función como cada vez se hace mas larga la función dejo un enlace ha dicha función.

En el archivo también se pueden encontrar otras funciones, las cuales calculan la tendencia previa, así como los patrones. De momento no las explico, por el hecho de que aún estoy retocándolas, y estas funciones formarán parte de un indicador general.

Además, aún me queda por comprobar el buen funcionamiento.

La función de las velas es:
int tipovela(int i)
{
//Dojis
if(Open[i] == Close[i])
{
if(Low[i] == Open[i])
{
Alert("Doji lapida");
return(4);
}
if((High[i]-Open[i]) == (Open[i]-Low[i]))
{
Alert("Doji clasico");
return(1);
}
if((High[i]-Open[i]) > (3*(Open[i]-Low[i])))
{
Alert("Doji larga sombra superior");
return(2);
}
if((Open[i]-Low[i]) > (3*(High[i]-Open[i])))
{
Alert("Doji larga sombra inferior");//Doji libelula
return(3);
}
Alert("Doji");
return(27);
}


//Marubozus
//Marubozu alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]))
{
Alert("Marubozu alcista");
return(5);
}
//Marubozu bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]))
{
Alert("Marubozu bajista");
return(6);
}
//Marubozu cerrado alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Close[i]-Open[i]) > (3*(Open[i]-Low[i]))) )
{
Alert("Marubozu cerrado alcista");
return(10);
}
//Marubozu cerrado bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]) &&
((Open[i]-Close[i]) > (3*(High[i]-Open[i]))))
{
Alert("Marubozu cerrado bajista");
return(13);
}
//Marubozu abierto alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]) &&
((Close[i]-Open[i]) > (3*(High[i]-Close[i]))))
{
Alert("Marubozu abierto alcista");
return(16);
}
//Marubozu abierto bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Open[i]-Close[i]) > (3*(Close[i]-Low[i]))))
{
Alert("Marubozu abierto bajista");
return(17);
}
//Martillo invertido alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]) &&
((High[i]-Close[i]) > (2*(Close[i]-Open[i]))))
{
Alert("Martillo invertido alcista");
return(14);
}
//Martillo invertido bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]) &&
((High[i]-Open[i]) > (2*(Open[i]-Close[i]))))
{
Alert("Martillo invertido bajista");
return(15);
}
//Martillo alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Open[i]-Low[i]) > (2*(Close[i]-Open[i]))))
{
Alert("Martillo alcista");
return(12);
}
//Martillo bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Close[i]-Low[i]) > (2*(Open[i]-Close[i]))))
{
Alert("Martillo bajista");
return(11);
}
//Larga sombra superior alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) > (3*(Open[i]-Low[i]))) &&
((High[i]-Close[i]) > (3*(Close[i]-Open[i]))))
{
Alert("Larga sombra superior alcista");
return(19);
}
//Larga sombra superior bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) > (3*(Close[i]-Low[i]))) &&
((High[i]-Open[i]) > (3*(Open[i]-Close[i]))))
{
Alert("Larga sombra superior bajista");
return(20);
}
//Larga sombra inferior alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Open[i]-Low[i]) > (3*(Close[i]-Open[i]))) &&
((Open[i]-Low[i]) > (3*(High[i]-Close[i]))))
{
Alert("Larga sombra inferior alcista");
return(21);
}
//Larga sombra inferior bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Close[i]-Low[i]) > (3*(Open[i]-Close[i]))) &&
((Close[i]-Low[i]) > (3*(High[i]-Open[i]))))
{
Alert("Larga sombra inferior bajista");
return(22);
}
//Onda alta alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) > (3*(Close[i]-Open[i]))) &&
((Open[i]-Low[i]) > (3*(Close[i]-Open[i]))))
{
Alert("Onda alta alcista");
return(23);
}
//Onda alta bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) > (3*(Open[i]-Close[i]))) &&
((Close[i]-Low[i]) > (3*(Open[i]-Close[i]))) )
{
Alert("Onda alta bajista");
return(24);
}
//Peonza alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
// ((High[i]-Close[i]) < (Close[i]-Open[i])) && // ((Open[i]-Low[i]) < (Close[i]-Open[i])) && ((High[i]-Close[i]) == (Close[i]-Open[i])) && ((Open[i]-Low[i]) == (Close[i]-Open[i])) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+1]-Open[i+1]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+2]-Open[i+2]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+3]-Open[i+3]))) ) { Alert("Peonza alcista"); return(8); } //Peonza bajista if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) < (Open[i]-Close[i])) && ((Close[i]-Low[i]) < (Open[i]-Close[i])) && ((High[i]-Open[i]) == (Close[i]-Low[i])) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+1]-Open[i+1]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+2]-Open[i+2]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+3]-Open[i+3]))) ) { Alert("Peonza bajista"); return(7); } //Gran vela alcista if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Close[i]-Open[i]) > (3*(High[i]-Close[i]))) &&
((Close[i]-Open[i]) > (3*(Open[i]-Low[i]))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+1]-Close[i+1])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+2]-Close[i+2])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+3]-Close[i+3])))) )
{
Alert("Gran vela alcista");
return(9);
}
//Larga vela alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((MathAbs(Close[i]-Open[i])) > (MathAbs(Close[i+1]-Open[i+1]))) &&
((MathAbs(Close[i]-Open[i])) > (MathAbs(Close[i+2]-Open[i+2]))) )
{
Alert("Larga vela alcista");
return(25);
}

//Gran vela bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Open[i]-Close[i]) > (3*(High[i]-Open[i]))) &&
((Open[i]-Close[i]) > (3*(Close[i]-Low[i]))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+1]-Close[i+1])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+2]-Close[i+2])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+3]-Close[i+3])))) )
{
Alert("Gran vela bajista");
return(18);
}
//Larga vela bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((MathAbs(Close[i]-Open[i])) > (MathAbs(Close[i+1]-Open[i+1]))) &&
((MathAbs(Close[i]-Open[i])) > (MathAbs(Close[i+2]-Open[i+2]))) )
{
Alert("Larga vela bajista");
return(26);
}
//Ultima comprobacion
//Vela bajista
if((High[i] >= Open[i]) && (Open[i] > Close[i]) &&
(Close[i] >= Low[i]))
{
Alert("Vela bajista");
return(28);
}
//Vela alcista
if((High[i] >= Close[i]) && (Close[i] > Open[i]) &&
(Open[i] >= Low[i]))
{
Alert("Vela alcista");
return(29);
}
return(0);

}
Saludos a todos y espero que os valga.

jueves, 9 de julio de 2009

La función tipo de vela.

Bien supongo que todos conoceis el libro de "Manual de candlestick", Velas japonesas, del señor Ustin.

En el libro se presentan diversos patrones de velas japonesas, supongo que habrá indicadores para metatrader que presenten los patrones de las velas japonesas, pero como a mi me gusta programar decidí hacer una función a la cual se le pasara el número de vela y me dijera el tipo de vela que es.

He tardado en publicar esta función por haber tenido problemas, ya que cuando tenía todo el código programado, se me borró del ordenador, cosas extrañas que pasan, por eso te recomiendo que realices copias de seguridad cada cierto tiempo.

Espero que os guste la función siguiente.

La función solo nos dice el tipo de vela que se ha formado, no identifica los patrones, eso lo haré mas adelante.

int tipovela(int i)
{
//Dojis
if(Open[i] == Close[i])
{
if(Low[i] == Open[i])
{
Alert("Doji lapida");
return(4);
}
if((High[i]-Open[i]) == (Open[i]-Low[i]))
{
Alert("Doji clasico");
return(1);
}
if((High[i]-Open[i]) > (3*(Open[i]-Low[i])))
{
Alert("Doji larga sombra superior");
return(2);
}
if((Open[i]-Low[i]) > (3*(High[i]-Open[i])))
{
Alert("Doji larga sombra inferior");//Doji libelula
return(3);
}
}

//Marubozus
//Marubozu alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]))
{
Alert("Marubozu alcista");
return(5);
}
//Marubozu bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]))
{
Alert("Marubozu bajista");
return(6);
}
//Marubozu cerrado alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Close[i]-Open[i]) > (3*(Open[i]-Low[i]))) )
{
Alert("Marubozu cerrado alcista");
return(10);
}
//Marubozu cerrado bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]) &&
((Open[i]-Close[i]) > (3*(High[i]-Open[i]))))
{
Alert("Marubozu cerrado bajista");
return(13);
}
//Marubozu abierto alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]) &&
((Close[i]-Open[i]) > (3*(High[i]-Close[i]))))
{
Alert("Marubozu abierto alcista");
return(16);
}
//Marubozu abierto bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Open[i]-Close[i]) > (3*(Close[i]-Low[i]))))
{
Alert("Marubozu abierto bajista");
return(17);
}
//Martillo invertido alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] == Low[i]) &&
((High[i]-Close[i]) > (2*(Close[i]-Open[i]))))
{
Alert("Martillo invertido alcista");
return(14);
}
//Martillo invertido bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] == Low[i]) &&
((High[i]-Open[i]) > (2*(Open[i]-Close[i]))))
{
Alert("Martillo invertido bajista");
return(15);
}
//Martillo alcista
if((High[i] == Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Open[i]-Low[i]) > (2*(Close[i]-Open[i]))))
{
Alert("Martillo alcista");
return(12);
}
//Martillo bajista
if((High[i] == Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Close[i]-Low[i]) > (2*(Open[i]-Close[i]))))
{
Alert("Martillo bajista");
return(11);
}
//Larga sombra superior alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) > (3*(Close[i]-Open[i]))) &&
((Open[i]-Low[i]) < (Close[i]-Open[i]))) { Alert("Larga sombra superior alcista"); return(19); } //Larga sombra superior bajista if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) > (3*(Open[i]-Close[i]))) &&
((Close[i]-Low[i]) < (Open[i]-Close[i]))) { Alert("Larga sombra superior bajista"); return(20); } //Larga sombra inferior alcista if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) < (Close[i]-Open[i])) && ((Open[i]-Low[i]) > (3*(Close[i]-Open[i]))))
{
Alert("Larga sombra inferior alcista");
return(21);
}
//Larga sombra inferior bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) < (Open[i]-Close[i])) && ((Close[i]-Low[i]) > (3*(Open[i]-Close[i]))))
{
Alert("Larga sombra inferior bajista");
return(22);
}
//Onda alta alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) > (3*(Close[i]-Open[i]))) &&
((Open[i]-Low[i]) > (3*(Close[i]-Open[i]))))
{
Alert("Onda alta alcista");
return(23);
}
//Onda alta bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) > (3*(Open[i]-Close[i]))) &&
((Close[i]-Low[i]) > (3*(Open[i]-Close[i]))) )
{
Alert("Onda alta bajista");
return(24);
}
//Peonza alcista
if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((High[i]-Close[i]) < (Close[i]-Open[i])) && ((Open[i]-Low[i]) < (Close[i]-Open[i])) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+1]-Open[i+1]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+2]-Open[i+2]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+3]-Open[i+3]))) ) { Alert("Peonza alcista"); return(8); } //Peonza bajista if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((High[i]-Open[i]) < (Open[i]-Close[i])) && ((Close[i]-Low[i]) < (Open[i]-Close[i])) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+1]-Open[i+1]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+2]-Open[i+2]))) && ((MathAbs(Close[i]-Open[i])) < (MathAbs(Close[i+3]-Open[i+3]))) ) { Alert("Peonza bajista"); return(7); } //Gran vela alcista if((High[i] > Close[i]) && (Close[i] > Open[i]) &&
(Open[i] > Low[i]) &&
((Close[i]-Open[i]) > (3*(High[i]-Close[i]))) &&
((Close[i]-Open[i]) > (3*(Open[i]-Low[i]))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+1]-Close[i+1])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+2]-Close[i+2])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+3]-Close[i+3])))) )
{
Alert("Gran vela alcista");
return(9);
}
//Gran vela bajista
if((High[i] > Open[i]) && (Open[i] > Close[i]) &&
(Close[i] > Low[i]) &&
((Open[i]-Close[i]) > (3*(High[i]-Open[i]))) &&
((Open[i]-Close[i]) > (3*(Close[i]-Low[i]))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+1]-Close[i+1])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+2]-Close[i+2])))) &&
((MathAbs(Close[i]-Open[i])) > (3*(MathAbs(Open[i+3]-Close[i+3])))) )
{
Alert("Gran vela bajista");
return(18);
}

return(0);
}


Como puedes observar en el código la función da una alerta cada vez que se produce una de las velas conocidas.

Esta función se debe de añadir en el código de nuestro indicador o de nuestro expert advisor, además se debería llamar a la función cada vez que se produce una nueva vela, pero también se puede obtener una vela determinada.

Este es una primera versión de la función, aún estoy comprobando dicha función en tiempo real, y me falta añadira alguna que otra cosa.

Saludos a todos.

jueves, 18 de junio de 2009

Como dibujar una linea en un grafico.

Saludos, llevaba tiempo sin escribir, pues estuve atareado con otras cosas.

Bien, no me olvidado del código para el EA d'Agostino, solo que lo he estado probando pero no da muy buenos resultados, todo será cuestión de paciencia.

Este post lo escribo por el echo de que he necesitado dibujar una línea al arrancar un expert advisor.

El siguiente código dibuja una línea Roja en el máximo del día anterior, y una línea verde en el mínimo del día anterior.

Bien lo primero es crear una función para dibujar una línea, navegando un poco por la página de MQL4, podemos encontrar un artículo donde se realiza esto, pongo a continuación la función que deberemos incluir en un archivo include.

int  maximosdiarios()
{
//Calculamos el máximo del día anterior
double precio=iHigh(Symbol(), PERIOD_D1,1);

//Dibujamos una línea roja

ObjectCreate("Maximo", OBJ_HLINE, 0, 0, precio);
ObjectSet("Maximo", OBJPROP_COLOR, Red);
ObjectSet("Maximo", OBJPROP_WIDTH, 3);

//Calculamos el mínimo del día anterior
price=iLow(Symbol(),PERIOD_D1,1);

//Dibujamos una línea verde
ObjectCreate("Minimo",OBJ_HLINE,0,0,precio);
ObjectSet("Minimo", OBJPROP_COLOR, Green);
ObjectSet("Minimo", OBJPROP_WIDTH, 3);

return(0);
}

Bien, esta función podemos ponerla en un archivo include o como una función dentro del EA o del indicador.

Tan solo nos hara falta llamar a la función dentro del expert advisor, como yo solo quiero dibujarla una sola vez al arrancar el EA, decidí poner la llamada a la función maximosdiarios() en la función init() del EA.

Tan solo mencionar que en el dinit() del EA se ha llamado a la función ObjectDeleteAll().

Saludos espero que os sea de utilidad, yo la emplearé más adelante en un EA.

lunes, 8 de junio de 2009

La importancia de la salida.

Ando un poco atareado, así que no tengo mucho tiempo para postear, pero he leído un artículo interesante en x-trader. Recomiendo su lectura.

En x-trader han publicado un artículo sobre como pueden variar las ganancias de un sistema sin tener en cuenta la entrada y tan solo estableciendo unos parámetros o reglas para la salida.

Dependiendo de las reglas de salida el sistema puede proporcionar diferentes ganancias.

Un saludo.

martes, 19 de mayo de 2009

Cruce de precio con una media

Este post lo escribo para contestar a un email recibido hace unos dias, siento no haber podido responder antes pero estuve de vacaciones.

En el email según entiendo se me pide un expert advisor para que nos avise de cuando el precio cruza una media LWMA.

La solución puesta a continuación es una de las múltiples que podríamos hacer, tampoco se si es exactamente lo que se me pidio en el email.

Para cambiar el período de la media tan solo hay que modificar la linea:

extern int media=15;

y poner el período que deseamos, es decir, si queremos una media de 100 cambiariamos el 15 por un 100.

//+------------------------------------------------------------------+
//| nuevo.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Programar meta."
#property link "http://programarmeta.blogspot.com"

extern int periodo=15;
bool BarraNueva=false;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

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

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
double media=iMA(NULL, 0, periodo, 0, MODE_LWMA, PRICE_CLOSE,0);
Fun_NuevaBarra();
if(BarraNueva == 1)
{
if(((Open[1] <> media)) ||
((Close[2] <> media) && (Close[1] > media)))
Alert("Cruce hacia arriba");
if(((Open[1] > media) && (Close[1] <> media) && (Open[2] > media) &&
(Close[1] < nuevahora="0;" barranueva="false;" nuevahora="Time[0];" barranueva="true;">

Saludos a todos.