Systemhandel

Schnick – Unterstützung durch maschinelles Lernen im Trading mit MetaTrader 5
MetaTrader5
Schnick – Unterstützung durch maschinelles Lernen im Trading mit MetaTrader 5

Dieser Skript ist Teil des Artikels "Maschinelles Lernen: So können Support Vector Machines im Trading eingesetzt werden", der auf der MQL5-Website veröffentlicht wurde.Diese Version des Codes wurde speziell für die Verwendung mit der Demo-Version des Support Vector Machine Learning Tools erstellt, das kostenlos im MQL5 Marktplatz erhältlich ist.Stellen Sie sich folgendes hypothetische Szenario vor: Sie sind ein Forscher, der eine seltene Tierart namens Schnicks untersucht, die nur in den Tiefen der Arktis vorkommt. Aufgrund der Abgeschiedenheit dieser Tiere wurden nur wenige Exemplare (sagen wir etwa 5000) gefunden. Als Forscher stehen Sie vor der Frage: Wie kann ich einen Schnick identifizieren?Alles, was Ihnen zur Verfügung steht, sind die Forschungsarbeiten, die von den wenigen Forschern veröffentlicht wurden, die einen Schnick gesehen haben. In diesen Arbeiten beschreiben die Autoren bestimmte Merkmale der gefundenen Schnicks, wie Größe, Gewicht, Anzahl der Beine usw., aber all diese Merkmale variieren stark zwischen den Forschungsarbeiten, ohne erkennbares Muster...Wie können wir diese Daten nutzen, um ein neues Tier als Schnick zu identifizieren?Eine mögliche Lösung für unser Problem ist die Verwendung eines Support Vector Machine (SVM), um die Muster in den Daten zu identifizieren und einen Rahmen zu schaffen, der verwendet werden kann, um Tiere als Schnick oder Nicht-Schnick zu klassifizieren. Der erste Schritt besteht darin, einen Datensatz zu erstellen, der zur Schulung Ihrer SVM verwendet werden kann, um Schnicks zu identifizieren. Die Trainingsdaten bestehen aus einer Reihe von Eingaben und den entsprechenden Ausgaben, die die SVM analysieren und aus denen sie ein Muster extrahieren kann.Dieses Skript versucht, die Leistungsfähigkeit von Support Vector Machines bei der Lösung von Klassifikationsproblemen zu demonstrieren, indem es das Support Vector Machine Learning Tool verwendet, das im MQL5 Marktplatz erhältlich ist. Eine vollständige Beschreibung dieses hypothetischen Problems und Skripts finden Sie im Artikel "Maschinelles Lernen: So können Support Vector Machines im Trading eingesetzt werden". Der Artikel enthält eine Schritt-für-Schritt-Anleitung zur Verwendung des Skripts und wie dieses Problem Einblicke in die Verwendung von maschinellem Lernen zur Bewertung von Markttrends geben kann.Code://+------------------------------------------------------------------+ //|                                                 Schnick_Demo.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                              http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link      "http://www.mql5.com" #property version   "1.00" //+------------------------------------------------------------------+ //| Dieses Skript demonstriert die Fähigkeiten des Support Vector //|                     Machine Learning Tools //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Die folgende Anweisung importiert alle Funktionen, die im //| Support Vector Machine Tool 'svMachineTool.ex5' enthalten sind //+------------------------------------------------------------------+ #import "svMachineTool_demo.ex5" enum ENUM_TRADE {BUY,SELL}; enum ENUM_OPTION {OP_MEMORY,OP_MAXCYCLES,OP_TOLERANCE}; int  initSVMachine(void); void setIndicatorHandles(int handle,int &indicatorHandles[],int offset,int N); void setParameter(int handle,ENUM_OPTION option,double value); bool genOutputs(int handle,ENUM_TRADE trade,int StopLoss,int TakeProfit,double duration); bool genInputs(int handle); bool setInputs(int handle,double &Inputs[],int nInputs); bool setOutputs(int handle,bool &Outputs[]); bool training(int handle); bool classify(int handle); bool classify(int handle,int offset); bool classify(int handle,double &iput[]); void deinitSVMachine(void); #import //--- Die Anzahl der Eingaben, die wir für die SVM verwenden werden int N_Inputs=7; //+------------------------------------------------------------------+ //| Expert-Initialisierungsfunktion                                   | //+------------------------------------------------------------------+ int OnInit()   {    double inputs[];           //leeres double Array zur Erstellung von Trainingsdaten    bool   outputs[];          //leeres bool Array zur Erstellung von Trainingsdaten    int N_TrainingPoints=5000; //definiert die Anzahl der zu generierenden Trainingsproben    int N_TestPoints=5000     //definiert die Anzahl der Proben zum Testen    genTrainingData(inputs,outputs,N_TrainingPoints); //Generiert die Eingaben und Ausgaben für das Training der SVM    int handle1=initSVMachine();             //initialisiert eine neue Support Vector Machine und gibt einen Handle zurück    setInputs(handle1,inputs,7);             //gibt die Eingaben (ohne Fehler) an die Support Vector Machine weiter    setOutputs(handle1,outputs);             //gibt die Ausgaben (ohne Fehler) an die Support Vector Machine weiter    setParameter(handle1,OP_TOLERANCE,0.01); //setzt den Fehler-Toleranzparameter auf <5%    training(handle1);                       //trainiert die Support Vector Machine mit den übergebenen Eingaben/Ausgaben    insertRandomErrors(inputs,outputs,500);  //fügt zufällige Fehler zu den ursprünglichen Eingaben/Ausgaben hinzu    int handle2=initSVMachine();             //initialisiert eine neue Support Vector Machine und gibt einen Handle zurück    setInputs(handle2,inputs,7);             //gibt die Eingaben (mit Fehlern) an die Support Vector Machine weiter    setOutputs(handle2,outputs);             //gibt die Ausgaben (mit Fehlern) an die Support Vector Machine weiter    setParameter(handle2,OP_TOLERANCE,0.01); //setzt den Fehler-Toleranzparameter auf <5%    training(handle2);                       //trainiert die Support Vector Machine mit den übergebenen Eingaben/Ausgaben    double t1=testSVM(handle1,N_TestPoints); //testet die Genauigkeit der trainierten Support Vector Machine und speichert sie in t1    double t2=testSVM(handle2,N_TestPoints); //testet die Genauigkeit der trainierten Support Vector Machine und speichert sie in t2    Print("Die SVM-Genauigkeit beträgt ",NormalizeDouble(t1,2),"% (unter Verwendung von Trainingsdaten ohne Fehler)");    Print("Die SVM-Genauigkeit beträgt ",NormalizeDouble(t2,2),"% (unter Verwendung von Trainingsdaten mit Fehlern)");    deinitSVMachine(); //räumt den gesamten Speicher auf, der zur Generierung der SVM verwendet wurde, um Speicherlecks zu vermeiden    return(0);   } //+------------------------------------------------------------------+ //| Expert-Deinitialisierungsfunktion                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   { //--- Keine Funktionen in OnDeinit() ausgeführt   } //+------------------------------------------------------------------+ //| Expert-Tick-Funktion                                             | //+------------------------------------------------------------------+ void OnTick()   { //--- Keine Funktionen in OnTick() ausgeführt     } //+------------------------------------------------------------------+ //| Diese Funktion nimmt die Beobachtungsmerkmale des beobachteten //| Tieres und gibt basierend auf den gewählten Kriterien true/false zurück //+------------------------------------------------------------------+ bool isItASchnick(double height,double weight,double N_legs,double N_eyes,double L_arm,double av_speed,double f_call)   {    if(height   < 1000  || height   > 1100)  return(false); //Wenn die Höhe außerhalb der Parameter liegt, > return(false)    if(weight   < 40    || weight   > 50)    return(false); //Wenn das Gewicht außerhalb der Parameter liegt, > return(false)    if(N_legs   < 8     || N_legs   > 10)    return(false); //Wenn die N_Legs außerhalb der Parameter liegt, > return(false)    if(N_eyes   < 3     || N_eyes   > 4)     return(false); //Wenn die N_Augen außerhalb der Parameter liegt, > return(false)    if(L_arm   < 400   || L_arm    > 450)   return(false); //Wenn der L_arm außerhalb der Parameter liegt, > return(false)    if(av_speed < 2     || av_speed > 2.5)   return(false); //Wenn das av_speed außerhalb der Parameter liegt, > return(false)    if(f_call   < 11000 || f_call   > 15000) return(false); //Wenn der f_call außerhalb der Parameter liegt, > return(false)    return(true);                                           //Andernfalls > return(true)   } //+------------------------------------------------------------------+ //| Diese Funktion nimmt ein leeres double Array und ein leeres bool Array //| und generiert die Eingaben/Ausgaben, die für das Training der SVM verwendet werden //+------------------------------------------------------------------+ void genTrainingData(double &inputs[],bool &outputs[],int N)   {    double in[];                //erstellt ein leeres double Array zur Verwendung                                    //für vorübergehende Speicherung der generierten Eingaben    ArrayResize(in,N_Inputs);       //passt das in[]-Array an N_Inputs an    ArrayResize(inputs,N*N_Inputs); //passt das inputs[]-Array auf N*N_Inputs an    ArrayResize(outputs,N);         //passt das outputs[]-Array auf N an    for(int i=0;i<N;i++)      {       in[0]=    randBetween(980,1120);    //Zufällige Eingabe für die Höhe generiert       in[1]=    randBetween(38,52);       //Zufällige Eingabe für das Gewicht generiert       in[2]=    randBetween(7,11);        //Zufällige Eingabe für N_legs generiert       in[3]=    randBetween(3,4.2);       //Zufällige Eingabe für N_eyes generiert       in[4]=    randBetween(380,450);     //Zufällige Eingabe für L_arms generiert       in[5]=    randBetween(2,2.6);       //Zufällige Eingabe für av_speed generiert       in[6]=    randBetween(10500,15500); //Zufällige Eingabe für f_call generiert       //--- kopiert die neuen zufälligen Eingaben in das Trainingsdaten-Array       ArrayCopy(inputs,in,i*N_Inputs,0,N_Inputs);       //--- bewertet die zufälligen Eingaben und bestimmt, ob es sich um einen Schnick handelt       outputs[i]=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]);    }   } //+------------------------------------------------------------------+ //| Diese Funktion testet die Erfolgsquote der trainierten SVM bei der Klassifizierung neuer zufälliger Eingaben //+------------------------------------------------------------------+ double testSVM(int handle,int N)   {    double in[];    int atrue=0;    int afalse=0;    int N_correct=0;    bool Predicted_Output;    bool Actual_Output;    ArrayResize(in,N_Inputs);    for(int i=0;i<N;i++)      {       in[0]=    randBetween(980,1120);    //Zufällige Eingabe für die Höhe generiert       in[1]=    randBetween(38,52);       //Zufällige Eingabe für das Gewicht generiert       in[2]=    randBetween(7,11);        //Zufällige Eingabe für N_legs generiert       in[3]=    randBetween(3,4.2);       //Zufällige Eingabe für N_eyes generiert       in[4]=    randBetween(380,450);     //Zufällige Eingabe für L_arms generiert       in[5]=    randBetween(2,2.6);       //Zufällige Eingabe für av_speed generiert       in[6]=    randBetween(10500,15500); //Zufällige Eingabe für f_call generiert       //--- verwendet die isItASchnick-Funktion, um die tatsächliche gewünschte Ausgabe zu bestimmen       Actual_Output=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]);       //--- verwendet die trainierte SVM, um die prognostizierte Ausgabe zurückzugeben.       Predicted_Output=classify(handle,in);       if(Actual_Output==Predicted_Output)         {          N_correct++; //Diese Anweisung zählt die Anzahl der Male, die die prognostizierte Ausgabe korrekt ist.         }      } //--- gibt die Genauigkeit der trainierten SVM als Prozentsatz zurück    return(100*((double)N_correct/(double)N));   } //+------------------------------------------------------------------+ //| Diese Funktion nimmt die korrekten Trainingsdaten und Ausgaben //| und fügt N zufällige Fehler in die Daten ein //+------------------------------------------------------------------+ void insertRandomErrors(double &inputs[],bool &outputs[],int N)   {    int nTrainingPoints=ArraySize(outputs); //berechnet die Anzahl der Trainingspunkte    int index;                              //erstellt eine neue Ganzzahl 'index'    bool randomOutput;                      //erstellt einen neuen bool 'randomOutput'    double in[];                                   //erstellt ein leeres double Array zur Verwendung    ArrayResize(in,N_Inputs);               //passt das in[]-Array auf N_Inputs an    for(int i=0;i<N;i++)      {       in[0]=    randBetween(980,1120);    //Zufällige Eingabe für die Höhe generiert       in[1]=    randBetween(38,52);       //Zufällige Eingabe für das Gewicht generiert       in[2]=    randBetween(7,11);        //Zufällige Eingabe für N_legs generiert       in[3]=    randBetween(3,4.2);       //Zufällige Eingabe für N_eyes generiert       in[4]=    randBetween(380,450);     //Zufällige Eingabe für L_arms generiert       in[5]=    randBetween(2,2.6);       //Zufällige Eingabe für av_speed generiert       in[6]=    randBetween(10500,15500); //Zufällige Eingabe für f_call generiert       //--- wählt zufällig einen der Trainingsinputs aus, um einen Fehler einzufügen       index=(int)MathRound(randBetween(0,nTrainingPoints-1));       //--- generiert eine zufällige boolesche Ausgabe zur Erstellung eines Fehlers       if(randBetween(0,1)>0.5) randomOutput=true;       else                     randomOutput=false;       //--- kopiert die neuen zufälligen Eingaben in das Trainingsdaten-Array       ArrayCopy(inputs,in,index*N_Inputs,0,N_Inputs);       //--- kopiert die neue zufällige Ausgabe in das Trainingsdaten-Array       outputs[index]=randomOutput;      }   } //+------------------------------------------------------------------+ //| Diese Funktion wird verwendet, um einen zufälligen Wert zwischen t1 und t2 zu erstellen //+------------------------------------------------------------------+ double randBetween(double t1,double t2)   {    return((t2-t1)*((double)MathRand()/(double)32767)+t1);   } //+------------------------------------------------------------------+

2012.12.14
EA_MALR: Der perfekte Expert Advisor für MetaTrader 5
MetaTrader5
EA_MALR: Der perfekte Expert Advisor für MetaTrader 5

Der Expert Advisor basiert auf dem MALR-Indikator und bietet Funktionen wie Trailing Stop, Lot-Erhöhung, Mittelung und Umkehr. Der EA_MALR ist ein Expert Advisor, der auf dem MALR-Indikator basiert (der Autor ist unbekannt). Ein Verkaufsauftrag wird ausgelöst, wenn der Kurs die -Linie (die oberste Linie) von oben nach unten durchbricht, während ein Kaufauftrag eröffnet wird, wenn der Kurs die -Linie (die unterste Linie) von unten nach oben durchbricht. Zu den Funktionen gehören: Mittelung bei neuem Signal, Positionsumkehr bei Signalwechsel, Trailing Stop mit zusätzlichen Einstellungen, Lot-Erhöhung bei festgelegtem Drawdown. Die Testergebnisse seit 2000 für EURUSD: Anfangs-Lot 0,10, anfängliches Kapital 10.000$, 1:500, MetaQuotes-Demo. Unten sind Charts mit und ohne Lot-Erhöhung dargestellt. Mittelung und Umkehr werden nicht verwendet (nur Stop Loss/Take Profit werden eingesetzt). Die Mittelungsfunktion ist aktiviert (Umkehrfunktion ist deaktiviert). Umkehrfunktion ist aktiviert (Mittelungsfunktion ist deaktiviert). Sowohl Umkehr- als auch Mittelungsfunktionen sind aktiviert. Der Expert Advisor ist vor Datenverlust geschützt, wenn es zu Verbindungsabbrüchen, Netzwerkfehlern oder einem Neustart des Expert Advisors (Terminals) kommt. Die wichtigsten Einstellungen des Expert Advisors (bei Null werden diese Einstellungen nicht verwendet): sl/tp - Stop Loss/Take Profit nach Eröffnung der Position festlegen. N_modify_sltp - Anzahl der Versuche, Stop Loss/Take Profit in einem erfolglosen Handel zu setzen. use_Averaging - Aktivierung der Mittelung bei festgelegtem Verlust (loss_forAveraging) in Punkten. Eröffnung eines zusätzlichen Grundlots bei neuem gleichgerichtetem Signal. loss_forAveraging - Anzahl der Punkte im Verlust vom vorherigen Eröffnungspreis (letzte Mittelung). Position_overturn - Positionsumkehr, wenn das Signal auf dem Indikator sich ändert. Lot-Umkehr wird mit einem Umkehrkoeffizienten (koff_multiplication) multipliziert. use_increase - Lot-Erhöhung bei gegebenem Drawdown (Max_drawdown) beim Öffnen und Mittelung der Position. Trail_StopLoss - Aktivierung des Trailing Stops in Punkten (trail). Bei Umkehr und Mittelung bleibt der Trailing Stop erhalten. Activate_by_profit - Aktivierung des Trailing Stops bei festgelegtem Gewinn in Punkten (profit) vom Eröffnungspreis. Bei Mittelung ist der Eröffnungspreis gleich dem Mittelungswert aller Eröffnungen.

2012.12.12
Exp_JBrainSig1_UltraRSI: Dein Trading-Assistent für MetaTrader 5
MetaTrader5
Exp_JBrainSig1_UltraRSI: Dein Trading-Assistent für MetaTrader 5

Der Exp_JBrainSig1_UltraRSI Expert Advisor nutzt die Werte der JBrainTrend1Sig und UltraRSI Indikatoren, um den Marktstatus zu analysieren. Ein Handelssignal wird beim Schließen der Kerze generiert, wenn das Signal des JBrainTrend1Sig Indikators erscheint und die Cloudfarbe des UltraRSI Indikators mit der Farbe seines Signals übereinstimmt. Analog dazu tritt das Handelssignal auf, wenn sich die Cloudfarbe des UltraRSI Indikators ändert und das letzte Signal des JBrainTrend1Sig Indikators mit der Cloudfarbe übereinstimmt. Somit filtern sich die Indikatoren in diesem Handelssystem gegenseitig. Diese Variante der Strategie wird aktiviert, wenn du die Zusammensetzung (simultanes Filtern) im Modus-Eingabeparameter des Expert Advisors auswählst. Die anderen beiden Werte, JBrainSig1Filter und UltraRSIFilter, sind für Algorithmen gedacht, bei denen einer dieser beiden Indikatoren die Quelle für ein Handelssignal ist und der andere das Bestätigungssignal (Signalfilter). Platziere die JBrainTrend1Sig.ex4 und UltraRSI.ex5 kompilierten Dateien im Verzeichnis terminal_data_folder\MQL5\Indicators. Während der Tests, die unten gezeigt werden, wurden die Standard-Eingabeparameter des Expert Advisors verwendet. Stop Loss und Take Profit wurden während der Tests nicht verwendet. Abb. 1. Die Historie der Handelsgeschäfte im Chart. Testresultate für 2011 bei NZDUSD H4: Abb. 2. Chart der Testergebnisse

2012.12.12
Erste Vorherige 51 52 53 54 55 56 57 58 59 60 61 Nächste Letzte