Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 242

 
Youri Lazurenko:

No puedo resolver un problema aparentemente sencillo. En algún lugar del gráfico había un cruce de MA. Encontramos un bar después de la travesía. ¿Cómo puedo calcular el número de barras desde esa barra hasta la barra actual?

El número de esa barra en particular. ¿No?
 
Youri Lazurenko:

No puedo resolver un problema aparentemente sencillo. En algún lugar del gráfico había un cruce de MA. Encontramos un bar después de la travesía. ¿Cómo puedo calcular el número de barras desde esta barra hasta la actual?


Parece que está hecho (al menos el comentario en la pantalla es correcto). Gracias al"número de barras" creo que he encontrado la solución. Utilizo la función iTime para determinar la fecha de la barra necesaria. El boceto tiene este aspecto:

void OnTick()

{

int nBarsUp, nBarsDn;

datetime date_dn = iTime(NULL, 0, IntersectionDN());

datetime date_up = iTime(NULL, 0, IntersectionUp());

datetime date_1 = iTime(NULL, 0, 1);

nBarsUp = Bars(Symbol(), 0, date_up, date_1);

nBarsDn = Bars(Symbol(), 0, date_dn, date_1);

Comment("Número de barras largas: " + nBarsUp + "\n "+ "Número de barras cortas: " + nBarsUp + "\n".

"Número de barras cortas:" + nBarsDn);

}

//+------------------------------------------------------------------+

int IntersecciónDN()

{

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

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retorno(i-1);

}

return(-1);

}

int IntersectionUp()

{

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

{

if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

&& iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

retorno(i-1);

}

return(-1);

}

 
Youri Lazurenko:

Parece que ha funcionado (al menos el comentario en la pantalla es correcto). Gracias al"número de barras", creo que he encontrado una solución. He utilizado la función iTime para determinar la fecha de la barra deseada. El boceto tiene este aspecto:

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

Está buscando un cruce en el bucle. Y desde la barra de cero hasta lo más profundo de la historia. Así que su función IntersectionXX() devuelve el número de barra.

¿Para qué es todo esto?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

Está buscando un cruce en el bucle. Y desde la barra cero hasta el final de la historia. Así que IntersectionXX() devuelve el número de barra.

¿Para qué es todo esto?


El número del bar, sí. Pero necesito saber el número de barras - desde esta barra en el fondo de la historia hasta la barra cero. En resumen, necesito el ángulo de inclinación de la barra desde la MA. Pero como no se puede calcular como me parece (el precio en la línea vertical y las barras en la línea horizontal colocadas a cierta distancia una de otra - son valores incompatibles). Hace tiempo se sugirió en el foro introducir un coeficiente: la diferencia de precio dividida por el número de barras. La idea me parece razonable. Quiero ponerlo en práctica, pero como yo mismo soy un maniquí, intento encontrar algo y probarlo yo mismo por ensayo y error.

P.D. ¿Cómo se inserta el código en MQL4 (como el tuyo, no como el mío)?
 

¿Alguien puede aconsejar cómo solucionar este problema?


Después de cambiar el TF, el panel se deforma

 
Youri Lazurenko:

El número de barras, sí. Pero necesito saber el número de barras - desde esta barra en el fondo de la historia hasta la barra 0. En resumen, necesito el ángulo de la barra desde el MA. Pero como no se puede calcular, me parece (el precio en la línea vertical y las barras en la línea horizontal colocadas a cierta distancia entre sí - son valores incompatibles). Hace tiempo se sugirió en el foro introducir un coeficiente: la diferencia de precio dividida por el número de barras. La idea me parece razonable. Quiero ponerlo en práctica, pero como soy un dummie, intento encontrar algo y probar yo mismo por ensayo y error.

P.D. ¿Cómo se inserta el código en el MQL4 (como lo tienes tú, no como lo tengo yo)?
Si este es el décimo compás, ¿cómo puedo saber la diferencia entre el décimo y el cero compás? 10-0=10
¿Y para qué sirve la resta?

 

Hola! Los dosnúmerosmenosq y wse comparan incorrectamente, cuando son iguales, el operador if piensa que uno es mayor que el otro.¿Cuál es el error? Cuando q = -0,0002 y w es también -0,0002, res12=falso, ¿por qué?

 

Hola! Los dosnúmerosmenosq y wse comparan incorrectamente, cuando son iguales, el operador if piensa que uno es mayor que el otro.¿Cuál es el error? Cuando q = -0,0002 y w es también -0,0002, res12=falso, ¿por qué?

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Hola! Los dosnúmerosmenosq y wse comparan incorrectamente, cuando son iguales, el operador if piensa que uno es mayor que el otro.¿Cuál es el error? Cuando q = -0,0002 y w es también -0,0002, res12=falso, ¿por qué?


Creo que hay que normalizar y ya está, no se pueden comparar los dobles entre sí sin normalizar.

si NormalizarDoble (q<=w)
 
Vyacheslav Kornev:

Creo que tengo que normalizar y ya está, ya que no es posible comparar el doble entre ellos sin normalizar.


Gracias, ha funcionado, ¡sólo que he normalizado q y w por separado!

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))
Razón de la queja: