Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Pendingorder löschen bei Trendwechsel (http://www.expert-advisor.com/forum/showthread.php?t=5973)

FORWARD 15.01.18 18:33

Pendingorder löschen bei Trendwechsel
 
mein EA löscht die offenen PendingOrder nicht, wenn der Trend wechselt.
Programmiert ist, dass offene aktive Orders bei Trendwechsel geschlossen werden... funktioniert super, nur leider bleiben alle Pendingorder drin.
Irgendwas ist falsch beim Orderdelete, ich finde den Fehler nicht :(

// Short Signale umsetzen
if(ShortSignal == true)
{
// eventuelle Long Order schließen
if(LongOrder>0)
{
if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
bool LongOrderGeclosed = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
if(LongOrderGeclosed==true)LongOrder=0;
}

}

{
if(OrderType()==OP_SELL)
{
// lösche Pendingorder
if (BuyStopOrder>0) OrderDelete(BuyStopOrder);
BuyStopOrder = 0;
}
}



// Short Order eröffnen
while(ShortOrder<1)
{
ShortOrder=OrderSend(Symbol(),OP_SELL,HandelsLots, Bid,10,(Bid+0.01000),(Bid-0.01000),"FORWARD",MagicNumber,0,Red);
}

{
SellStopOrder=OrderSend(Symbol(),OP_SELLSTOP,Hande lsLots,Bid-0.00100,10,(Bid+0.01000),(Bid-0.00900),"FORWARD",MagicNumber,0,Red);

Adlerauge 15.01.18 23:01

Hallo,
der folgende Code schliesst bzw. löscht alle Orders, den kannst Du Dir nach Deinen Wünschen anpassen und einbauen:

PHP-Code:

 for (int i OrdersTotal() -1>= 0i--) 
   { if (
OrderSelect(iSELECT_BY_POSMODE_TRADES))
      { switch (
OrderType())
         { case 
0: if (OrderClose(OrderTicket(), OrderLots(), Bid1000000)) {}; break;
           case 
1: if (OrderClose(OrderTicket(), OrderLots(), Ask1000000)) {}; break;
           case 
2: if (OrderDelete(OrderTicket())) {}; break;
           case 
3: if (OrderDelete(OrderTicket())) {}; break;
           case 
4: if (OrderDelete(OrderTicket())) {}; break;
           case 
5: if (OrderDelete(OrderTicket())) {}; break;
         } 
      }
   } 


FORWARD 16.01.18 20:53

Danke, die Deletefunktion arbeitet sobald eine neue Order plaziert wird.
Wie definiere ich, das er im Buysignal die StopSell löscht und
im Sellsignal die StopBuy?
Momentan löscht er immer in Trendrichtung und nicht entgegen.
Leider habe ich keine Erfahrung mit der Programmierung und lerne Stück für Stück aus dem Netz. Sicherlich kann ich case 1-5 definieren, oder?

So schaut der Abschnitt aktuell aus

PHP-Code:

// Long Signale umsetzen
              
if(LongSignal == true )
              {    
                 
// eventuelle Short Order schließen
                       
if(ShortOrder>0)
                           {
                              if(
OrderSelect(ShortOrder,SELECT_BY_TICKET))
                                      {
                                          
bool ShortOrderGeclosed OrderClose(ShortOrder,OrderLots(),Ask,10,Blue);
                                          if(
ShortOrderGeclosed == trueShortOrder=0;
                                          
                                      }
                           }   
                           
                                      
     for (
int i OrdersTotal() -1>= 0i--) 
   { if (
OrderSelect(iSELECT_BY_POSSellStopOrder))
         { switch (
OrderType())
         { case 
1: if (OrderDelete(OrderTicket())) {}; break;
           case 
2: if (OrderDelete(OrderTicket())) {}; break;
           case 
3: if (OrderDelete(OrderTicket())) {}; break;
           case 
4: if (OrderDelete(OrderTicket())) {}; break;
           case 
5: if (OrderDelete(OrderTicket())) {}; break;
         } 
      }
   } 


FORWARD 17.01.18 13:09

Danke, jetzt löscht er die Pendingorders.
Leider in Trendrichtung...und nicht bei Trendwechsel.
Wie formuliert man, dass wenn BuySignal wahr ist die SellStopp Positionen gelöscht werden?

FORWARD 17.01.18 13:09

PHP-Code:

// Long Signale umsetzen
              
if(LongSignal == true)
              {    
                 
// eventuelle Short Order schließen
                       
if(ShortOrder>0)
                           {
                              if(
OrderSelect(ShortOrder,SELECT_BY_TICKET))
                                      {
                                          
bool ShortOrderGeclosed OrderClose(ShortOrder,OrderLots(),Ask,10,Blue);
                                          if(
ShortOrderGeclosed == trueShortOrder=0;
                                          
                                      }
                           }   
                           
                                      
     for (
int i OrdersTotal() -1>= 0i--) 
   { if (
OrderSelect(iSELECT_BY_POSMODE_TRADES))
      { switch (
OrderType())
         { case 
2: if (OrderDelete(OrderTicket())) {}; break;
           case 
3: if (OrderDelete(OrderTicket())) {}; break;
           case 
4: if (OrderDelete(OrderTicket())) {}; break;
           case 
5: if (OrderDelete(OrderTicket())) {}; break;
         } 
      }
   } 


Adlerauge 17.01.18 15:09

...viele Antworten bekommt man, indem man die F1-Taste benutzt, wenn sich der Cursor auf der jeweiligen MQL4-Funktion befindet, in diesem Fall:

OrderType
Returns order operation type of the currently selected order.
int OrderType();
Returned value
Order operation type of the currently selected order. It can be any of the following values:
0 - OP_BUY - buy order,
1 - OP_SELL - sell order,
2 - OP_BUYLIMIT - buy limit pending order,
3 - OP_BUYSTOP - buy stop pending order,
4 - OP_SELLLIMIT - sell limit pending order,
5 - OP_SELLSTOP - sell stop pending order.

FORWARD 18.01.18 12:40

da bin ich trotzdem nicht weiter gekommen.
Ich komme nicht aus der "Programmierer Lounge"
Trotzdem versuche ich das ganze auf die Reihe zu bekommen.

Ich habe jetzt doch weiterhin an meiner Variante festgehalten.
Der EA löscht jetzt in Trendrichtung die Limitorders, aber leider nicht die Stoporders, obwohl es gleich geschrieben ist, woran könnte das liegen?

PHP-Code:

// Short Signale umsetzen
               
if(ShortSignal == true)
               {
               
// eventuelle Long Order schließen
                     
if(LongOrder>0
                        {
                           if(
OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
                              {
                                 
bool LongOrderGeclosed OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
                                 if(
LongOrderGeclosed==true)LongOrder=0;
                              }
                        }
              
        if(
BuyLimitOrder>0)
                           {
                              if(
OrderSelect(BuyLimitOrder,SELECT_BY_TICKET))
                              
                                      {
                                          
bool BuyLimitOrderDelete OrderDelete(OrderTicket());
                                          if(
BuyLimitOrderDelete == trueBuyLimitOrder=0;
                                      }
                                     
                           }              
    
                           if(
BuyStopOrder>0)
                           {
                              if(
OrderSelect(BuyStopOrder,SELECT_BY_TICKET))
                              
                                      {
                                          
bool BuyStopOrderDelete OrderDelete(OrderTicket());
                                          if(
BuyStopOrderDelete == trueBuyStopOrder=0;
                                      }
                           }     
                           

      
// Short Order eröffnen
      
while(ShortOrder<1)
        {
         
ShortOrder=OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,10,(Bid+0.01000),(Bid-0.00300),"FORWARD",MagicNumber,0,Red);
        }
        {
         
SellLimitOrder=OrderSend(Symbol(),OP_SELLLIMIT,HandelsLots,Bid+0.00050,10,(Bid+0.01050),(Bid-0.00350),"FORWARD",MagicNumber,0,Red);
        } 
        {
         
SellLimitOrder=OrderSend(Symbol(),OP_SELLLIMIT,HandelsLots,Bid+0.00100,10,(Bid+0.01100),(Bid-0.00400),"FORWARD",MagicNumber,0,Red);
        }  
        {
         
SellStopOrder=OrderSend(Symbol(),OP_SELLSTOP,HandelsLots,Bid-0.00050,10,(Bid+0.00950),(Bid-0.00250),"FORWARD",MagicNumber,0,Red);
        }
        {        {
         
SellStopOrder=OrderSend(Symbol(),OP_SELLSTOP,HandelsLots,Bid-0.00100,10,(Bid+0.00900),(Bid-0.00200),"FORWARD",MagicNumber,0,Red);
        } 


traderdoc 18.01.18 17:08

Das Erste, was man für sich und andere, die einem helfen sollen, tun sollte, ist den Code ordentlich und übersichtlich schreiben. Das kann doch keiner lesen!

Also so oder so ähnlich sollte das aussehen.

Code:

//Short Signale umsetzen
if (ShortSignal == true) {    // eventuelle Long Order schließen
  if (LongOrder > 0) {
      if (OrderSelect(LongOrder, SELECT_BY_TICKET) == true) {
        bool LongOrderGeclosed = OrderClose(LongOrder, OrderLots(), Bid, 10, Blue);
        if (LongOrderGeclosed == true) LongOrder = 0;
      }
  }
             
  if (BuyLimitOrder > 0) {
      if (OrderSelect(BuyLimitOrder, SELECT_BY_TICKET)) {
        bool BuyLimitOrderDelete = OrderDelete(OrderTicket());
        if (BuyLimitOrderDelete == true) BuyLimitOrder = 0;
      }
  }             
   
  if (BuyStopOrder > 0) {
      if (OrderSelect(BuyStopOrder, SELECT_BY_TICKET)) {
        bool BuyStopOrderDelete = OrderDelete(OrderTicket());
        if (BuyStopOrderDelete == true) BuyStopOrder = 0;
      }
  }   
                         
  // Short Order eröffnen
  while (ShortOrder < 1) {
      ShortOrder = OrderSend(Symbol(), OP_SELL, HandelsLots, Bid, 10, (Bid+0.01000), (Bid-0.00300), "FORWARD", MagicNumber, 0, Red);

      SellLimitOrder = OrderSend(Symbol(), OP_SELLLIMIT, HandelsLots, Bid+0.00050, 10, (Bid+0.01050), (Bid-0.00350), "FORWARD", MagicNumber, 0, Red);
 
      SellLimitOrder = OrderSend(Symbol(), OP_SELLLIMIT, HandelsLots, Bid+0.00100, 10, (Bid+0.01100), (Bid-0.00400), "FORWARD", MagicNumber, 0, Red);

      SellStopOrder = OrderSend(Symbol(), OP_SELLSTOP, HandelsLots, Bid-0.00050, 10, (Bid+0.00950), (Bid-0.00250), "FORWARD", MagicNumber, 0, Red);

      SellStopOrder = OrderSend(Symbol(), OP_SELLSTOP, HandelsLots, Bid-0.00100, 10, (Bid+0.00900), (Bid-0.00200), "FORWARD", MagicNumber, 0, Red);
  }
}

Der Code wurde jetzt nur ordentlich strukturiert und nicht auf Sinnhaftigkeit und Fehlern kontrolliert.

traderdoc

Lampe 18.01.18 19:35

Du machst dir die Arbeit den Code zu strukturieren, und lässt dann trotzdem, nicht mal den kleinsten Hinweis für den Hilfesuchenden da?

Ich werde mal versuchen dir zu helfen Forward, möchte aber darauf Hinweisen das ich selber Anfänger bin und daher nicht versprechen kann, das meine Aussagen auch richtig sind.

Wenn ich mir deinen Code anschaue würde ich sagen der Fehler liegt darin, das du keine for Schleife benutzt um die Orders durchzuzählen. Ich glaube das dies aber nötig ist, weil das Programm dann jede Order nacheinander durchgeht und abgleicht ob deine Orderbedingungen stimmen.

Ich lasse dir nun ein BeispielsCode da den du, wenn du ihn verstanden hast, auf deinen eigenen Code anpassen kannst:

Code:

//Short Signale umsetzen
if (ShortSignal == true)  // eventuelle Long Order schließen
  {
    for(int i=OrdersTotal()-1; i>=0; i--)  //1.
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  //2.
          {
          if(OrderComment()==Orderkommentar) //3.
            {
              if(OrderType()==BUY_LIMIT) //4.
                {
                bool LongOrderGeclosed=OrderDelete(OrderTicket(),clrNONE) //5.
                }
            }
          }
        }
  }

zu 1.
das ist die for Schleife die jede einzelne Order, auf die danach von dir per if befehl definierten, Bedingungen prüft.

zu 2.
SELECT_BY_POS,MODE_TRADES
Das bedeutet du suchst mit der for Schleife alle Positionen durch die aktuell vorhanden sind.

zu 3.
jetzt musst du per if Befehl deine Orders Filtern. Ich habe in diesem Beispiel OrderComment genommen. Für mich ist das ein entspannter Weg. Du kannst aber auch die Orders über die vorher zugewiesene MagicNumber filtern.

zu 4.
hiermit prüfst du den Status der Order, also ist es eine Buy_Limit, eine Sell_Limit Order oder eine Buy Order und und und. Jenachdem was du suchst. Wenn du F1 drückst bei OrderType bekommst du eine Auflistung der Ordertypen.
Im obigen Beispiel suchen wir eine BUY_LIMIT Order.

zu 5.
wenn entsprechend die obigen Bedingungen stimmen, solltest du die von dir gesuchte Order gefunden haben, und kannst nun mit OrderDelete() die entsprechende Order löschen.

Du musst soweit ich weiß IMMER wenn du mit einer Order arbeiten willst, vorher die For Schleife verwenden. Auch wenn du Orders schließen, Modifizieren oder PendingOrders löschen möchtest.

Ich hoffe das meine Ausführungen stimmen und dir weiter helfen.

Sollte ich Fehler eingebaut haben dürfen sich gerne die erfahrenen Progger eingeladen fühlen mich zu berichtigen.

MfG
Lampe

traderdoc 18.01.18 20:58

Zitat:

Zitat von Lampe (Beitrag 40216)
Du machst dir die Arbeit den Code zu strukturieren, und lässt dann trotzdem, nicht mal den kleinsten Hinweis für den Hilfesuchenden da?

Ja, weil es mir nur um die Vorarbeit ging, lesbaren Code zu posten.
Das Fehlersuchen würde ein Vielfaches der Zeit ausmachen.

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:50 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum