Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Hilfe, EA arbeitet ca. 45 Min.,dann streikt er!!! (http://www.expert-advisor.com/forum/showthread.php?t=3936)

schmimanu 27.10.14 16:31

Hilfe, EA arbeitet ca. 45 Min.,dann streikt er!!!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo an die Community!

ich habe ein 2 ziemliche Probleme mit meinem EA:

1. Er arbeitet ca. 45 Minuten und stoppt dann :mad:. Ohne Zeitbegrenzung läuft alles wie geschmiert.

2. Wenn der TP in der Periode, in der die Position eröffnet wurde, die Position schließt, wird sofort eine neue Position eröffnet,..., bis eine neue Perioge beginnt. (Ich hoffe, dass ist verständlich?!). Das ist bei Verlusttrades ein Problem!!!

Der EA läuft auf dem DAX, M1.

Der Code ist im Anhang. Ich würde sehr freuen, wenn mir jemand helfen könnte.

Vielen Dank schon mal und viele Grüße Manuela.

traderdoc 27.10.14 18:51

if(SymbolInfoDouble(Symbol(),SYMBOL_SESSION_VOLUME )==(GewinnMax*Point)) GewinnErreicht=true;
Diese Zeile solltest Du mal ganz genau erklären.

if((NeuePeriodeBegonnen==false)||(GewinnErreicht== true)) {
int Total=OrdersTotal();
bool AllesAus=OrderClose(Total,Handelslots,OrderProfit( ),5,Green);
So darf in der Close-Funktion nie!!!! die Anzahl der offenen Orders + evtl. PendingOrders erscheinen. Ist z.B. keine Order offen und da jetzt Hour = 18 ist, wäre auch NeuePeriodeBegonnen = false, spingt der EA in diese OrderClose-Funktion mit Total = 0. Diese Order existiert aber nie!! D.h. Fehler: invalid ticket for OrderClose function!
Es muß außerdem die Ticketnummer benutzt werden und die Anzahl der Orders!

LongOrder = OrderSend(Symbol(),OP_BUY,Handelslots,Ask,1,0,0,"M AXing Long",MagicNumber,0,Green);
Hier wird eine Integerzahl zurückgegeben, die nur im Strategietester 1 sein könnte. Ansonsten ist das meist eine 6- oder 7-stellige Ticketnummer.
if(LongOrder==1)break; ist somit so oder so überflüssig.
Dito für ShortOrder!
Die Slippage von 1 könnte ggf. zu klein sein, damit bliebe ggf. der EA in der while-Schleife hängen.

double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderSt opLoss(),TakeProfit,0,Orange);
Sollte Dein Broker die Dax-Werte mit einer Kommastelle liefern, dann würde nahezu ständig ein Fehler wegen invalid SL bzw. TP auftreten, denn in der regel liefert der Broker Daten als 9120 oder 9120,0 0der 9120,5. Als SL oder TP werden aber sicherlich häufig Werte errechnet, die als Nachkommastelle keine 0 oder 5 haben und das akzeptiert der Broker nicht und verweigert das OrderModify().

Soweit beim Überfliegen. Das ist noch einiges zu tun!

Ein ernstgemeinter Tip! Nie wieder einen Spaghetti-Code schreiben. Schau Dir in anderen Beispielen an, wie funktional gecodet wird. Das liest und programmiert sich einfacher. Die Länge Deines Codes ist verhältnismäßig kurz. Über mehrere DIN A4-Seiten sieht keiner mehr durch.

Auf die Schnelle im Startegietester läuft der EA über mehrere Tage.

Viel Erfolg!

traderdoc

fxdaytrader 27.10.14 18:52

if((Hour()==HandelsBeginn)&&(Hour()!=HandelsEnde))

Das heißt: Wenn aktuelle Stunde GENAU GLEICH StartStunde UND aktuelle Stunde UNGLEICH EndStunde

Mit anderen Worten: Eine Stunde später (aber noch vor der EndStunde) ist die Bedingung natürlich nicht mehr true, also wird auch nicht mehr gearbeitet. Ist wie ABM - ArbeitBisMittag, lol ... :D

möglicherweise hilft das:
if((Hour()>=HandelsBeginn)&&(Hour()<=HandelsEnde))

Solange die Bedingung für das öffnen der Position true ist wird dann auch eine neue Posi eröffnet. Du müsstest da eine Begrenzung einbauen oder was auch immer.

fxdaytrader 27.10.14 18:54

Der doc war schneller.

solltest du professionelle Hilfe beim Erstellen des EA in Anspruch nehmen wollen (honorarpflichtig) dann kannst Du Dich auch per PM direkt an den Doc wenden.
Erspart viele aus Frust geleerte Pullen Himbeergeist, Bienenstich, usw. :D

edit:
Zitat:

Zitat von traderdoc (Beitrag 27872)
double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderSt opLoss(),TakeProfit,0,Orange);
Sollte Dein Broker die Dax-Werte mit einer Kommastelle liefern, dann würde nahezu ständig ein Fehler wegen invalid SL bzw. TP auftreten, denn in der regel liefert der Broker Daten als 9120 oder 9120,0 0der 9120,5. Als SL oder TP werden aber sicherlich häufig Werte errechnet, die als Nachkommastelle keine 0 oder 5 haben und das akzeptiert der Broker nicht und verweigert das OrderModify().

Ja, das wird häufig vergessen (ich nehme mich da nicht aus) und ist wichtig falls der EA eben nicht nur auf fx-pairs laufen soll. Ich meine der doc hatte da mal eine Lösung geposted, weiß nur nicht mehr wo/in welchem Forum ...

traderdoc 27.10.14 19:00

Noch einmal dazu:

2. Wenn der TP in der Periode, in der die Position eröffnet wurde, die Position schließt, wird sofort eine neue Position eröffnet,..., bis eine neue Periode beginnt. (Ich hoffe, dass ist verständlich?!). Das ist bei Verlusttrades ein Problem!!!

Wie kann ein Trade, der im TP geschlossen, wurde ein Verlusttrade sein? Oder lese ich was falsch?
Das sofortige Neuöffnen liegt am noch bestehenden aktuellen LongSignal.

traderdoc

PS: fx, ich könnte nach dem Spaghetti jetzt wirklich einen gebrauchen, hicks!

schmimanu 27.10.14 20:07

Hallo traderdoc und fxdaytrader!

Das nenne ich schnelle Hilfe und Beantwortung:-)

Spaghetti-Code - schöner Name! Ja, ich gelobe Besserung und werde mich weiter in die Materie vertiefen.

Für professionelle Hilfe bin ich noch nicht verzweifelt genug:D. Aber bevor ich mich sinnlos mit Himbeergeist und Bienenstich vergifte, melde ich mich:D.

Das Grundgerüst für den EA war eine Tutorial-Reihe auf Youtube und ich war für den Anfang froh, eine Anleitung auf deutsch gefunden zu haben.

fxdaytrader, Du hast recht - da lag mein gedanklicher Fehler: >= anstatt ==.

Und traderdoc: die Zeile if(SymbolInfoDouble(Symbol(),SYMBOL_SESSION_VOLUME )==(GewinnMax*Point)) GewinnErreicht=true;
war mein verzweifelter Versuch, einen Tagesgewinn zu programmieren und bei einer bestimmten Gewinnsumme den EA zu stoppen. Habe ich schon rausgenommen. Habe selber gemerkt, dass das Müll ist.

Und
"2. Wenn der TP in der Periode, in der die Position eröffnet wurde, die Position schließt, wird sofort eine neue Position eröffnet,..., bis eine neue Periode beginnt. (Ich hoffe, dass ist verständlich?!). Das ist bei Verlusttrades ein Problem!!!"
So ein Satz entsteht, wenn ich beim schreiben abgelenkt werde. Sorry, in dem Zusammenhang muss es natürlich SL heißen. Obwohl der Fehler sowohl beim SL, als auch beim TP entsteht.

So, Euch beiden, habt erst man vielen Dank für eure schnelle und lustige Hilfe! Falls ich weitere Hilfe brauche, werde ich mich melden.

Viele Grüße - Manuela.

P.S.: Was heißt eigentlich "per PM":confused:

traderdoc 27.10.14 20:19

PM - persönliche Mitteilung.

schmimanu 27.10.14 20:24

Ah, danke!

Gruß - Manuela.


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:37 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum