Ayuda a la codificación - página 38

 

...

En el indicador la única forma de hacerlo sería mantenerlo en un bucle sin fin hasta que se detecte algún evento (teclado, ratón, ...)

Pero eso también significaría que se detiene la ejecución del resto de las funciones del terminal (es lo mismo que cuando tienes un indicador malo que se cuelga - bloquea tu metatrader) Así que no es una buena solución. La función que se suele utilizar para eso (sleep) que permite la ejecución de otro código mientras tu código está en pausa (que sería el tiempo en el que permites que el resto de cosas en el terminal hagan el trabajo) está desactivada en los indicadores por lo que no se puede utilizar para una solución

marley60:
si hay una alarma, hace un sonido "pling" una vez. ¿hay alguna posibilidad de reproducir un sonido de alarma hasta que la detenga? (razón: no oiré un solo "pling" cuando esté en el baño o en la cocina) he sustituido el sonido de la alarma por una canción pero preferiría tener una opción entre reproducir una vez/reproducir hasta que se detenga (como era en tradestation).
 

Pregunta sobre el índice

Hola Mladen;

He visto que algunos llaman a un indicador como Ind[3][0][1] así, ¿qué significa el primer y segundo índice definido?

gracias de antemano

kemal

 

Problema de zigzag en el EA

Hola,

Utilizo el Zigzag indy estándar en mi EA. Utilizo el siguiente código para determinar los nodos del zigzag. Me he dado cuenta de que a veces la MT4 devuelve los nodos de zigzag del marco de tiempo equivocado. Por ejemplo, cuando intento obtener los nodos de zigzag de H1, MT4 devuelve los valores de los nodos de zigzag de M15. ¿Alguien se ha encontrado con este problema antes? Si conoce más información sobre el zigzag y la posible área del problema, por favor, aconséjelo.

Muchas gracias.

FFJason

nota: TF es el marco de tiempo que alimenta diferentes valores para obtener los nodos de zigzag de diferentes marcos de tiempo. De alguna manera MT4 mezcló los valores de los nodos cuando se utiliza un TF específico.

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

¿Cómo abrir una nueva orden después del S/L de la orden anterior?

Abrir una nueva orden después del S/L de la orden anterior.
Estimado señor;

¿Alguien conoce el programa de EA para que después de cerrar la orden basada en el S/L se abra la nueva orden?

Saludos
 

...

Probablemente se trata de un caso en el que el pico de ZigZag de un marco temporal es el mismo que el pico de ZigZag de otro marco temporal (lo cual no es un caso inusual ya que se buscan picos). En cuanto a los marcos de tiempo, usted está obteniendo valores correctos de marcos de tiempo con ese código. Tal vez sólo haya que hacer un cambio en el código para asegurarse de que se obtienen los 4 últimos valores del ZigZag, y entonces el código sería así

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

[/PHP]

As you can see only the loop end is changed from "150" to "Bars-1"

novalight:
Hi,

I use standard Zigzag indy in my EA. I use the following code to determine the zigzag nodes. I noticed that sometimes the MT4 returns the zigzag nodes from the wrong time frame. For example, when I try to get H1 zigzag nodes, MT4returns M15 zigzag node values. Has anyone come across such problem before? If you know more info about zigzag and the possible problem area, please advise.

Many thanks.

FFJason

note: TF is the time frame which I feed different values for getting zigzag nodes from different time frame. Somehow MT4 mixed up the node values when a specific TF is used.

[PHP]

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Problema de zigzag en el EA

Hola Maiden,

Muchas gracias por tu ayuda.

He leído un poco sobre iBarShift, y tu iBarShift(NULL,TF,0) parece obtener el número total de barras en el gráfico. Por favor, corrígeme si entiendo mal tu intención de usar iBarShift.

Me fijé en los casos en los que ZigZag devolvía valores de nodo erróneos, y el número de búsqueda (yo uso 150) no era el problema. Además, entiendo que algunos nodos son los mismos para diferentes marcos de tiempo, pero los errores que encontré fueron dos o más nodos y los números de barra correspondientes estaban todos apuntando a un marco de tiempo diferente. Ese era el problema que me desconcertaba.

