Inhalte aufrufen

  • Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden
Profilbild

OrderClose error 4051

- - - - -

  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
13 Antworten zu diesem Thema

  #1
OFFLINE   lion

moin zusammen,

ich nutze zum testen von indikatoren meist die selbe code struktur. jetzt ist der bollinger in kombi mit dem rsi dran.

ich habe verschiedene dinge probiert und komme dennoch nicht weiter. er eröffnet einen trade, schliesst ihn aber nicht mehr. bei long und short (einzeln getestet)

in der execute long funktion wird das ticket zurückgegeben, wonach dann in der else if anweisung gefragt wird. verstehe einfach nicht warum er nicht schliesst.hab den code verglichen mit den anderen indikatoren die ich getestet hab und konnte keine auffälligkeiten feststellen.

ich danke für erfolgreiche hinweise zur ergreifung des fehlers smile.gif

lieben gruss,
lion

hier ist der Teil der checkt ob ein long in frage kommt:
if(IsTradingAllowed())
if(iClose(Symbol(),TimeframeBB,0) > bbLower1){
if(iClose(Symbol(),TimeframeBB,2) < bbLower2 && rsi2 < RSIuntenLong
&& iClose(Symbol(),TimeframeBB,1) < bbUpper1 && rsi1 < RSIuntenLong)
if(orderTicket <= 0){
orderTicket = executeLong();
}
}

else if(iClose(Symbol(),TimeframeBB,0) >= bbUpper0){
if(OrderSelect(orderTicket,SELECT_BY_TICKET) == true){
if(OrderType() == OP_BUY){
bool res = OrderClose(OrderTicket(),OrderLots(),Ask,10000,clr NONE);
orderTicket = 0;
}
}
}

und hier der execute long teil.
int executeLong(){
double entry = Ask;

//double tp = entry + TP * Point;
double sl =entry - SL * Point;

int ticket;
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10000,sl,0,Komm entar,Magic,0,clrNONE);
return ticket;
}



  #2
OFFLINE   lion

aus error 4051 ist jetzt 4108 geworden. ich habe ihn nochmal neu geschrieben und mich auf die einfachste variante beschränkt. er eröffnet jetzt die trades so wie ich es möchte aber in dem journal taucht jetzt der neue error code auf.

 

nach verschiedenen versuchen bin ich am verzweifeln woran es liegen kann. ich kann den logischen ablauf noch so oft durchgehen, ich finde den fehler nicht.

 

im anhang findet ihr jetzt al den code aufs einfachste reduziert. vielleicht kann mir jemand den entsprechenden wink mit dem zaunpfahl geben.

 

 

vielen dank und lieben gruss,

lion

 



  #3
OFFLINE   lion

jetzt it anhang :)

Dateianhang



  #4
OFFLINE   alexf82

ohne es getestet zu haben, aber mach mal aus 

OrderClose(OrderTicket(),OrderLots(),Ask,10000,clr NONE);

 

OrderClose(OrderTicket(),OrderLots(),Ask,10000,clrNONE);


  • lion gefällt das

  #5
OFFLINE   lion

vielen dank für deine antwort alexf82,

 

du meinst aus clr NONE soll ich clrNONE machen. richtig?

 

es ist an allen stellen (Check trade, ist es erlaubt, orderausführung)

im code auf clrNONE geschrieben. das es so richtig ist sehe ich an der roten färbung....



  #6
OFFLINE   lion

theoretisch könnte das clrNONE auch weggelassen werden. bestimmt ja nur die farbe bzw. in diesem fall keine farbe...

 

die orders werden ja auch alle so geschlossen wie es sein soll. es werden sogar neue eröffnet, was ja eigentlich komisch ist wenn was mit der ticket nummer nicht stimmt. bei fehler in der ticket nummer sollte er ja eigentlich keinen trade mehr eröffnen.



  #7
OFFLINE   lion

selbst wenn ich folgende zeilen direkt am anfang der on tick funktion platziere. ändert es nichts an dem fehler. die zeilen sind eigentlich auch nicht nötig da ja der code ansich an jeder stelle mit dem orderticket arbeitet um es auf 0 oder >0 zu setzen

 

if(OrderSelect(longOrder,SELECT_BY_TICKET) && OrderCloseTime() > 0) longOrder = 0;
 if(OrderSelect(shortOrder,SELECT_BY_TICKET) && OrderCloseTime() > 0) shortOrder = 0;


  #8
OFFLINE   lion

ich wollte mal schauen bei welchem trade der fehler zuerst auftaucht. 
 
für mich erstaunlich ist das er vom ersten trade an auftaucht. zu dem zeitpunkt sollte doch das orderticket eigentlich so und so auf 0 sein.
 
mysteriös...wäre sehr dankbar über hilfe

Dateianhang


Bearbeitet von lion, 30 December 2020 - 19:36 Uhr,


  #9
OFFLINE   alexf82

bau dir mal eine Abfrage in den Code, der deine Ticket-Nr auf 0 setzt, sobald keine Order mehr offen ist. dann sollte es glaub ich klappen.

 

du setzt diese nirgends zurück, aber frägst z.b das hier ab:

Please Login or Register to see this Hidden Content

du bist jetzt außerhalb deiner Tradingzeit, der letzte Trade wurde geschlossen. 

Da du außerhalb der Tradingzeit bist, geht er in diese Abfrage. dein orderTicket hat aber immer noch den Wert der letzten, bereits geschlossen Order. Die versucht er nun wieder zu schließen -> gibt natürlich einen Fehler!

 

Also frage ab, ob überhaupt noch eine Order offen ist, falls nicht, setzt dein orderTicket auf 0 und dann sollte es klappen

 


Bearbeitet von alexf82, 30 December 2020 - 20:57 Uhr,

  • lion gefällt das

  #10
OFFLINE   lion

laut meinem bisherigen verständnis (bin noch ziemlich am anfang) wären ja folgende zeilen so eine abfrage:

 

if(OrderSelect(longOrder,SELECT_BY_TICKET) && OrderCloseTime() > 0) longOrder = 0;
if(OrderSelect(shortOrder,SELECT_BY_TICKET) && OrderCloseTime() > 0) shortOrder = 0;
 
denn da wird ja gefragt ob eine order offen ist und wenn nicht dann wird das ticket auf 0 gesetzt.
 
das problem scheint ja im (!IsTradingAllowed()) bereich zu liegen.
 
theoretisch müsste aus meinem bescheidenen verständnis, dann folgendes gemacht werden (rot markiert):
 
if(!IsTradingAllowed()){
if(orderTicket > 0){
 bool res= OrderClose(OrderTicket(),OrderLots(),Ask,1000,clrNONE);
 if(res == true){
shortOrder = 0;
orderTicket = 0;
 }
}
if(orderTicket > 0){
 bool res= OrderClose(OrderTicket(),OrderLots(),Bid,1000,clrNONE);
 if(res == true){
longOrder = 0;
orderTicket = 0;
 }
}  
 }


  #11
OFFLINE   alexf82

ja richtig, so eine Abfrage wäre es vom Prinzip her!

Aber mit der Abfrage setzt du ja nur deine longOrder und deine shortOrder auf 0, nicht dein orderTicket!

 

 

vom Prinzip her, würde dein rotes klappen. Allerdings würdest du 1x den Fehler erhalten, da er ja mind. 1x in die Abfrage geht, weil dein orderTicket einen Wert enthält! Ist er einmal durch die Abfrage durch, steht es auf 0 und würde somit nicht mehr ausgeführt werden.

 

Allerdings hast du z.b. das Problem, wenn dein MT4 neu gestartet werden muss und du eine Order offen hast. Nach dem Neustart wird der EA neu initialisiert und dein orderTicket wäre auf 0, egal ob irgendeine Order offen ist oder nicht.

 

Deshalb musst du immer nach offenen Order abfragen, du kannst es bei jedem Tick machen oder nach Zeit, wie auch immer.

du brauchst als erstes in deinem onTick Bereich folgendnes:

Please Login or Register to see this Hidden Content

wenn es nicht gleich bei jedem Tick geprüft werden soll, sondern z.b. nur alle 5sek

Please Login or Register to see this Hidden Content

}

 

Was passiert aber, wenn mehr als ein Trade offen ist? Oder wird das nie passieren? wirklich nie?

 



  #12
OFFLINE   lion

hey alex,

 

ich habe jetzt folgendes probiert:

 

1. mit verwendung meiner oben genannten zeile

 

geändert wie folgt: f(OrderSelect(orderTicket,SELECT_BY_TICKET) && OrderCloseTime() > 0) orderTicket = 0;aus meinem verständnis greie ich damit auf das orderTicket zu

 

an folgende stellen im code gesetzt:

 

- direkt an den anfang der OnTick funktion

- in den geltungsbereich vom check der order

- in den geltungsbereich!IsTradingAllowed

 

der Fehler 4108 taucht immer noch auf.

 

2.mit verwendung deiner ersten schleife.

 

ich habe sie an die selben geltungsbereiche wie bei punkt 1 gesetzt und der fehler taucht immer noch auf.

 

3. in meinem code wird beim

- check chort/long trade nach schliessen vom tradeorderTicket=0

- bei !IsTradingAllowed

- und bei der Orderausführung (execute s/l) 

bezug auf das Order Ticket genommen. es ist für mich (als MQL4 anfänger) nicht verständlich wo der fehler liegen kann.

 

 

ja richtig, so eine Abfrage wäre es vom Prinzip her! Aber mit der Abfrage setzt du ja nur deine longOrder und deine shortOrder auf 0, nicht dein orderTicket!

 

deswegen hab ich die zeile so geändert wie oben beschrieben > wäre dann ja der richtige bezug> erfolglos 

 

om Prinzip her, würde dein rotes klappen. Allerdings würdest du 1x den Fehler erhalten, da er ja mind. 1x in die Abfrage geht, weil dein orderTicket einen Wert enthält! Ist er einmal durch die Abfrage durch, steht es auf 0 und würde somit nicht mehr ausgeführt werden.

 

verstehe ich nicht. wenn es klappen könnte. warum kommt dann eine fehelermeldung?

 

Allerdings hast du z.b. das Problem, wenn dein MT4 neu gestartet werden muss und du eine Order offen hast. Nach dem Neustart wird der EA neu initialisiert und dein orderTicket wäre auf 0, egal ob irgendeine Order offen ist oder nicht.

 

das problem sollte ja mit der schleife im OnInit() geltungsbereich geklärt sein. oder ist sie nciht ganz vollständig?

 

Was passiert aber, wenn mehr als ein Trade offen ist? Oder wird das nie passieren? wirklich nie?

 

es ist nicht geplant, dass mehr als ein trade offen ist. aus meinem verständinss wäre das problem aber mit shortOrder=0 / longOrder=0geklärt.

 

wie du siehst, ich komme trotz vieler gedanken nicht auf den richtigen pfad.

 

vielen dank und lieben gruss  

 



  #13
OFFLINE   alexf82

Hallo lion,

 

anbei eine schnelle Fassung, wie es ohne Fehler klappt. 

Es ginge auch noch eleganter, aber ohne jetzt deinen Code großartig umzuschreiben und aufgrund Zeitmangels ....

aber so würde es normal klappen, ohne dass du einen Close-Fehler erhältst.

 

Grüße

Alex

 

Dateianhang


  • lion gefällt das

  #14
OFFLINE   lion

hey alex,

 

vielen vielen dank! 

 

es funktioniert erstmal. ich verstehe leider immer noch nicht was in der abfrage oder ausführung !IsTradingAllowed nicht stimmt.aber dem widme ich mich zu eine späteren zeitpunkt.

 

nochmal vielen dank!

 

lieben gruss,

lion





Similar Topics

  Thema Eröffnet von Statistik Letzter Beitrag




0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer