Ayuda con la codificación... ¿Cómo puedo hacer que el indicador filtre en lugar de alertar?

 

Esto produce una alerta cuando el precio alcanza una línea superior o inferior.

Quiero permitir que las operaciones se ejecuten hasta que se acerquen a estas líneas. Cuando el precio se acerque demasiado no permitir que las operaciones se abran.

¿Cómo consigo que esa lógica ocurra en el cierre de la barra actual cuando todo lo que hay aquí son matrices?

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

return(0);

}
 

Veo que te estás esforzando, ¡bien hecho! A estas alturas creo que lo que más necesitas es saber cómo ayudarte a ti mismo, así que te aconsejo que utilices _extensamente_ la función "NAvigator->Search" de MQL, encontrarás respuestas a muchas de tus preguntas (lo único que se puede llamar desde un indicador son los buffers, y esto se hace a través de iCustom(); los objetos no son arrays, etc. y mucho más). Por ejemplo, una búsqueda de "array" enseñará que el índice de array de la Barra Actual es 0, el índice de arrray de la Última Barra es 1 y así sucesivamente.

Si las entradas de la función de búsqueda son todas abrumadoras, probablemente esté intentando hacer cosas demasiado difíciles para usted en este momento. Creo que la mayoría de los ejemplos anteriores se tocan en el curso para principiantes de codersguru, así que recomendaría una segunda lectura.

También podrías tomar un EA sencillo, y tratar de simplificarlo/modificarlo ligeramente, eso te enseñará cómo funciona. Una vez hecho, puedes intentar complejizarlo.

Lo siento si estoy fuera de la marca.

Ahora, en general, para trabajar en el precio de cierre, usted prueba para la apertura de una nueva barra y, a continuación, escribir sus condiciones en el índice 1 de las matrices. Un código posible para detectar la apertura de una nueva barra:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Tiempo[0];

return(true);

}

return(false);

}

Espero que esto ayude, buena suerte.

 

Sí, estás en el camino correcto.

Yo dejaría todo, y releería la programación en c++.

Desgraciadamente el orientado a objetos no es tan bueno para mq4, así que tendrás que compensar con lo básico.

Sigue así compañero, lo conseguirás.

 
Aaragorn:
Esto produce una alerta cuando el precio alcanza una línea superior o inferior.

Quiero permitir que las operaciones se ejecuten hasta que se acerquen a estas líneas. Cuando el precio se acerca demasiado no permitir que las operaciones se abran.

¿Cómo consigo que esa lógica ocurra en el cierre de la barra actual cuando todo lo que hay aquí son matrices?

Usted puede tener esto como un ejemplo. Se acerca a lo que quieres conseguir. Por lo que puedo ver, es el mismo indicador que usted está utilizando.

 
pipeline:
Veo que te estás esforzando, ¡bien hecho! A estas alturas creo que lo que más necesitas es saber cómo ayudarte a ti mismo, así que te aconsejo que utilices _extensamente_ la función "NAvigator->Search" de MQL, encontrarás respuestas a muchas de tus preguntas (lo único que se puede llamar desde un indicador son los buffers, y esto se hace a través de iCustom(); los objetos no son arrays, etc. y mucho más). Por ejemplo, una búsqueda de "array" enseñará que el índice de array de la Barra Actual es 0, el índice de arrray de la Última Barra es 1 y así sucesivamente.

Si las entradas de la función de búsqueda son todas abrumadoras, probablemente estás tratando de hacer cosas demasiado difíciles para ti en esta etapa. Creo que la mayoría de los ejemplos anteriores se tocan en el curso para principiantes de codersguru, así que recomendaría una segunda lectura.

También podrías tomar un EA sencillo, y tratar de simplificarlo/modificarlo ligeramente, eso te enseñará cómo funciona. Una vez hecho, puedes intentar complejizarlo.

Lo siento si estoy fuera de la marca.

Ahora, en general, para trabajar en el precio de cierre, usted prueba para la apertura de una nueva barra y luego escribir sus condiciones en el índice 1 de las matrices. Un código posible para detectar la apertura de una nueva barra:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Tiempo[0];

return(true);

}

return(false);

}

Espero que esto ayude, buena suerte.

ok sobre la función de búsqueda... no devuelve nada. He intentado usarla varias veces en el metaeditor. Escribo lo que quiero y le doy a return y no pasa nada, o hago clic en esa pequeña caja de ir al lado de la cadena de búsqueda y no pasa nada. Me estaba dando cuenta de lo cutre que es la búsqueda porque no funciona en absoluto. Me refiero a la función de búsqueda en la ventana del navegador del metaeditor... ¿hay algún protocolo para que funcione que yo no conozca?

 
fx-programmer:
Sí, estás en el buen camino.

Yo dejaría todo, y volvería a leer programación en c++.

Desgraciadamente el orientado a objetos no es tan bueno para mq4, así que tendrás que compensar con lo básico.

Sigue así, amigo, lo conseguirás.

Gracias por los ánimos, el apoyo moral cuenta. ¿Ves cuál es mi objetivo teórico aquí? ¿Podrías sugerir un método mejor (lo básico como lo llamas) para lograr este objetivo?

 
pipeline:

Ahora, en general, para trabajar en el precio de cierre, usted prueba la apertura de una nueva barra y luego escribe sus condiciones en el índice 1 de la matriz. Un código posible para detectar la apertura de una nueva barra:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Tiempo[0];

return(true);

}

return(false);

}

Espero que esto ayude, buena suerte.

casi ayuda si sabes lo que quiero decir..suponiendo que devuelve true entonces que, ¿cómo se obtiene el valor del indicador fuera de la matriz en el cierre actual ahora que se ha detectado que hay una nueva barra?

 
 
Aaragorn:

Anoche estuve buscando en Google y encontré esto...

http://www.gordago.com/?act=download

¿alguien tiene alguna experiencia con esto? ¿es real?

Gordago no maneja o todavía no es capaz de manejar indicadores personalizados. Ese es un gran inconveniente.

La única forma de aprender a programar es esforzarse, como estás haciendo ahora... aprendiendo de los ejemplos. El material de Coders' Guru es genial para aprender.

Buena suerte,

Maji

 
Hoy estoy pensando en decir que al diablo con los indicadores y simplemente ver si puedo crear algo que me permita referenciar el máximo más alto y el mínimo más bajo de las barras anteriores(x).

Cuanto más miro los indicadores más atractivo parece esto....

ok veo el high() en variables predefinidas. ¿como lo uso para obtener el máximo de las últimas 30 horas por ejemplo?

 

Escribir un indicador es una cosa, y escribir un EA es otra cosa. No los mezcles. En los indicadores tienes que manejar el historial también para dibujarlo correctamente. Cuando escribes un EA sólo tienes el tick actual y tienes que calcular los valores cada tick (si no quieres perder una operación). Entonces, para obtener los valores del borde superior e inferior del tick ACTUAL puedes hacer 2 cosas

  1. Usar el indicador original como un indicador personalizado
  2. escribir la lógica del indicador dentro de su EA

La primera opción no es difícil. Tienes que encontrar primero, cuál es el índice del buffer que se usa para la línea superior y la línea inferior.

Para encontrarlo tienes que buscar en el código del indicador

SetIndexBuffer(0,superior);

SetIndexBuffer(1,middle1);

SetIndexBuffer(2,lower);

como puedes ver la línea superior es el índice 0, la central es el índice 1 y la inferior es el índice 2.

Ahora que tenemos esta información tenemos que saber cuántos parámetros tiene el indicador. Para obtener esta información hay que buscar las líneas que comienzan con la palabra external

Sólo he encontrado 1 línea

extern int period = 34;

Ahora, podemos utilizar el indicador como un cliente

double upLevel = iCustome(NULL,0, "Trend Bands", 34, 0, 0);

double LowLevel = iCustome(NULL,0, "Trend Bands", 34, 2, 0);

34 es el parámetro del indicador

el 0 es el índice de la banda (2 para la inferior)

el último 0 es el desplazamiento de la barra (En el EA necesitamos la corriente, así que usamos 0)

ahora que tienes los valores superiores e inferiores puedes comprobarlos con el precio

Espero que te haga progresar

Eli