Moving Average Ordersend Error 131
Updated EA, Backtesting, gemeinsame Fehler und einige Arbeits-Code Joined Jul 2008 Status: Mitglied 62 Beiträge Dieser Thread könnte von Interesse für diejenigen von Ihnen, die beginnen wollen oder bereits begonnen haben, die Entwicklung ihrer eigenen Custom Expert Advisor. Dies ist nicht ein quotMetaTrader 4 MQL Expert Advisor Tutorialquot oder so ähnlich, könnte aber für Anfänger helfen, verhindert, dass einige Fehler und bieten Arbeitscode für einige der häufigsten Funktionen. Vor ein paar Monaten habe ich meine erste, sehr einfache EA nur für Lernzwecke geschrieben und ich habe es in diesem Thread veröffentlicht. Ich habe versucht, es so einfach wie möglich zu halten und haben viele Kommentare, um es einfacher für Anfänger, die Strategie meiner EA zu folgen und wie ich es implementiert. In den letzten Wochen las ich viel über Chartanalyse, Intermarketanalyse und Preisprognose mit neuronalen Netzen. Daneben habe ich einige Bibliotheken entwickelt, die häufig benötigte Funktionen wie Moneymanagement, Ordermanagement, Fehlerbehandlung und Fehlerprotokollierung enthalten. Und ich habe auch viel über Backtesting, Validierung und Kurvenanpassung Probleme gelernt. Gemeinsame Backtesting-Fehler habe ich am Anfang Und das ist schon der Punkt, der nicht wirklich intelligent mit meinem letzten Ansatz: Ich habe die EA für einen bestimmten Zeitraum optimiert und dann die EA für den gleichen Zeitraum getestet. Dont tun, dass Und wenn Sie tun - nehmen Sie nicht diese Ergebnisse und glauben, dass Sie die ultimative Holy-Grail-EA gefunden Wir wollen eine EA, die nicht nur erstellen schöne Equity-Kurven für unsere optimierte Periode (Kurve passenden Quote) Sondern auch für die Zukunft. Bild wollen wir eine EA, die die Tages-Chart als Zeitrahmen und wir haben die folgenden Zeitreihen-Daten zu schreiben: Wir jetzt tun Backtesting und Optimierung der EA. Das bedeutet, dass wir die gleitenden Mittelwerte, das Risiko, die nachlaufende Stoppgröße (oder die Variablen, die wir in unserer EA verwenden) bestimmen, die die höchste Balance (niedrigster Drawdown, erwartete Auszahlung) ergeben. Wenn wir dies für den gesamten Zeitraum 2003 bis 2008 tun, können wir eine sehr schöne Kurve bekommen, aber wir haben keine Ahnung, wie die EA im Jahr 2009 ausführen würde. Eine mögliche Lösung ist, dass wir die Zeitreihendaten in zwei Teile einteilen: Eine für die Optimierung und einen Teil für die Validierungstests: Jetzt würden wir eine Optimierung für die Jahre 2003-2005 vornehmen und diese Werte für das Testen im Jahr 2006 verwenden. Wenn wir noch gute Ergebnisse erzielen, wäre unsere EA in der Zukunft erfolgreich gewesen, obwohl wir sie getestet haben die Vergangenheit. Weil die EA nicht für das Jahr 2006 optimiert wurde. Wir können dies für die nächsten Jahre wiederholen und versuchen, diese Einstellungen, die gute Ergebnisse für alle oder die meisten Perioden zu finden. Ich weiß nicht, welchen Zeitraum Sie für die Optimierung wählen sollten und welche zum Testen. Dieses ist Versuch und Störung und hängt auch vom Zeitrahmen ab, den Sie wählen, um Ihr EA an zu lassen. Verbesserte Modellierungsqualität Je mehr Daten Sie haben, desto besser (bedeutet genauer) die Backtesting-Ergebnisse. Hier ist eine Möglichkeit, die Modellierqualität zu verbessern: Wählen Sie im Optionsmenü von MetaTrader 4 (drücken Sie CtrlO) die RegisterkarteChartsquot und legen Sie diese Werte für quotMax-Balken in Historyquot und quotMax-Balken in chartquot fest: 2147483647 - Klicken Sie auf OK. Als nächstes öffnen Sie die History Center in MT4 (drücken Sie F2), wählen Sie das Währungspaar in der Symbolliste auf der linken Seite und wählen Sie den niedrigsten Zeitrahmen, 1 Minute (doppelklicken Sie es). Drücken Sie quotDownloadquot und beantworten Sie quotOKquot, wenn Sie die Warnung erhalten. Es kann einige Minuten dauern, bis alle historischen Werte heruntergeladen wurden. Ich habe 3,5 Mio 1-Minuten-Kerzen, das ist die letzten 10 Jahre in Minuten Sollte genug sein. Sie können dies mit jedem Zeitrahmen und Währung zu tun, oder verwenden Sie das enthaltene Skript quotperiodconverterquot, die mit MT4 kommt. Als nächstes werde ich Ihnen mit einigen Bibliotheken, die ich geschrieben habe und die mir helfen, nicht zu überschreiben, jedes bisschen Ich brauche oft. Ich speichere alle offenen Aufträge in einem Array (nur die Aufträge, die die EA eröffnet hat), damit ich sehen konnte, wie viele Aufträge insgesamt eröffnet wurden. Und ich habe eine kleine Funktion geschrieben, die das Öffnen einer Position vereinfacht. Define MAGICNUMBER 29031985 Maximal erlaubter Schlupf für die Auftragsausführung define SLIPAGE 5 Alle offenen Aufträge in diesem Array speichern int Ticket 9193 Stellen Sie offene Positionen für eine bestimmte Währung auf und sichern Sie unsere Aufträge im Ticket-Array. Wir können nicht einfach ArraySize (Ticket) zurückgeben, da einige Aufträge bereits gestoppt werden konnten. Int countOpenOrders () return (updateOrderManager ()) Öffnet eine neue Position und gibt den Fehlercode param Paarwährungspaar zurück, verwenden Sie EURUSD oder Symbol () param Befehl VERKAUFEN oder VERKAUFEN - verwenden Sie nicht OPBUY oder OPSELL param Losgröße des Auftrags in Lot param stoploss (Befehl BUY - Befehl kaufen) return (OrderSend (Paar) OPBUY. Load. profit. MAGICNUMBER 0. Grün)) Verkaufsbefehl send else if (Befehl SELL-Befehl Verkauf) return (OrderSend (Paar) OPSELL. lot Bid ) Aktualisiert alle Informationen über die aktuell geöffneten Aufträge. Speziell sieht durch alle Aufträge, wenn sie noch aktiv sind oder möglicherweise durch Stop-Verluste gestoppt wurden und speichert ihre Ticket-Nummer in Ticket-Array. Int updateOrderManager () int count 0 ArrayResize neu berechnen (Ticket 0) Alle Aufträge für (int i 0 i lt OrdersTotal () i) Interessieren Sie sich nur für Trades, die sich im Tradingpool befinden. Geschlossene oder abgebrochene Aufträge sind Nicht interessant für uns, wenn (OrderSelect (i. SELECTBYPOS MODETRADES) false) break Count Positionen, die von unserem EA geöffnet wurden, wenn ((OrderMagicNumber () MAGICNUMBER)) Resize Ticket-Array und speichern Ticket ArrayResize (Ticket TicketTicket () Rückgabe der offenen Positionen Rückgabe (Anzahl) Ticket - speichert alle Ticketnummern der aktuell geöffneten Bestellungen der EAs updateOrderManager () - sollte jedes Häkchen oder bevor Sie Ticket verwenden möchten, aufgerufen werden, da es sich um einen Auftrag handeln könnte Geschlossen gestoppt. Diese Funktion aktualisiert das Ticket-Array countOpenOrders () - zählt die Anzahl der offenen Aufträge, einfach ein Nebenprodukt der vorherigen Funktion newMarketOrder (String-Paar, String-Befehl, Doppel-Lot, Double Stoploss, Double Takeprofit) - macht es einfacher für mich zu öffnen Eine neue Bestellung. Pair kann zBEURUSDquot sein oder mit Symbol () das aktuelle Symbol des angehängten Diagramms verwenden. Der Befehl ist entweder "BUYquot" oder "SELLquot", Lot, Stoploss und Takeprofit sind selbsterklärend. Die Slipage ist am Anfang des Codes definiert, nur Marktbestellungen sind möglich. Aber es ist kein Problem, eine Funktion newPendingOrder schreiben. Dies ist eine sehr einfache Bibliothek, die verwendet werden, um die aktuelle freie und gebrauchte Marge, Eigenkapital, Gleichgewicht und Gewinn zu berechnen. Wichtiger ist die Funktion, die optimale Losgröße für ein gegebenes Risiko und einen Stopverlust zu berechnen. Externe Variablen extern double Risiko 0,02 double balance 0,00 double equity 0,00 double marginFree 0,00 double marginUsed 0,00 double marginUsedPercent 0,00 double marginUsablePercent 0,00 double profitLossPercentage 0.00 Berechnen Sie die optimale Losgröße Wenn sl gesetzt ist, berechnen Sie die Losgröße nach Stop-Loss, sonst verwenden Sie das Risiko der Marge Als Losgröße Parameter: sl, Stop-Verlust im Point-Value (zB 0,0050 50 Pips) doppelte LoseOptimierte (doppelte Stoploss) doppelte Lose Setzen Sie das Risiko in korrekten Grenzen, wenn (Risiko lt 0,001) Risiko 0,001 if (Risiko gt 0,50) Risiko 0,50 doppelte Hebelwirkung MarketInfo (Symbol (), MODELOTSIZE) MarketInfo (Symbol (), MODEMARGINREQUIRED) Berechnen Sie die benutzte Marge nach Risiko, wenn der Stopverlust zu klein ist, wenn ((stoploss lt MarketInfo (Symbol (), MODESTOPLEVEL)) ampamp (stoploss gt 0) AccountEquity () Risk Leverage MarketInfo (Symbol (), MODELOTSIZE) Berechnen Sie Los, so dass nur Risiko des Eigenkapitals verloren gehen kann Übersetzen stoploss to pip values if stoploss negativ, machen Sie es positiv if (stoploss lt 0) stoploss - stoploss MarketInfo (Symbol MODULOTSIZE) MarketInfo (Symbol (), MODEPOINT) Berechnen Sie den benötigten Wert pro Pip, um das Risiko zu beeinträchtigen. PipValuePerLot MarketInfo (Symbol (), MODELOTSIZE) Korrekter Betrag des Kapitals nach sl-Größe doppelt NeededPipValue AccountEquity () Risk stoploss Berechnen Sie die optimalen Losgrößenmengen NeededPipValue PipValuePerLot Prüfen Sie, ob die Losgröße in den korrekten Grenzen liegt (Lots lt MarketInfo (Symbol (), MODEMINLOT)) Lose MarketInfo (Symbol () (MODEMAXLOT)) Lose MarketInfo (Symbol (), MODEMAXLOT) Berechnet die aktuelle freie, verwendete Margin und andere Werte double updateMoneyManager () balance AccountBalance () equity AccountEquity () MarginFree AccountFreeMargin () ) MarginGesamtes MargeGesamtes MarginGesamtes MarginUsedPercent MarginGesamtes Eigenkapital 100 MarginUsablePercent MarginFree Eigenkapital 100 GewinnLossPercentage AccountProfit () Saldo 100 updateMoneyManager () - berechnet die aktuelle freie und gebrauchte Marge, spart Eigenkapital, Bilanz und Gewinn in den Variablen. LotsOptimized (double stoploss) - berechnet die optimale Losgröße für einen Auftrag unter dem gegebenen Risiko - und Stopverlust. Das Risiko ist am Anfang der Datei definiert: 0,02 bedeutet: Dont Risiko mehr als 2 des Gesamtbetrages des Eigenkapitals. Konto-Eigenkapital 10.000 Risiko 0.02 2 Stop-Verlust bei EURUSD ist auf 0.0100 100 Pips Wir riskieren nur 2 von 10.000 200 Pip-Wert pro Los: 100.000 x 0.0001 10 Stop-Verlust 100 Pips bedeutet, dass wir einen Pip-Wert pro Los von 200 100 2 wollen Dies bedeutet, eine Menge von 2 10 0,2 Wenn wir jetzt mit einem 100 Pipe Verlust gestoppt werden, verlieren wir nur 200 oder 2. Einfach. Wenn kein Stopverlust gegeben ist, wird die Größe der Position in Abhängigkeit von der Höhe des Eigenkapitals, des Risikos und der Hebelwirkung berechnet. Dies ist bei weitem nicht eine fertige Money Management-Bibliothek. Es ist nur eine Basis, die erweitert werden kann und sollte. Einige Ideen: Definieren Sie eine Grenze des maximal investierten Kapitals in Prozent, wie 2 pro Position UND nicht mehr dann (z. B.) 10 - 20 insgesamt investiert Speichern Sie die Balance, Equity und Gewinn-Kurve in einem Array. Verwenden Sie dann diese Daten, um zu sehen, ob die letzten Trades profitabel sind oder nicht. Kann für quotpanischen Modusquot verwendet werden oder um das Risiko zu reduzieren, wenn die letzten Trades Verluste verursacht haben Wenn Sie eine Multi-Währung EA haben, könnte es sinnvoll sein, auch festzulegen, wie viel Sie nicht nur pro Position und insgesamt investieren wollen, sondern auch wie Viel pro Marktwährung. Wie: 2 Risiko pro Auftrag, 10 pro Markt und 20 insgesamt. Dies ist eine sehr einfache Protokollierungsbibliothek, die für das Erstellen von Protokollen nützlich ist, die in das MT4-Terminal geschrieben und auf einer Festplatte in einer Datei gespeichert werden können. Extern string logFile log. txt extern bool loggingAktiv falsch extern bool logToFile false Setzt die Position der Protokolldatei param Dateipfad und Dateiname unserer Logdatei void setLogFile (Stringdatei) logFile-Datei Aktiviert die Protokollierung auf dem Datenträgerbereich void enableFileLogging () LogToFile true Deaktiviert die Protokollierung auf dem Datenträgerbereich void disableFileLogging () logToFile false Druckt das Protokoll in das Journalbuch und speichert das Protokoll in die Datei void printLog (string log) Drucken oder Speichern von Protokollen, wenn die Protokollierung aktiviert ist, wenn (loggingActive) Bei der Protokollierung in die Datei (LOGGING: Fehler beim Öffnen der Datei) return (0) FileWriteString (Handle. log. StringLen (log. Text)) if (handle lt 1) Drucken (LOGGING: Fehler beim Öffnen der Datei) if (logToFile) int handle FileOpen (logFile. FILEBIN FILEREAD FILEWRITE )) FileClose (handle) LogString auszudrucken, um Journal zu drucken (log) Ich denke, diese Funktion sollte alle selbsterklärend sein. Sie können die Protokollierungsfunktionalität aktivieren oder deaktivieren und die Protokollierung separat aktivieren oder deaktivieren. Die Log-Meldungen werden nur an das Terminal und nicht auf die Festplatte geschrieben. PrintLog (String-Protokoll) - Druckt die Zeichenfolge auf das Journal, wenn die Protokollierung aktiviert ist und auch auf die Datei, wenn Protokollierung in Datei aktiviert ist Ich weiß, theres die stderror. mqh kommen mit MetraTrader, aber ich habe meine eigene Version geschrieben. Das ist, weil ich meine eigenen Fehlercodes enthalten kann eine Nachricht sehr einfach. Aber jetzt sind nur Stander-MQL-Laufzeitfehler und Serverfehler implementiert. ---- Fehler aus dem Handel Server zurückgegeben definieren ERRNOERROR definieren 0 ERRNORESULT 1 definieren ERRCOMMONERROR 2 definieren ERRINVALIDTRADEPARAMETERS 3 ERRSERVERBUSY definieren 4 definieren ERROLDVERSION 5 definieren ERRNOCONNECTION 6 definieren ERRNOTENOUGHRIGHTS 7 definieren ERRTOOFREQUENTREQUESTS 8 ERRMALFUNCTIONALTRADE 9 definieren ERRACCOUNTDISABLED 64 definieren ERRINVALIDACCOUNT 65 definieren ERRTRADETIMEOUT 128 definieren ERRINVALIDPRICE definieren 129 definieren ERRINVALIDSTOPS 130 definieren ERRINVALIDTRADEVOLUME 131 definieren ERRMARKETCLOSED 132 definieren ERRTRADEDISABLED 133 definieren ERRNOTENOUGHMONEY 134 definieren ERRPRICECHANGED 135 definieren ERROFFQUOTES 136 definieren ERRBROKERBUSY 137 definieren ERRREQUOTE 138 ERRORDERLOCKED definieren 139 definieren ERRLONGPOSITIONSONLYALLOWED 140 ERRTOOMANYREQUESTS definieren 141 definieren ERRTRADEMODIFYDENIED 145 definieren ERRTRADECONTEXTBUSY 146 definieren ERRTRADEEXPIRATIONDENIED 147 ERRTRADETOOMANYORDERS 148 definieren - --- MQL4 Laufzeitfehler definieren ERRNOMQLERROR 4000 ERRWRONGFUNCTIONPOINTER definieren 4001 definieren ERRARRAYINDEXOUTOFRANGE 4002 definieren ERRNOMEMORYFORCALLSTACK 4003 definieren ERRRECURSIVESTACKOVERFLOW 4004 definieren ERRNOTENOUGHSTACKFORPARAM 4005 definieren ERRNOMEMORYFORPARAMSTRING 4006 definieren ERRNOMEMORYFORTEMPSTRING 4007 definieren ERRNOTINITIALIZEDSTRING 4008 definieren ERRNOTINITIALIZEDARRAYSTRING 4009 definieren ERRNOMEMORYFORARRAYSTRING 4010 definieren ERRTOOLONGSTRING 4011 definieren ERRREMAINDERFROMZERODIVIDE 4012 definieren ERRZERODIVIDE 4013 definieren ERRUNKNOWNCOMMAND 4014 definieren ERRWRONGJUMP 4015 definieren ERRNOTINITIALIZEDARRAY 4016 definieren ERRDLLCALLSNOTALLOWED 4017 definieren ERRCANNOTLOADLIBRARY 4018 definieren ERRCANNOTCALLFUNCTION 4019 definieren ERREXTERNALCALLSNOTALLOWED 4020 definieren ERRNOMEMORYFORRETURNEDSTR 4021 definieren ERRSYSTEMBUSY 4022 definieren ERRINVALIDFUNCTIONPARAMSCNT 4050 definieren ERRINVALIDFUNCTIONPARAMVALUE 4051 ERRSTRINGFUNCTIONINTERNAL 4052 definieren ERRSOMEARRAYERROR 4053 definieren ERRINCORRECTSERIESARRAYUSING 4054 definieren ERRCUSTOMINDICATORERROR 4055 definieren ERRINCOMPATIBLEARRAYS 4056 definieren ERRGLOBALVARIABLESPROCESSING 4057 definieren definieren ERRGLOBALVARIABLENOTFOUND 4058 definieren ERRFUNCNOTALLOWEDINTESTING 4059 definieren ERRFUNCTIONNOTCONFIRMED 4060 definieren ERRSENDMAILERROR 4061 definieren ERRSTRINGPARAMETEREXPECTED 4062 definieren ERRINTEGERPARAMETEREXPECTED 4063 definieren ERRDOUBLEPARAMETEREXPECTED 4064 definieren ERRARRAYASPARAMETEREXPECTED 4065 definieren ERRHISTORYWILLUPDATED 4066 definieren ERRTRADEERROR 4067 definieren ERRENDOFFILE 4099 definieren ERRSOMEFILEERROR 4100 definieren ERRWRONGFILENAME 4101 definieren ERRTOOMANYOPENEDFILES 4102 definieren ERRCANNOTOPENFILE 4103 definieren ERRINCOMPATIBLEFILEACCESS 4104 definieren ERRNOORDERSELECTED 4105 definieren ERRUNKNOWNSYMBOL 4106 definieren ERRINVALIDPRICEPARAM 4107 definieren ERRINVALIDTICKET 4108 definieren ERRTRADENOTALLOWED 4109 definieren ERRLONGSNOTALLOWED 4110 definieren ERRSHORTSNOTALLOWED 4111 definieren ERROBJECTALREADYEXISTS 4200 definieren ERRUNKNOWNOBJECTPROPERTY 4201 definieren ERROBJECTDOESNOTEXIST 4202 definieren ERRUNKNOWNOBJECTTYPE 4203 definieren ERRNOOBJECTNAME 4204 definieren ERROBJECTCOORDINATESERROR 4205 definieren ERRNOSPECIFIEDSUBWINDOW 4206 ERRSOMEOBJECTERROR 4207 Zeichenfolge Errordescription (int-Code) Schalter definieren (Code) ERRNOERROR. Print (Kein Fehler zurückgegeben) break case ERRNORESULT. Print (Kein Fehler zurückgegeben, aber das Ergebnis ist unbekannt) break case ERRCOMMONERROR. Print (Allgemeiner Fehler) break case ERRINVALIDTRADEPARAMETER. Ausdruck (Ungültige Handelsparameter) break case ERRSERVERBUSY. Print (Handelsserver ist besetzt) break case ERROLDVERSION. Print (Alte Version des Client-Terminals) break case ERRNOCONNECTION. Print (Keine Verbindung zum Handelsserver) break case ERRNOTENOUGHRIGHTS. Print (Nicht genügend Rechte) break case ERRTOOFREQUENTREQUESTS. Drucken (zu häufige Anfragen) break case ERRMALFUNCTIONALTRADE. Print (Störung des Handelsbetriebs) break case ERRACCOUNTDISABLED. Drucken (Konto deaktiviert) break case ERRINVALIDACCOUNT. Ausdruck (ungültiges Konto) break case ERRTRADETIMEOUT. Print (Zeitüberschreitung) break case ERRINVALIDPRICE. Drucken (Ungültiger Preis) break case ERRINVALIDSTOPS. Ausdruck (Ungültige Stopps) break case ERRINVALIDTRADEVOLUME. Drucken (Invalid trade volume) break case ERRMARKETCLOSED. Print (Markt ist geschlossen) break case ERRTRADEDISABLED. Drucken (Handel ist deaktiviert) break case ERRNOTENOUGHMONEY. Print (Nicht genug Geld) break case ERRPRICECHANGED. Drucken (Preis geändert) break case ERROFFQUOTES. Drucken (Off-Anführungszeichen) break case ERRBROKERBUSY. Print (Broker ist besetzt) break case ERRREQUOTE. Ausdruck (Requote) break case ERRORDERLOCKED. Print (Bestellung ist gesperrt) break case ERRLONGPOSITIONSONLYALLOWED. Drucken (Nur lange Positionen erlaubt) break case ERRTOOMANYREQUESTS. Print (Zu viele Anfragen) break case ERRTRADEMODIFYDENIED. Print (Änderung verweigert, weil Auftrag zu nahe am Markt) brechen Fall ERRTRADECONTEXTBUSY. Print (Handelskontext ist besetzt) break case ERRTRADEEXPIRATIONDENIED. Print (Abläufe werden vom Broker verweigert) break case ERRTRADETOOMANYORDERS. Drucken (Die Anzahl offener und ausstehender Aufträge hat die vom Broker festgelegte Grenze erreicht.) Break case ERRNOMQLERROR. Print (Kein Fehler) break case ERRWRONGFUNCTIONPOINTER. Ausdruck (Falscher Funktionszeiger) Bruchfall ERRARRAYINDEXOUTOFRANGE. Drucken (Array-Index ist außerhalb des gültigen Bereichs) break case ERRNOMEMORYFORCALLSTACK. Print (Kein Speicher für Funktionsaufruf Stack) Bruchfall ERRRECURSIVESTACKOVERFLOW. Ausdruck (Rekursiver Stapelüberlauf) Bruchkasten ERRNOTENOUGHSTACKFORPARAM. Print (Nicht genügend Stack für Parameter) break case ERRNOMEMORYFORPARAMSTRING. Print (Kein Speicher für Parameterstring) break case ERRNOMEMORYFORTEMPSTRING. Print (kein Speicher für temp string) break case ERRNOTINITIALIZEDSTRING. Ausdruck (nicht initialisierte Zeichenfolge) break case ERRNOTINITIALIZEDARRAYSTRING. Print (nicht initialisierte Zeichenfolge im Array) break case ERRNOMEMORYFORARRAYSTRING. Print (Kein Speicher für array string) break case ERRTOOLONGSTRING. Print (Zu lange Schnur) Break Case ERRREMAINDERFROMZERODIVIDE. Drucken (Rest von Null teilen) break Fall ERRZERODIVIDE. Ausdruck (Zero divide) break case ERRUNKNOWNCOMMAND. Print (Unbekannter Befehl) break case ERRWRONGJUMP. Print (Falscher Sprung (nie erzeugter Fehler)) break case ERRNOTINITIALIZEDARRAY. Ausdruck (nicht initialisiertes Array) break case ERRDLLCALLSNOTALLOWED. Drucken (DLL-Aufrufe sind nicht erlaubt) break case ERRCANNOTLOADLIBRARY. Print (Bibliothek kann nicht geladen werden) break case ERRCANNOTCALLFUNCTION. Print (Funktion nicht aufrufen) break case ERREXTERNALCALLSNOTALLOWED. Print (Expert-Funktionsaufrufe sind nicht erlaubt) break case ERRNOMEMORYFORRETURNEDSTR. Print (Nicht genügend Speicher für temp string, der von function zurückgegeben wird) break case ERRSYSTEMBUSY. Print (System ist besetzt (nie erzeugter Fehler)) break case ERRINVALIDFUNCTIONPARAMSCNT. Print (Ungültige Funktionsparameter zählen) break case ERRINVALIDFUNCTIONPARAMVALUE. Print (Ungültiger Funktionsparameterwert) break case ERRSTRINGFUNCTIONINTERNAL. Print (Stringfunktion interner Fehler) break case ERRSOMEARRAYERROR. Drucken (Einige Arrayfehler) break case ERRINCORRECTSERIESARRAYUSING. Drucken (Falsches Reihenarray unter Verwendung) break case ERRCUSTOMINDICATORERROR. Print (Benutzerdefinierter Anzeigefehler) break case ERRINCOMPATIBLEARRAYS. Drucken (Arrays sind nicht kompatibel) break case ERRGLOBALVARIABLESPROCESSING. Print (Fehler der globalen Variablen) break case ERRGLOBALVARIABLENOTFOUND. Drucken (globale Variable nicht gefunden) break case ERRFUNCNOTALLOWEDINTESTING. Print (Funktion ist im Testmodus nicht erlaubt) break case ERRFUNCTIONNOTCONFIRMED. Print (Funktion ist nicht bestätigt) break case ERRSENDMAILERROR. Drucken (E-Mail-Fehler senden) break case ERRSTRINGPARAMETEREXPECTED. Ausdruck (Stringparameter erwartet) break case ERRINTEGERPARAMETEREXPECTED. Ausdruck (Integer-Parameter erwartet) break case ERRDOUBLEPARAMETEREXPECTED. Ausdruck (Doppelparameter erwartet) break case ERRARRAYASPARAMETEREXPECTED. Ausdruck (Array als Parameter erwartet) break case ERRHISTORYWILLUPDATED. Drucken (angeforderte Verlaufsdaten im Aktualisierungszustand) break case ERRTRADEERROR. Print (Irrtum in der Handelsfunktion) break case ERRENDOFFILE. Drucken (Ende der Datei) break case ERRSOMEFILEERROR. Print (Einige Dateifehler) break case ERRWRONGFILENAME. Print (Falscher Dateiname) break case ERRTOOMANYOPENEDFILES. Drucken (Zu viele geöffnete Dateien) break case ERRCANNOTOPENFILE. Print (Datei kann nicht geöffnet werden) break case ERRINCOMPATIBLEFILEACCESS. Print (Inkompatibler Zugriff auf eine Datei) break case ERRNOORDERSELECTED. Print (Kein Auftrag ausgewählt) break case ERRUNKNOWNSYMBOL. Print (Unbekanntes Zeichen) break case ERRINVALIDPRICEPARAM. Drucken (Ungültiger Preis) break case ERRINVALIDTICKET. Drucken (Ungültiges Ticket) break case ERRTRADENOTALLOWED. Drucken (Handel ist nicht erlaubt - Kontrollkästchen "Live-Handel aktivieren" in den Experteneigenschaften aktivieren) break case ERRLONGSNOTALLOWED. Print (Longs sind nicht erlaubt - Prüfeigenschaften) break case ERRSHORTSNOTALLOWED. Drucken (Shorts sind nicht erlaubt - Prüfeigenschaften) break case ERROBJECTALREADYEXISTS. Print (Objekt existiert bereits) break case ERRUNKNOWNOBJECTPROPERTY. Print (Unbekannte Objekt-Eigenschaft) break case ERROBJECTDOESNOTEXIST. Print (Objekt existiert nicht) break case ERRUNKNOWNOBJECTTYPE. Print (Unbekannter Objekttyp) break case ERRNOOBJECTNAME. Ausdruck (kein Objektname) break case ERROBJECTCOORDINATESERROR. Print (Objektkoordinatenfehler) break case ERRNOSPECIFIEDSUBWINDOW. Print (kein Unterfenster) break case ERRSOMEOBJECTERROR. Drucken (Einige Fehler in der Objektfunktion) break ErrorDescription (int-Code) - gibt die Fehlerbeschreibung für den angegebenen Code zurück Und heres eine andere einfache EA, die einige der Funktionen verwendet, die in den vorhergehenden Pfosten bereitgestellt wurden. So funktioniert das. Es verwendet 3 exponentielle gleitende Durchschnitte - schnell, mittel und langsam in den Wochentagen. Und nur ein paar einfache Regeln: Kaufen, wenn wir in bullish Trend Verkaufen, wenn wir in Baisse Trend Bullish Trend sind. Schneller MA größer als mittlerer MA, mittlerer MA größer als langsamer MA für die aktuelle wöchentliche Bar Bearish Trend. Schneller MA ist niedriger als mittleres MA, mittleres MA ist niedriger als langsames MA für die aktuelle wöchentliche Bar Dies sollte verhindern, dass wir vom Verkaufen, wenn wir in einem zinsbullischen Markt sind und vom Kauf, während auf dem bärischen Markt. Kaufen und verkaufen Signale werden auch mit den gleichen 3 gleitenden Durchschnitten generiert: Kauf Signal. Mittleres MA kreuzt langsames MA von unten nach oben und schnelles MA liegt über mittlerem MA im Tages-Chart Verkaufssignal. Mittleres MA kreuzt langsames MA von oben nach unten und schnelles MA liegt unterhalb des mittleren MA im Tages-Chart Wenn wir in einem zinsbulligen Trend sind, suchen wir nach Kaufsignalen. Und wenn wir im bärischen Trend sind, nur für Verkaufssignale zu sehen. Darüber hinaus verwendet diese EA nachlaufende Haltestellen zu halten Gewinne, sobald sie gemacht wurden. Und es ist auch möglich, mehr als eine Position gleichzeitig zu öffnen (siehe MAXORDERS definieren). Definieren MAXORDERS 5 Technische Indikatorvariablen extern int FastMA 8 extern int MediumMA 21 extern int SlowMA 55 extern int TrailStop 200 extern int InitialSL 200 Prüfen auf zinsbullische Marktbedingungen bool isBullishMarket () double fast iMA (Symbol (), PERIODW1 FastMA 0. MODEEMA 0) doppelt mittel iMA (Symbol (), PERIODW1 MediumMA 0. MODEEMA PRICECLOSE 0) doppelt langsam iMA (Symbol (), PERIODW1 SlowMA 0. MODEEMA PRICECLOSE 0) Bullish: schnelles gt-Medium Gt langsam im WEEKLY-Diagramm if ((fast gt medium) ampamp (mittel gt langsam)) return (true) else return (false) Auf bärische Marktbedingungen prüfen bool isBearishMarket () double fast iMA (Symbol (), PERIODW1 0) doppelt mittel iMA (Symbol (), PERIODW1 MediumMA 0. MODEEMA PRICECLOSE 0) doppelt langsam iMA (Symbol (), PERIODW1 SlowMA 0. MODEEMA PRICECLOSE 0) Bullisch: schnell (Lt mittel) ampamp (medium lt langsam)) return (true) else return (false) Achten Sie auf ein Kaufsignal bool buySignalOccured () double currentFast iMA (Symbol (), PERIODD1. FastMA. 0. MODEEMA. PREISE. 0) doppeltes previousMedium iMA (Symbol (), PERIODD1 MediumMA 0. MODEEMA PRICECLOSE 1) doppelter currentMedium iMA (Symbol (), PERIODD1 MediumMA 0. MODEEMA PRICECLOSE 0) 1) double currentSlow iMA (Symbol (), PERIODD1 SlowMA 0. MODEEMA PRICECLOSE 0) if (currentFast gt currentMedium) wenn ((vorhergehendMedium lt previousSlow) ampamp (currentMedium gt currentSlow )) Return (true) return (false) Achten Sie auf ein Verkaufssignal bool sellSignalOccured () double currentFast iMA (Symbol (), PERIODD1.FIXMA 0. MODEEMA PRICECLOSE 0) double previousMedium iMA (Symbol (), PERIODD1. 1) doppelter StromMedium iMA (Symbol (), PERIODD1 MediumMA 0. MODEEMA PRICECLOSE 0) double previousSlow iMA (Symbol (), PERIODD1 SlowMA 0. MODEEMA PRICECLOSE 1) (CurrentFast lt currentMedium) if ((previousMedium gt previousSlow) ampamp (currentMedium lt currentSlow)) return (true) return (false) Überprüfen Sie die Bedingungen Für den Kauf oder Kauf einer Position void checkForOpen () double lot Nur Handel am Beginn einer neuen Bar if (Volume 91 0 93 gt 1) return Überprüfen Sie die Kaufbedingung auf dem ausgewählten Paar if (isBullishMarket ()) if (buySignalOccured ()) Los LotsOptimized (InitialSL-Punkt) newMarketOrder (Symbol (), BUY. Los. Stellen Sie - InitialSL Point eine Frage. 0) Überprüfen Sie die Verkaufsbedingung für das ausgewählte Paar if (isBearishMarket ()) if (sellSignalOccured ()) Los lotsOptimized (InitialSL Point) newMarketOrder (Symbol (), VERKAUFEN Bid InitialSL Point 0) Double stoploss Iterate durch jede Ordnung und wählen Sie diejenigen aus, die zu unserer EA gehören (int j 0 j lt OrdersTotal () j) if (OrderSelect (j SELECTBYPOS MODETRADES) false) break if (OrderMagicNumber () MAGICNUMBER OrderSymbol () Symbol ()) Fortsetzen, wenn (OrderType () OPBUY) Ist bereits im Profitbereich bestellt, wenn (Ask - TrailStop Point gt OrderOpenPrice ()) Ist neuer Verlust oberhalb der aktuellen Order stoploss if (Ask - TrailStop Point gt OrderStopLoss ()) OrderModify (OrderTicket ), OrderOpenPrice (), Ask - TrailStop Point 0. 0. Blue) weiter, wenn (OrderType () OPSELL) Ist bereits im Gewinnbereich, wenn (Bid TrailStop Point lt OrderOpenPrice ()) Ist neuer Verlust unter den aktuellen Aufträgen stoploss, wenn ( Bid TrailStop Punkt lt OrderStopLoss ()) OrderModify (OrderTicket (), OrderOpenPrice (), Bid TrailStop Point. 0. 0. Blue) weiter Startpunkt des Experten void start () if (MediumMA lt FastMA) return if (SlowMA lt MediumMA) return Aktualisieren Sie unsere Order - und MoneyManager updateMoneyManager () updateOrderManager () Aktualisieren Sie nachlaufende Stops - wir verwenden keinen Verkauf Signal, um eine Position zu schließen, könnte dies später implementiert werden. Aber nachlaufende Stopps sollten gute Ergebnisse erzielen updateTrailingStops () Check auf Öffnen einer Position if (countOpenOrders () lt MAXORDERS) checkForOpen () Heres das zu optimierende Teil: extern int FastMA 8 extern int MediumMA 21 extern int SlowMA 55 extern int TrailStop 200 extern int InitialSL 200 FastMA, MediumMA und SlowMA sind die Perioden für die exponentiellen gleitenden Mittelwerte. InitialSL definiert den anfänglichen Stopverlust, der verwendet wird, wenn eine neue Position geöffnet wird. TrailingStop definiert die Größe des hinteren Endes in Pips. Einige mögliche Verbesserungen Dieses System ist für Lernzwecke und sollte besser nicht in Live-Trading verwendet werden - Sie können es optimieren und testen Sie es auf einem Demo-Konto, wenn Sie möchten. Es ist einfach und es gibt viele Dinge, die verbessert werden sollten, bevor sie auf einem Live-Konto wie zum Beispiel: Bessere Erkennung des gesamten Markttrends - eine einfache Verbesserung wäre, nicht die gleichen gleitenden durchschnittlichen Perioden für die tägliche und wöchentliche Chart Open verwenden Mehr Positionen, wenn sich der Markt in die gewünschte Richtung bewegt. Warten Sie nicht, bis ein anderes Kaufsignal auftritt, aber öffnen Sie eine neue Position, wenn wir bereits in der Gewinnzone mit dem ersten Auftrag sind und die Wahrscheinlichkeiten sind, dass theres keine Tendenzänderung im Anblick Verwenden Sie besseres Geld - und Risikomanagement. Backtesting und Optimierung Ich habe 2007 als Backtesting-Periode genommen und diese Werte verwendet: Unter allen Ergebnissen, die ich bekam, habe ich eine mit einem guten Ergebnis ausgewählt (gt 26.000 Gewinn) und einen Drawdown von Dann habe ich diese Werte für Backtesting verwendet 2008: gt 40.000 Gewinn Aber das war ein Glücksfall. Andere Konfigurationen mit unterschiedlichen Werten von schlecht bis wirklich, wirklich schlecht. So theres noch viel zu tun: verbessern Sie das Risiko - und Geldmanagement verbessern Sie Auftragsmanagementbedarf für bessere Gesamtentdeckungentdeckung entwickeln Sie bessere Signale addieren Sie zu den rentablen Positionen. Erlauben Sie, mehr Aufträge zu öffnen und nicht auf ein anderes Signal zu warten, aber öffnen Sie, wenn bereits große Profite geschnittene Löse schnell gebildet werden. (Mit ATR zum Beispiel) besseres Backtesting und Optimierung: für 2002 optimieren und backtest für 2003. wählen Sie einige Einstellungen und backtest sie auch für 2004. loszuwerden Einstellungen, die schlechte und Backtest für 2005 mit durchgeführt Restlichen Einstellungen und so weiter. Bis Sie eine gute Einstellung, die gut während eines längeren Zeitraums durchgeführt haben Wenn Sie irgendwelche Fragen oder Verbesserungen haben, lassen Sie mich wissen. Jeder Kommentar Willkommen 3ma. mq4 6 KB 321 downloads Was für eine Menge Arbeit haben Sie hier gesetzt. Danke für Eure Mühe. Ich habe nicht Ihre Programmierfähigkeiten. Ein paar Kommentare: Dies kann meine Schuld, weil der falsche Installation. Der EA sendet eine falsche Losgröße. Ich bekam 131 Fehler, so legte ich ein paar Print-Befehle in den Code zu sehen, was die Losgröße war. Die Print-Befehle befinden sich auf der Zeile vor den newMarketOrder-Zeilen. Als nächstes öffnen Sie die History Center in MT4 (drücken Sie F2), wählen Sie das Währungspaar in der Symbolliste auf der linken Seite und wählen Sie den niedrigsten Zeitrahmen, 1 Minute (doppelklicken Sie es). Drücken Sie quotDownloadquot und beantworten Sie quotOKquot, wenn Sie die Warnung erhalten. Es kann einige Minuten dauern, bis alle historischen Werte heruntergeladen wurden. Ich habe 3,5 Mio 1-Minuten-Kerzen, das ist die letzten 10 Jahre in Minuten Sollte genug sein. Sie können dies mit jedem Zeitrahmen und Währung zu tun, oder verwenden Sie das enthaltene Skript quotperiodconverterquot, die mit MT4 kommt. Ich glaube nicht, dass Sie für jeden Zeitrahmen herunterladen müssen, oder verwenden Sie den Periodenkonverter, wenn die Verlaufsdaten durch das Verlaufszentrum heruntergeladen werden. Wenn ich 1 min für ein Währungspaar mit dem Historiencenter herunterlade, werden alle Standardzeitrahmen gefüllt und verfügbar, wenn es beendet ist. Der Periodenkonverter würde nur für benutzerdefinierte Zeitrahmen verwendet werden. Wenn Sie Daten importieren, die extern heruntergeladen wurden (z. B. Alpari), dann muss der Periodenkonverter für jeden anderen Zeitraum als 1min verwendet werden. Ich bin einfach erstaunt, wenn ich Ihre quotMy ersten EAquot-Thread zu lesen. Lesen Sie API Gestern, und post die erste EA Heute. Dies ist die Fähigkeit eines echten erfahrenen Programmierer Und als Händler, gehen Sie in die richtige Richtung. You have noticed general mistakes soon and are trying to correct them soon. Your quotto doquot list is perfect also. You are so capable enough to do most anything you want, but never forget to be simple. This is a statement that is posted in other forex forum recently and I totally agree. quotI know many who are real PRO traders and they say K. I.S. S Keep it simple system. quot Most trading system that has too many parameters that can quotadjustquot to the market (its what HAPPEND in the past) doesnt work well. Keep your eye on risk management and how to exit the market, then you will be successfull. The reasons why most traders will fail are 1) overtrade (risk too much at a time) 2) predict the future too much (especially by indicators) and underestimate randomness of the market 3) take profit too early and stop loss too late (both are related to the exit) 4) too complicated minded and just cant be consistent Thank you for posting and Good luck. Ive got a small present for you. These are the codes to autodetect and correct a problem of the broker that has quotone more digitquot. For example, most brokers have 4 price digits for EURUSD. (example 1.2345) But Alpari (I dont know whether there are another brokers or not) has 5 digits (example 1.23456) For JPY cross, most brokers gives 123.45 and Alpari gives 123.456. This causes an error when you use pips based integer value (stoploss or takeprofit etc.). Worst of all, if you calculate lot size from pips based stoploss, It returns wrong lot size. It will cause fatal malfunction for risk management. It can be used like this. (Maybe you can do it more sophisticated and universal way) int DQADJ DeciQuoteAdjuster() SL by pips int SLpips StopLossDQADJ SL decision double SL Ask - StopLossDQADJPoint lot size decision double RiskAmount AccountFreeMargin() (RiskRate100) double lot RiskAmount (PipValueStopLossDQADJ) StopLoss is pips based integer. PipValue means PL value for 1lot and 1pip. return(DeciQuoteADJ) return 1 or 10 I wanted to test EA 2 but the file common. mqh is missing. where can I find it One more question. I am new to all this. I use IMA function in the code as below. It seems to me that the IMA call does not return current values I want it to buy or sell when after the gold cross but it seems to do it elsewhere. Am I missing something. Maybe someone wants to cooperate on the project Order details extern int Slippage 3 How much slip can we accept extern double Lots 0.01 extern int MagicNumber 0 Stops extern bool UseStopLoss False No stops for the Axitrader extern int StopLoss 30 extern bool UseTakeProfit False extern int TakeProfit 60 extern bool UseTrailingStop True extern int TrailingStop 30 extern bool EachTickMode True extern bool OrderNoLossProfit True for axitrader ------------------------------------------------------------------ expert initialization function ------------------------------------------------------------------ int init() ---- Ticks back int BuyBackTicks 2 back ticks to check if time low lt high to buy int CloseBuyBackTicks 0 int SellBackTicks 2 back ticks to check if time low lt high to buy int CloseSellBackTicks 0 MA int MALow 5 int MAHigh 8 int Current 0 Current Bar int Order 0 int Ticket 0 int BarCount double StopLossLevel, TakeProfitLevel double BuyBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current BuyBackTicks) double BuyBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current BuyBackTicks) double BuyNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double BuyNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double SellBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current SellBackTicks) double SellBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current SellBackTicks) double SellNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double SellNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double CloseBuyBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current CloseBuyBackTicks) double CloseBuyBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current CloseBuyBackTicks) double CloseBuyNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double CloseBuyNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) double CloseSellBackLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current CloseSellBackTicks) double CloseSellBackHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current CloseSellBackTicks) double CloseSellNowLow iMA(NULL, 0, MALow, 0, MODEEMA, PRICECLOSE, Current 0) double CloseSellNowHigh iMA(NULL, 0, MAHigh, 0, MODEEMA, PRICECLOSE, Current 0) Alert(quotBuyBackLow, BuyBackHighquot, BuyBackLow, quot quot, BuyBackHigh) Alert(quotSellBackLow, SellBackHighquot, SellBackLow, quot quot, SellBackHigh) Check position bool IsTrade False for (int i 0 i lt OrdersTotal() i ) OrderSelect(i, SELECTBYPOS, MODETRADES) Select order by position in the trading pool bool OrderSelect( int index, int select, int poolMODETRADES) The function selects an order for further processing. It returns TRUE if the function succeeds. It returns FALSE if the function fails. To get the error information, one has to call the GetLastError() function. The pool parameter is ignored if the order is selected by the ticket number. The ticket number is a unique order identifier. To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open positions list. One can distinguish an open position from a pending order by the order type. If the order close time does not equal to 0, the order is a closed order or a deleted pending order and was selected from the terminal history. They also differ from each other by their order types. Parameters: index - Order index or order ticket depending on the second parameter. select - Selecting flags. It can be any of the following values: SELECTBYPOS - index in the order pool, SELECTBYTICKET - index is order ticket. pool - Optional order pool index. Used when the selected parameter is SELECTBYPOS. It can be any of the following values: MODETRADES (default)- order selected from trading pool(opened and pending orders), MODEHISTORY - order selected from history pool (closed and canceled order). Closing existing orders if (OrderType() OPSELL ampamp OrderSymbol() Symbol()) Sell order found for currency pair same as chart close existing order if condition fulfilled(to be specified below) Closing Strategy here if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh) Order SIGNALCLOSESELL if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh)Order SIGNALCLOSEBUY if (Order SIGNALCLOSEBUY) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange) continue Trailing stop if(UseTrailingStop ampamp TrailingStop gt 0) if(Bid - OrderOpenPrice() gt Point TrailingStop) if(OrderStopLoss() lt Bid - Point TrailingStop) OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen) if (EachTickMode) BarCount Bars continue if (OrderType() OPBUY ampamp OrderSymbol() Symbol()) close existing order if condition fulfilled (to be specified below) Closing Strategy here if (CloseSellBackLow lt CloseSellBackHigh ampamp CloseSellNowLow gt CloseSellNowHigh) Order SIGNALCLOSESELL if (Order SIGNALCLOSESELL) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen) if (Order SIGNALBUY) if (AccountFreeMargin() lt (1000 Lots)) Alert(quotWe have no money. Free Margin quot, AccountFreeMargin()) return(0) StopLossLevel FuncStopLossLevel(UseStopLoss, StopLoss) TakeProfitLevel FuncTakeProfitLevel(UseTakeProfit, TakeProfit) Ticket OrderSend(Symbol(), OPBUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, quotBuy(quot MagicNumber quot)quot, MagicNumber, 0, DodgerBlue) Alert(quotBuying ticket quot, Ticket, quotError code quot, GetLastError() ) if(Ticket gt 0) if (OrderSelect(Ticket, SELECTBYTICKET, MODETRADES)) Alert(quotBUY order opened. quot, OrderOpenPrice()) if (OrderNoLossProfit) if (StopLoss gt 0 TakeProfit gt0) xxx OrderModify(OrderTicket(), OrderOpenPrice(), Ask Point StopLoss, Ask TakeProfit Point, 0, DarkOrange) else Alert(quotError opening BUY order. quot, GetLastError()) SELL SELL SELL Found gold cross: Insert Selling Strategy if (SellBackLow gt SellBackHigh ampamp SellNowLow lt SellNowHigh) Order SIGNALSELL if (Order SIGNALSELL) Check free margin if (AccountFreeMargin() lt (1000 Lots)) Alert(quotWe have no money. Free Margin quot, AccountFreeMargin()) return(0) if (UseStopLoss) StopLossLevel Bid StopLoss Point else StopLossLevel 0.0 if (UseTakeProfit) TakeProfitLevel Bid - TakeProfit Point else TakeProfitLevel 0.0 Ticket OrderSend(Symbol(), OPSELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, quotSell(quot MagicNumber quot)quot, MagicNumber, 0, DeepPink) if(Ticket gt 0) if (OrderSelect(Ticket, SELECTBYTICKET, MODETRADES)) Alert(quotSELL order opened. quot, OrderOpenPrice()) modify order with stoploss, take profit for axitrader xxx if (OrderNoLossProfit) if (StopLoss gt 0 TakeProfit gt0) OrderModify(OrderTicket(), OrderOpenPrice(), Ask Point StopLoss, Ask TakeProfit Point, 0, DarkOrange) else Alert(quotError opening SELL order. quot, GetLastError()) Alert(quotSelling Ticket quot, Ticket, quotError code quot, GetLastError()) double FuncStopLossLevel(bool UseStopLoss, double StopLoss) double StopLossLevel if (UseStopLoss) StopLossLevel Ask - StopLoss Point else StopLossLevel 0.0 return (StopLossLevel) double FuncTakeProfitLevel(bool UseTakeProfit, double TakeProfit) double TakeProfitLevel if (UseTakeProfit) TakeProfitLevel Ask - TakeProfit Point else TakeProfitLevel 0.0Opening a Trade Using OrderSend In the last module, we went over the basic Expert Advisor and how to create input parameters. If you8217d like to review that module, click here: The Expert Advisor. Today we are going to do something more useful with an Expert Advisor: open a trade. The MetaTrader function used to open a trade is called 8220OrderSend8221. This table details each of the parameters required to set when using the function. The symbol of the currency. The type of order to open. Siehe Tabelle unten. The number of lots to open. The preferred open price. The number of points the preferred open price may slip. The stoploss set in the order on the brokers server. This value must be calculated using the price and the currency point value. The takeprofit set in the order on the brokers server. This value must be calculated using the price and the currency point value. A text comment that can be seen from within the MetaTrader platform when viewing open orders. The color of the arrow that will appear on the price chart when the OrderSend function is successful. Most of these parameters are pretty straight forward, but a few require a bit of an explanation. The 8220 symbol 8221 parameter is the name of the currency pair. You can use the MT function 8220Symbol()8221 which will automatically use the currency of the chart that the EA is running on. Or you can even define any name in quotes, for example 8220EURUSD8221. (Note: Opening a currency different than the one that the EA is running requires some special techniques which I8217ll cover in a later module.) The 8220 cmd 8221 parameter is the command that tells the broker8217s server what you want to do. The choices for a market order are OPBUY or OPSELL 8211 open a Buy or Sell trade. The 8220 volume 8221 parameter is the number of lots you8217d like to open or close. The 8220 price 8221 parameter is the preferred price. On MT, I8217ve found this value should be set to the 8220Ask8221 price for opening Buy orders and the 8220Bid8221 price for opening Sell orders. Any other values seem to cause the function to fail. The 8220 slippage 8221 parameter is how many points you8217ll allow the trade to slip and still complete the order. For example, suppose you8217d like to buy the EURUSD at 1.3595 and the slippage is set to 3 8211 you might pay as much as 1.359531.3598. (This may look bad, but if you set your slippage too small you may not get the trade at all.) The 8220 stoploss 8221 parameter is the limit for how far the trade can go against you before the broker8217s server closes the position. (Note: Your EA does not need to be running for the stoploss to work. This is a value stored on the broker8217s system.) This value will be lower than your open price for Buy orders and greater than the open price for Sell orders. Both the stoploss and takeprofit parameters must be in exact terms of the price, so you need to do some math here. For example, if you8217d like a stoploss of 15 points, you need to subtract 15 from the open price (for an open price of 1.3595): stoploss 1.3595 8211 0.0015 1.3580 Fortunately, there is an easy way to get the 0.0015 number using the 8220Point8221 function: 15 Point 0.0015 This way, you can work with a number like 15 instead of 0.0015. (I personally think the OrderSend function could have been written to simply accept a relative value like 15 for the stoploss instead of requiring an absolute price value like 1.3580). The 8220 takeprofit 8221 parameter is the limit of how far a trade can go in your direction before it closes for a profit. This value will be higher than your open price for Buy orders and less than the open price for Sell orders. The rest of this parameter is just like the stoploss. The 8220 comment 8221 parameter can be any text. It is saved with the trade and appears in the comment window in the trading terminal. I usually put the name of the EA in this field so when I look at my open trades I can see what EA has opened each. The 8220 magic 8221 parameter is a number that you can assign to the trade so that you can identify it later. We8217ll see exactly how in a later module on the OrderSelect function. The 8220 expiration 8221 parameter holds an expiration time for pending orders. It has no meaning for market orders. (In my experience it does not work for pending orders either.) The 8220 arrowcolor 8221 parameter allows you to choose the color of the arrow that is drawn on the chart when the trade is opened. Now that we have described all of the input parameters, I8217ll make a quick note about the 8220return value8221. The OrderSend function will return a value back after it has finished running. In MQL, like most languages, a negative number is a bad thing and zero or a positive number is usually a good thing 8211 indicating the function executed successfully. We8217ll capture and check the value return from the OrderSend function so we8217ll know if it worked and actually opened a trade successfully. Note: All of the information about the OrderSend function is available from within the MetaEditor. The help file is very useful. Even as an experienced MQL programmer, I refer to the help often. (From within the MetaEditor, select View-gtNavigator and then use the search option to find your information.) So, let8217s see what the MQL code looks like. Here is the MQL code for the OrderSend function. extern int stoploss200 the takeprofit extern int takeprofit200 the number of lots extern double lots 1.0 this function will be called each time new price data arrives from the broker int start() int status OrderSend( Symbol(), the synbol for this chart OPBUY, a buy order lots, number of lots Ask, use the ask price for a BUY 3, allow the price up to move 3 points Ask 8211 (stoplossPoint), stop Bid (takeprofitPoint), limit 8220My Simple EA8221, comment to see in TerminalCompany 8675309, a unique to id this trade 0, expiration, doesn8217t work Blue a blue arrow ) if( status lt 0 ) Comment(8220OrderSend Failed. Error8221, GetLastError()) return(0) Here are some common error codes returned from the OrderSend function that you may come across as you develop your EA8217s: ERRINVALIDPRICE 8211 usually the wrong preferred price: For Buy, use Ask, for. use Bid. ERRINVALIDSTOPS 8211 usually bad math with the stoploss or takeprofit values, or they are zero and the broker will not accept zero. ERRINVALIDTRADEVOLUME 8211 the lot value is invalid, usually a problem with mini or micro lots. If you have trouble, try setting this to 1.0 to see if the error goes away. ERRNOTENOUGHMONEY 8211 self explanatory, if you are testing using a demo account this can happen often 8211 just open another demo account. This wraps up our lesson on opening a trade with an Expert Advisor. (To open a Sell trade, change the 8220cmd8221 parameter to OPSELL and reverse the math on the stoploss and takeprofit.) This limited amount of information is dangerous, so be careful with this code and please, only run this on a demo account Next module we8217ll learn how to use technical indicatorsMQL4 Reference MetaQuotes Language 4 (MQL4) is a built-in language for programming trading strategies. Diese Sprache wird von MetaQuotes Software Corp. basierend auf ihrer langjährigen Erfahrung in der Erstellung von Online-Handelsplattformen entwickelt. Mit dieser Sprache können Sie Ihre eigenen Expert Advisors, die Handelsmanagement automatisiert und sind perfekt geeignet für die Umsetzung Ihrer eigenen Trading-Strategien zu schaffen. Außerdem können Sie mit MQL4 eigene technische Indikatoren (benutzerdefinierte Indikatoren), Scripts und Bibliotheken erstellen. MQL4 contains a large number of functions necessary for analyzing current and previously received quotes, and has built-in basic indicators and functions for managing trade orders and controlling them. Der MetaEditor (Texteditor), der verschiedene Konstruktionen der MQL4-Sprache hervorhebt, wird für das Schreiben des Programmcodes verwendet. Es hilft den Anwendern, sich im Expertensystem ganz einfach zu orientieren. The brief guide contains functions, operations, reserved words, and other language constructions divided into categories, and allows finding the description of every used element of the language. Programme, die in MetaQuotes Language 4 geschrieben wurden, haben unterschiedliche Merkmale und Zweck: Expert Advisor ist ein mechanisches Handelssystem, das bis zu einem bestimmten Diagramm verbunden ist. Ein Expert Advisor wird gestartet, wenn ein Ereignis eintritt, das von ihm gehandhabt werden kann: Ereignisse der Initialisierung und Desinitialisierung, Ereignis eines neuen Tick-Empfangs, eines Timer-Ereignisses, Defektänderung des Ereignisses, Chart-Ereignis und benutzerdefinierte Ereignisse. Ein Expert Advisor kann Sie über eine Möglichkeit informieren, handeln und automatisch auf einem Konto zu handeln, das Aufträge direkt an einen Handelsserver sendet. Expert Advisors werden in terminaldirectoryMQL4Experts gespeichert. Custom Indicator ist ein technischer Indikator, der unabhängig zusätzlich zu den bereits in das Client-Terminal integrierten geschrieben wird. Wie integrierte Indikatoren können sie nicht automatisch handeln und sind nur für die Durchführung von analytischen Funktionen vorgesehen. Benutzerdefinierte Indikatoren werden im Terminalverzeichnis gespeichert MQL4Indicators Script ist ein Programm, das für eine einzelne Ausführung von Aktionen bestimmt ist. Im Gegensatz zu Expert Advisors verarbeiten Skripte keine Aktionen außer dem Startereignis (dies erfordert die OnStart-Handler-Funktion in einem Skript). Scripts werden in terminaldirectoryMQL4Scripts gespeichert. Library ist ein Satz von benutzerdefinierten Funktionen, die zum Speichern und Verteilen häufig benutzter Blöcke benutzerdefinierter Programme bestimmt sind. Bibliotheken können nicht von selbst starten. Bibliotheken werden in terminaldirectoryMQL4Libraries gespeichert. Include File ist ein Quelltext der am häufigsten verwendeten benutzerdefinierten Blöcke. Solche Dateien können in die Quelltexte von Expert Advisors, Scripts, benutzerdefinierten Indikatoren und Bibliotheken bei der Kompilierung aufgenommen werden. Die Verwendung von enthaltenen Dateien ist mehr bevorzugt als die Verwendung von Bibliotheken aufgrund zusätzlicher Belastung, die beim Aufrufen von Bibliotheksfunktionen auftritt. Include-Dateien können im selben Verzeichnis wie eine Quelldatei gespeichert werden - in diesem Fall wird die include-Direktive mit doppelten Anführungszeichen verwendet. Another place to store include files is terminaldirectoryMQL4Include, in this case the include directive is used with angle brackets.
Comments
Post a Comment