|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
OrderModify Error
Ich brauch mal wieder Hilfe. So weit klappt alles bei meinem EA aber er will auf Teufel kommt raus nicht den SL nachziehen. Ich hab dazu nochmal einen eigenen kleinen EA Programmiert um es besser zu verstehen aber ich verstehe nicht warum es ein Error gibt.
Code:
int LongTicket; double ZIGZAG[4]; int MagicNumber = 11222; int start() { int i = 0; double value = 0; int count = 0; while (count < 4) { value = iCustom(Symbol(),0,"Swing_ZZ",2,0,i); if (value > 0) { ZIGZAG[count] = value; count++; } i++; } int bs_array[4] = {1,2,3,4}; int Index = ArrayMinimum(bs_array,WHOLE_ARRAY,0); double Tief = ZIGZAG[Index]; double ord=OrderSelect(LongTicket,SELECT_BY_TICKET); if(OrderCloseTime() != 0 || LongTicket == 0) { if(Open[2] < Close[2] && Open[1] < Close[1]) { LongTicket = OrderSend(Symbol(),OP_BUY,1,Ask,0,0.0,0.0,"Long",MagicNumber,0,clrRed); if(LongTicket<0) { Print("Error Long",GetLastError()); } else Print("Long Open"); } } if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true) { if(OrderType() == OP_BUY ) { if(Volume[0]==1) { bool res=OrderModify(LongTicket,OrderOpenPrice(),ZIGZAG[Index],0,0,clrAliceBlue); if(!res) {Print("Error Order Modify PrintER",GetLastError());} } } } return(0); } |
|
|||
Wenn ich mir deinen Code so ansehe, denke ich, bei dir gibt es noch ein wenig Verständnissprobleme (Grundlagen fehlen).
Gehen wir mal kurz durch: Code:
int start() Bedenke das dein Code bei JEDEM Tick ausgeführt wird. Vieles im Code ist nicht bei jedem Tick sinnvoll. Du solltest Bedingungen nutzen! Code:
int bs_array[4] = {1,2,3,4}; int Index = ArrayMinimum(bs_array,WHOLE_ARRAY,0); double Tief = ZIGZAG[Index];
Code:
double ord = OrderSelect(LongTicket,SELECT_BY_TICKET);
Code:
if(OrderCloseTime() != 0 || LongTicket == 0) { ...
Code:
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)==true) { if(OrderType() == OP_BUY) { if(Volume[0]==1) { bool res = OrderModify(LongTicket,OrderOpenPrice(),ZIGZAG[Index],0,0,clrAliceBlue); if(!res) {Print("Error Order Modify PrintER",GetLastError());} } } }
|
|
|||
Ich hab mir mal paar Anleitungen angeschaut und mal denn Code verbessert.
Code:
int LongTicket = 0; extern int StopLoss = 1000; void OnTick() { double StopLossLevel; StopLossLevel = Bid - StopLoss*Point; //--- bool Ord = OrderSelect(LongTicket,SELECT_BY_TICKET); if(OrderCloseTime() != 0 || LongTicket == 0) { if(Open[2] < Close[2] && Open[1] < Close[1]) { LongTicket = OrderSend(Symbol(),OP_BUY,1.0,Ask,0,StopLossLevel,0.0,"Buy Order"); if(LongTicket < 0) { Print("Error"); } else { Print(" Ticket # ist: " +string(LongTicket)); } } } //--- double val; int val_index=iLowest(NULL,0,MODE_LOW,14,4); if(val_index!=-1) val=Low[val_index]; else PrintFormat("Error in call iLowest. Error code=%d",GetLastError()); Comment("Low ist: ",val_index); //--- //--- if(Volume[0]==1) if(LongTicket > 0) if(StopLossLevel < val_index) { bool res=OrderModify(OrderTicket(),OrderOpenPrice(),val_index,0,0,clrAliceBlue); if(!res) Print("OrderModify ERROR. ErrorPR: ",GetLastError()); else { Print("OrderModify hat funktioniert!"); } } |
|
|||
Bitte gründlich durchlesen, dann findest du auch den Fehler.
Manche Sachen habe ich schon in meinem vorherigen Post erwähnt. Diese hast du aber nicht korrigiert! Code:
double StopLossLevel; StopLossLevel = Bid - StopLoss*Point; Code:
double StopLossLevel = Bid - StopLoss*Point; Code:
bool Ord = OrderSelect(LongTicket,SELECT_BY_TICKET);
Code:
if(OrderCloseTime() != 0 || LongTicket == 0) === === === === === === === === === === === === Code:
if(Volume[0]==1) { if(LongTicket > 0) { if(StopLossLevel < val_index) { bool res=OrderModify(OrderTicket(),OrderOpenPrice(),val_index,0,0,clrAliceBlue); if(!res) Print("OrderModify ERROR. ErrorPR: ",GetLastError()); else Print("OrderModify hat funktioniert!"); } } }
|
|
|||
Ich verstehe das mit LongTicket noch nicht so ganz also LongTicket =0; ist ja falsch. Aber wie weise ich ihm denn einen Wert zu? Ich möchte ja genau dieses Ticket aufrufen.
Fangen wir mal ganz von vorne an mir geht es ja in erster Linie darum das nur 1 Order eröffnet wird. Ich hab jetzt gesehen das kann ich auch mit Code:
If(OrdersTotal()==0) So dann schaut er ob die Bedienung stimmt und ist so lange in einer schleife bis LongTicket größer als 0 ist also 1. Code:
if(Open[2] < Close[2] && Open[1] < Close[1] ) { while(LongTicket<=0) { LongTicket = OrderSend(Symbol(),OP_BUY,1,Ask,0,StopLossLevel,0.0,"Buy Open",MagicNumber,0,clrGreen); } |
|
|||
Zitat:
Code:
int LongTicket = 0; was du mit "LongTicket" machen musst (obwohl DU sie ja erstellt hast.). Der Grund, warum dein Code fehlerhaft ist, ist ja der, dass du "LongTicket" eben KEINEN WERT gibst. Einen echten Wert (eben eine ECHTE Ticketnummer) erhält deine Variable "LongTicket" in dieser Zeile: Code:
LongTicket = OrderSend(Symbol(),OP_BUY,1.0,Ask,0,StopLossLevel,0.0,"Buy Order"); Code:
bool Ord = OrderSelect(LongTicket,SELECT_BY_TICKET); ... if(OrderCloseTime() != 0 || LongTicket == 0) Zitat:
Code:
LongTicket = OrderSend(Symbol(),OP_BUY,1.0,Ask,0,StopLossLevel,0.0,"Buy Order"); Deine Frage lässt leider wirklich darauf schließen, das der Code 1-1 von extern übernommen wurde, und du wirklich keine Ahnung davon hast, was da eingentlich passiert! Zitat:
Es nur auf eine Order zu beschränken ist ja nicht das Problem, welches wir hier die ganze Zeit durchgehen! Unter anderem. Aber bitte richtig und passend im Code unterbringen. Aber nochmal, ums Begrenzen ging es hier bisher doch überhaupt nicht. Ja, bis auf die Tatsache, das "LongTicket" NICHT 1 ist, sondern eine Ticketnummer beinhaltet (3783043 als Beispiel...). |
|
|||
Ach jetzt hab ich es verstanden. Nein ein bisschen Ahnung hab ich schon bin zwar noch Anfänger aber immerhin.
Also ja im Grunde möchte ich einfach meinen Stoploss angezogen bekommen. So das wenn er den Trade eingeht ich nicht auf feste Pips angewiesen bin wie mit dem TrailingStop sonder das es Variabel ist. Immer an der letzten Korrektur soll der SL gesetzt werden. So und jetzt zu dem Code Code:
double val; int val_index=iLowest(NULL,0,MODE_LOW,14,4); if(val_index!=-1) val=Low[val_index]; else PrintFormat("Error in call iLowest. Error code=%d",GetLastError()); Comment("Low ist: ",val_index); |
|
|||
So ich bin jetzt ein großes Stück weitergekommen. Erstmal will ich verstehen wie ich ganz genau mit OrderModify umgehen muss deswegen hab ich das alles mal anders gestaltet. Mein Code sieht jetzt folgendermaßen aus:
Code:
void OnTick() { double StopLossLevel = Bid - StopLoss*Point; //--- if(OrdersTotal()==0) if(Close[2]>Open[2] && Close[1]>Open[1]) { LongTicket = OrderSend(Symbol(),OP_BUY,1,Ask,0,StopLossLevel,0.0,"Buy Order",MagicNumber,clrGreen); if(LongTicket < 0) { Print("Error Open Buy",GetLastError()); } else { Print("Ticket # is: " +string(LongTicket)); } } //--- if(OrderType()==OP_BUY) if(Open[8]< Ask) { Trailing(); } //--- return; } void Trailing() { if(OrderSelect(LongTicket,SELECT_BY_TICKET)) bool res=OrderModify(OrderTicket(),OrderOpenPrice(),Open[8],0,0); if(!res) Print("Error ",GetLastError()); else Print("Check"); } 2018.03.11 23:27:57.088 2017.01.03 09:00:27 EaLong2.0 EURUSD,M15: unknown ticket 24 for OrderModify function 2018.03.11 23:27:57.088 2017.01.03 09:00:26 EaLong2.0 EURUSD,M15: Error 4108 2018.03.11 23:27:57.088 2017.01.03 09:00:26 EaLong2.0 EURUSD,M15: OrderModify error 4108 2018.03.11 23:27:57.088 2017.01.03 09:00:26 EaLong2.0 EURUSD,M15: unknown ticket 24 for OrderModify function 2018.03.11 23:27:57.088 2017.01.03 09:00:25 EaLong2.0 EURUSD,M15: Error 4108 Wo liegt jetzt genau der Fehler? |
|
|||
Zitat:
Kann es sein, das du deinen Code vor dem Posten um einige Zeilen verringert hast? Falls nicht, dann hast du hier immer noch die selben Fehler: Code:
void OnTick() { double StopLossLevel = Bid - StopLoss*Point; if(OrdersTotal()==0) { if(Close[2]>Open[2] && Close[1]>Open[1]) { LongTicket = OrderSend(Symbol(),OP_BUY,1,Ask,0,StopLossLevel,0.0,"Buy Order",MagicNumber,clrGreen); if(LongTicket == -1) Print("Error Open Buy",GetLastError()); else Print("Ticket # is: " +string(LongTicket)); } } if(OrderType()==OP_BUY) { if(Open[8]< Ask) Trailing(); } } void Trailing() { if(OrderSelect(LongTicket,SELECT_BY_TICKET)) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Open[8],0,0)) Print("Error ",GetLastError()); else Print("Check"); }
|
|
|||
Hey, also die Punkte habe ich verbessert jetzt funktioniert es auch besser nur kommt jetzt so bald eine Order offen ist der Fehler ERROR 1 obwohl der SL nachgezogen wird in einem Englischen Forum hat einer gemeint das passiert wenn der SL schon nachgezogen ist das Programm es aber auf die selbe ziehen will stimmt das? Sonst hab ich nicht wirklich was gefunden was genau der Fehler ist. Also der Code bis jetzt:
Code:
void OnTick() { double StopLossLevel = Bid - StopLoss*Point; if(OrdersTotal()==0) { if(Close[2]>Open[2] && Close[1]>Open[1]) { LongTicket = OrderSend(Symbol(),OP_BUY,1,Ask,0,StopLossLevel,0.0,"Buy Order",MagicNumber,0,clrGreen); if(LongTicket == -1) Print("Error Open Buy",GetLastError()); else Print("Ticket # is: " +string(LongTicket)); } } else { if(Open[8]< Ask) Trailing(); } } void Trailing() { if(OrderSelect(LongTicket,SELECT_BY_TICKET)) if(OrderType() == OP_BUY) if(!OrderModify(LongTicket,OrderOpenPrice(),Open[8],0,0)) Print("Error ",GetLastError()); else Print("Check"); } |
Lesezeichen |
Stichworte |
error, fehler, mql4, ordermodify, ordermodify error, programmierung, programmierung metatrader, programmierung mql4 |
|
|