|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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 Geändert von Trader6666 (17.06.16 um 16:02 Uhr) |
|
|||
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; } } }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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 |
|
|||
Ich glaub da hilft "OrderModify" oder so.
|
|
|||
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
@ 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); } |
|
|||
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
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 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 |
|
|||
" 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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
mql4, order, order selektierung, programmierung, programmierung metatrader, selektierung |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|