Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 116

 
novichok2018:

Ich danke Ihnen. Die Pause scheint geholfen zu haben. Mal sehen, was als nächstes passiert.

Nein, es hat nicht wirklich geholfen. Es funktioniert nur, wenn eine Art von Position eröffnet wird. Wenn z.B. eine Verkaufsposition eröffnet und noch nicht geschlossen ist und gleichzeitig eine Kaufposition eröffnet und geschlossen wird, kann die Verkaufsposition die Bedingungen für ihre eigene Schließung nicht sehen, bis eine andere Verkaufsposition eröffnet und geschlossen wird (gemäß ihren eigenen Bedingungen). Und wenn BAY erneut öffnet und schließt, verfehlt es erneut seine Schließungsbedingungen. Ich habe versucht, das Vorhandenseinoffener Positionen nach dem Schließen von BAY mit der Funktion ExistPositions() von I.Kim zu ermitteln, aber ich verstehe nicht, wo ich sie einfügen und wo ich Print platzieren soll, um die Ausführung zu kontrollieren. Irgendein Hinweis.

 
novichok2018:

Nein, es hat nicht wirklich geholfen. Sie funktioniert nur, wenn die gleiche Art von Position eröffnet wird. Wenn zum Beispiel zuerst eine Verkaufsposition eröffnet und noch nicht geschlossen wird und gleichzeitig eine Kaufposition eröffnet und geschlossen wird, dann sieht die Verkaufsposition ihre Schließungsbedingungen nicht, bis eine andere Verkaufsposition eröffnet und geschlossen wird (gemäß ihren Bedingungen). Und wenn BAY erneut öffnet und schließt, verfehlt es erneut seine Schließungsbedingungen. Ich habe versucht, das Vorhandenseinoffener Positionen nach dem Schließen von BAY mit der Funktion ExistPositions() von I.Kim zu ermitteln, aber ich verstehe nicht, wo ich sie einfügen und wo ich Print platzieren soll, um die Ausführung zu kontrollieren. Können Sie mir einen Tipp geben?

Kennt denn niemand die Lösung? Ich weiß es nicht.

 
novichok2018: Kennt denn niemand die Lösung? Ich weiß es nicht.

Ich habe mich im Forum angemeldet - wie ich sehe, führen Sie Selbstgespräche... Wo ist der Anfang Ihres Gesprächs und worum geht es - schwer zu verstehen. Um ein Programm zu debuggen, ist es viel bequemer , Alert statt Print zu verwenden - es wird sofort auf dem Bildschirm angezeigt. Diese Alerts werden platziert, bevor die if-Bedingung geprüft wird. Eine andere Methode der Fehlersuche mit einem Bleistift - gehen Sie das Programm so durch, wie es ausgeführt werden soll, und notieren Sie die Werte der Variablen. Wenn er sich ändert - streichen Sie den alten Wert durch und schreiben Sie den neuen. So wurde es früher gemacht. MetaEditor verfügt jetzt über einen Debugger, mit dem Sie die Werte von Variablen überwachen können. Die einfachsten Konstruktionen sollten separat geprüft werden, indem ein Skript geschrieben wird

 
novichok2018:

Kennt denn niemand die Lösung? Ich weiß es nicht.

Versuchen Sie es auf diese Weise:

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
Woher bezieht iCustom seine Daten?
 
Igor Makanu:

Versuchen Sie es auf diese Weise:

Danke, ich habe es ausprobiert - es werden keine Positionen geschlossen, auch nicht nach einigen Anpassungen, so dass der Compiler nicht flucht.

 
STARIJ:

Ich habe mich ins Forum eingeloggt - ich sehe, dass du Selbstgespräche führst... Es ist schwer zu verstehen, wo Sie angefangen haben und wovon Sie sprechen. Zum Debuggen von Programmen ist es bequemer , Alert anstelle von Print zu verwenden - es wird sofort auf dem Bildschirm angezeigt. Diese Alerts werden platziert, bevor die if-Bedingung geprüft wird. Eine andere Methode der Fehlersuche mit einem Bleistift - gehen Sie das Programm so durch, wie es ausgeführt werden soll, und notieren Sie die Werte der Variablen. Wenn er sich ändert - streichen Sie den alten Wert durch und schreiben Sie den neuen. So wurde es früher gemacht. MetaEditor verfügt jetzt über einen Debugger, mit dem Sie die Werte von Variablen überwachen können. Die einfachsten Konstrukte müssen separat geprüft werden, indem ein Skript geschrieben wird

Danke für die Empfehlungen, aber für meine Situation sind sie nicht ganz richtig. Zur Verdeutlichung folgt der Code einer benutzerdefinierten Schließfunktion

 

Es funktioniert nicht richtig - dasSchließen von Positionenerfolgt unter den Bedingungen der ersten offenen Position. Das heißt, wenn zuerst eine Kauf- oder Verkaufsposition mit Bedingung 1 und dann eine zweite Position mit Bedingung 2 eröffnet wurde, wird die Schließungsbedingung ignoriert und die zweite Position trotz einer anderen magischen Zahl ebenfalls mit Bedingung 1 geschlossen.

Ich habe eine Unterbrechung angewandt, nachdem der Auftrag geschlossen wurde, aber die Lösung war nur halbherzig:nur wenn eine Position desselben Typs geöffnet wird. Wenn z.B. eine BOY-Position zuerst geöffnet und noch nicht geschlossen wurde, während eine BAY-Position geöffnet und geschlossen wird, sieht die BAY-Position keine Bedingungen, um geschlossen zu werden, solange eine andere BAY-Position geöffnet und geschlossen wird (gemäß ihren Bedingungen). Und wenn BAY erneut öffnet und schließt, verfehlt es erneut seine Schließungsbedingungen. Was ist also zu tun?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
Woher bezieht iCustom seine Daten?

aus den Puffern des benutzerdefinierten Indikators, Praxis, zum Beispiel auf der MA

novichok2018:

Ich habe die Unterbrechung nach dem Schließen eines Auftrags angewandt, aber die Lösung ist halbherzig:nur wenn eine Position desselben Typs eröffnet wird. Wenn z.B. eine BOY-Position geöffnet und noch nicht geschlossen wurde, während eine BAY-Position geöffnet und geschlossen wird, sieht die BAY-Position keine Bedingungen, um geschlossen zu werden, bis eine andere BAY-Position geöffnet und geschlossen wird (zu ihren eigenen Bedingungen). Und wenn BAY erneut öffnet und schließt, verfehlt es erneut seine Schließungsbedingungen. Was ist also zu tun?

Ersetzen Sie break durch continue

es ist seltsam, dass mein Code-Beispiel nichts schließt, vielleicht geht es um die Preisnormalisierung

 
Igor Makanu:


Ersetzen Sie break durch continue


Ersetzt. Verfluchter Fehler 138(requotes). Dann habe ich eine Pause eingelegt, und es sind wieder 138. Seltsam, vielleicht ist es mir vorher nicht aufgefallen.

 
Igor Makanu:

aus den Puffern des benutzerdefinierten Indikators, üben Sie mit dem MA, zum Beispiel


Handelt es sich dabei um das Feld, das im Datenfenster des Terminals erscheint?
Grund der Beschwerde: