einfache Frage

 

Ich grüße Sie alle. Ich habe einen Code erstellt (in Abänderung anderer Codes), um Marktaufträge zu schließen.



int l_pos_44 = 0;

if (CheckFirstOP(OP_BUY) > 1) {

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;

double Price = OrderOpenPrice();

if (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) {

Dist = MathAbs(Bid - Price);

int Ticket = OrderTicket();

double Lot = OrderLots();

OrderClose(Ticket, Lot, Bid, 3);

}

}


(derselbe Code für das Schließen von Verkaufspositionen (natürlich mit der Variablen OP_SELL anstelle von OP_BUY))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {

if (OrderSelect(l_pos_8, SELECT_BY_POS)) {

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {

if (OrderType() == a_cmd_0) {

l_count_4++;

brechen;

}

}

}

}

return (l_count_4);

}


Ich benötige einen Code zum Schließen von Long- oder Short-Positionen, wenn mehr als eine Position für einen Typ geöffnet ist... also insgesamt 2 Positionen (1 Kauf- und 1 Verkaufsposition)... Ich muss auch die zuletzt geöffnete Position behalten, d.h. in diesem Fall die mit dem höheren offenen Preis für die Kaufposition und die mit dem niedrigeren offenen Preis für die Verkaufsposition. Das Problem ist, dass der Code die Positionen nicht schließt...er schließt keine von ihnen.


wenn: "if (CheckFirstOP(OP_BUY) == 1)", dann schließt der Code die ersten Positionen sofort nachdem sie eröffnet wurden...d.h. nachdem eine Kauf- und eine Verkaufsorder eröffnet wurden, werden sie mit dem nächsten Tick geschlossen. Und wenn: "if (CheckFirstOP(OP_BUY) > 1)" wird keine der Positionen geschlossen. Ich weiß nicht, was ich falsch mache.

Kann mir bitte jemand helfen?

 

I forgot:


double Dist = 1000000.0;

 
Aljohin:

Kann mir bitte jemand helfen?

1. Dies ist nur ein Teil deines Codes, zeige uns zum Beispiel die Funktion CheckFirstOP().

2. Die for-Schleife ist inkrementell. Das funktioniert nicht richtig, wenn in der Schleife Aufträge geschlossen werden, siehe -> https://www.mql5.com/en/forum/119840.

3. Die Namenskonvention für Ihre Variablen ist... nicht so gut.

4. Bitte benutzen Sie die SRC-Schaltfläche, um Ihren Code zu posten, damit er die Formatierung beibehält. Es ist sehr schwer, Ihren Code so zu lesen.

 
gordon:

1. Dies ist nur ein Teil Ihres Codes, zeigen Sie uns zum Beispiel die Funktion CheckFirstOP().

2. Die for-Schleife ist inkrementell. Das funktioniert nicht richtig, wenn in der Schleife Aufträge geschlossen werden, siehe -> https://www.mql5.com/en/forum/119840.

3. Die Namenskonvention für Ihre Variablen ist... nicht so gut.

4. Bitte benutzen Sie die SRC-Schaltfläche, um Ihren Code zu posten, damit er die Formatierung beibehält. Es ist sehr schwer, Ihren Code so zu lesen.


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3. Ihre Namenskonvention für Variablen ist ... nicht so gut.

sieht aus wie eine Decompiler-Namenskonvention ...

"Er ist neu in diesem Zeug"

 
meikel:

sieht aus wie eine Decompiler-Namenskonvention ...

"er ist neu in dieser Sache"

wahrscheinlich ja...ich möchte einen EA modifizieren, den ich gekauft habe...sie haben mir auch den Code geschickt (sie sagten, aus Versehen)...jetzt verstehe ich den Grund für diese so seltsame Nomenklatur...wie gesagt, ich bin neu (habe gerade das Buch von MQL4 auf dieser Seite gelesen) und wollte zumindest am Anfang nicht viel ändern, also habe ich die Namen so gelassen, wie ich sie fand.

 
Ais:

Hallo

Ausgewählter Auftrag kann durch folgenden Ausdruck vollständig geschlossen werden: "OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;"

Mit freundlichen Grüßen

löst mein Problem nicht...

 
gordon:

2. Die for-Schleife ist inkrementell. Das wird nicht richtig funktionieren, wenn man Aufträge in der Schleife schließt, siehe -> https://www.mql5.com/en/forum/119840.

Warum funktioniert das Inkrementieren nicht? Im Buch von MQL4 wird es nicht erwähnt (glaube ich)... jedenfalls habe ich es versucht:


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

einfach in dieser Zeile jetzt sicher sein

Ja, natürlich habe ich es versucht und es ändert nichts...seltsame Dinge mit dieser Programmierung :) es wäre nicht schwierig, einen einfachen Schließbefehl zu schreiben (dachte ich)...

 
it doesn't work, don't know why
Wenn Sie den Auftragsindex 5 schließen, wird der Auftragsindex 6 zu Index 5, 7 zu 6 usw. Wenn Sie hochzählen, fehlt jeder zweite offene Auftrag.
 
WHRoeder:
Wenn Sie Order-Index 5 schließen, wird Order-Index 6 zu Index 5, 7 zu 6, usw. Wenn Sie hochzählen, verpassen Sie jeden anderen offenen Auftrag.

ah ok, verstanden...trotzdem ist der Code so gedacht, dass er nur eine offene Order behält und sofort zu arbeiten beginnt, wenn 2 Orders geöffnet sind und eine davon schließt, nachdem sie ausgewählt und analysiert wurde (d.h. 2 Orders)...also denke ich nicht, dass es ein großer Fehler ist, die Orderauswahl zu erhöhen...Wie auch immer, ich habe die Dekrementierungsmethode ohne Ergebnis ausprobiert...vielleicht versuche ich es auf die falsche Art und Weise...ich weiß es nicht...kann jemand meinen Code ausprobieren und sehen, ob er wirklich die Trades schließt...oder kann jemand einen einfachen Code schreiben, um die vorher geöffnete Order auszuwählen und zu schließen (d.h. diejenige mit dem höheren Openprice für den Kauf und mit dem niedrigeren Openprice für den Verkauf)?

Vielen Dank