Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3872
Beiträge: 37190
Benutzer: 6.156
Aktive Benutzer: 437
Links: 80
Wir begrüßen unseren neuesten Benutzer: kraus10
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 10 Stunden
- kraus10
vor 18 Stunden
- ultragrass...
vor einem Tag
- shanmughav...
vor 3 Tagen
- Aline
vor 4 Tagen
- GPCecchett...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 44
Gesamt: 44
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Werbung

Like Tree33Likes
Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #71 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 271
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Lampe Beitrag anzeigen
Das mit dem LotSize wird ich morgen umsetzen. Ich habe halt ausserhalb von OnTick, also vermutlich Global, die LotSize Berechnung die ungefähr so aussieht:
Ja, da sieht du ja selbst, das ein double beim Aufruf zurückgegeben wird. Dein loser Aufruf weiter oben, ohne den Rückgabewert
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.

Zitat:
Zitat von Lampe Beitrag anzeigen
Wie schaffe ich es denn dann, das er die Fehlerhafte Order noch sendet?
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:
Zitat von Lampe Beitrag anzeigen
Alternativ, habe ich denn noch andere Möglichkeiten ausser mit einer Schleife zu arbeiten?

*ich wechsel mal kurz in den Editor und schreib dann hier weiter*

So. Ich habe jetzt mal folgendes geschrieben.

Code:
if(a==0)
         if(t==0)
            {
            LotSize();
            LongOrder1=OrderSend(NULL,OP_BUYSTOP,LotSize,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);
            ShortOrder1=OrderSend(NULL,OP_SELLSTOP,LotSize,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
            if(LongOrder1<=0)
               {
               LongOrder1=OrderSend(NULL,OP_BUYSTOP,LotSize,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);
               }
            if(ShortOrder1<=0)
               {
               ShortOrder1=OrderSend(NULL,OP_SELLSTOP,LotSize,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
               }   
            if((LongOrder1>0)&&(ShortOrder1>0))
               {
               TradeActionVierZehnUhr++;
               }
            } 
         }
Mein Gedanke, wenn eine der beiden Orders nach dem ersten Senden noch keine Ticketnummer hat, geht er in die if Bedingung und sendet die fehlende Order nach. Wenn am Ende beide ne Ordernummer haben also größer als 0 sind => TradeAction++.

Ist das eine Herangehensweise die irgendwo Sinn macht oder ist das Blödsinn?
Die Herangehensweise an sich kann unterschiedlich sein. Ob jetzt mit if's oder ne Schleife spielt keine entscheidende Rolle.
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:
Zitat von Lampe Beitrag anzeigen
Die Entscheidene Frage ist ja auch, muss ich zwangsläufig FehlerCodes abfragen?
JA, denn die sagen dir ja, WIESO dein OrderSend fehlgeschlagen ist. Nur dann kannst du ja auch RICHTIG darauf reagieren.
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++;
Lampe likes this.
Mit Zitat antworten
  #72 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: Jan 2018
Beiträge: 38
Lampe befindet sich auf einem aufstrebenden Ast
Standard

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:
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,
Daraus schließe ich, die meisten Fehler entstehen aus einer fehlerhaften Programmierung heraus. Nun ist es doch aber so das man im Backtest, zumindest auf Tickbasis, schon ziemlich viele Errormeldungen kriegt die bei Live Handel auch kommen würden. So war es auch bei mir und ich habe sie alle beseitigen können. Live hat mein EA jetzt seit dem 01.02. auch bereits Trades abgesetzt. Abgesehen von der einen Sache, als er die falsche Kerze zur Berechnung heran zog, lief alles gut. Ich gehe also davon aus das der Code ersteinmal so keine Fehler hat, also die Parameterliste korrekt ist.

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;
      }
Jetzt könnte ich den Fehler auslesen, im Nachhinein sofern ich nicht vorm Rechner sitze, und ihn dann beheben. Aber wie sollte ich es denn schaffen das der EA selbstständig auf Fehler reagiert?

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
Mit Zitat antworten
  #73 (permalink)  
Alt vor 2 Wochen
Mitglied
 
Registriert seit: May 2015
Beiträge: 271
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Lampe Beitrag anzeigen
Nun ist es doch aber so das man im Backtest, zumindest auf Tickbasis, schon ziemlich viele Errormeldungen kriegt...
Da kann ich deine Aussage nicht ganz nachvollziehen. Ich persönlich bekam in einem Backtest nie "viele Errormeldungen".
Aber auch da hängt es natürlich davon ab, was wie programmiert wurde.

Zitat:
Zitat von Lampe Beitrag anzeigen
Jetzt könnte ich den Fehler auslesen, im Nachhinein sofern ich nicht vorm Rechner sitze, und ihn dann beheben. Aber wie sollte ich es denn schaffen das der EA selbstständig auf Fehler reagiert?
Indem du mögliche Fehler im Code abfängst UND MÖGLICHE Lösungen integrierst.
In dem Beispiel mit dem Preis, könnte ein erneutes OrderSend() ein paar Sekunden später, nach dem Refreshen der Preise helfen.

Zitat:
Zitat von Lampe Beitrag anzeigen
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.
Gerade beim Fehler "Preis" wirst du nicht sooo viele Quellen des Problems haben. Ich selbst hatte diesen Fehler nur 1 mal relativ am Anfang,
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:
Zitat von Lampe Beitrag anzeigen
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?
Um den Unterschied zu verdeutlichen, eine PASSENDE Lösung wird i.d.R. nicht implementiert, sondern eine MÖGLICHE Lösung auf Basis einer MÖGLICHEN Ursache.
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.
Lampe likes this.
Mit Zitat antworten
  #74 (permalink)  
Alt vor 2 Wochen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.922
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
Lampe likes this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #75 (permalink)  
Alt vor 3 Tagen
Mitglied
 
Registriert seit: Jan 2018
Beiträge: 38
Lampe befindet sich auf einem aufstrebenden Ast
Standard

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))
Ich weiß, das ==true ist überflüssig. Doch wie oben erwähnt möchte ich jegliches nicht unbedingt wichtiges derzeit ruhen lassen. Solange das also dem Code nicht schadet lasse ich erstmal so.

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...)
Mit Zitat antworten
  #76 (permalink)  
Alt vor 3 Tagen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.922
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
hilfe, lernen, mql4, mql4 aufbau, mql4 lernen, programmierung, programmierung metatrader, programmierung mql4, starthilfe


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------