MT4 - Martin Gale-EA öffnet zu viele Positionen - Seite 2

 

Ich meine mit "Orders Managen" Orders suchen, bzw. erst mal schaun, ob überhaupt Welche offen sind, auswählen, prüfen ob sie geschlossen werden müssen, in dem Fall eher, ob weitere Orders in Gegenrichtung geöffnet werden müssen. Eben schaun, ob Welche offen sind, und wenn ja, was für Welche und was mit denen gemacht werden muss usw.

for( l=OrdersTotal()-1 ; l>=0 ; l-- ) {

if( OrderSelect( l , SELECT_BY_POS ) ) {

if( OrderSymbol() == Symbol() ) {


if( OrderMagicNumber() == MN_Sel ) {
...


if( OrderMagicNumber() == MN_Buy ) {
...

Bisher hab ich dafür immer diese Schleife benutzt. Die war aber eigentlich für EAs, bei denen immer nur eine einzige Order auf einmal offen ist. Im MartinGale-EA sind ja immer mehrere Orders gleichzeitig offen. Mehrere Sell-Orders und mehrere Buy-Orders sind gleichzeitig im Markt. Und da frag ich mich, ob diese Order-Such-Schleife da dann auch funktioniert.

Skype hab ich nicht.

Dateien:
 
Ja, die Schleife geht. Er findet Orders.
 

Aber findet er auch Alle? Wenn z.B. 2 Buy-Orders und gleichzeitig 4 Sell-Orders offen sind, zählt er die dann Alle korrekt?

Diese for-Loop für die Order-Suche hab ich nie wirklich kapiert.


Hab ne leise Ahnung, warum das Ding bisher zu viele Orders geöffnet hat. Weil OrderSend() in ner for-Loop wahrscheinlich nicht optimal funkt, um es mal vorsichtig aus zu drücken.


Jetzt mal angenommen, es sollen z.B. 8 Buy-Orders geöffnet werden ( weil z.B. gerade 4 Sell-Orders im Markt sind und die Anzahl der Gegen-Orders immer verdoppelt werden soll ).

Dann müsste man erst mal rausfinden, wie viele Sell-Orders im Markt sind. Das müsste ja mit der üblichen for-Loop funktionieren.

Dann müsste man diese Anzahl verdoppeln. Dann müsste man wieder mit dieser for-Loop zählen, wie viele Buy-Orders im Markt sind, und jedes Mal, wenns zu wenig sind, eine Weitere öffnen, wieder zählen, wie Viele im Markt sind, wieder Eine öffnen, wenns zu wenig sind, wieder zählen, obs genug sind und so weiter, bis genug ( in diesem Fall 8 ) Buy-Orders im Markt sind. Wie könnte man das coden?

 
ScalpXpert:

Aber findet er auch Alle? Wenn z.B. 2 Buy-Orders und gleichzeitig 4 Sell-Orders offen sind, zählt er die dann Alle korrekt?

Ja, er findet sie, aber er zählt sie nicht, da er sich nicht merkt, dass er sie gefunden hat! Dazu müsstest Du eine Variable als Zähler mit einbauen.


   LongCount = 0;
   ShortCount = 0;
   for (i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if(OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) LongCount++;            
        if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol() ShortCount++;  
      }
   }
 
ScalpXpert:

Ich meine mit "Orders Managen" Orders suchen, bzw. erst mal schaun, ob überhaupt Welche offen sind, auswählen, prüfen ob sie geschlossen werden müssen, in dem Fall eher, ob weitere Orders in Gegenrichtung geöffnet werden müssen. Eben schaun, ob Welche offen sind, und wenn ja, was für Welche und was mit denen gemacht werden muss usw.

Bisher hab ich dafür immer diese Schleife benutzt. Die war aber eigentlich für EAs, bei denen immer nur eine einzige Order auf einmal offen ist. Im MartinGale-EA sind ja immer mehrere Orders gleichzeitig offen. Mehrere Sell-Orders und mehrere Buy-Orders sind gleichzeitig im Markt. Und da frag ich mich, ob diese Order-Such-Schleife da dann auch funktioniert.

Skype hab ich nicht.

   Hallo,

   vielleicht liegt es daran, dass der Ticket nicht überprüft wird. Leider ist der Code viel zu Gross und konnte nicht alles durch checken.

   ich tue die alten Orders in der Schleife so umsetzen:


//+------------------------------------------------------------------+
double FindeLetztenBuyPreis(){
   int altesticket, ticket = 0;
   double altespreis = 0;

   for(int cnt = OrdersTotal() -1; cnt >=0; cnt--){
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY){
            altesticket = OrderTicket();
            if(altesticket > ticket){
               ticket = altesticket;
               altespreis = OrderOpenPrice();
              }
           }
        }
     }
   return(altespreis);
}
//+------------------------------------------------------------------+
double FindeLetztenSellPreis(){
   int altesticket, ticket = 0;
   double altespreis = 0;

   for(int cnt = OrdersTotal() -1; cnt >=0; cnt--){
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL){
            altesticket = OrderTicket();
            if(altesticket > ticket){
               ticket = altesticket;
               altespreis = OrderOpenPrice();
              }
           }
        }
     }
   return(altespreis);
} 

   Gruß igor.

 

Hallo.


Lag vermutlich nicht am Ticket, sondern daran, dass irgendwelche Bedingungen und Zählereien sich gegenseitig in den Weg kamen.


Eigentlich hab ich aber zur Zeit gar keine Zeit dafür.


Im Anhang eine schnell überarbeitete und hoffentlich richtige Version. Mal angenommen, dass die richtig ist, kann man bestimmt irgendwas besser machen und optimieren. Aber wie gesagt hab ich leider gerade viel Anderes zu tun.

Dateien:
LoShDTi_v2a.mq4  29 kb
 
Für die Optimierung hat das Terminal bzw. der Editor das gerade neu aufgestellte (Debug =>) Profiling mit aktuellen und/oder historischen Daten.
Grund der Beschwerde: