Questions des débutants MQL5 MT5 MetaTrader 5 - page 441

 

Pouvez-vous me dire ce que je fais de mal ?

J'ai besoin de calculer le nombre de barres qui se sont écoulées depuis que le prix a traversé la MA pour la dernière fois - sans compter la barre zéro.

   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-:

Pouvez-vous me dire ce que je fais de mal ?

Vous devez - compter le nombre de barres qui se sont écoulées depuis que le prix a franchi la MA pour la dernière fois - sans compter la barre zéro.

   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);
        }

D'après ce que je comprends, une fois que vous avez identifié le croisement et fixé le stop=1, il y a une sortie immédiate du cycle. Ok, alors vous devez aller plus loin et vous souvenir du numéro de la bougie où le croisement a eu lieu. I.e.

C'est plus facile de l'écrire soi-même :

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

C'est vous qui avez identifié le numéro de la bougie. Si le nombre = 2 et que l'on ne tient pas compte de l'actuel, alors à partir du moment du croisement, une bougie a été formée (ou interprétez-le comme vous voulez).

 
Tapochun:

D'après ce que je comprends, une fois que vous avez identifié le croisement et fixé le stop=1, il y a une sortie immédiate du cycle. OK, alors vous devez aller plus loin et vous souvenir du numéro de la bougie où le croisement a eu lieu. I.e.

C'est plus facile de l'écrire soi-même :

C'est vous qui avez identifié le numéro de la bougie. Si le nombre = 2 et que l'on ne tient pas compte de l'actuel, alors une bougie s'est formée depuis le croisement (bon, ou interprétez-le comme vous voulez).

Merci, c'est comme ça que ça a marché pour moi.


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:
Pouvez-vous me dire s'il s'agit d'une figurine de test réaliste ? Et est-ce un bon ou un mauvais résultat pour une année avec une dépo de 3000 $ ?
La réponse est simple : les performances du testeur ne sont PAS RÉELLES si vous testez un EA. Strategy Tester est utilisé par les traders pour vérifier les performances de l'ATC, ou pour tester des stratégies manuelles en ligne.
 
-Aleks-:

Merci, c'est comme ça que ça s'est passé pour moi.


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;
           }
        }
     }

Vous ne devriez pas l'écrire de cette façon, car s'il n'y a pas eu de croisement au cours des 1000 dernières mesures, premièrement, la boucle continuera, et deuxièmement, il peut y avoir une boucle/erreur, car si l'histoire se termine et qu'il n'y a pas de croisement, il n'y aura pas de sortie de la boucle, car Stop = 0. Il est préférable de l'écrire de la façon dont je l'ai mentionné ci-dessus.

 
Tapochun:

Vous ne devriez pas l'écrire de cette façon, car s'il n'y a pas eu de croisement pendant les 1000 dernières mesures, premièrement, le cycle continuera, et deuxièmement, il peut tourner en boucle/erreur, car si l'histoire se termine et qu'aucun croisement ne se produit, il n'y aura pas de sortie du cycle, car Stop = 0. Il est préférable de l'écrire de la façon dont je l'ai mentionné ci-dessus.

Le signe "ou" ne fonctionne pas - selon l'expression, soit la boucle sera dépassée de 1000 barres, soit elle se terminera dès que le résultat requis aura été trouvé. Ou bien elle sera terminée avant 1000 barres si le résultat requis, c'est-à-dire le croisement de la MA, est atteint ?
 
-Aleks-:
Le signe "ou" ne fonctionne pas - la condition dit que soit elle atteint 1000 barres, soit elle se termine dès que le résultat souhaité est trouvé. Ou bien ce sera fini avant 1000 barres, si le résultat souhaité, c'est-à-dire le franchissement de la MA, est atteint ?
|| Par conséquent, même si i >= 1000, mais stop = 0, le cycle continuera et i continuera à s'incrémenter, ce qui entraînera des valeurs de MA incorrectes (au cas où il sortirait de l'historique). Et l'opérateur break est responsable de la fin de la boucle lorsque le résultat souhaité est trouvé ;
 
Tapochun:
|| Par conséquent, même si i >= 1000, mais stop = 0, la boucle continuera, i continuera à s'incrémenter, ce qui entraînera une valeur MA erronée (au cas où il y aurait une valeur aberrante dans l'historique). Et l'opérateur break est responsable de la fin de la boucle lorsqu'il trouve le résultat souhaité ;
Compris, merci pour la précision ! Je pensais que l'une des conditions serait fausse et que la boucle s'arrêterait...
 

Bonjour 2015.09.19_02:13AM MSC. Dans la fonction ArrayResize() de toute façon le compilateur écrit

en face de la taille du tableau -- virgule attendue, que vous écriviez int ou non. Si tu n'écris pas int, ça dit : "-.

Je l'ai changé sans type. Et j'ai supprimé la référence & et les crochets - ça a marché !
Avertissements : quand il a été écrit normalement, -- le compilateur a écrit : cache l'identifiant

déclaration de niveau global. Et lorsque j'ai supprimé la déclaration d'identifiant au niveau global, - a écrit

il écrit : "Error, undeclared identifier. Et j'ai changé les tableaux High[] et Low[] en HighP[] et LowP[]. Non

aidé. Le compilateur écrit la même chose. 02:27 MSC. Je joins un fichier de capture d'écran.

Dossiers :
 
Николай Никитюк:

Bonjour 2015.09.19_02:13AM MSC. Dans la fonction ArrayResize() de toute façon le compilateur écrit

en face de la taille du tableau -- virgule attendue, que vous écriviez int ou non. Si vous n'écrivez pas int, il dit : "-.

"sans type. Et j'ai enlevé la référence & et les crochets - ça a aidé !
Avertissements : quand il a été écrit normalement, -- le compilateur a écrit : cache l'identifiant

déclaration de niveau global. Mais lorsque j'ai supprimé la déclaration d'identifiant au niveau global, - a écrit

il écrit : "Error, undeclared identifier. Et j'ai changé les tableaux High[] et Low[] en HighP[] et LowP[]. Non

aidé. Le compilateur écrit la même chose. 02:27 MSC. Je joins le fichier de capture d'écran.

  1. Les images doivent être insérées comme suit :Forum : comment insérer une image
  2. Vous ne lisez pas du tout ce qu'on vous conseille ?

    Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

    Questions des débutants

    Karputov Vladimir, 2015.09.17 18:46

    1. Mauvaise orthographe de ArrayResize. Il devrait en être ainsi :
      //--- устанавливаю размеры массивов с запасом (reserve)
      ArrayResize(mrate,16,9);
      ArrayResize(maVal,16,9);
      ArrayResize(fVal,3,2);
      ArrayResize(zVal,3);
    2. Et la définition de l'indicateur timeseries pour le tableau ressemblera à ceci :
      //--- массив максимальных цен баров
      ArraySetAsSeries(High,true);
      //---  
      ArraySetAsSeries(Low,true);