comprobar histórico iMA

Foro para cuestiones generales sobre la plataforma MetaTrader 4.

comprobar histórico iMA

Notapor Benys » 02 May 2016, 11:00

Buenas, necesito un poco de ayuda, pero a ver si no pido demasiado, estoy aprendiendo a programar mi propio EA, y voy poco a poco, una de las condiciones que necesito es comprobar el historial de las velas, y comprobar que el precio de apertura y cierre, este por encima o por debajo de unas iMA,y así indicar que el EA busque las condiciones de la dirección contraria para operar.
Programarlo manualmente creo que lo estoy haciendo bien, ya que no es necesario comprobar muchas velas pasadas, pero seguro que hay alguna manera de simplificarlo con algún Array, pero lo he intentado y todavía estoy muy verde :mrgreen:

Resumiendo: SI Open&Close de esa vela están por encima de iMA(x) de esa misma vela, buscar unas condiciones para la primera vela que las cumpla, y por debajo pues las otras condiciones.

Gracias y perdonar mi ignorancia, si pido demasiado seguiré probando :)
Benys
 
Mensajes: 7
Registrado: 12 Ene 2016, 21:29
Karma: 0

Re: comprobar histórico iMA

Notapor Duracell » 04 May 2016, 13:11

Buenas,

A ver si te entiendo, intentas conseguir el cuerpo de la vela y compararlo con un indicador personalizado tuyo? o simplemente con una MA?
Continous learning... always long @ smoke xd

La Gran Carrera xd
Imagen
Avatar de Usuario
Duracell
 
Mensajes: 524
Registrado: 02 Nov 2013, 13:21
Karma: 10

Re: comprobar histórico iMA

Notapor Benys » 04 May 2016, 19:32

Lo que intento es marcar el camino para seguir en una dirección u otra, busco que la apertura y el cierre de la vela este por encima de una MA de máximos, o por debajo de la misma MA pero en mínimos, ya que el indicador no estará todo el día conectado, quiero encontrar la primera vela que haya cruzado hasta la otra MA, y si se cumplen otros indicadores comprar o vender.
Mi idea es nombrar otra variable (Merc), y si la función devuelve 1=buscar condiciones bajistas, o 2= condiciones alcistas, que siga un camino u otro.
Una pequeña muestra de lo que estoy intentando, hay que depurarlo bastante mas porque creo que así nunca pararía de comprobar todas las velas pasadas, y si se da la condición en una vela la pasada, por ejemplo la [3], quiero que pare de buscar en el historial.

void MovMar()
{
if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1)<Close[1]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1)<Open[1])
return(Merc=1);
if (iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,1)>Open[1]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,1)>Close[1])
return(Merc=2);
if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2)<Close[2]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2)<Open[2])
return(Merc=1);
if (iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,2)>Open[2]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,2)>Close[2])
return(Merc=2);
...

Perdonar si digo barbaridades, pero como dije estoy aprendiendo a programar en mis ratos libres y con la info de la red.
Thanks
Benys
 
Mensajes: 7
Registrado: 12 Ene 2016, 21:29
Karma: 0

Re: comprobar histórico iMA

Notapor Duracell » 05 May 2016, 13:59

Buenas,

Por lo que veo así a simple vista, el problema es que estás comparando la iMA con el cuerpo de la Vela 1 y 2 respectivamente, piensa que la vela actual es la 0 y de aquí para atrás tienes que ir sumando 1 por cada vela.

Otro error es que tu función es "void" que significa vacío en inglés, vamos que no devuelve nada y tu le estás haciendo un return de un entero, así que de entrada deberías poner int MovMar().

He hecho que te compile y arreglado algo, pero no acabo de entender la dinámica. Antes que nada deberías buscar la vela con Close más alto, una vez tengas esa ID compararla con la EMA de 6 que tienes por si el precio realmente está por encima o la EMA lo está y en ese caso que te envíe una notificación.

Te adjunto un par de links que te ayudarán.
https://docs.mql4.com/series/ihighest
https://docs.mql4.com/common/sendnotification

Un saludo y espero te sea de ayuda.
Adjuntos
benys.mq4
(1.5 KiB) 327 veces
Continous learning... always long @ smoke xd

La Gran Carrera xd
Imagen
Avatar de Usuario
Duracell
 
Mensajes: 524
Registrado: 02 Nov 2013, 13:21
Karma: 10

Re: comprobar histórico iMA

Notapor Refresko » 05 May 2016, 17:37

Hola, te recomiendo que expliques con una imagen un poco mejor tu idea, y asi dejar mas claras las reglas para colaborarte.

otra cosa que puedes hacer es declarar la variable de la iMA, para evitar tener que repetir tanto el texto del codigo. si solo usas 2 "posiciones" de la misma iMA, puedes hacer 2 y te sera mas facil entender el code y evitaras muchos errores.
seria algo asi:

Código: Seleccionar todo
 int MovMar()
    {
    int Merc=0;  // si se usa como variable local, se puede retornar. ---- si se usa como global, no es necesario.
    double Media_POS_1_HIGH=iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1);
    double  Media_POS_2_HIGH=iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2);
    double Media_POS_1_LOW=iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,1);
    double Media_POS_2_LOW=iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,2);

    if (Media_POS_1_HIGH<Close[1] && Media_POS_1_HIGH<Open[1])  //Condicion1
    Merc=1;
   
    if (Media_POS_1_LOW>Open[1] && Media_POS_1_LOW>Close[1])  //Condicion2
    Merc=2;

   if (Media_POS_2_HIGH<Close[2] && Media_POS_2_HIGH<Open[2]) // Condicion3
    Merc=1;

     if (Media_POS_2_LOW>Open[2] && Media_POS_2_LOW>Close[2])  //Condicion4
    Merc=2;
   
   return Merc;
   // ...
}


has de tener muy claras las reglas, pues (sin saber todo el codigo que tienes), en el ejemplo que pones puede pasar que la condicion 1 y condicion 3 sean positivas o negativas ambas,o sea una positiva y una negativa, y entonces el resultado seria solo de la ultima condicion afirmativa. y eso puede hacer una gran diferencia.
Última edición por Refresko el 10 May 2016, 05:45, editado 3 veces en total
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Re: comprobar histórico iMA

Notapor Refresko » 05 May 2016, 23:37

.... que pena, apenas note el hecho que en lugar de editar el mensaje anterior, lo cite.... :D :D :D
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Avatar de Usuario
Refresko
 
Mensajes: 165
Registrado: 12 Dic 2011, 22:56
Karma: 5

Re: comprobar histórico iMA

Notapor Benys » 07 May 2016, 08:46

jajaja, lo claro que lo tengo en mi cabeza y lo mal que me explico :D

Duracell escribió:Buenas,

Por lo que veo así a simple vista, el problema es que estás comparando la iMA con el cuerpo de la Vela 1 y 2 respectivamente, piensa que la vela actual es la 0 y de aquí para atrás tienes que ir sumando 1 por cada vela.

Otro error es que tu función es "void" que significa vacío en inglés, vamos que no devuelve nada y tu le estás haciendo un return de un entero, así que de entrada deberías poner int MovMar().



Lo de comparar las velas, si no voy mas perdido de lo que pensaba lo estoy haciendo bien, comparo la media de esa vela, (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1), con la apertura y cierre de la misma, Close[1]&&
Open[1])

if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2)<Close[2]&&
Open[2])

Y lo de "void" creo que también esta bien, porque voy haciendo el EA por partes, y para mi es mas sencillo hacer la descripción fuera de la función especial init()(ya que quiero que se ejecute solamente al empezar el EA), y después llamarla cuando voy montando el EA.







refresko escribió:Hola, te recomiendo que expliques con una imagen un poco mejor tu idea, y asi dejar mas claras las reglas para colaborarte.

otra cosa que puedes hacer es declarar la variable de la iMA, para evitar tener que repetir tanto el texto del codigo. si solo usas 2 "posiciones" de la misma iMA, puedes hacer 2 y te sera mas facil entender el code y evitaras muchos errores.
seria algo asi:


Cierto, el programa se ve mucho mas limpio y sencillo, pero como soy un poco torpe, voy haciendo copia y pega parece que me aclaro al ir redactandolo, tendría que declara 2 variables por cada vela pasada que quiero que revise, pero apunto tu recomendación porque me sera más sencillo para revisar el code mas rápido.





refresko escribió:
has de tener muy claras las reglas, pues (sin saber todo el codigo que tienes), en el ejemplo que pones puede pasar que la condicion 1 y condicion 3 sean positivas o negativas ambas,o sea una positiva y una negativa, y entonces el resultado seria solo de la ultima condicion afirmativa. y eso puede hacer una gran diferencia.



En cuanto a las condiciones, lo que pretendo, es que en cuanto una condición sea cierta, deje de comprobar el resto de velas, por eso decía que aun tengo que ir depurandolo.

A ver si con una imagen me explico mejor :)


Imagen


En ese gráfico, la función buscaría hasta la vela 8, en la que la condición Open & Close[8] <(iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,8), devolvería la variable Merc=2, por lo que hasta que el cuerpo de una vela no este por encima de la Media_High, no seguiría buscando el resto de condiciones del EA.

Un saludo y gracias por las molestias ;)
Benys
 
Mensajes: 7
Registrado: 12 Ene 2016, 21:29
Karma: 0

Re: comprobar histórico iMA

Notapor Benys » 09 May 2016, 21:12

Creo que la solución para que deje de comprobar el resto de velas, al darse una condición y devolver un solo valor de la variable Tend, es colocar else delante de if, y si no me equivoco no hace falta colocar las llaves { } en cada "else if". Es chapucero pero creo que sirve :lol:


void MovMar()
{
if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1)<Close[1]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,1)<Open[1])
return(Tend=1);
else if (iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,1)>Open[1]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,1)>Close[1])
return(Tend=2);

else if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2)<Close[2]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,2)<Open[2])
return(Tend=1);
else if (iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,2)>Open[2]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,2)>Close[2])
return(Tend=2);

else if (iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,3)<Close[3]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_HIGH,3)<Open[3])
return(Tend=1);
else if (iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,3)>Open[3]&&
iMA(NULL,0,6,0,MODE_EMA,PRICE_LOW,3)>Close[3])
return(Tend=2);

// ...añadir comprobacion mas velas

return(Tend);
}
Benys
 
Mensajes: 7
Registrado: 12 Ene 2016, 21:29
Karma: 0

Siguiente

Volver a MetaTrader 4

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados