Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 869

 
Artyom Trishkin:
Im Hilfebereich erfahren Sie, wofür es gedacht ist. Und ja, es ist richtig, dass ein vom Benutzer eingegebener Parameter nicht programmatisch geändert werden kann. Wenigstens kann dem Benutzer etwas gehören :)

Wenn Sie wirklich wollen, können Sie das)

 
Vitaly Muzichenko:

Wenn Sie wirklich wollen, können Sie das)

Das können Sie natürlich, wenn Sie sie neu zuweisen. Der vom Benutzer eingegebene Wert bleibt jedoch unverändert.
 

Ich stoße oft auf ein Problem. Der Compiler flucht mit einem "Variable already defined"-Fehler über den Code:

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

Im Referenzhandbuch unter https://docs.mql4.com/ru/basis/variables/local heißt es:

Variablen, die innerhalb eines Blocks (auf interner Ebene) deklariert werden, haben den Geltungsbereich desBlocks.

Wenn Blöcke verschachtelt sind undder Bezeichner im externen Block denselben Namen hat wie der Bezeichner im internen Block, ist der Bezeichner des externen Blocks "unsichtbar" (versteckt), bis der interne Block abgeschlossen ist.

Aber auch das Beispiel aus demselben Referenzbuch lässt sich nicht kompilieren, da es denselben Fehler "Variable bereits definiert" aufweist:

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

Dasselbe Problem mit Zyklen:

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

Wie können wir dieses Problem umgehen und das Verzeichnisbeispiel ohne den Fehler "Variable bereits definiert" kompilieren?

 
The_Sheikh:

Ich stoße oft auf ein Problem. Der Compiler flucht mit einem "Variable already defined"-Fehler über den Code:

Im Referenzhandbuch unter https://docs.mql4.com/ru/basis/variables/local heißt es:

Variablen, die innerhalb eines Blocks (auf interner Ebene) deklariert werden, haben den Geltungsbereich desBlocks.

Wenn Blöcke verschachtelt sind undder Bezeichner im externen Block denselben Namen hat wie der Bezeichner im internen Block, ist der Bezeichner des externen Blocks "unsichtbar" (versteckt), bis der interne Block abgeschlossen ist.

Aber auch das Beispiel aus demselben Referenzbuch lässt sich nicht kompilieren, da es denselben Fehler "Variable bereits definiert" aufweist:

Dasselbe Problem mit Zyklen:

Wie können wir dieses Problem umgehen und das Verzeichnisbeispiel ohne den Fehler "Variable bereits definiert" kompilieren?

#Eigenschaft streng
 
The_Sheikh:

Wie kann ich dieses Problem umgehen und das Verzeichnisbeispiel kompilieren, ohne dass der Fehler "Variable bereits definiert" auftritt?

nicht alle Beispiele im Nachschlagewerk funktionieren über einen längeren Zeitraum korrekt

durch den Geltungsbereich in Ihren Beispielen - die Sichtbarkeit innerhalb eines einzelnen Operators ist lokal, es sollte definitiv so funktionieren:

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

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

d.h. die Sichtbarkeit innerhalb einer for-Anweisung ist lokal, die Variablen i und x gehen beim Verlassen der Anweisung verloren

 

Versucht, den letzten Peak des Peak Repainter-Indikators zu suchen, der von EA verarbeitet werden soll:

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

Das Ergebnis ist, dass 1 in die globale Variable geschrieben wird, obwohl sie eigentlich -1 sein sollte.

Was ist los? Mit dem Code? Mit dem Indikator?

Das Kennzeichen wird in der Standardeinstellung verwendet.

Dateien:
 
Alexey G. Smolyakov:

Versucht, den letzten Peak des Peak Repainter-Indikators zu suchen, der von EA verarbeitet werden soll:

Das Ergebnis ist, dass 1 in die globale Variable geschrieben wird, obwohl sie eigentlich -1 sein sollte.

Was ist los? Mit dem Code? Mit dem Indikator?

Der Indikator wird mit einer Standardeinstellung verwendet.

Warum lautet der Name des Indikators so?

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

Warum der Name des Indikators?

Ich bewahre nur Indikatoren für verschiedene EAs in verschiedenen Verzeichnissen auf. Und ich benenne sie leicht um, damit sie gruppiert werden.

Hat der Name eine Auswirkung?

 
Alexey G. Smolyakov:

Ich bewahre nur die Indikatoren für verschiedene EAs in verschiedenen Verzeichnissen auf. Und ich benenne sie ein wenig um, damit sie in Gruppen zusammengefasst werden.

Hat der Name eine Auswirkung?

Der Zugriff auf die Dateien in МТ4 erfolgt innerhalb des MQL4-Ordners, der Ausgang von Expert Advisors/Scripts/Indicators außerhalb dieses Ordners ist aus Sicherheitsgründen ausgeschlossen.

 
Igor Makanu:

betrifft, findet jeder Zugriff auf Dateien in MT4 innerhalb des MQL4-Ordners statt, der Ausgang von EAs/Skripten/Indikatoren außerhalb dieses Ordners ist aus Sicherheitsgründen ausgeschlossen

Vollständiger Pfad des MQL4-Ordners\Indicators\Used. Es scheint, dass es keinen Ausgang außerhalb des Ordners gibt. Dies ist jedoch eine Anomalie - andere Expert Advisors arbeiten mit ihren Indikatoren in ähnlichen Ordnern ohne Probleme. Aber was ist das Problem mit diesem Indikator - ich verstehe es nicht. Ich habe mir den Code angesehen, aber ich habe nicht genug Wissen und Erfahrung, um ihn zu verstehen. Ich habe den Verdacht, dass nur der letzte Takt oder etwas Ähnliches gezählt wird.