Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 869

 
Artyom Trishkin:
La section d'aide vous indique à quoi il sert. Et, oui, il est exact qu'un paramètre entré par l'utilisateur ne peut pas être modifié par programme. Au moins quelque chose peut appartenir à l'utilisateur :)

Si vous le voulez vraiment, vous pouvez)

 
Vitaly Muzichenko:

Si vous le voulez vraiment, vous pouvez)

Vous pouvez, bien sûr, si vous le réaffectez. Mais la valeur saisie par l'utilisateur restera inchangée.
 

Je rencontre souvent un problème. Le compilateur jure avec une erreur "variable déjà définie" sur le code :

if (n<10)
 {
  int a=10;
 }
else
 {
  int a=5;
 }

Le guide de référence sur https://docs.mql4.com/ru/basis/variables/local indique :

Lesvariables déclarées à l'intérieur d'un bloc (au niveau interne) ont la portée dubloc.

Si les blocs sont imbriqués et quel'identifiant du bloc externe porte le même nom que l'identifiant du bloc interne, l'identifiant du bloc externe est "invisible" (caché) jusqu'à ce que le bloc interne soit terminé.

Mais même l'exemple du même livre de référence ne compile pas avec la même erreur "variable déjà définie" :

int i=5;      // локальная переменная функции
     {
      int i=10;  // переменная функции 
      Print("В блоке i = ",i); // результат  i = 10;
     }
   Print("Вне блока i = ",i);  // результат  i = 5;

Même problème avec les cycles :

int i=10;
for (int i=1;i<10;i++) ...

Comment contourner ce problème et faire en sorte que l'exemple du répertoire compile sans l'erreur "variable déjà définie" ?

 
The_Sheikh:

Je rencontre souvent un problème. Le compilateur jure avec une erreur "variable déjà définie" sur le code :

Le guide de référence sur https://docs.mql4.com/ru/basis/variables/local indique :

Lesvariables déclarées à l'intérieur d'un bloc (au niveau interne) ont la portée dubloc.

Si les blocs sont imbriqués et quel'identifiant du bloc externe porte le même nom que l'identifiant du bloc interne, l'identifiant du bloc externe est "invisible" (caché) jusqu'à ce que le bloc interne soit terminé.

Mais même l'exemple du même livre de référence ne compile pas avec la même erreur "variable déjà définie" :

Même problème avec les cycles :

Comment contourner ce problème et faire en sorte que l'exemple du répertoire compile sans l'erreur "variable déjà définie" ?

#propriété stricte
 
The_Sheikh:

Comment puis-je contourner ce problème et faire en sorte que l'exemple du répertoire compile sans l'erreur "variable déjà définie" ?

tous les exemples du livre de référence ne fonctionnent pas correctement pendant longtemps

par la portée dans vos exemples - la visibilité au sein d'un seul opérateur est locale, cela devrait certainement fonctionner ainsi :

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double x=i;
     }

   for(int i=0;i<10;i++)
     {
      double x=i;
     }
  }

c'est-à-dire que la visibilité à l'intérieur d'une instruction for est locale, les variables i et x seront perdues lorsque vous quitterez l'instruction.

 

J'ai essayé de rechercher le dernier pic de l'indicateur Peak Repainter à traiter par EA :

   GV_trendD1 = StringConcatenate(GVn," дневной тренд");
   if (!GlobalVariableCheck(GV_trendD1))
      {
      double   fUP,fDN;

      for (int f=0; f<=400 && !IsStopped(); f++)
         {
         fUP = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
         if (fUP>=15) {GlobalVariableSet(GV_trendD1,1);break;}
         else {fDN = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",1,f); if (fDN>=15) {GlobalVariableSet(GV_trendD1,-1);break;}}
         }
      }

Le résultat est que 1 est écrit dans la variable globale, alors qu'il devrait en fait être -1.

Qu'est-ce qui ne va pas ? Avec le code ? Avec l'indicateur ?

L'indicateur est utilisé avec le réglage par défaut.

Dossiers :
 
Alexey G. Smolyakov:

J'ai essayé de rechercher le dernier pic de l'indicateur Peak Repainter à traiter par EA :

Le résultat est que 1 est écrit dans la variable globale, alors qu'il devrait en fait être -1.

Qu'est-ce qui ne va pas ? Avec le code ? Avec l'indicateur ?

L'indicateur est utilisé avec un réglage par défaut.

Pourquoi le nom de l'indicateur est-il comme ça ?

iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
 
Artyom Trishkin:

Pourquoi le nom de l'indicateur?

Je garde juste les indicateurs pour les différents EAs dans des répertoires différents. Et je les renomme légèrement pour qu'ils soient groupés.

Le nom affecte-t-il quelque chose ?

 
Alexey G. Smolyakov:

Je garde juste les indicateurs pour les différents EAs dans des répertoires différents. Et je les renomme légèrement pour qu'ils soient regroupés.

Le nom affecte-t-il quelque chose ?

C'est le cas, tous les accès aux fichiers dans MT4 se font à l'intérieur du dossier MQL4, la sortie des conseillers experts/scripts/indicateurs en dehors de ce dossier est exclue pour des raisons de sécurité.

 
Igor Makanu:

affecte, tout accès aux fichiers dans MT4 a lieu à l'intérieur du dossier MQL4, la sortie des EAs/scripts/indicateurs en dehors de ce dossier est exclue pour des raisons de sécurité

Chemin complet du dossier MQL4\Indicators\Used. Il semble qu'il n'y ait pas de sortie en dehors du dossier. Mais il s'agit d'une anomalie - d'autres conseillers experts travaillent sans problème avec leurs indicateurs dans des dossiers similaires. Mais quel est le problème de cet indicateur - je ne le comprends pas. J'ai examiné son code mais je n'avais pas assez de connaissances et d'expérience pour le comprendre. J'ai l'impression qu'il ne compte que la dernière mesure ou quelque chose comme ça.