comprobar histórico iMABuenas, 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 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
Re: comprobar histórico iMABuenas,
A ver si te entiendo, intentas conseguir el cuerpo de la vela y compararlo con un indicador personalizado tuyo? o simplemente con una MA?
Re: comprobar histórico iMALo 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
Re: comprobar histórico iMABuenas,
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.
Re: comprobar histórico iMAHola, 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:
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...
Re: comprobar histórico iMA.... que pena, apenas note el hecho que en lugar de editar el mensaje anterior, lo cite....
No puedes cometer/ dos veces el mismo error/ la segunda vez sera/ Por eleccion...
Re: comprobar histórico iMAjajaja, lo claro que lo tengo en mi cabeza y lo mal que me explico
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.
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.
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 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
Re: comprobar histórico iMACreo 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
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); }
10 mensajes
• Página 1 de 2 • 1, 2
|
|
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado