Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Anfängerfrage zur While-Schleife (http://www.expert-advisor.com/forum/showthread.php?t=5505)

Drehrumbumm 25.02.17 11:55

Anfängerfrage zur While-Schleife
 
Ich arbeite gerade das Buch
https://book.mql4.com
durch um zu lernen.
Nun ist mir in folgendem Übungscode etwas aufgefallen:
Code:

// ------------------------------------------------ ----------------------------------------
  // fibonacci.mq4
  // Der Code sollte nur für Ausbildungszwecke verwendet werden .
  // ------------------------------------------------ ----------------------------------------
  Int start ()                                                          // Sonderfunktion start ()
  {
  // ------------------------------------------------ ----------------------------------------
  Int i ;                                                              // Formaler Parameter, Zähler
  double
  A , B , C ,                                                          // Zahlen in der Sequenz
  Delta ,                                                              // Wirklicher Unterschied zwischen Koeffizienten
  D ;                                                                  // Voreingestellte Genauigkeit
  // ------------------------------------------------ ----------------------------------------
  A = 1 ;                                                              // Ursprünglicher Wert
  B = 1 ;                                                              // Anfangswert 
  C = 2 ;                                                              // Anfangswert
  D = 0,0000000001 ;                                                    // Genauigkeit einstellen
  Delta = 1000,0 ;                                                      // Anfangswert
  // ------------------------------------------------ ----------------------------------------
  while ( Delta > D )                                                  // while Scheleifen Operator Header
  {                                                                    // Eröffnungsklammer der while-Schleife
  I ++;                                                                // Zähler
  A = B ;                                                              // Nächster Wert
  B = C ;                                                              // Nächster Wert
  C = A + B ;                                                          // Nächster Wert
  Delta = MathAbs ( C / B - B / A ) ;                                  // Suchdifferenz zwischen Koeffizienten
  }                                                                    // Verschlussklammer des der while schleife
  // ------------------------------------------------ ----------------------------------------
  Alert ( " C = " , C , " Fibonacci-Zahl = " , C / B , " i = " , i ) ;  // Anzeige auf dem Bildschirm
  return ;                                                              // Exit start ()
  }
  // ------------------------------------------------ ----------------------------------------

Direkt beim Start der While-Anweisung wird mit einer Variable "I" als Zähler gearbeitet.
Muss die nicht deklariert werden oder gehen wir davon aus, dass sie schon deklariert ist und das nicht Bestandteil des Übungscodes ist?

Ca$hDigger 25.02.17 13:17

Das ist sicherlich einfach ein Groß/Kleinschreib-Fehler denn oben ist der Zähler int i zu finden. Nimm in der Schleife einfach i++; statt I++;.
Und zur besseren Lesbarkeit sollte man den Code einrücken.

C$D

traderdoc 25.02.17 14:15

@Ca$hDigger sagt es, zur besseren Lesbarkeit Code einrücken!

Benutzt hier im Editor in der Menüleiste das Zeichen # schreibt dort den Code dazwischen, rückt den Code mindestens nach jedem { ein. Es gibt zahlreiche schöne Beispiele. Wenn möglich auch Variablen in ähnlichen untereinanderstehenden Gleichungen auf gleiche Höhe schreiben, Vergleichszeichen auf gleiche Höhe und den Kommentartext weit rechts dann selbst linksbündig.

In Deinen Codebeispiel ist nicht nur das i falsch geschrieben, sondern auch die beiden Int, die eigentlich als int zu schreiben wären. Üblicherweise werden lokale Variablen wie hier innerhalb der Funktion start() klein geschrieben, globale Variablen dagegen mit einem beginnenden Großbuchstaben, zur besseren Unterscheidbarkeit.
Gelegentlich wird zur internen Kennzeichnung der Variablentyp in die Variable integriert, z.B.
int ivariable oder int i_variable bzw.
double dvariable oder d_variable

Das dient dem besseren Verständnis, da man sofort an dem ersten Buchstaben erkennt, um welchen Variablentyp es sich handelt.

Also, gewöhnt Euch von vornherein an, den Code gut strukturiert, nicht in ellenlangen Zeilen, eingerückt und mit verständlichen Variablennnamen zu schreiben. Das hilft v.a. auch denen, die sich hier auf die Fehlersuche begeben.

traderdoc

Drehrumbumm 25.02.17 15:31

Sorry für das fehlende Einrücken, dass kenne ich auch so.
War aber eben die Datei aus dem darüber erwähnten Buch. Jedoch hätte ich das korrigieren sollen - mein Fehler. Copy & Paste ist halt nicht immer das Beste :rolleyes:
Die Tips bezüglich der Groß- und Kleinschreibung sind echt wertvoll - Danke.
Obgleich der Autor des Buches diese Fehler oft wiederholt...
In der Deklaration groß geschrieben und unten dann Klein.
MQL4 ist doch Groß- und Kleinschreibungssensitiv - oder?
Ich meine das so gelesen zu haben.
Und hier noch mal der Code zum Zeichnen , dass ich verstanden haben ;-)
Code:

// -------------------------------------
  // fibonacci.mq4
  // Der Code sollte nur für Ausbildungszwecke verwendet werden .
  // ------------------------------------
  Int start ()                              // Sonderfunktion start ()
  {
  // ------------------------------------
  // Formaler Parameter, Zähler
      double
      A , B , C ,                              // Zahlen in der Sequenz
      Delta ,                                  // Wirklicher Unterschied zwischen Koeffizienten
      D ;                                      // Voreingestellte Genauigkeit
  // -------------------------------------
      A = 1 ;                                  // Ursprünglicher Wert
      B = 1 ;                                  // Anfangswert 
      C = 2 ;                                  // Anfangswert
      D = 0,0000000001 ;                        // Genauigkeit einstellen
      Delta = 1000,0 ;                          // Anfangswert
  // -------------------------------------
      while ( Delta > D )                      // while Scheleifen Operator Header
      {                                        // Eröffnungsklammer der while-Schleife
        I ++;                                    // Zähler
        A = B ;                                  // Nächster Wert
        B = C ;                                  // Nächster Wert
        C = A + B ;                              // Nächster Wert
        Delta = MathAbs ( C / B - B / A ) ;      // Suchdifferenz zwischen Koeffizienten
      }                                        // Verschlussklammer des der while schleife
  // -------------------------------------
      Alert ( " C = " , C , " Fibonacci-Zahl = " , C / B , " i = " , i ) ;  // Anzeige auf dem Bildschirm
      return ;                                                              // Exit start ()
  }


Ca$hDigger 25.02.17 16:09

Ne das passt noch nicht. Jetzt existiert die Variable int i gar nicht mehr und in der Schleife ist weiterhin das i groß was wiederum nicht zu dem kleinen i im Alert passt :D
Und int start ist auch immer noch groß geschrieben.

C$D

Drehrumbumm 25.02.17 16:31

Code:

//--------------------------------------------------------------------
// fibonacci.mq4

//--------------------------------------------------------------------
int start()                             
  {
//--------------------------------------------------------------------
      int i;                               
      double
      A,B,C,                               
      Delta,                               
      D;                                   
//--------------------------------------------------------------------
      A=1;                                 
      B=1;                                 
      C=2;                                 
      D=0.0000000001;                     
      Delta=1000.0;                         
//--------------------------------------------------------------------
      while(Delta > D)                     
      { 
        i++;                                 
        A=B;                               
        C=A + B;                           
        Delta=MathAbs(C/B - B/A);         
      }                                   
//--------------------------------------------------------------------
  Alert("C=",C," Meldungstext=",C/B," i=",i);
  return;                               
  }
//--------------------------------------------------------------------

Jetzt sollte es passen.

Gleich die nächste Frage:

Wo bekommt den "case" hier den entsprechenden Zustand zugewiesen?
Also wie wird "case" in dem Beispiel aus dem Buch eigentlich ausgelöst?
Code:

//--------------------------------------------------------------------
// pricealert.mq4
// Code für Lernzwecke
//--------------------------------------------------------------------
int start()                                                    // Startfunktion
  {
  double Level=1.3200;                                // Voreingestelltes Preislevel
  int Delta=NormalizeDouble((Bid-Level)/Point,0); // Überschuss
  if (Delta<=0)                                            // Wenn Preis unter dem Level
    {
      Alert("Preis liegt unter dem Level");        // Nachricht
      return;                                                  // Exit start()
    }
//--------------------------------------------------------------------
      switch(Delta)                                        // Header von Switch
        {                                                        // Start der Switch- Schleife
        case 1 : Alert("Plus 1 Punkt");  break;  // Varianten...
        case 2 : Alert("Plus 2 Punkt2"); break;
        case 3 : Alert("Plus 3 Punkt2"); break;
        case 4 : Alert("Plus 4 Punkt2"); break;  //Hier werden
        case 5 : Alert("Plus 5 Punkt2"); break;  //10 Fälle vorgestellt
        case 6 : Alert("Plus 6 Punkt2"); break;  //aber es sind
        case 7 : Alert("Plus 7 Punkt2"); break;  //unbegrenzte Möglichkeiten
        case 8 : Alert("Plus 8 Punkt2"); break;  //dieser Fälle möglich
        case 9 : Alert("Plus 9 Punkt2"); break;
        case 10: Alert("Plus 10 Punkt2");break; //("Mehr als 10 Punkte");
        default: Alert                           
     
        }                                                        // Ende der switch - Schleife
      return;                                                  // Exit start()
  }
//--------------------------------------------------------------------


Ca$hDigger 25.02.17 16:34

bei fibonacci.mq4 fehlt in der while-schleife jetzt das i++ ;)
edit: ok du hast es gerade geändert

traderdoc 25.02.17 16:37

Hm und welche Funktion übt nun die Variable i aus?

Case läuft über Delta in switch(Delta)

traderdoc

Drehrumbumm 25.02.17 20:44

Zitat:

Zitat von traderdoc (Beitrag 37914)
Hm und welche Funktion übt nun die Variable i aus?

Case läuft über Delta in switch(Delta)

traderdoc

Da sind eigentlich alles nur Codefragmente zur Verdeutlichung der entsprechenden Funktion.

Zum Thema Case:
Heißt also, das der Wert Delta in switch (Delta)
die case-Anweisungen durchrasselt, bis eine gefunden wird, die wahr ist - richtig?

traderdoc 25.02.17 21:27

Zitat:

Zitat von Drehrumbumm (Beitrag 37916)
Zum Thema Case:
Heißt also, das der Wert Delta in switch (Delta)
die case-Anweisungen durchrasselt, bis eine gefunden wird, die wahr ist - richtig?

Na ja eigentlich andersherum, aber es läuft auf dasselbe hinaus.
Die Variable Delta stellt mit ihrem Wert die Größe dar, nach der die case Abfrage sucht.
Ist case 1 true, dann wir die dahinterstehende Anweisung ausgeführt, wenn nicht, dann wird weiter gesucht usw.

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:44 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum