Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 441

 

¿Pueden decirme qué estoy haciendo mal?

Necesito calcular cuántas barras han pasado desde que el precio cruzó por última vez la MA - excluyendo la barra cero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i!=1000 || Stop!=1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

 
-Aleks-:

¿Pueden decirme qué estoy haciendo mal?

Necesita - contar cuántas barras han pasado desde que el precio cruzó por última vez la MA - sin incluir la barra cero.

   if(Bars>1400)
     {
      int Stop;
      double MATcycle;
      for(int i=0;i<1000 || Stop==1; i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i+1);
         if(MATcycle<High[i+1] && MATcycle>Low[i+1])
           {
            Stop=1;
            Print("MATcycle=",MATcycle," i=",i);
           }
         else return (0);
        }

Por lo que tengo entendido, una vez identificado el cruce y puesto el stop=1, hay una salida inmediata del ciclo. Bien, entonces hay que ir más allá y recordar el número de la vela donde se produjo el cruce. Es decir

Es más fácil escribirlo uno mismo:

for( int i = 1; i < 1000; i++ )
{
 iMaValue = ...;   // Значение МА на i свече
 if( iMaValue < High[ i ] && iMaValue > low[ i ] )
 {
  num = i;   // Запоминаем номер свечи, на котором произошло пересечение
  break;     // Выходим из цикла
 }
}

Esto es que has identificado el número de la vela. Si el número = 2 y no se tiene en cuenta el actual, entonces desde el cruce se formó una vela (o interpretarlo como quieras).

 
Tapochun:

Por lo que tengo entendido, una vez identificado el cruce y puesto el stop=1, hay una salida inmediata del ciclo. Bien, entonces tienes que ir más allá y recordar el número de la vela donde se produjo el cruce. Es decir

Es más fácil escribirlo uno mismo:

Esto es que has identificado el número de la vela. Si el número = 2 y se ignora el actual, entonces se ha formado una vela desde el cruce (bueno, o interpretarlo como se quiera).

Gracias, así es como me ha funcionado


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

 
alph:
¿Puede decirme si se trata de una cifra de prueba realista? ¿Y es un buen o mal resultado para un año con una deposición de 3.000 dólares?
La respuesta es sencilla: la actuación del probador NO ES REAL si está probando un EA. El Probador de Estrategias es utilizado por los operadores para comprobar el rendimiento del ATC, o para probar las estrategias manuales en línea.
 
-Aleks-:

Gracias, así es como me ha funcionado


int Stop=0;
   if(Bars>1400)
     {
     
      double MATcycle;
      for(int i=1;(i!=1000 || Stop==0); i++)
        {
         MATcycle=iMA(Symbol(),TFT,pMAT,shiftMAT,typeMAT,priceMAT,i);
         if(MATcycle<=High[i] && MATcycle>=Low[i])
           {
            Print("MATcycle=",MATcycle," i=",i);
            Stop=i;
            break;
           }
        }
     }

No deberías escribirlo así, porque si no hubo cruce durante las últimas 1000 barras, primero, el bucle continuará, y segundo, puede dar un bucle/error, porque si la historia termina y no hay cruce, no habrá salida del bucle, porque Stop = 0. Es mejor escribirlo de la manera que mencioné anteriormente.

 
Tapochun:

No deberías escribirlo así, porque si no hubo cruce durante las últimas 1000 barras, en primer lugar, el ciclo continuará, y en segundo lugar, puede hacer un bucle/error, porque si la historia termina y no hay cruce, no habrá salida del ciclo, porque Stop = 0. Es mejor escribirlo de la manera que mencioné anteriormente.

El signo "o" no funciona: según la expresión, el bucle se sobrepasará en 1000 barras o terminará en cuanto se encuentre el resultado deseado. ¿O se acabará antes de las 1000 barras si el resultado requerido, es decir, el cruce de la MA?
 
-Aleks-:
El signo "o" no funciona - la condición dice que o bien llega a 1000 barras o bien termina en cuanto se encuentra el resultado deseado. ¿O se acabará antes de 1000 barras, si el resultado deseado, es decir, el cruce de la MA?
|| significa que si al menos una de las condiciones de los paréntesis es cierta, el ciclo se repetirá. Por lo tanto, incluso cuando i >= 1000, pero stop = 0, el ciclo continuará y i seguirá incrementándose, lo que provocará valores incorrectos de MA (en caso de que se salga del historial). Y el operador break se encarga de la terminación del bucle cuando se encuentra el resultado deseado;
 
Tapochun:
|| significa que si al menos una de las condiciones entre paréntesis es verdadera, el bucle se repetirá, por lo tanto, incluso cuando i >= 1000, pero stop = 0, el bucle continuará, i continuará incrementándose, lo que provocará el valor incorrecto de MA (en caso de que haya un valor atípico en el historial). Y el operador de ruptura es responsable de la terminación del bucle al encontrar el resultado deseado;
Entendido, ¡gracias por la aclaración! Pensé que una de las condiciones estaría mal y entonces el bucle se detendría...
 

Hola 2015.09.19_02:13AM MSC. En la función ArrayResize() de todos modos el compilador escribe

frente al tamaño del array -- se espera una coma, tanto si se escribe int como si no. Si no escribes int, dice: "-.

Lo he cambiado sin tipo. Y eliminé la referencia & y los corchetes - ¡funcionó!
Advertencias: cuando se escribió normalmente, -- el compilador escribió: oculta el identificador

declaración a nivel global. Y cuando eliminé la declaración del identificador a nivel global, - escribí

escribe: "Error, identificador no declarado. Y he cambiado los arrays High[] y Low[] por HighP[] y LowP[]. No

ayudado. El compilador escribe lo mismo. 02:27 MSC. Adjunto un archivo de capturas de pantalla.

Archivos adjuntos:
 
Николай Никитюк:

Hola 2015.09.19_02:13AM MSC. En la función ArrayResize() de todos modos el compilador escribe

frente al tamaño del array -- se espera una coma, tanto si se escribe int como si no. Si no escribes int, dice: "-.

"sin tipo". Y eliminé la referencia & y los corchetes - ¡ayudó!
Advertencias: cuando se escribió normalmente, -- el compilador escribió: oculta el identificador

declaración a nivel global. Y cuando eliminé la declaración del identificador a nivel global, - escribí

escribe: "Error, identificador no declarado. Y he cambiado los arrays High[] y Low[] por HighP[] y LowP[]. No

ayudado. El compilador escribe lo mismo. 02:27 MSC. Adjunto el archivo de capturas de pantalla.

  1. Las imágenes deben insertarse así:Foro: cómo insertar una imagen
  2. ¿No lees en absoluto lo que te aconsejan?

    Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

    Preguntas de los principiantes

    Karputov Vladimir, 2015.09.17 18:46

    1. Escritura incorrecta de ArrayResize. Debería ser así:
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. Y al establecer la bandera de series de tiempo para la matriz se verá así:
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);


Razón de la queja: