|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Zitat:
in einer Variablen zu speichern, oder in OrderSend direkt aufzurufen, ist also wertlos. Hab dir oben schon zwei Beispiele geschrieben, wie du die Funktion nutzen kannst. Das ist ja der Knackpunkt. Ausgeführt wird eine Order ja eben nur dann, wenn OrderSend kein Problem hatte. Also muss die Ursache für das Scheitern der Orderausführung beseitigt werden. Zitat:
In deinem Code würde er beim Fehlschlag halt nur noch EIN EINZIGES MAL versuchen zu senden. Da die meisten Fehlschläge aber mit einem Fehler in der Parameterliste, und nicht mit einem "zufällig" fehlgeschlagenem Abarbeiten seitens des Brokers zu tun haben, würden weitere, direkte OrderSend-Versuche einfach nur die gleichen, unveränderten Parameter mitgeben und wieder und wieder fehlschlagen. Deshalb: Zitat:
Vor allem, wenn ein EA vollautomatisch für dich traden soll, du also nicht "zuschaust", muss der EA ja auf solche Probleme selber reagieren können. Hier findest du die ErrorCodes, von denen wohl am meisten die 128-134 ausschlagen dürften. Eine mögliche Umsetzung könnte z.B so aussehen: Code:
double lot = LotSize(); ResetLastError(); LongOrder1 = OrderSend(NULL,OP_BUYSTOP,lot,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow); if(LongOrder1 == -1) { // Ein paar Fehler anschauen: switch(GetLastError()) { case 129: { // Falscher Preis... break; } case 130: { // Falscher Stop. // Häufiger Fehler bei der Berechnung(Kurs,Stop,Punkt) ist das Vertauschen // von +/- zum Kurs (Kurs +/- Stop*Point) break; } case 131: { // Falsches Volumen (Lot). // Mögliche Ursachen: // - Angabe, die nicht mit den Lot-Schritten (MODE_LOTSTEP) übereinstimmt. // - Der momentane Account (z.B. Microaccount) erlaubt keine größeren // Lot als ... break; } ... } } ResetLastError(); ShortOrder1 = OrderSend(NULL,OP_SELLSTOP,lot,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed); if(ShortOrder1 == -1) { // Entsprechend wie oben... } if(LongOrder1 > 0 && ShortOrder1 > 0) TradeActionVierZehnUhr++; |
|
|||
Hallo Next. Ich du machst dir echt Arbeit mit deinen Beiträgen, herzlichen Dank.
Lass uns mal ausschließlich beim Fehlerauslesen bleiben, ich denke das ist der Hauptknackpunkt der mein EA Projekt gefährden kann. Ich habe mir jetzt die ErrorCodes abgeschaut. Mit dem einen oder anderen Error hatte ich auch schon zu tun.. Du schreibst: Zitat:
Aber sagen wir mal folgendes. Ich mache dann eine Abfrage wie du sie gepostet hast: Code:
if(LongOrder1 == -1) { // Ein paar Fehler anschauen: switch(GetLastError()) { case 129: { // Falscher Preis... break; } Angenommen falscher Preis.. Ich müsste dann ja im Vorfeld wissen warum und wieso der Preis falsch ist, um eine Entsprechende Regelung zu Programmieren. Das würde aber bedeuten ich könnte auch gleich die richtige Berechnung in den Code schreiben. Bei 128, Trade Timeout könnte ich natürlich die Regel formulieren das er es noch einmal versuchen soll. Machst du persönlich es bei deinem EA/EA´s so das du echt zu jedem Error bereits eine passende Lösung in das Programm schriebst? Bei TimeOut und vielleicht einigen anderen kann ich das Verstehen, aber bei anderen? Bei "falscher Stop" beispielsweise, wie sollte man da passend reagieren? Man hat es ja im Code selbst schon nach bestem Wissen und Gewissen formuliert. Ich denke als ersten Schritt werde ich mal einbauen das er mir eventuelle Error ins Journal schreibt. MfG Lampe |
|
||||
Zitat:
Aber auch da hängt es natürlich davon ab, was wie programmiert wurde. Zitat:
In dem Beispiel mit dem Preis, könnte ein erneutes OrderSend() ein paar Sekunden später, nach dem Refreshen der Preise helfen. Zitat:
als eine Berechnung zusammen mit der Nachkommastelle falsch war. Allgemein muss noch dazu gesagt werden, nur weil es diese Fehlercodes gibt, heißt das noch lange nicht, das man jetzt JEDEN davon behandeln muss, schon garnicht bis ins letzte Detail. Du kannst ja programmiertechnisch auch nicht ALLE Fehlerquellen neutralisieren. Setz einfach gewisse Routinen (wie z.B. beim Preis aktualisieren und erneut senden) um. Wenn wiederholte Versuche auch fehlschlagen, sollte man OrderSend erstmal stoppen und selbst nachschauen warum, denn bei mir kann ich meine bisherigen Probleme mit OrderSend an einer Hand abzählen. Was ich damit sagen will, es ist, bei vernünftiger Programmierung eher selten (oder gar eine Ausnahme), als die Regel, das OrderSend fehlschlägt. Vorausgesetzt natürlich man setzt ein paar Routinen sinnvoll ein. Wenn z.B. die Berechnung deines Stops richtig implementiert ist (Wert, Digits, Berechnung entsprechend Ordertyp, ect...), so wirst du auch kaum mit entsprechendem Fehlercode in Kontakt kommen. Zitat:
Bei gewissen Fehlercodes sind die Ursachen natürlich eindeutig (INVALID_TRADE_VOLUME, MARKET_CLOSED,TRADE_DISABLED, ect...), bei anderen kann man wiederum einfach NICHT alles abdecken! Mit meinem EA trade ich momentan noch manuell. Ich habe beim Fehlschlag von OrderSend einfach nur eine Meldung und weiß bescheid. Daher kann ich dir auch sagen, das Fehler bzgl. OrderSend bisher wirklich kaum vorhanden waren. Wie gesagt, die wichtigsten Errors abfangen und mögliche Lösungen als Routine implementieren. Bei weiterem Misserfolg dann OrderSend stoppen und manuell nachschauen, denn dann ist es wahrscheinlich ein Problem der Programmierung (wie z.B. bei mir damals, als die eigentliche Berechnung im Code richtig implementiert wurde, die Werte, mit der sie gefüttert wurde, aber an früheren Stellen im Code teilweise falsch erfasst / bearbeitet wurden). PS: Du kannst auch mal einen Blick hier reinwerfen. |
|
|||
Ja, manchmal staunt man immer wieder, woran man alles denken muss.
Z.B. existiert beim Broker AVATrade und dem Handelsinstrument DAX ein Digit = 1. Also bekamen alle SL- und TP-Berechnungen ein NormalizeDouble(blablabla, Digits), d.h. 1 Stelle nach dem Komma. So weit so gut, aber häufig (nicht immer!) bekam ich den Fehler des Invalid SL/TP! Warum ging es manchmal und warum aber häufig nicht? Im Nachgang ganz einfach: die TickSize dieses Handelsinstruments ist ungewöhnlicherweise 0.5! D.h. die Orderfunktionen akzeptieren nur double-Werte mit einer 0 oder einer 5 nach dem Komma!! Alle anderen Kommastellen führen zum o.g. Fehler. Ja, da muss man erst mal drauf kommen! traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo Leute. Nicht wundern das ich derzeit nicht so oft vorbei schaue, ich befinde mich für einige Wochen ausser Haus und habe wenig Zeit für die sonst alltäglichen Aufgaben.
Ich möchte nochmal Next danken, wie Doc anfangs schon andeutete hast du vermutlich viel Zeit in deine Posts investiert, das weiß ich wirklich zu schätzen! Ich komm mir da schon etwas blöd vor aber mehr als Danke sagen kann ich hier nicht, also vielen Dank!! Nachdem der EA die letzten 2 Wochen fehlerfrei lief trat heute wieder der Fehler auf, das er um 14 Uhr die Falsche Kerze verwendet hat um Entry und Stop zu setzen. Das ist auch der Grund für mein Handeln jetzt, ansonsten hätte ich gesundheitlich auch gerne mal 5 Woche ruhe vom Traden und allem, was dazu gehört. Nichts desto trotz habe ich in den Code geschaut und folgenden Fehler entdeckt: Code:
//Periodenbeginn prüfen if(PeriodenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; } else NeuePeriodeBegonnen = false; if((NeunUhrEins==true)||(ZehnUhrEins==true)||(ElfUhrEins==true)||(ZwoelfUhrEins==true)||(DreizehnUhrEins==true)||(VierzehnUhrEins==true)||(FuenfzehnUhrEins==true)||(SechzehnUhrEins==true)||(SiebzehnUhrEins==true)||(AchtzehnUhrEins==true)||(NeunzehnUhrEins==true)||(ZwanigUhrEins==true)||(EinUndZwanzigUhrEins==true)) { PeriodenStartZeit=Time[0]; } if((VierzehnUhrRoutine==true)&&(TradeActionVierZehnUhr==0)&&(NeuePeriodeBegonnen=true)) Bei NeuePeriodeBegonnen steht bzw stand allerdings nur ein = Zeichen. Die Order wurde 13.59.59 Uhr gesetzt statt 14.00.00. Meine Frage, wenn da nur ein = steht, verfehlt ja der Befehl seine Wirkung. Ich vermute daher das eben dies den Fehler verursacht hat, wie seht ihr das? MfG Lampe (Wenn mir jemand Antwortet, kannst du mir bitte noch kurz die Zeile verraten die schreiben muss um eventuelle Errors auszulesen? Print...) |
|
|||
Das hätte eigentlich einen Compilerfehler ergeben müssen.
Setze mal an den Anfang des Programms die Zeile #property strict Dann sollten solche Fehler auf jeden Fall erkannt werden. Ja klar muss da auch == stehen. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi Doc,
bei mir stand auch damals schon strict beim compilieren, hat mir keinen Fehler angezeigt. Ich vermute du siehst den Fehler darin, das ich mehrere Unterschiedliche Bedingungen in einer if() Klammer zusammengefasst habe? Meintest du das? Ich bin jetzt wieder zuhause und will grade meine zweite Strategie fertig stellen, stoße aber auf einen Fehler. Mein Ziel ist es das kein Trade gemacht wird wenn es auf dem H1 Chart zu einem GAP kam. Also, wenn der erste Tick der neuen Kerze, ausserhalb der Hoch und Tief Spanne der Vorkerze liegt, soll kein Trade gesetzt werden. Vorläufig sieht das bei mir so aus: Code:
//GAP-Auslesen PeriodenEroeffnung=(iOpen(NULL,PERIOD_H1,0)); Tief=(iLow(NULL,PERIOD_H1,1)); Hoch=(iHigh(NULL,PERIOD_H1,1)); if(Tief<PeriodenEroeffnung) { if(Hoch>PeriodenEroeffnung) { KeinGap=1; } } else(KeinGap=0); Leider funktioniert das aber so nicht. Kann mir einer einen Tipp geben wie ich da vorgehen kann? MfG Lampe |
|
|||
Zitat:
Zitat:
mögliches "=" hingewiesen und erwähnt, das ein gleicher Kurs für ihn vielleicht kein Gap wäre: Code:
if(PeriodenEroeffnung >= Tief && PeriodenEroeffnung <= Hoch) KeinGap = 1; else KeinGap = 0; anstatt eine Int-Variable zu nutzen. Und sofern der Doc deinen Beitrag bis zum Schluss lesen würde, hätte er wegen folgendem vielleicht sogar noch seinen Post zitiert... PS: Sagte ich schon vielleicht ??? |
|
|||
Der Doc hat überhaupt nichts gegen mehr Bedingungen im if, solange die Übersicht erhalten bleibt.
Auf jeden Fall hätte der Doc nichts gegen ein bool KeinGap; denn dann wäre es auch egal ob ein = oder == stehen würde, weil dann weder das eine noch das andere gebraucht wird. Ein if (KeinGap) oder ein if (!KeinGap) sieht doch auch viel eleganter aus! Das nennt man auch minimalistische Perfektion. In diesem Sinne, (vielleicht) wird alles gut. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Na dann mal Herzlichen Dank an:
NextUser und Traderdoc für eure Beteiligung und Hilfestellung seit meinem letzten Post. Vielleicht, wäre es für alle Beteiligten gut gewesen einfach den Compilierfehler zu benennen anstatt ein Rätselraten auszulösen und mich suchen zu lassen. Vielleicht, wurde mir aber auch kein Compilierfehler angezeigt obwohl ich die besagte Einstellung auf strict zu stehen hatte. Moment das weiß ich ja, also nicht vielleicht sondern es war so. Vielleicht, weiß ich jetzt immer noch nicht welchen Fehler Doc am Anfang der "vielleicht Orgie" meinte. Na der EA läuft auch so, vielleicht war es nicht so schlimm. Ich hätte jetzt vielleicht noch eine Frage, vielleicht möchte mir ja jemand kurz und bündig, jedoch Aussagekräftig Antworten. Vielleicht auch nicht. Ich möchte gerne Abfragen ob der LETZTE gemachte Trade im Plus oder im Minus geschlossen hat. Also, ob es ein Gewinn oder Verlust Trade war. Wie kann ich das machen? Danke, vielleicht bis später. MfG Lampe |
Lesezeichen |
Stichworte |
hilfe, lernen, mql4, mql4 aufbau, mql4 hilfe, mql4 lernen, programmierung, programmierung metatrader, programmierung mql4, starthilfe |
|
|