Posisition Select, Order Select

 

Hallo,


ich arbeite ja normalerweise mit Marktorder, 

hier ist es ja recht einfach, abzufragen ob für das aktuelle Symbol eine Position besteht.


   if(PositionSelect(_Symbol)==false)
     {...

wie funktioniert das bei Pending Order, ich will ja nicht gleich unendlich viele eröffnen sondern nur eine 

wenn ich die Funktion 

https://www.mql5.com/de/docs/trading/orderselect

verwende, dann will die Funktion ja immer eine Ticketnummer. Diese interessiert mich eigentlich gar nicht, weil ich ja im Netting Mode arbeite. 


gibts ein 

OrderSelect(_Symbol)

ebenfalls?


danke

amando

Dokumentation zu MQL5: Handelsfunktionen / OrderSelect
Dokumentation zu MQL5: Handelsfunktionen / OrderSelect
  • www.mql5.com
Waehl Order für die weitere Arbeit damit.  Gibt true bei erfolgreicher Funktionsausführung zurück. Gibt false bei verfehlter Funktionsausführung zurück. Um fehlerbezogene Information zu bekommen, muss die Funktion GetLastError() gehiessen werden. Man muss nicht geltende Warteordern und Positionen verwechseln, die auch in der Registerkarte...
 

Eine kleine Hilfe..


//+------------------------------------------------------------------+
//| Deletes all pending orders                                       |
//+------------------------------------------------------------------+
void DeleteAllPendingOrders(int symbol_number)
  {
   int   total_orders =0; // Total number of pending orders
   ulong order_ticket =0; // Order ticket
//--- Get the total number of pending orders
   total_orders=OrdersTotal();
//--- Loop through the total number of pending orders
   for(int i=total_orders-1; i>=0; i--)
     {
      //--- If the order selected
      if((order_ticket=OrderGetTicket(i))>0)
        {
         //--- Get the order symbol
         GetOrderProperties(O_SYMBOL);
         //--- If the order symbol and the current symbol are equal
         if(ord.symbol==Symbols[symbol_number])
            //--- Delete the order
            DeletePendingOrder(order_ticket);
        }
     }
  }

ist aus dem Artikel https://www.mql5.com/de/articles/755

Das MQL5-Kochbuch – Mehrwährungsfähiger Expert Advisor und die Arbeit mit Pending Orders in MQL5
Das MQL5-Kochbuch – Mehrwährungsfähiger Expert Advisor und die Arbeit mit Pending Orders in MQL5
  • www.mql5.com
Diesmal werden wir einen mehrwährungsfähigen Expert Advisor mit einem Handelsalgorithmus erstellen, der auf der Arbeit mit den Pending Orders Buy Stop und Sell Stop basiert. Das Muster, das wir erstellen werden, dient dem untertägigen Handel bzw. Tests. Folgende Themen werden in diesem Beitrag erörtert: Der Handel in einem festgelegten...
 
Christian:

Eine kleine Hilfe..


ist aus dem Artikel https://www.mql5.com/de/articles/755

ja genau das ist was ich eigentlich nicht machen wollte ;-)

gibts noch andre ideen?

 
amando:

ja genau das ist was ich eigentlich nicht machen wollte ;-)

gibts noch andre ideen?

hmmm ..... Nein :-)

Kein Ticket keine Kekse ..

 
amando:

verwende, dann will die Funktion ja immer eine Ticketnummer. Diese interessiert mich eigentlich gar nicht, weil ich ja im Netting Mode arbeite. 


Wie stellst du dir denn folgendes vor:


Du setzt ZWEI pending orders eurusd in den Markt .

Eine möchtest du jetzt löschen ....???


Das hat nichts mit NETTING oder HEDGE mode des Kontos zu tun.

 
Christian:

Wie stellst du dir denn folgendes vor:


Du setzt ZWEI pending orders eurusd in den Markt .

Eine möchtest du jetzt löschen ....???


Das hat nichts mit NETTING oder HEDGE mode des Kontos zu tun.

Schon klar, das ist beim löschen, aber ich will ja nur wissen ins eine gibt. Danke trotzdem.

 

Kann mir jemand sagen, warum ich dann hier immer den Wert 0 rausbekomme?


ich rufe in der OnTick()


diesen Block auf.

Die Erste Order setzt er noch richtig, aber dann eröffnet er diese Multible. Kann ich in der On Tick nicht so selektieren, quasi wenn kein neuer tick kommt führt er diesen immer wieder aus oder selektiere ich die Order nur falsch?

 if(CheckPendingExpert(_Symbol,MN) < 1 )
     {
      if(Hour()>=Start && Hour()<=End && 
         InsideBarLong(_Symbol,PERIOD_M5,1) == true

         )
        {
         OrderEinstig = Low(_Symbol,PERIOD_M5,1);
         OrderStopLoss = Low(_Symbol,PERIOD_M5,2);
         OrderTakeProfit = (OrderEinstig + TP*_Point);
         
         PendingOpen(_Symbol,ORDER_TYPE_BUY_LIMIT,Lots, OrderEinstig, OrderStopLoss, OrderTakeProfit,MN,Text,TimeCurrent()+60*60);
         return;
        }

	        ....
int CheckPendingExpert(const string symbol,const int magic)
  {
   int pendingopen=0;
  
   int total=OrdersTotal(); // Anzahl platzierter Pending Orders 
//--- in allen platzierten Pending Orders suchen
   for(int i=total-1; i>=0; i--)
     {
      if((OrderSelect(i)) == true)
        {
         ulong  order_ticket=OrderGetTicket(i);                   // das Ticket der Order
         string order_symbol=OrderGetString(ORDER_SYMBOL);
         ulong  magicnumber=OrderGetInteger(ORDER_MAGIC); // MagicNumber der Position
         
         //--- wenn die MagicNumber übereinstimmt
         if(order_symbol==symbol && magic==magicnumber)
           {
            pendingopen+=1;

           }
        }
     }
   return(pendingopen);
  }

selektiere ich die Order zu stark?


danke

 

Der Aufruf von Orderselect ist falsch.


Orderselect benötigt ein Ticket kein Index.

Orderselect kannst du erst nach OrderGetTicket nutzen.

https://www.mql5.com/de/docs/trading/orderselect
 

Hier der korrekte Ablauf:


1. Anzahl der offenen Orders holen

2. Ticket der 1. offenen Order holen über Index Nummer 1

3. Orderselectieren mit dem Ticket ( Wenn True dann ist sie existent)

4. Abfragen von OrderDetails.

5. Ticket von der nächsten Order holen

usw ....bis der Index OrdersTotal zu ende ist.

 
Christian:

Hier der korrekte Ablauf:


1. Anzahl der offenen Orders holen

2. Ticket der 1. offenen Order holen über Index Nummer 1

3. Orderselectieren mit dem Ticket ( Wenn True dann ist sie existent)

4. Abfragen von OrderDetails.

5. Ticket von der nächsten Order holen

usw ....bis der Index OrdersTotal zu ende ist.

 Nun Ja, eigentlich gehts noch einfacher, zumindest wenn einen nur das Symbol interessiert


 

Wenn es dir rein um die Anzahl der offenen Orders geht  ... ja !


Kannte ich bis eben auch noch nicht.


Aber , es macht trotzdem Sinn gleich beim Öffnen einer Order/Position  das Ticket in einn lokalen Buffer zu setzen.

Denn ständig den Server fragen was da denn los ist beim ihm kostet immer Zeit.

Macht sich bemerkbar beim Testen/Optimieren.

OnTick sollte so klein wie möglich gehalten werden.

Grund der Beschwerde: