MQL4: Problem mit bool-Abfrage nach OrderSelect

 

Hallo zusammen,

ich hoffe mir kann jemand helfen und mir sagen, wo mein Fehler liegt.


Beschreibung:

Es handelt sich um einen Grid-EA.         Zur leicherten Darstellung gehe ich davon aus nur "long" Positionen zu eröffnen.

Der EA soll immer den OrderOpenPrice() der aktuellen/neuesten Market-Orderals Basis für weitere Berechnungen nutzen --> double PREISLEVEL()

Ich definiere mit einer input Variable die Maschenweite des Grids, zB 200  --> double Grid_Abstand


In den hier dargestellten Programmzeilen ermittle ich mithilfe des PREISLEVEL() +/- Grid_Abstand jeweils die Ober-/Untergrenze der Grid-Ebenen:

double GRID_UPPER_1_HIGH()    {double Grid_Upper_1_High = PREISLEVEL()+(1*Grid_Abstand*Point)+(Grid_Abstand/2)*Point;  return(Grid_Upper_1_High);};      double GRID_UPPER_1_LOW()     {double Grid_Upper_1_Low  = PREISLEVEL()+(1*Grid_Abstand*Point)-(Grid_Abstand/2)*Point;  return(Grid_Upper_1_Low);};


double GRID_CURRENT_HIGH()    {double Grid_Current_High = PREISLEVEL()+(Grid_Abstand/2)*Point;                         return(Grid_Current_High);};      double GRID_CURRENT_LOW()     {double Grid_Current_Low  = PREISLEVEL()-(Grid_Abstand/2)*Point;                         return(Grid_Current_Low);};


double GRID_LOWER_1_HIGH()    {double Grid_Lower_1_High = PREISLEVEL()-(1*Grid_Abstand*Point)+(Grid_Abstand/2)*Point;  return(Grid_Lower_1_High);}      double GRID_LOWER_1_LOW()     {double Grid_Lower_1_Low  = PREISLEVEL()-(1*Grid_Abstand*Point)-(Grid_Abstand/2)*Point;  return(Grid_Lower_1_Low);};



Im Anschluss daran, prüfe ich mit bool'schen Abfrage, ob in den zuvor berechneten Grid-Ebenen die jeweiligen Order-Artenvorliegen.

Hintergrund: Es soll immer im Grid-Bereich darüber eine BUYSTOP und im Grid-Bereich darunter eine BUYLIMIT Order liegen.

bool GRID_UPPER_1_BUYSTOP()   {bool Grid_Upper_1_Buystop    =false; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)   if(OrderType()==OP_BUYSTOP)    if(OrderOpenPrice()>GRID_UPPER_1_LOW() && OrderOpenPrice()<GRID_UPPER_1_HIGH())  Grid_Upper_1_Buystop    = true;  return(Grid_Upper_1_Buystop);};

bool GRID_CURRENT_BUY()       {bool Grid_Current_Buy        =false; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)   if(OrderType()==OP_BUY)        if(OrderOpenPrice()<GRID_CURRENT_HIGH() && OrderOpenPrice()>GRID_CURRENT_LOW())  Grid_Current_Buy        = true;  return(Grid_Current_Buy);};

bool GRID_LOWER_1_BUYLIMIT()  {bool Grid_Lower_1_Buylimit   =false; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)   if(OrderType()==OP_BUYLIMIT)   if(OrderOpenPrice()<GRID_LOWER_1_HIGH() && OrderOpenPrice()>GRID_LOWER_1_LOW())  Grid_Lower_1_Buylimit   = true;  return(Grid_Lower_1_Buylimit);};



Nun zu meinem Problem: In der bool'schen Prüfung hat der EA Probleme, den Code nach der OrderType()-Prüfung, nämlich der Prüfung ob der OrderType() in dem Grid-Bereich liegt, zu verarbeiten. Konkret stört sich der EA an folgendem Schnipsel:

if( OrderOpenPrice()<GRID_LOWER_1_HIGH() && OrderOpenPrice()>GRID_LOWER_1_LOW() )


Ich bin mir nicht sicher wo mein Fehler liegt.

Wenn ich die Variable in drei einzelne Variablen zerlege und nach einander bzw. aufeinander aufbauen nutze, in dem ich zuerst die TicketNummer prüfe, danach mit der gefundenen TicketNummer den OrderOpenPrice ermittle, danach mit dem OrderOpenPrice die bool'sche Abfrage mache.... dann funktioniert das. Aber so wie oben gezeigt in einem Rutsch nicht. :-(

Hoffe ich habe es verständlich erklärt und hoffe noch mehr, mir kann jemand die augen öffnen was ich falsche mache.


Danke vorab

Gruß

 
  1. Bitte gewöhne Dir einen anderen Programmierstil an, so lange Zeilen sind unlesbar, vor allem, wenn man sich nicht auskennt.
  2. Welche drei Variablen?
  3. Zeig doch bitte auch den Code der geht, es hilft sicher zum Verstehen.
 
Carl Schreiber:
  1. Bitte gewöhne Dir einen anderen Programmierstil an, so lange Zeilen sind unlesbar, vor allem, wenn man sich nicht auskennt.
  2. Welche drei Variablen?
  3. Zeig doch bitte auch den Code der geht, es hilft sicher zum Verstehen.

Sorry... ich versuche es zukünftig  besser anzuordnen...

Anbei der Code für die ture/false Prüfung auf eine vorliegende BUYLIMIT-Order,  im unteren Grid-Bereich, aber aufgeteilt auf 2 Variablen.

   double Grid_Lower_1_Buylimit_Price = 0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_BUYLIMIT)
            Grid_Lower_1_Buylimit_Price = OrderOpenPrice();
     };
   
   bool Grid_Lower_1_Buylimit_BOOL = false;
   if(Grid_Lower_1_Buylimit_Price<GRID_LOWER_1_HIGH() && Grid_Lower_1_Buylimit_Price>GRID_LOWER_1_LOW())
      Grid_Lower_1_Buylimit_BOOL = true;

 
Markus Wilhelm:

Sorry... ich versuche es zukünftig  besser anzuordnen...

Anbei der Code für die ture/false Prüfung auf eine vorliegende BUYLIMIT-Order,  im unteren Grid-Bereich, aber aufgeteilt auf 2 Variablen.

  1. Alles hängt jetzt von den Funktionen GRID_LOWER_1_HIGH() und GRID_LOWER_1_LOW(), die unbekannt sind, ab.
  2. Du verwendest OrderOpenPrice() - ist da auch eine (die richtige) Order ausgewählt worden?
  3. Kleiner Tipp: Man kann einer boolschen Variablen einen Vergleich zuweisen:
bool gt = 5 > 8, // =>  gt  ist falsch
     kl = v > myFunc(); // hängt jetzt vom Wert von v ab und dem Ergebnis des Funk.-Aufrufs
 
Carl Schreiber:
  1. Alles hängt jetzt von den Funktionen GRID_LOWER_1_HIGH() und GRID_LOWER_1_LOW(), die unbekannt sind, ab.
  2. Du verwendest OrderOpenPrice() - ist da auch eine (die richtige) Order ausgewählt worden?
  3. Kleiner Tipp: Man kann einer boolschen Variablen einen Vergleich zuweisen:

1. Ja, die Funktionen bzw. die Werte sind bekannt

2. Ja, die richtige Order ist ausgewählt

3. Verstehe ich leider nicht


Aber grundsätzlich, wenn Punkt 1 und Punkt 2 richtig ist... dann verstehe ich nicht warum die true/false Prüfung bei der einen Version klappt und bei der anderen nicht.

Denn die "aufgeteilte" Prüfung funktioniert, die "zusammenhängende" Prüfung nich --> und beide nutzen die identischen, vorher ermittelten Funktionen.

Nach unterschiedlichen Prüfungen konnte ich eben feststellen, dass der Fehler kommt sobald ich die Funktionen GRID_LOWER_1_HIGH() und GRID_LOWER_1_LOW()  mit in die Bedingung aufnehme.



Hier die zusammengefasste Prüfung

bool GRID_LOWER_1_BUYLIMIT()
   {bool Grid_Lower_1_Buylimit = false;
   
   for(int i=OrdersTotal()-1; i>=0; i--) 
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
            if(OrderType()==OP_BUYLIMIT)
               if(OrderOpenPrice()<GRID_LOWER_1_HIGH() && OrderOpenPrice()>GRID_LOWER_1_LOW())      // das hier stört ihn und bringt den Fehler bei der Ermittlung
                  Grid_Lower_1_Buylimit = true;
      }
                     return(Grid_Lower_1_Buylimit);};


Hier die aufgeteilte Prüfung

   double Grid_Lower_1_Buylimit_Price = 0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()==OP_BUYLIMIT)
            Grid_Lower_1_Buylimit_Price = OrderOpenPrice();
     };
   
   bool Grid_Lower_1_Buylimit_BOOL = false;
       if(Grid_Lower_1_Buylimit_Price<GRID_LOWER_1_HIGH() && Grid_Lower_1_Buylimit_Price>GRID_LOWER_1_LOW())
           Grid_Lower_1_Buylimit_BOOL = true;
 

Geh die Sequenz von Ifs mit dem Debugger durch.

Warum MT4? Wenn Du eh MQL lernst, warum die letzte Generation der Sprache lernen und nicht die neueste?

 
Carl Schreiber:

Geh die Sequenz von Ifs mit dem Debugger durch.

Warum MT4? Wenn Du eh MQL lernst, warum die letzte Generation der Sprache lernen und nicht die neueste?

Hab mit MT4 angefangen und mir das programmieren versucht anzueignen. Alles Neuland für mich und damals schien mit MQL4 "verständlicher"... 

Dann muss ich mir mal die Sache mit Debugger anschauen... dachte villeicht hab ich einen banalen Fehler den ich vor lauter Bäumen im Wald nicht sehe denn logisch betrachtet machen die beiden Funktionen das gleiche.
Einmal einstufig umd einmal zweistufig... leider mit unterschiedlichen Ergebnissen
 

Anbei nochmal in einer leserlicheren Schreibweise... hoffe mir kann jemand helfen.


Alles beginnt mit:

1. Schritt: durch eine input Variable wird der Grid_Abstand = zB.: 200 definiert
2. Schritt: Ermittlung vom Preislevel: PREISLEVEL() = OrderOpenPrice() der aktuellen MARKET-Order
3. Schritt: Grid-Bereiche bzw. die Ober-/Untergrenzen der Grid-Bereiche ermitteln

   double GRID_LOWER_1_HIGH()
     {
      double Grid_Lower_1_High = PREISLEVEL() - (1 * Grid_Abstand * Point) + (Grid_Abstand / 2) * Point;
      return(Grid_Lower_1_High);
     }

   double GRID_LOWER_1_LOW()
     {
      double Grid_Lower_1_Low = PREISLEVEL() - (1 * Grid_Abstand * Point) - (Grid_Abstand / 2) * Point;
      return(Grid_Lower_1_Low);
     }


Sobald das gemacht ist, soll die Pr üfung erfolgen, ob der jeweilige OrderType() in dem ermittelten Grid-Bereich (also zwischen Ober-/Untergrenze) vorliegt.
In meinem Beispiel der OrderType() = OP_BUYLIMIT, da ich den Grid-Bereich unterhalb der aktuellen Market-Order pr üfe.
Dazu anbei zwei unterschiedliche Vorgehensweisen.

// Beispiel der aufgeteilten Prüfung

   double Grid_Lower_1_Buylimit_Price = 0;
   for(int i = OrdersTotal()-1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
           {
            Grid_Lower_1_Buylimit_Price = OrderOpenPrice();
           }
        }
     };

   bool Grid_Lower_1_Buylimit_BOOL = false;
     {
      if(Grid_Lower_1_Buylimit_Price < GRID_LOWER_1_HIGH() && Grid_Lower_1_Buylimit_Price > GRID_LOWER_1_LOW())
        {
         Grid_Lower_1_Buylimit_BOOL = true;
        }



// Beispiel der zusammenhängenden Prüfung

   bool GRID_LOWER_1_BUYLIMIT()
     {
      bool Grid_Lower_1_Buylimit = false;

      for(int i = OrdersTotal()-1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
              {
               if(OrderType() == OP_BUYLIMIT)
                 {
                  if(OrderOpenPrice() < GRID_LOWER_1_HIGH() && OrderOpenPrice() > GRID_LOWER_1_LOW())
                    {
                     Grid_Lower_1_Buylimit = true;
                    }
                 }
              }
           }
        }

      return (Grid_Lower_1_Buylimit);
     }


Wie anfangs erwähnt, funktioniert die Abfrage bei der "aufgeteilten Pr üfung", aber nicht bei der "zusammenhängenden Pr üfung", obwohl ich glaube beides inhaltlich identisch ist

 

Streu doch diverse Prints ein, um selbst herauszufinden, was das Problem ist (ungetestet):

// Beispiel der zusammenhängenden Prüfung

   bool GRID_LOWER_1_BUYLIMIT()
     {
      bool Grid_Lower_1_Buylimit = false;

      for(int i = OrdersTotal()-1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
              {
               if(OrderType() == OP_BUYLIMIT)
                 {
                  Print(__LINE__," ",OrderOpenPrice()," < ",GRID_LOWER_1_HIGH()," && ",OrderOpenPrice()," > ",GRID_LOWER_1_LOW() );
                  if(OrderOpenPrice() < GRID_LOWER_1_HIGH() && OrderOpenPrice() > GRID_LOWER_1_LOW())
                    {
                     Print(__LINE__," ",OrderOpenPrice()," < ",GRID_LOWER_1_HIGH()," && ",OrderOpenPrice()," > ",GRID_LOWER_1_LOW() );
                     Grid_Lower_1_Buylimit = true;
                    }
                 }
              }
           }
        }

      return (Grid_Lower_1_Buylimit);
     }
 
Carl Schreiber:

Streu doch diverse Prints ein, um selbst herauszufinden, was das Problem ist (ungetestet):


ja also es ist tatsächlich so, dass er den OrderOpenPrice() nicht korrekt erkennt bzw. er kennt ihn, nutzt ihn aber nicht bis zum Schluss wenn ich es zusammenhängend mache.


Wenn ich es aufteile, d.h.

...
...
if(OrderType() == OP_BUYLIMIT)
  {
   OOP_LOWER_1_BUYLIMIT = OrderOpenPrice();
}


und anschließend

if(OOP_LOWER_1_BUYLIMIT > GRID_LOWER_1_LOW() && OOP_LOWER_1_BUYLIMIT < GRID_LOWER_1_HIGH())

mache, klappt es.

Ich verstehe einfach nicht, warum er diesen Zwischenschritt will und es nicht in einem Rutsch durch klappt... Da ist meine Verständnissfrage...

 
Markus Wilhelm:


ja also es ist tatsächlich so, dass er den OrderOpenPrice() nicht korrekt erkennt bzw. er kennt ihn, nutzt ihn aber nicht bis zum Schluss wenn ich es zusammenhängend mache.


Wenn ich es aufteile, d.h.


und anschließend

mache, klappt es.

Ich verstehe einfach nicht, warum er diesen Zwischenschritt will und es nicht in einem Rutsch durch klappt... Da ist meine Verständnissfrage...

Wenn der Preis gesichert wird, bleibt er so, auch wenn der Focus diesbezüglich sich geändert hat.