Problem mit der Gesamtzahl der offenen Aufträge

 

Hallo zusammen, ich habe alle Ratschläge, die ich in diesem Forum finden kann, ausprobiert, aber keiner scheint zu funktionieren. Kann mir bitte jemand helfen? Ich glaube, das Problem liegt an meiner OrderTotal-Funktion. Ich handele mit 10 Währungspaaren, d.h. ich habe den EA auf 10 Charts geöffnet. Es handelt sich um eine einfache Hedging-Strategie. Ich möchte, dass der EA je nach Signal einen Handel (long oder short) eröffnet. Wenn der Handel in meine Richtung geht, Trailingstop oder Take Profit. Wenn der Handel jedoch gegen mich geht, möchte ich, dass er einen Handel in die entgegengesetzte Richtung eröffnet. Der Code, den ich verwende, scheint zu funktionieren, aber dann bleibt er manchmal stecken, d.h. er eröffnet keinen Handel mehr. Außerdem, wenn ein oder zwei Handel auf einem Paar geöffnet sind, scheint er keinen Handel auf anderen Paaren eröffnen zu wollen.

Hier ist mein Code

int start()
{
     {
     if (OrdersTotal() == 0)
     if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
         }

  for(int i=OrdersTotal()-1; i>=0; i--) 
  {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
      //Calculate the point value in case there are extra digits in the quotes
      if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
      else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
      else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);

//calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
      
     if (OrderType() == OP_BUY) 
      {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *PointValue,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *PointValue,Digits))
            {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *PointValue,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
              }
            }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*PointValue,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*PointValue, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
          }
 
  1. Sie müssen die Berufe filtern.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;  // These
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);                    // Execute only on Symbol orders.
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2);  // This and below are always executed
          if (OrderType() == OP_BUY)                                   // Symbol is irrelevant.             
    
    Mit geschweiften Klammern.
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
          if (OrderSymbol()==Symbol())
    {                                                                   // Rest of code executes only on Symbol orders.
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
          double lots = NormalizeDouble(OrderLots() * Multiplier, 2); 
          
          if (OrderType() == OP_BUY) 
             :
    }

  2. Bei einem 4-stelligen Broker, Punkt = 0,0001
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
    Fixiert und vereinfacht.
    PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;

  3. Da alles innerhalb der geschweiften Klammern Symbol() ist, kann jede MarketInfo durch vordefinierte Variablen ersetzt werden
  4. Zahlen nicht hart codieren.
    Prüfen Sie Ihre RückgabewerteWas sind Funktionsrückgabewerte? Wie verwende ich sie? -MQL4-Forum und häufige Fehler in MQL4-Programmen und wie man sie vermeidet - MQL4-Artikel
    result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue);
 

1. vielen Dank für Ihre Hilfe. Ich habe eine Klammer hinzugefügt, wie vorgeschlagen, aber der EA öffnet immer noch nur einen Handel auf einem Währungspaar. Es wird nicht öffnen einen Handel auf einem der anderen Charts, obwohl die Kaufbedingung erfüllt wurden. Ich habe auf diese für Wochen stecken, können Sie bitte einen anderen Blick.

2 EDIT: Nicht mehr erforderlich

3 Mein Code sieht jetzt wie folgt aus

int start()
{
  {
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
  }       

  for(int i=OrdersTotal()-1; i>=0; i--) 
    {
      //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
      double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
      if (OrderSymbol()==Symbol())
    { 
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
    if (OrdersTotal() == 0)
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());
Wenn ein Auftrag für ein beliebiges Paar geöffnet ist, wird kein weiterer Auftrag geöffnet, bis OrdersTotal()==0 ist.
 
GumRai:
Wenn eine Order für ein beliebiges Paar geöffnet ist, wird keine weitere Order geöffnet, bis OrdersTotal()==0 ist.

Ich danke Ihnen für Ihre Hilfe. Ich muss die erste ursprüngliche Order auf nur einen Handel begrenzen. Ich möchte nicht, dass der EA weiterhin Orders öffnet, wenn die Kaufbedingung erfüllt ist. Also habe ich Orderstotal hinzugefügt, um dies zu begrenzen. Dieser Code scheint jedoch mit dem Code hier zu kollidieren

else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(OrdersTotal() == 1) //<----------
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());

Hier möchte ich, dass der EA nur eine Absicherung pro offenem Handel öffnet, daher OrderTotal ==1

Wie kann ich also die Anzahl der Trades am besten begrenzen, d. h. einen ursprünglichen Trade und einen Hedge-Trade? Vielen Dank

 
Trader3000: Wie kann man nun die Anzahl der Trades am besten begrenzen, d.h. ein Original-Trade und ein Hedge-Trade?
  1. Zählen Sie also die Anzahl der Orders, die auf dem aktuellen Chart offen sind. OrdersTotal gibt die Anzahl der Orders zurück, die auf allen Charts offen sind.
  2. Keine Filterung nach magischer Zahl macht EA inkompatibel mit allen anderen (einschließlich sich selbst auf anderen TFs,) und manuellem Handel Symbol ist nicht gleich Ordersymbol, wenn eine andere Währung zu einem anderen separaten Chart hinzugefügt wird. - MQL4 Forum
 

Vielen Dank für die Hilfe von allen. Ich habe das Problem gelöst und der EA öffnet jetzt einen Handel auf allen Charts, wenn die Kaufbedingung erfüllt ist, aber nichts darunter funktioniert jetzt. Der EA ruft die Trailingstop- oder Hedge-Funktionen nicht auf. Könnte bitte jemand einen Blick darauf werfen und mich wissen lassen, was ich falsch gemacht habe, denn ich kann es nicht herausfinden.

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
 else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }
 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   double lots = NormalizeDouble(OrderLots() * Multiplier, 2);

Ich weiß nicht genau, was Sie tun, aber ich schlage vor, dass Sie es vermeiden, 2 Variablen zu benennen, deren einziger Unterschied ein Großbuchstabe ist. Es ist leicht, die beiden zu verwechseln, besonders wenn andere, die Ihren Code lesen, die Konvention übernommen haben, dass Variablen, die mit einem Großbuchstaben beginnen, Globalscope sind.

Es wurde keine Reihenfolge ausgewählt, also könnte OrderLots() alles Mögliche sein


    
     if (OrderType() == OP_BUY) 

Dies würde die Werte der zuletzt in der vorangegangenen Schleife ausgewählten Bestellung verwenden, wobei es sich möglicherweise nicht um die richtige magische Zahl oder das richtige Symbol handelt.

 

Vielen Dank für Ihre Antwort. Was ich versuche zu tun ist, haben die EA öffnen die erste ursprüngliche Handel wherethe Losgröße ist ein Prozentsatz von meinem Eigenkapital. Wenn der Handel geht gegen

Bei mir muss der EA eine Absicherung in die entgegengesetzte Richtung öffnen, aber hier muss die Lotsize das Dreifache der ursprünglichen Lotsize sein (OrderLots). Auch wenn es so aussieht, als ob keine

Ich habe jetzt die Lots direkt in die OrderSend-Funktion gesetzt, aber weder der Trailingstop noch die

die Absicherung ausgelöst wird, wenn sie sollten. Beide funktionierten perfekt, bevor ich dies hinzufügen

total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }

int start()
{ 
   double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
         result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
    {
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
       }

Ich glaube, meine geschweiften Klammern {} sind nicht an der richtigen Stelle

 
Ich habe Ihnen bereits im zweiten Teil meines vorherigen Beitrags gesagt
 

Vielen Dank für die bisherige Hilfe. Ich mache Fortschritte. Ich habe es jetzt so hinbekommen, dass alles so zu funktionieren scheint, wie es sollte, außer dass der EA die Bedingung für die Eröffnung eines Hedge Trades ignoriert. Er öffnet manchmal (aber nicht immer) einen Hedge-Trade, auch wenn die Bedingungen nicht erfüllt sind. Auch der TrailingStop greift nicht immer. Ich glaube, mir fehlen noch irgendwo die geschweiften Klammern {}. Mein Code sieht jetzt so aus. Könnte bitte jemand für mich einen Blick darauf werfen. Danke.

int start()
{ 
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
    }
    {
    if(total==0 )
    if(Close[1]>Close[2])
    {
         result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
         Print("Error setting Original order: ",GetLastError());     
    }
     if (OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK)
            if(total == 1)
            {
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,  Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
            }
       }
      // else if (OrderType() == OP_SELL)
      // ... 

GumRai:

This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.


Ich habe versucht, dies zu beheben, indem ich die geschweiften Klammern änderte. Ist das der beste Weg, oder muss ich die OrderSelect-Funktion jedes Mal vor OrderSend duplizieren und hinzufügen? Vielen Dank