Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4753
Beiträge: 42350
Benutzer: 7.117
Aktive Benutzer: 140
Links: 83
Wir begrüßen unseren neuesten Benutzer: Krulle
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 21:38).
Neue Benutzer:
vor 23 Stunden
- Krulle
vor einem Tag
- adamascahs...
vor einem Tag
- David12
vor 2 Tagen
- adizycpitt...
vor 3 Tagen
- bgregoratt...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 66
Gesamt: 66
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 26.07.21
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 56
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard 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-Order als 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:

Code:
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-Arten vorliegen.

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

Code:
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:

Code:
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 aufbauenf 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ß
Mit Zitat antworten
  #2 (permalink)  
Alt 26.07.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.566
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Nun ja, es gibt Code, da existieren Fehler, die sieht man sofort und es gibt denselben Code, nur "anders" geschrieben, da exisierenn dieselben Fehler, die man aber nicht sofort sieht.

Zu Letzterem gehört Dein Code.
Ich habe schon wirklich viel Code gesehen, aber solche Bandwürmer bisher nicht.
Der ist leider an Unübersichtlichkeit, kaum noch zu übertreffen.
Nimm das jetzt bitte nicht persönlich, sondern versuche, die Abfragen und Schleifen eingerückt in separate Zeilen zu schreiben.
Das macht Dir das Lesen zukünftig einfacher und uns, die die Fehler finden sollen, auch.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #3 (permalink)  
Alt 26.07.21
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 56
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

ich versuche mich zu bessern.
Ist folgende Darstellung leserlicher?

Code:
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);};
Mit Zitat antworten
  #4 (permalink)  
Alt 26.07.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.566
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Geht so. Ich würde das so scheiben, dann sieht man genaus was wohin gehört.

Code:
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);
}
Ob man nun z.B. bei
for (int i = OrdersTotal()-1; i >= 0; i--) {
die { hinter die Zeile schreibt oder so
for (int i = OrdersTotal()-1; i >= 0; i--)
{
ist dann eher Geschmackssache.

Auch die Freizeichen nach den Operatoren und hinter if und for erleichtern die Leseweise enorm. Auch mal eine Freizeile einfügen, um wie hier, die Schleife hervorzuheben.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #5 (permalink)  
Alt 26.07.21
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 56
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

Ok verstanden.
Aber um auf die eigentliche Frage zu meinem Problem zurück zu kommen :-D

Eine Idee wo der Fehler liegen könnte?
Mit Zitat antworten
  #6 (permalink)  
Alt 26.07.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.566
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Den Code würde ich mir erst anschauen, wenn er in
lesbarer Form vorliegt.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #7 (permalink)  
Alt 27.07.21
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 56
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

Hi,
ich habe versucht den Code in vernünftiger Form mal dar zu stellen.
Für weitere Hinweise zur Darstellung/Schreibweise bin ich dankbar.
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

Code:
   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.

Code:
// 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;
        }
     }


Code:
// 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".
Mit Zitat antworten
  #8 (permalink)  
Alt 28.07.21
Mitglied
 
Registriert seit: Jun 2011
Ort: Minsk, Weißrussland
Beiträge: 81
Bobs befindet sich auf einem aufstrebenden Ast
Standard

Ich sehe nicht den Code aller Funktionen, aber ich kann davon ausgehen, dass das Problem kann durch die Verwendung einer Funktion innerhalb einer anderen entstehen. Beide Funktionen verwenden OrderSelect(i,SELECT_BY_POS), wodurch sich die ausgewählte Order ändert.
Versuchen OrderSelect(i,SELECT_BY_POS) zweites mal danach anwenden.
Mit Zitat antworten
  #9 (permalink)  
Alt 28.07.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.566
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Im zweiten Code fehlt schon mal die Selektion nach OP_BUYLIMIT. Damit wird die tatsächlich letzte Order benutzt, um die Variable Grid_Lower_1_Buylimit_Price zu füllen, egal, von welchem Ordertyp die letzte Order ist.

Wir brauchen noch den Code der Funktion PREISLEVEL().

Dass Funtionen in Abfragen verwendet werden, stellt überhaupt kein Problem dar. D.h.
if(OrderOpenPrice() < GRID_LOWER_1_HIGH() && OrderOpenPrice() > GRID_LOWER_1_LOW())
sollte auch funktionieren.
Das hier verwendete OrderOpenPrice() muss ja auch nicht identisch sein zum OrderOpenPrice() in der Funktion PREISLEVEL().
Existieren z.B. mehrere BuyLimit-Orders, dann wird bei derjenigen BuyLimitOrder ein true folgen, für die die Abfrage als erste mit true endet. Alle evtl. weiteren BuyLimitOrders blieben dann unberücksichtigt, weil Grid_Lower_1_Buylimit dann true bleibt.

Was ermittelt denn der EA im dritten Codebeispiel?

Das prinzipiell nächste Problem besteht eben darin, dass nicht gesamte relevante Code gesendet wird (z.B. Funktion PREISLEVEL()). Da könnten schon einige Informationen auf der Strecke bleiben.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #10 (permalink)  
Alt 29.07.21
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 56
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

Anbei der Code

Code:
input int Grid_Abstand = 200;
input int MagicNumber  = 1234;


// GRID_START_TICKET() ist die zu letzt eröffnete Pending-Order bzw. neueste Market-Order
   double PREISLEVEL()
     {
      double PreisLevel = 0;

      if(OrderSelect( GRID_START_TICKET() , SELECT_BY_TICKET , MODE_TRADES ) == false )
        {
         PreisLevel = NormalizeDouble( ( Ask + Bid ) / 2 , Digits );
        };
      if(OrderSelect( GRID_START_TICKET() , SELECT_BY_TICKET , MODE_TRADES ) == true )
        {
         PreisLevel = NormalizeDouble( OrderOpenPrice() , Digits );
        };
      return(PreisLevel);
     };


// GRID-Bereiche (Ober-/Untergrenze) ermitteln
   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 );
     };


      // 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);
        };
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2021 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------