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

 
Alexey Viktorov:

1. He dicho comprobar, no sustituir. iFractals devuelve 0 si no hay ningún fractal. No lo uso regularmente y, naturalmente, no obstruyo los restos no secos de la memoria con tales trivialidades.

2. La función, aunque está horriblemente escrita, sigue funcionando correctamente.

3. El último valor se muestra en Comentario. Sustitúyelo por.

y ver cuántas veces se imprime

Muchas, pero nunca falsas. Como si la condición se cumpliera siempre. Pero debería ser falso.

 
Ghabo:

Mucho, pero nunca falso. Es como si la condición se cumpliera siempre. Pero debería ser falso, en la captura de pantalla, la situación contradice la condición, pero verdadera.


En la captura de pantalla están marcados el primer fractal y el segundo. Pero según la condición la función busca más hasta encontrar el que está por debajo del primero. Y el cuarto fractal es más bajo que el primero... Que es lo que dice la condición.

Si la condición se complementa con

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

También imprimirá falso.

 
Alexey Viktorov:

El primer fractal y el segundo fractal están marcados en la captura de pantalla. Pero según la condición, la función busca más hasta encontrar el que está por debajo del primero. Y el cuarto fractal es más bajo que el primero... Que es lo que dice la condición.

Si se añade la condición

También imprimirá falso.

Revertir la condición
 if(fr2>fr1) return(true);
        else break;

Imprime falso, pero la condición se cumple.

aqa1

 

El segundo ciclo siempre devuelve el precio del fractal encontrado en el primer ciclo.

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

El segundo ciclo siempre devuelve el precio del fractal encontrado en el primer ciclo.

Parece que tienes un problema con la lógica.

Intente describir el orden de búsqueda con palabras sencillas. Piensa si has escrito todo correctamente. Y luego hacer una función de búsqueda que devuelva el precio de un fractal encontrado por su número de serie. En cuanto lo hagas, y te devuelva el precio correcto para el fractal que especificaste por su número de secuencia, empieza a hacer la lógica para encontrar el precio del siguiente fractal (ya tendrás una función que te devuelva su precio en ese momento). Y luego sólo queda comparar esos precios.

Y haces un montón de todo a la vez.

 

¿Quizá no he entendido bien cómo funciona?

Primero encuentro un fractal, el primero por encima de la MA - (marcado como #1 en la captura de pantalla),

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

Desde ella, miro, más allá en la historia, el primer fractal (marcado con el número 2 en la captura de pantalla). Si el fractal nº 2 es mayor que el fractal nº 1, devuelvo true.

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

¿Es todo correcto?

aq11

 
Artyom Trishkin:

devolverá el precio del fractal encontrado por su número de secuencia.

No por número, busco por condición que el fractal esté por encima de la MA, el número ordinal puede ser cualquiera. El precio de este fractal en el primer bucle se escribe en la variable "fr1" correctamente.

El problema está en el segundo bucle, si entiendo bien, claro. No está claro por qué no se encuentra el precio del fractal número 2.

 
Ghabo:

No por número, busco por condición que el fractal esté por encima de la MA, el número ordinal puede ser cualquiera. El precio de este fractal en el primer ciclo se escribe en la variable "fr1" correctamente.

El problema está en el segundo bucle, si entiendo bien, claro. No entiendo por qué no se puede encontrar el precio del fractal número 2.

Tengo que volver a contarte toda la lógica. ¿Hay algo que se te ocurra por tu cuenta?

1. En el primer bucle, encontramos el fractal por encima del MA. El número de la barra se escribe en la variable num_bar (barra #11 en la captura de pantalla).

2. En el segundo bucle comenzamos a buscar el segundo fractal que satisface la condición. Empezamos a buscar desde num_bar... es decir, de la barra #11 porque nf es cero.

3. El fractal se encuentra. El valor es igual al anterior. La condición no se cumplirá ya que la condición contiene > entonces < pero no es igual. Si ponemos ==, se producirá el mismo galimatías, pero desde el otro lado.

Probablemente, deberíamos buscar el segundo fractal de la siguiente barra num_bar+1 o incluso +2.

 
Alexey Viktorov:

Hay que volver a contar con toda la lógica. ¿Hay algo que se te ocurra por tu cuenta?

1. En el primer ciclo encuentra un fractal por encima de la MA. El número de la barra se escribe en la variable num_bar (barra #11 en la captura de pantalla).

2. En el segundo bucle, empieza a buscar el segundo fractal que satisface la condición. Empezamos a buscar a partir de la barra numérica... es decir, de la barra #11 porque nf es igual a cero.

3. El fractal se encuentra. El valor es igual al anterior. La condición no se cumplirá, porque en la condición > entonces < pero no es igual. Si ponemos ==, se producirá la misma basura pero desde el otro lado.

Probablemente, deberíamos buscar el segundo fractal de la siguiente barra num_bar+1 o incluso +2.

En general, la acción en los dos primeros párrafos, la he expresado).

Para "num_bar+1" gracias.

No encuentro el mínimo.

La condición no se cumple, la flecha está puesta, cumplida no está puesta.

La condición es la siguiente: si la distancia del mínimo de la vela atravesada por la MA al mínimo dela iLowest es mayor o igual a 100, pongo la flecha.

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

De B a A encuentro el mínimo de C.

A-C=100 pips en el punto B, debería poner la flecha.

¿Por qué no lo hace?

bajo1

 
Ghabo:

En general, las acciones en los dos primeros párrafos, lo dije)

Un poco equivocado en el segundo punto. No ha definido dónde empezamos a buscar y cuándo obtendremos qué valor. Y esto es lo que te hace pensar que deberías buscar un poco más.

Ghabo:

No se puede encontrar el mínimo.

La condición no se cumple, la flecha está puesta, la condición no se cumple.

La condición es que si la distancia desde el mínimo de la vela que cruzó la MA hasta el mínimo del iLowest es mayor o igual a 100 entre los cruces de precios y la MA, pongo la flecha.

De B a A encuentro el mínimo de C.

A-C=100 pips en el punto B, debería poner la flecha.

¿Por qué no lo pone?

Hay algo en este código que también es difícil de entender la lógica.

Como mínimo necesitamos saber dónde y cómo se definen las variables indexS1 e indexS2 y si se reinician en cada tick.

Y qué ocurrirá si el cruce de МА queda atrapado en un hueco?


Y una pregunta más: ¿sabes cómo utilizar el depurador?

Razón de la queja: