|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Probleme mit Orderaufgabe (Pending Order)
Hallo zusammen,
ich arbeite seit längerem an meinem eigenen News-Advisor. Nachdem ich vor kurzem das Konzept nochmal umgestellt und neu angefangen habe, stoße ich auf folgendes Problem: Der EA soll kurz vor einer News zwei Pending-Orders aufgeben und diese bis zum zeitpunkt X an den jeweiligen Preis anpassen. Ab zeitpunkt X wird nicht mehr modifiziert und abgewartet welche Order getroffen wird. Jetzt zum Problem: Sobald die Order ausgeführt werden soll, erhalte ich die Fehlermeldung "Invalid Trade Parameters". Ich habe den Verdacht, dass es an meiner Definition für den Preis der OrderSend-Funktion liegt, finde den Fehler aber nicht. Vielleicht könnt ihr mir weiterhelfen int BuyStop_Preis = Ask + (PipDifferenz*Point); int BuyStop_StopLoss = Ask + ((PipDifferenz - StopLoss)*Point); int BuyStop_TakeProfit = Ask + ((PipDifferenz + TakeProfit)*Point); int SellStop_Preis = Bid - (PipDifferenz*Point); int SellStop_StopLoss = Bid - ((PipDifferenz + StopLoss)*Point); int SellStop_TakeProfit = Bid - ((PipDifferenz - TakeProfit)*Point); void OpenBuyStop() { int ticket,tries; tries = 0; if (!GlobalVariableCheck("InTrade")) { while (tries < 3) { GlobalVariableSet("InTrade", CurTime()); // set lock indicator ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyStop_Preis,1 ,BuyStop_StopLoss,BuyStop_TakeProfit,"EA Order",NULL,0,Red); Alert("BuyStop eröffnet, Ticket ="+ticket); GlobalVariableDel("InTrade"); // clear lock indicator if(ticket<=0) { Alert("Fehler bei der BuyStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError())+" BuyStop @ "+BuyStop_Preis+" SL @ "+BuyStop_StopLoss+" TP @"+BuyStop_TakeProfit); tries++; } else tries = 3; } } } void OpenSellStop() { int ticket,tries; tries = 0; if (!GlobalVariableCheck("InTrade")) { while (tries < 3) { GlobalVariableSet("InTrade", CurTime()); // set lock indicator ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,SellStop_Preis ,1,SellStop_StopLoss,SellStop_TakeProfit,"EA Order",NULL,0,Red); Alert("SellStop eröffnet, Ticket ="+ticket); GlobalVariableDel("InTrade"); // clear lock indicator if(ticket<=0) { Alert("Fehler bei der SellStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError())+" BuyStop @ "+SellStop_Preis+" SL @ "+SellStop_StopLoss+" TP @"+SellStop_TakeProfit); tries++; } else tries = 3; } } } Danke & Gruß, Bucardo |
|
|||
Code:
int Slippage = 3; double Pt; int M; M = 1; if (MarketInfo(Symbol(), MODE_PROFITCALCMODE) == 0) { if (Digits == 3 || Digits == 5) M = 10; if (Digits == 6) M = 100; if (Digits == 7) M = 1000; Pt = Point*M; } else Pt = 1.0; int BuyStop_Preis = Ask + (PipDifferenz*Pt); int BuyStop_StopLoss = Ask + ((PipDifferenz - StopLoss)*Pt); int BuyStop_TakeProfit = Ask + ((PipDifferenz + TakeProfit)*Pt); int SellStop_Preis = Bid - (PipDifferenz*Pt); int SellStop_StopLoss = Bid - ((PipDifferenz + StopLoss)*Pt); int SellStop_TakeProfit = Bid - ((PipDifferenz - TakeProfit)*Pt); Slippage *= M; void OpenBuyStop() { int ticket, tries; tries = 0; if (!GlobalVariableCheck("InTrade")) { while (tries < 3) { GlobalVariableSet("InTrade", CurTime()); // set lock indicator ticket =OrderSend(Symbol(), OP_BUYSTOP, Lots, BuyStop_Preis, Slippage, BuyStop_StopLoss, BuyStop_TakeProfit, "EA Order", 0, 0, Red); if (ticket > 0) { Alert("BuyStop eröffnet, Ticket ="+ticket); GlobalVariableDel("InTrade"); // clear lock indicator break; } else { Alert("Fehler bei der BuyStop -Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError()) + " BuyStop @ "+BuyStop_Preis + " SL @ " + BuyStop_StopLoss + " TP @" + BuyStop_TakeProfit); tries++; } } } } void OpenSellStop() { int ticket, tries; tries = 0; if (!GlobalVariableCheck("InTrade")) { while (tries < 3) { GlobalVariableSet("InTrade", CurTime()); // set lock indicator ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, SellStop_Preis, Slippage, SellStop_StopLoss, SellStop_TakeProfit, "EA Order", 0, 0, Red); if (ticket > 0) { Alert("SellStop eröffnet, Ticket ="+ticket); GlobalVariableDel("InTrade"); // clear lock indicator break; } else { Alert("Fehler bei der SellStop-Aufgabe aufgetreten! (Fehlernummer: "+ErrorDescription(GetLastError()) + " BuyStop @ " + SellStop_Preis + " SL @ " + SellStop_StopLoss + " TP @" + SellStop_TakeProfit); tries++; } } } } Die Slippage war vorher fix mit 1 angegeben. Bei einem 5-Digitbroker hätte das bedeutet, dass nur eine Slippage von 0.1 Pip möglich gewesen wäre - viel zu wenig. Die Magicnumber wurde als 0 eingesetzt. Falls Order geöffnet wurde - kurze Alertmeldung und dann mit break Sprung aus der while-Schleife. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Danke traderdoc für die schnelle Hilfe! Ich habe den Code entsprechend verändert und es funktioniert einwandfrei
Leider hat sich beim Testen gleich ein neues Problem aufgetan. Meine OrderModify-Funktion läuft nicht mehr. Ich hatte eben kurz eine Version, die funktionierte, war kurz abgelenkt und finde jetzt nicht mehr den Fehler... Letztendlich soll die Order mit Preis, SL und TP so modifiziert werden, dass sie über einen definierten Zeitraum mit den aktuellen Preisen mitläuft. Im Moment bleiben die Parameter aber unverändert so, wie sie bei der Orderaufgabe festgelegt wurden. Hier der Code: void DoModify() { for (int i = 0; i < OrdersTotal(); i++) { ph2=OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() &&(OrderType()==OP_BUYSTOP)) { if ((OrderOpenPrice()>BuyStop_Preis) || (OrderOpenPrice()<BuyStop_Preis)) { Alert("BuyStop OrderModifikation ausgeführt, BuyStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(BuyStop_Preis,5)); ph3 = OrderModify(OrderTicket(),Ask + PipDifferenz*Point,(Ask + PipDifferenz*Point) - StopLoss*Point,(Ask + PipDifferenz*Point) - StopLoss*Point,0,Red); } } if (OrderSymbol()==Symbol() && (OrderType()==OP_SELLSTOP)) { if ((OrderOpenPrice() > SellStop_Preis) || (OrderOpenPrice() < SellStop_Preis)) { /*Alert("SellStop OrderModifikation ausgeführt, SellStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(SellStop_Preis,5));*/ ph4 = OrderModify(OrderTicket(),Bid - PipDifferenz*Point,(Bid - PipDifferenz*Point) + StopLoss*Point,(Bid - PipDifferenz*Point) - TakeProfit*Point,0,Red); } } } } Gruß Bucardo |
|
|||
Code:
void DoModify() { for (int i = 0; i < OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP) { if (OrderOpenPrice() != BuyStop_Preis) { ph3 = OrderModify(OrderTicket(), Ask + PipDifferenz*Pt, Ask + (PipDifferenz - StopLoss)*Pt, Ask + (PipDifferenz + TakeProfit)*Pt, 0, Red); } if (ph3) { Alert("BuyStop OrderModifikation ausgeführt, BuyStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(BuyStop_Preis,5)); continue; } if (OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP) { if (OrderOpenPrice() != SellStop_Preis) { ph4 = OrderModify(OrderTicket(), Bid - PipDifferenz*Pt, Bid - (PipDifferenz + StopLoss)*Pt, Bid - (PipDifferenz - TakeProfit)*Pt, 0, Red); } if (ph4) { Alert("SellStop OrderModifikation ausgeführt, SellStop war @ "+DoubleToStr(OrderOpenPrice(),5)+"// Änderung in "+DoubleToStr(SellStop_Preis,5)); } } } } } }
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo Bucardo,
seit einigen Wochen verfolge ich auch die Strategie zum Newstrading, bzw. habe ein EA dazu erstellt. Leider bin ich erst jetzt auf Dein Programm gestoßen Mein EA ist auch so aufgebaut, dass ich 20-10 Sek vor der Nachricht 2 PendingOrder platziere und kurz danach manuell wieder aussteige. Werden Deine Pending Order immer sofort platziert? Bei mir passiert es manchmal, dass eine Order nicht gesetzt wird und meine CPU-Leistung nach oben geht. Mich würde wirklich brennend interessieren, ob Du damit schon positive Erfolge erzielen konntest? Gruß Rob |
Lesezeichen |
Stichworte |
abgabe order, mql4, order, orderaufgabe, pending order, programmierung, programmierung metatrader |
|
|