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

 
Artyom Trishkin:
Das ist nicht sehr gut. Haben Sie beim Kompilieren möglicherweise Warnungen erhalten? In solchen Fällen müssen Sie die Ursachen der Warnungen beseitigen, nicht #property strict
Als #property strict geschrieben wurde, gab der Compiler in jeder for()-Schleife die Fehlermeldung aus, dass die Variablen einen Typ haben müssen, also musste ich int i und int p in jede Schleife schreiben. Danach hat der Compiler keine Fehler mehr erzeugt, aber die Zeile wurde nicht gebaut. Als ich #property strict entfernte, brauchte der Compiler den Typ nicht mehr in jedem Zyklus zu deklarieren, und die Zeile wurde erstellt.
 

Ich habe mein Guthaben aufgeladen und kann nun das Terminal mit dem echten Konto nicht finden.

 
Timur1988:
Wenn #property strict ausgeschrieben wurde, erzeugte der Compiler in jeder for()-Schleife Fehler, dass Variablen einen Typ haben müssen, so dass ich int i und int p in jeder Schleife ausschreiben musste. Danach hat der Compiler keine Fehler mehr erzeugt, aber die Zeile wurde nicht gebaut. Als ich #property strict entfernte, brauchte der Compiler den Typ nicht in jeder Schleife zu deklarieren, und die Zeile wurde erstellt.

Ein typischer Fall für die Ausnutzung impliziter Fehler in der Logik. Sobald der Compiler "strenger" geworden ist, verschwindet der Selbstbetrug langsam.

Ich habe mich gefragt, warum es so viele identische Schleifen gibt?

Und warum stören Sie sich in keiner Weise an der Fehlermeldung "out of array", wenn Sie den Indikator auf dem Chart ausführen?

Zum Beispiel hier:

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }        
      }
 
7u6y5t4r3e2w1q:

Ich habe mein Guthaben aufgeladen und kann nun das Terminal mit dem echten Konto nicht mehr finden.

Der Terminal ist derselbe, Sie müssen sich nur erneut mit einem echten Konto anmelden. So geht's: Datei - Mit Handelskonto verbinden - Kontonummer, Passwort und Server in dem erscheinenden Fenster angeben. Alle diese Daten wurden von der DC zur Verfügung gestellt, falls man sie fragen sollte.
 
Timur1988:
Als #property strict ausgeschrieben wurde, gab der Compiler in jeder for()-Schleife Fehler aus, dass Variablen einen Typ haben müssen, und so musste ich int i und int p in jeder Schleife ausschreiben. Danach hat der Compiler keine Fehler mehr erzeugt, aber die Zeile wurde nicht gebaut. Als ich #property strict entfernte, brauchte der Compiler den Typ nicht mehr in jedem Zyklus zu deklarieren, und die Zeile wurde gebaut.

die Antwort ist sehr einfach - Sie haben einen trivialen Array-Überlauf - und Ihr Indikator funktioniert aufgrund dieses Fehlers nicht mehr

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
        
         }        
      }
  
   for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+1][m-1]/(n-1);  
         My[i][p]=sum_y[p+1][m-1]/(n-1);

Sie können diesen Fehler zur Laufzeit sehen - starten Sie den Indikator und sehen Sie sich die Protokolldatei auf der Registerkarte Terminal - Experten an:

 
Vitalie Postolache:

Dies ist ein typischer Fall der Ausnutzung impliziter logischer Fehler. ...

Das Überschreiben eines Arrays ist ein grober Fehler in der Logik - und man kann einen solchen Fehler nicht "implizit" nennen.
 
Vitalie Postolache:

Ein typischer Fall für die Ausnutzung impliziter Fehler in der Logik. Sobald der Compiler "strenger" geworden ist, verschwindet der Selbstbetrug langsam.

Ich habe mich immer wieder gefragt, warum es so viele identische Schleifen gibt.

Und warum stören Sie sich in keiner Weise an der Fehlermeldung "out of array", wenn Sie den Indikator auf dem Chart ausführen?

Zum Beispiel hier:

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }        
      }


Wie berechnet man die Summe der Schlusskurse in jeder Dimension?
Was die gleichen Zyklen betrifft, so ist mir aufgrund meiner begrenzten Kenntnisse der Programmierung und der Algorithmen nichts Besseres eingefallen, um das Element des Arrays aus der gewünschten Dimension auszuwählen, das für die Substitution in der Formel erforderlich war.
 
Andrey F. Zelinsky:

die Antwort ist sehr einfach - Sie haben einen trivialen Array-Überlauf - und Ihr Indikator funktioniert aufgrund dieses Fehlers nicht mehr

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
        
         }        
      }
  
   for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+1][m-1]/(n-1);  
         My[i][p]=sum_y[p+1][m-1]/(n-1);

Sie können diesen Fehler in der Ausführungsphase sehen - starten Sie den Indikator und sehen Sie sich die Protokolldatei auf der Registerkarte Terminal - Experten an:

Können Sie mir bitte sagen, wie ich diesen Fehler beheben kann?
 
Timur1988:
Wie berechnen Sie dann die Summe der Schlusskurse in jeder Dimension?
Was die gleichen Zyklen betrifft, so fiel mir aufgrund meiner begrenzten Kenntnisse der Programmierung und der Algorithmen nichts Besseres ein, um das Element des Arrays aus der gewünschten Dimension auszuwählen, das für die Ersetzung in der Formel benötigt wurde.

Zum Beispiel so:

     for(int i=1; i<n; i++)

      {    
      for(int p=1; p<m; p++)
         {   
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }         
      }
 
Timur1988:
Können Sie mir bitte sagen, wie ich diesen Fehler beheben kann?

Um diesen Fehler zu korrigieren, müssen Sie Ihre Formel verstehen - was, warum und wie Sie zählen.

Und nur dann können Sie Ihren Algorithmus ausarbeiten und den Fehler beseitigen.

Mit der "Bauchgefühl"-Methode und ohne die Formel zu verstehen, können Sie zwar Fehler ausschließen, aber Sie werden eine falsche Berechnung vornehmen.

p.s. Erklären Sie im Detail, was Sie berechnen - kommentieren Sie Ihren Code ausführlich - und dann werden wir verstehen, wie man den Fehler beheben kann.

Grund der Beschwerde: