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)
-   -   Brauche Hilfe zur Order Selektierung (http://www.expert-advisor.com/forum/showthread.php?t=5007)

Trader6666 17.06.16 15:49

Brauche Hilfe zur Order Selektierung
 
Hallo,

ich möchte gerne eine Strategie auf mehrere Werte laufen lassen.
Da die Position auch vom EA verwaltet werden soll , bekomme ich probleme weil wenn ich ne for schleife laufen lasse um mir die offenen order anzeigen zu lassen, ignoriert er die Magicnumber , OrderComment und wtf ever ich Ihm auch sage, ich checks einfach ned warum!?!?

als Beispiel:

if(OrdersTotal() != 0 )
{


int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS)==false) continue;
Print(" Position: ",pos,"\n Order Comment : " , OrderComment(),
"\n Order Symbol: ", OrderSymbol(),"\nMagic Number: " ,OrderMagicNumber());

if( OrderMagicNumber() == MagicNumber )
{
Print ("EA: " + IntegerToString(MagicNumber) + " ist bereits mit einer Posi im Markt, Order verweigert");
// Order liegt bereits im Markt
Order_EA =1 ;
}
else
{
Order_EA=2;
}

}
}


wenn ich ne Position offen habe, zeigt er mir mit Print auch die nachricht an, aber dennoch hinterlegt er bei der nächsten Kerze Order_EA mit der 2 .... was überseh ich hier?!? hab alles mögliche ausprobiert und verzweifle so langsam :(:(:(

hoffe jem kann helfen


LG

traderdoc 17.06.16 18:27

Es ist immer sinnvoll den Aufruf der Orders mit der Letzten zu beginnen, d.h. die Variable pos zu decrementieren und nicht zu incrementieren. Desweiteren schrieb ich immer wieder: Schreibt den Code mittels des vorgesehenen Buttons # , dann kann man den Code viel besser lesen!

So, ich ordne, sortiere und fasse mal zusammen:

Code:

for(int pos = OrdersTotal()-1; pos >= 0; pos--) {
  if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
      Print(" Position: ", pos, "\n Order Comment : " , OrderComment(), "\n Order Symbol: ", OrderSymbol(), "\nMagic Number: " , OrderMagicNumber());

      if(OrderMagicNumber() == MagicNumber) {
        Print ("EA: " + IntegerToString(MagicNumber) + " ist bereits mit einer Posi im Markt, Order verweigert");
        //Order liegt bereits im Markt
        Order_EA =1 ;
        break;
      } else {
        Order_EA=2;
      }
  }
}

traderdoc

Trader6666 18.06.16 12:14

vielen Dank Doc, so hats geklappt


danke für den Hinweis mit dem code, werd ich das nächste mal tun ;)


Ich versuche auch Teilverkäufe mit einzubauen, nach dem Teilverkauf,
wird die offene Position aber nicht mehr als die gleiche erkannt und auch nicht mehr vom EA verwaltet, so das der EA bei erneutem Signal eine neue Order öffnet, obwohl die Teilposition, vom gleichen EA ja auch die gleiche MagicNumber hat, wenn man mit der Maus über die Positionsanzeige geht, wird einem die ID auch angezeigt. Woran liegt das, bzw wie kann man hier vorgehen,den wert ermitteln, damit der EA weiß, dass das noch die gleiche Posi ist???

LG

MA-EA 18.06.16 12:59

Ich glaub da hilft "OrderModify" oder so. :confused:

traderdoc 18.06.16 14:03

Ich kenne den Rest Deines Programms nicht. Aber ich kann Dir sagen wie der u.g. Code funktioniert.

Es wird mit der zuletzt ins Orderbuch aufgenommenen Order begonnen. Entspricht die OrderMagicNumber der vergebenen MagicNumber, dann wird neben der Printmeldung die Variable Order_EA auf 1 gesetzt und die Selektion abgebrochen, denn der EA erkennt damit, dass eine Orde existiert. Wird eine Order selektiert, die nicht der MagicNumber entspricht, dann wird solange Order_EA auf 2 gesetzt, bis evtl. eine Order auftaucht, die der MagicNumber entspricht.

D.h., wenn am Ende der Selektion die Variable Order_EA = 2 steht, dann gab es keine Market- oder PendingOrder, die der MagicNumber entsprach. Und wenn Du für jedes Chart eine andere MN vergibst, bedeutet das, dass in diesem Cahrt mit der MN keine Market- bzw. PendingOrder existiert.

D.h. wiederum, unter Beibehält der MN, sollte auch nach einem Teilverkauf die Variable Order_EA = 1 stehen und damit signalisieren, dass noch eine Order existiert.

traderdoc

Trader6666 18.06.16 20:59

Liste der Anhänge anzeigen (Anzahl: 1)
@ MA-EA glaub du hast mich falsch verstanden ;) aber danke dennoch für den versuch.


@Doc
ja genau das dachte ich ja auch, dass es auch bei Teilverkäufen sich ja immer noch um die gleiche MagicNumber handelt, die mir ja per MouseOver auch angezeigt wird wenn ich auf die offenen Positionen gehe. Im Bild sieht man , das der EA das ignoriert und ne neue Order aufmacht.

Freitag Abend konnte ich auch keine weiteren Tests mehr machen, war nicht mehr viel los. hier mal mein Code, vllt entdeckst du ja nen Fehler den ich übersehe.

Code:


int start()
{                                                                                           
          double BB_U  = iBands(Symbol(), 0,BB_Period,BB_Deviation,0, PRICE_CLOSE,1,1);
          double BB_L  = iBands(Symbol(), 0,BB_Period,BB_Deviation,0, PRICE_CLOSE,2,1);
          double C      = Close[1];
          double C2    = Close[2];                         
                                   
// Begin der Setup Sektion, Abfrage erfolgt bei jeder neuen Kerze ---------------------------------------------------                                                                                                           
          if(  BarCount != Bars  )
          {                                           
              Trend_();            //Trend bestimmen
              Target();            //Maximal-Ziel...drüber/drunter wird nicht mehr gehandelt
              TradeperBar  =    0; //Max. 1 Trade pro Kerze erlaubt
              BarCount      = Bars;                                           
              //Long Setup             
              if( C2 < BB_U  && C > BB_U )
              {
                L_SET = 1;
              }
              else
              {
                L_SET = 0;
              } 
              // Short Setup                 
              if(C2 > BB_L  && C < BB_L)
              {
                S_SET=2;
              }     
              else
              {
                S_SET=0;
              }             
// Keine offenen Order im Markt ------------------------------------------------------------------------             
       
        if(OrdersTotal() == 0)
        {
          //Long Trade , falls alle Parameter übereinstimmen                                               
          if( L_SET == 1 && TimeTrade() == true &&  Trend == 1 && Long_Richtung == true && TG_LONG == 0 )
          {
          double Long = OrderSend(Symbol(),OP_BUY,LotSize,Ask,0,Ask - (SL*pips),Bid + (TP*pips),NULL ,MagicNumber,0,clrLime);
          TradeperBar = 1;
          BE          = 0;
          TVK1_Done  = 0;
          TVK2_Done  = 0;
          Order_EA    = 1;
          }                               
                               
          if(  S_SET == 2 && TimeTrade() == true && Trend == 2  && Short_Richtung == true && TG_SHORT == 0 )                                 
          {
          double Short = OrderSend(Symbol(),OP_SELL,LotSize,Bid,0,Bid + SL*pips,Ask - TP*pips,NULL,MagicNumber,0,clrRed);
          TradeperBar = 1; 
          BE          = 0;
          TVK1_Done  = 0;
          TVK2_Done  = 0;
          Order_EA    = 1; 
          }
         
        }
// Ende der Sektion--------------------------------------------------------------------------------------------------------     
     
                           
//offene Posi´s schauen ob eine Order vom EA schon läuft--------------------------------------------------------------------         
                       
        if(OrdersTotal() != 0  )
        {                                 
          for(int pos = OrdersTotal()-1; pos >= 0; pos--)
          {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
            Print(" Position: ", pos, "\n Order Comment : " , OrderComment(), "\n Order Symbol: ", OrderSymbol(), "\nMagic Number: " , OrderMagicNumber());
            //offene Position vom EA gefunden, Order verweigern                 
            if(OrderMagicNumber() == MagicNumber)
            { 
              Print ("EA: " + IntegerToString(MagicNumber) + " ist bereits mit einer Posi im Markt, Order verweigert");
              Order_EA =1 ;
             
//Trade verwalten ---------------------------------------------------------------------------------------------------------             
              if(BE == 0)                                                                                                                       
              {
                MoveToBE();
              }
              if(BE == 1)
              {
                SL_Move();
              }
              if(TVK1_Done == 0 || (TVK1_Done == 1 && TVK2_Done == 0) )
              {
                CheckForTVK();
              }
                break;
            }
// Keine Order vom EA bei den offenen Posi´s dabei             
            else
            {
            Order_EA=2;
            }
          }
          }//Schleifenende
        }
//Ende der Sektion-----------------------------------------------------------------------------------------------------------------
       
                               
// Tradeausführung wenn EA noch nicht im Markt ist                               
        if(Order_EA == 2)
        {                                               
          if( L_SET == 1 && TimeTrade() == true &&  Trend == 1 && Long_Richtung == true &&  TG_LONG == 0 ) 
          {                               
          double Long = OrderSend(Symbol(),OP_BUY,LotSize,Ask,0,Ask - (SL*pips),Bid + (TP*pips),NULL,MagicNumber,0,clrLime);
          TradeperBar = 1;
          BE          = 0;
          TVK1_Done  = 0;
          TVK2_Done  = 0;
          } 
         
          if(  S_SET == 2 && TimeTrade() == true && Trend == 2  && Short_Richtung == true && TG_SHORT == 0 )
          {                               
          double Short = OrderSend(Symbol(),OP_SELL,LotSize,Bid,0,Bid + SL*pips,Ask - TP*pips, NULL,MagicNumber,0,clrRed);
          TradeperBar = 1; 
          BE          = 0;
          TVK1_Done  = 0;
          TVK2_Done  = 0;                               
          }         
                                                                         
        }
//Ende der Sektion--------------------------------------------------------------------------------------------------------------                                 
        }// Ende der ganzen Setup Sektion                 
       
      Comment("Kontostand: " , AccountBalance(),"\nTG_Long: " ,TG_LONG, "\nTG_Long: " , TG_SHORT, "\nMagic: " ,OrderMagicNumber(), "\nOffene Orders: " ,OrdersTotal(),
              "\nTrend: " ,Trend, "\nTradingZeit: ", TimeTrade(), "\nUP_Kreuzung: " , L_SET,"\nDOWN_Kreuzung: ",S_SET ,
              "\nTVK 1 Status: " , TVK1_Done, "\nBE_Status: " ,BE );
               
return(0);
}


traderdoc 18.06.16 21:48

Mal abgesehen von der unterschiedlichen Basis bei der SL- und TP-Berechnung, denn auch bei der TP-Berechnung ist bei einer BuyOrder vom Ask auszugehen, denn dort liegt im Endeffekt der OpenPrice, sollte der Rückgabewert der Funktion OrderSend() mit int deklariert werden, denn hinter diesem Rückgabewert verbirgt sich die TicketNumber.
Die Slippage ist gleich 0!!. Das wird im Demo gut gehen, aber nicht auf inem Realkonto.
Definitiv besitzt auch die Order nach der Teilschließung noch dieselbe MagicNumber.
Arbeitest Du mit ein und demselben Währungspaar gleichzeitig auf verschiedenen Timeframes?

Ansonsten kann ich nichts weiter feststellen. Eine Unbekannte bleiben die anderen Funktionen, deren Code nicht einsehbar ist.

traderdoc

Trader6666 18.06.16 23:30

hey doc,

ja das mit der Slippage und dem Bid/Ask is mir bewusst, EA läuft noch ned rund, deswegen hab ich das noch so stehen lassen, auf demo geht ja alles :D

Der EA soll auf mehrere Werte laufen, nie auf einen wert mit verschiedenen TimeFrames. MagicNumber hab ich mit extern double angelegt, damit ich nicht für jeden wert einen eigen EA schreiben brauch.

Danke für den Tipp mit mit der intialisierung der OrderSend Funktion,
OrderModify müsste demnach auch mit Bool initialisiert werden oder?!
Habs so aus den Docs entnommen

traderdoc 18.06.16 23:59

" MagicNumber hab ich mit extern double angelegt, damit ich nicht für jeden wert einen eigen EA schreiben brauch."

Das verstehe ich nicht. Die MagicNumber sollte unbedingt mit int deklariert werden.

traderdoc

Trader6666 19.06.16 09:37

moin , sorry für die Verwirrung, klar mit extern int, war wohl der Uhrzeit geschuldet :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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