Hoy encontré un problema más desconcertante con Zigzag. Utilizo la Alerta para mostrar los nodos devueltos por la rutina y encontré que a veces la rutina devuelve un par correcto de nodo y su número de barra, pero el otro nodo y el número de barra eran ambos 0. Eso es realmente extraño. He mejorado la rutina asegurando que ningún nodo tenga valor 0 con los siguientes códigos. Solo espero que no sea que MT4 se salte un latido o se cale, y arroje basura a mi EA. La razón por la que digo esto es que mi otro EA que muestra mensajes de alerta cuando mi programa tratando de insertar SL y TP, o recoger los valores de OP, y sucedió muy a menudo que MT4 acaba de saltar estos pasos, y regresó 0 valores. Tengo que mejorar mi programa para buscar estos casos y asegurarse de que estas tareas se realizan correctamente.

Por favor, aconséjeme. Estoy al final de mi ingenio. Su ayuda es muy apreciada. Saludos,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

[/PHP]

mladen:
You probably have a case when the ZigZag peak of one time frame is the same as the ZigZag peak of another time frame (which is not an unusual case since they are looking for peaks). As far as time frames are concerned, you are getting correct time frame values with that code. Maybe just one change in the code has to be done in order to ensure that you get 4 last ZigZag values, and then the code would be like this

[PHP]void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

As you can see only the loop end is changed from "150" to "Bars-1"
 

...

En cuanto a iBarShift(NULL,TF,0) : sí, devuelve el total de barras de un marco temporal objetivo. Pero el bucle no se ejecutará tantas veces, existirá tan pronto como se encuentren los últimos 4 picos de ZigZag.

Ahora por el bien de la discusión imagine esto: usted llama a la función para un marco de tiempo y tiene el límite de 150 barras para buscar los últimos 4 picos. Hace el trabajo y luego buscas en otro marco de tiempo. Y, sólo por el bien del argumento, imagine que el cuarto pico está fuera de las primeras 150 barras. Lo que sucederá. Ya que sus matrices no fueron limpiadas algunos resultados para el marco de tiempo previamente buscado siguen allí ya que en la barra 150 no se encontraron todos los 4 picos y algunos picos previamente encontrados se dejan allí ya que fueron encontrados en el marco de tiempo actualmente buscado

Ese fue el propósito de añadir ese código: para asegurarse de que realmente encuentra los últimos 4 picos. A veces tomará 10 barras, a veces 1000 (depende completamente de ZigZag y no es un número fijo de barras) pero no hará un bucle de "barras". Sólo hará el bucle necesario y se asegurará de que los 4 picos sean del marco temporal objetivo.

En cuanto a la mezcla de marcos de tiempo, no creo que esté ocurriendo. La forma en que se abre el archivo de historia para los marcos de tiempo objetivo (simplemente añadiendo los minutos del marco de tiempo objetivo al nombre del símbolo) hace que sea imposible leer los datos de 2 marcos de tiempo en un solo bucle si el parámetro de marco de tiempo no se altera (sólo se abre un archivo de historia en ese caso y no puede acceder a los datos de diferentes marcos de tiempo).

novalight:
Hola Maiden,

Muchas gracias por su ayuda.

He leído un poco sobre iBarShift, y tu iBarShift(NULL,TF,0)parece obtener el número total de barras del gráfico. Por favor, corrígeme si entiendo mal tu intención de usar iBarShift.

Me fijé en los casos en los que ZigZag devolvía valores de nodo erróneos, y el número de búsqueda (yo uso 150) no era el problema. Además, entiendo que algunos nodos son los mismos para diferentes marcos de tiempo, pero los errores que encontré fueron dos o más nodos y los números de barra correspondientes estaban todos apuntando a un marco de tiempo diferente. Ese era el problema que me desconcertaba.

Hoy encontré un problema más desconcertante con Zigzag. Utilizo la Alerta para mostrar los nodos devueltos por la rutina y encontré que a veces la rutina devuelve un par correcto de nodo y su número de barra, pero el otro nodo y el número de barra eran ambos 0. Eso es realmente extraño. He mejorado la rutina asegurando que ningún nodo tenga valor 0 con los siguientes códigos. Solo espero que no sea que MT4 se salte un latido o se cale, y arroje basura a mi EA. La razón por la que digo esto es que mi otro EA que muestra mensajes de alerta cuando mi programa tratando de insertar SL y TP, o recoger los valores de OP, y sucedió muy a menudo que MT4 acaba de saltar estos pasos, y regresó 0 valores. Tengo que mejorar mi programa para buscar estos casos y asegurarse de que estas tareas se realizan correctamente.

Por favor, aconséjeme. Estoy al final de mi ingenio. Su ayuda es muy apreciada. Saludos,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

 

Problema de zigzag en el EA

Hola Maiden,

Tienes toda la razón. He revisado mi código y he encontrado que 150 es insuficiente para un gran zigzag, y si no se encuentran los 4 nodos, toda la lógica de identificar qué nodo viene primero o último será un caos.

En conclusión, no hay nada malo con Zigzag ni MT4, es puramente mi propio error en el establecimiento de un número de búsqueda demasiado pequeño. Te agradezco tu tiempo, tu paciencia y, sobre todo, tu disposición a ayudar ......

Cuídate .....

Novalight

mladen:
En cuanto a iBarShift(NULL,TF,0) : sí, devuelve el total de barras de un marco temporal objetivo. Pero el bucle no se ejecutará tantas veces, existirá tan pronto como se encuentren los últimos 4 picos de ZigZag.

Ahora por el bien del argumento imagina esto : llamas a la función para un marco de tiempo y tienes el límite de 150 barras para buscar los últimos 4 picos. Hace el trabajo y luego buscas en otro time frame. Y, sólo por el bien del argumento, imagina que el cuarto pico está fuera de las primeras 150 barras. Lo que sucederá. Ya que sus matrices no fueron limpiadas algunos resultados para el marco de tiempo buscado previamente siguen allí ya que en la barra 150 no se encontraron todos los 4 picos y algunos picos encontrados previamente se dejan allí ya que fueron encontrados en el marco de tiempo buscado actualmente

Ese fue el propósito de añadir ese código: para asegurarse de que realmente encuentra los últimos 4 picos. A veces tomará 10 barras, a veces 1000 (depende completamente de ZigZag y no es un número fijo de barras) pero no hará un bucle de "barras". Sólo hará un bucle las veces necesarias y se asegurará de que los 4 picos son del marco temporal objetivo.

En cuanto a la mezcla de marcos de tiempo, no creo que ocurra. La forma en que se abre el archivo de historia para los marcos de tiempo objetivo (simplemente añadiendo los minutos del marco de tiempo objetivo al nombre del símbolo) hace que sea imposible leer los datos de 2 marcos de tiempo en un solo bucle si el parámetro de marco de tiempo no se altera (sólo se abre un archivo de historia en ese caso y no puede acceder a los datos de diferentes marcos de tiempo).
 

Ayuda con el código

Alguien sería tan amable de añadir código al indicador SnakeBorders para añadir los dos siguientes gráficos:

1. 1. Un diagrama de líneas que trace el centro del rango blanco (como se muestra en la línea roja de la imagen).

2. 2. Un diagrama de líneas que traza el extremo opuesto del diagrama de líneas amarillas (como lo representa la línea cian en la imagen).snakeborders.mq4

Archivos adjuntos:
sb.gif  39 kb
 

por favor alguien me ayuda a crear este indicador

Indicador que quiero

Condición

Comprar cuando el precio de la vela del cuerpo cruza por encima del indicador ma y rsi > rsi 50 después del cierre de la vela abrir una nueva vela comenzar una flecha azul y la línea azul hasta la venta

Vender cuando el precio de la vela del cuerpo cruza por debajo del indicador ma y rsi < rsi 50 después del cierre de la vela abrir una nueva vela comenzar una flecha roja y la línea roja hasta la compra

por favor, añadir la entrada para el cambio de valor también

Lo siento en mi mal inglés

Muchas gracias

Razón de la queja: