|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Modifizierung von PendingOrdern
Hallo alle zusammen,
ich habe mal wieder ein Problem. Ich möchte eine gesetzte Buystop-PendingOorder modifizieren. Dazu habe ich eine Test-Version geschrieben. Eine PO wird erstellt und wenn der Preis zu weit von der PO entfernt ist, soll der PO-Preis angepasst werden. Ich bekomme aber die Modifizierung absolut nicht hin. Kann mir jemand helfen? HTML-Code:
//+------------------------------------------------------------------+ //| TEST_Modify_PendingOrder.mq4 | //+------------------------------------------------------------------+ #property strict #include <stderror.mqh> #include <stdlib.mqh> extern double TP = 10; extern double SL = 20; extern double LS = 0.05; extern string MyComment = "TEST"; extern double AbstandZumMarkt = 20; double pips; //+------------------------------------------------------------------+ int OnInit() { // Determine what a pip is. pips=Point; //.00001 or .0001. .001 .01. if(Digits==3 || Digits==5 || Digits==1) pips*=10; //ist das gleiche wie: pips=points*10 else if(Digits==2) pips*=100; //ist das gleiche wie: pips=points*100 //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ void OnTick() { CheckForSignal(); Modify_PendingOrder(); } //+------------------------------------------------------------------+ void CheckForSignal() { if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP); } //+------------------------------------------------------------------+ void PlacePendingOrder(int dir) { // Buystop-PendingOrder double LongEntryPrice = Ask + (AbstandZumMarkt*pips); double LongSL = LongEntryPrice - SL*pips; double LongTP = LongEntryPrice + TP*pips; if(dir == OP_BUYSTOP) { int Long_ticket = OrderSend(Symbol(), dir, LS, LongEntryPrice, 30, LongSL, LongTP, MyComment, 0, 0, clrGreen); } } //+------------------------------------------------------------------+ void Modify_PendingOrder() { double price = 0, new_price = 0; if(TotalOpenBuyStopPendingOrders() > 0) { for(int i=0;i<OrdersTotal()-1;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol() == Symbol()) if(OrderType()==OP_BUYSTOP) { int orderticket = OrderTicket(); if(OrderTicket() == FindLastBuyStopPendingOrder()) { if(Ask <= (OrderOpenPrice()-(AbstandZumMarkt*pips))) { new_price = Ask + (AbstandZumMarkt*pips); int new_ticket = OrderModify(orderticket,new_price,(new_price-(SL*pips)),(new_price+(TP*pips)),0,clrBlue); } } } } } } //+------------------------------------------------------------------+ int TotalOpenBuyStopPendingOrders() { int total=0; if(OrdersTotal()>0)for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()) if(OrderType()==OP_BUYSTOP) total++; } else Print(__FUNCTION__," Failed to select order ",i," ",GetLastError()); } return (total); } //+------------------------------------------------------------------+ int FindLastBuyStopPendingOrder() { int orderticket = 0; datetime last = 0; for(int i = OrdersTotal()-1;i>=0;i--) { if(TotalOpenBuyStopPendingOrders() > 0) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol() == Symbol()) if(OrderType() == OP_BUYSTOP) { if(last == 0 || OrderOpenTime() > last) { last = OrderOpenTime(); orderticket = OrderTicket(); } } } return (orderticket); } //+------------------------------------------------------------------+ Ich wäre für eure hilfreichen Tipps sehr dankbar. |
|
|||
So auf die Schnelle hilft mir immer ein Blick in die Fehlermeldungen, und wenn mir die zu unverständlich sind, baue ich für jeden einzelnen Wert ein Print ein und kontrolliere (oder rechne nach). AVT
|
|
|||
Danke für deine Antwort. Ich sollte wohl wirklich alle Werte, wie TP und SL, nochmal einzeln betrachten. Hatte nur einen Print für die selektierte Ticketnummer (Print nicht im Programm-Code).
|
|
|||
Ich habe es mal laufen lassen, Änderungen
1. 3 Orders (um zu sehen, ob er auch wirklich nur die letzte ändert) 2. Modify_Pending Loop-Zeile geändert 3. FindLastPending Bedingungen geändert Probiers aus, hier der Code von den geänderten: Code:
//+------------------------------------------------------------------+ void CheckForSignal() { //if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP); if(TotalOpenBuyStopPendingOrders() <3) PlacePendingOrder(OP_BUYSTOP); } //+------------------------------------------------------------------+ void Modify_PendingOrder() { Print("Function: ",__FUNCTION__," entered"); double price = 0, //AktuellerEinstieg new_price = 0; //NeuerEinstieg int orderticket= 0; //LetzteBuyStopNummer double Grenzwert = 0; //Log MaximalAbstand double new_SL = 0; //Log NeuerSL double new_TP = 0; //Log NeuerTP Print("Function: ",__FUNCTION__," TotalOpenBuyStopPendingOrders=", IntegerToString(TotalOpenBuyStopPendingOrders()) ); if(TotalOpenBuyStopPendingOrders() > 0) //WartendeBuyStop { Print("Function: ",__FUNCTION__," going into Loop"); for(int i=OrdersTotal(); i>=0; i--) //LoopAlleOrders { Print("Function: ",__FUNCTION__," i=",IntegerToString(i)); if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //SelectTrades { orderticket=FindLastBuyStopPendingOrder(); //LetzteBuyStopNummer Print("Function: ",__FUNCTION__," i=",IntegerToString(i), " orderticket i=",IntegerToString(orderticket) ); if( OrderSymbol()==_Symbol //UnserMarkt && OrderType()==OP_BUYSTOP //BuyStopOrder && OrderTicket()==orderticket ) //IstLetzteBuyStop { Grenzwert=(OrderOpenPrice()-(AbstandZumMarkt*pips)); //MaxAbstand if(Ask <= Grenzwert ) //AskUnterGrenzwert { new_price = Ask + (AbstandZumMarkt*pips); //NeuerEinstieg Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits), " unter Grenzwert=",DoubleToStr(Grenzwert,_Digits), " new_price=",DoubleToStr(new_price,_Digits) ); int new_ticket = OrderModify(OrderTicket(), new_price, (new_price-(SL*pips)), (new_price+(TP*pips)), 0,clrNONE ); if( !new_ticket ) Print("Function: ",__FUNCTION__," failed to modify pending buy stop"); else { new_SL=OrderStopLoss(); new_TP=OrderTakeProfit(); Print("Function: ",__FUNCTION__," changed Ticket=",IntegerToString( OrderTicket() ), " new_price=",DoubleToStr(new_price,_Digits), " new SL=",DoubleToStr(new_SL,_Digits), " new TP=",DoubleToStr(new_TP,_Digits) ); } }//AskUnterGrenzwert else Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits), " noch nicht unter Grenzwert=",DoubleToStr(Grenzwert,_Digits) ); }//OurMarket und BuyStopOrder und IstLetzteBuyStop else Print("Function: ",__FUNCTION__," not OurSymbol, BuyStop or last BuyStopTicket"); }//SelectTrades else Print("Function: ",__FUNCTION__," no MODE_TRADES to select"); }//LoopAlleOrders }//WartendeBuyStop else Print("Function: ",__FUNCTION__," no Open BuyStopPendingOrders"); } //+------------------------------------------------------------------+ int FindLastBuyStopPendingOrder() { int orderticket = 0; //LastTicketNo Print("entered Function: ",__FUNCTION__, " orderticket=",IntegerToString(orderticket)); //Höchste (Letzte) bis Null (Erste), break nach Treffer for(int i=OrdersTotal()-1; i>=0; i--) { Print("entered loop Function: ",__FUNCTION__," i=",IntegerToString(i), " TotalOpenBuyStopPendingOrders=", IntegerToString(TotalOpenBuyStopPendingOrders()) ); if(TotalOpenBuyStopPendingOrders() > 0) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if( OrderSymbol() == Symbol() //OurMarket && OrderType() == OP_BUYSTOP ) //BuyStopOrder { orderticket = OrderTicket(); Print("Function: ",__FUNCTION__," i=",IntegerToString(i), " hat orderticket=",IntegerToString(orderticket) ); break; }//OurMarket and BuyStopOrder else Print("Function: ",__FUNCTION__," not our Symbol or not a BuyStop"); }//SELECT_BY_POS,MODE_TRADES }//TotalOpenBuyStopPendingOrders()>0 }//i=OrdersTotal()-1 Print("Function: ",__FUNCTION__," returns ticket=",IntegerToString(orderticket)); return (orderticket); }//+------------------------------------------------------------------+ |
Lesezeichen |
|
|