Diskussion zum Artikel "Adaptive Handelssysteme und ihre Verwendung im MetaTrader 5 Client-Terminal" - Seite 3

 
Quantum:

Liebe Forexistence,

>>Liebe

Sie haben Ihre Frage beantwortet :)

>> Ja, vielleicht habe ich meine Frage teilweise selbst beantwortet, und möchte nur eine Bestätigung oder andere Meinungen.

Sie haben Recht, es gibt zwei Möglichkeiten, wenn Sie die Handelsbedingungen ändern wollen, von einer Seite können wir neue Bedingungen zur Strategie CStrategyMA hinzufügen (aber wir werden die neue Strategie bekommen, die sich von der ursprünglichen unterscheidet), die andere Möglichkeit ist, eine neue Klasse zu erstellen (zum Beispiel CStrategyMA34) und zusätzliche Kauf/Verkaufsbedingungen dort hinzuzufügen.

Aber natürlich sollten Sie die Datei mit Ihrer neuen Strategie einschließen und diese neuen Strategien zur Funktion Expert_OnInit der Klasse CAdaptiveStrategy hinzufügen:

Der zweite Weg ist besser, Sie können viele Strategien und ihre Variationen hinzufügen.

Es ist nicht notwendig, die Instanzen der Klasse CStrategyMA zu entfernen (wenn Sie welche haben), wir werden nicht in ihre Sandboxen schauen, da ihre Ergebnisse schlecht sein werden.

Der Markt wird uns helfen, die beste Strategie in der Liste der Strategien zu bestimmen, die in m_all_strategies enthalten ist.

>> Ok, ich habe den Punkt so verstanden, wie ich ihn mir vorgestellt habe.

Aber die Frage, jetzt, ist eine andere. Ich arbeite daran, den EA zu "inputisieren", um mit Optimierungen arbeiten zu können.

Also im Beispiel meine ich Codestücke wie diese:

for(int i=0; i<RSIcicle; i++)
     {
      CStrategyRSI *t_StrategyRSI;
      t_StrategyRSI=new CStrategyRSI;
      if(t_StrategyRSI==NULL)
        {
         delete m_all_strategies;
         Print("Error of creation of object of the CStrategyRSI type");
         return(-1);
        }

      

       ////////////////////////// PLEASE LOOK AT THIS FOLLOWING PIECE OF CODE ///////////////////////
   //Zeitraum für jede Strategie festlegen
    int period=Trsi+Drsi*i;
    
    ENUM_TIMEFRAMES RSItempoframe=RSItempoframe_in; // SET TIMEFRAME (enum), INPUT, FOR STRATEGY 
    ENUM_APPLIED_PRICE RSIappprice=RSIappprice_in;  // SET APPPLIED PRICE (enum), INPUT, FOR STRATEGY
    
    int RSIvarA_root=RSIvarA_in;
    int RSIvarB_root=RSIvarB_in;
    
      // Initialisierung der Strategie
      t_StrategyRSI.Initialization(period,true,RSItempoframe,RSIappprice,RSIvarA_root,RSIvarB_root);
      /////////////////////////////////////////////////////////////////////////////////////////////


      // Einzelheiten der Strategie festlegen
      t_StrategyRSI.SetStrategyInfo(_Symbol,"[RSI_"+IntegerToString(period)+"]",period,"Relative Strenght Index "+IntegerToString(period));
      
      if(t_StrategyRSISet_Stops_ ==true) {
      t_StrategyRSI.Set_Stops(tSMSSone,tSMSStwo); //3500,1000);
      }

wo (Deklarationen) :

//+------------------------------------------------------------------+
//|                                            CAdaptiveStrategy.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

#include <Arrays\ArrayObj.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <CStrategyMA.mqh>
#include <CStrategyMAinv.mqh>
#include <CStrategyStoch.mqh>

#include <CStrategyRSI.mqh>   // ZUSÄTZLICHE STRATEGIE

/*
......
*/

input int Trsi=0, Drsi=10, RSIcicle=10;

input ENUM_TIMEFRAMES RSItempoframe_in= PERIOD_CURRENT;
input ENUM_APPLIED_PRICE RSIappprice_in= PRICE_CLOSE;

input int RSIvarA_in=60, RSIvarB_in=40;




input int tSMSSone=3500, tSMSStwo=1000;


input bool t_StrategyRSISet_Stops_=false;

/*
...
*/

//+------------------------------------------------------------------+
//| Class CAdaptiveStrategy                                          |

/*
...
*/

und wo Variablen:

RSItempoframe, RSIappprice, RSIvarA_root, RSIvarB_root

arbeiten zusammen mit

//+------------------------------------------------------------------+
//|                                                  CStrategyMA.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#include <CSampleStrategy.mqh>

input int mval=0, mval1=1, mval2=2, mval3=3, mval4=4, mvalVar=0, mvalFix=0,

          mvalVar2=0, mvalFix2=0;
          

//+------------------------------------------------------------------+
//| Class CStrategyMA for implementation of virtual trading          |
//| by the moving average strategy                                   |
//+------------------------------------------------------------------+
class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // Handle des Indikators Gleitender Durchschnitt (iMA)
   int               m_period;     // Zeitraum des Indikators Gleitender Durchschnitt
   double            m_values[];   // Array zum Speichern des Wertes des Indikators





   int               RSIvarA, RSIvarB; 
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;



   
public:
   // Initialisierung der Strategie // Hinweis auf hinzugefügte Eingaben


   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);


   // Deinitialisierung der Strategie
   int               Deinitialization();
   // Überprüfung der Handelsbedingungen und Eröffnung virtueller Positionen
   bool              CheckTradeConditions();
  };
//+------------------------------------------------------------------+
//| Method of initialization of the strategy                         |
//+------------------------------------------------------------------+



int CStrategyRSI::Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                 ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root)


  {
   //set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//Handle des Indikators erstellen 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

//+------------------------------------------------------------------+
//| checking the trade conditions and opening the virtual positions  |
//+------------------------------------------------------------------+
bool CStrategyRSI::CheckTradeConditions()
  {
   RecalcPositionProperties(m_position);
  // double p_close;

/*
...
*/
   
     if(CopyRates(_Symbol,m_timeframe,0,3,m_rates)<0)

{
      Alert("Error of copying history data - error:",GetLastError(),"!!");
      return(false);
     }
// Kopieren Sie den aktuellen Schlusskurs des vorherigen Balkens (dies ist Balken 1)
  // p_close=m_rates[1].close;  // close price of the previous bar          

   if(CopyBuffer(m_handle,0,0,3,m_values)<0)
     {
      Alert("Error of copying buffers of the Moving Average indicator - error number:",GetLastError());
      return(false);
     }

/*
...
*/

// Kaufbedingung 1: RSI steigt an
   bool buy_condition_1=(m_values[mval]>m_values[mval1]) && (m_values[mval1]>m_values[mval2]);  // HINWEIS Ganzzahlige Variable in den [] des Arrays

// Kaufbedingung 2: vorheriger Schlusskurs ist höher als MA
 //  bool buy_condition_2=(p_close>m_values[1]);


     bool buy_condition_2=(m_values[mval+mvalVar+mvalFix]>RSIvarA);

/*
... usw..
*/


   

Meine Frage ist:

Ist es zweckmäßig, den Code zu ändern, um die Eingangsvariable auf der Ebene der Strategie-Klassendatei (Include-Datei, d.h. CStrategyRSI.mqh) zu haben, oder mit der richtigen Hiearachy/Verbindungen/Bäume auf der Ebene der anderen Klasse/Includes (CAdaptiveStrategy.mqh)?

Mit anderen Worten, um das Kernsystem der EA-Idee zu beeinflussen, mit dem Hinzufügen von einigen Eingabeparametern für Optimierungsprüfungen,

sollte ich etwas wie dieses tun: (Eingabevariablen in CAdaptiveStrategy.mqh)

/*
...
*/

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // handle of the Moving Average (iMA) indicator
   int               m_period;     // period of the Moving Average indicator
   double            m_values[];   // array for storing the value of indicator
   int               RSIvarA, RSIvarB;
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;
   
public:
   // initialization of strategy
   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//Handle des Indikators erstellen 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/
 

oder etwas anderes wie dieses: (Eingabevariablen in CSampleRSI.mqh)

/*
...
*/

input   int               RSIvarA_root, RSIvarB_root;
   
input  ENUM_TIMEFRAMES  RSItempoframe=PERIOD_M5;
input   ENUM_APPLIED_PRICE RSIappprice=PRICE_CLOSE;
   

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // Handle des Indikators Gleitender Durchschnitt (iMA)
   int               m_period;     // Zeitraum des Indikators Gleitender Durchschnitt
   double            m_values[];   // Array zum Speichern des Wertes des Indikators

  ENUM_TIMEFRAMES   m_timeframe;
  ENUM_APPLIED_PRICE m_appprice;

int               RSIvarA, RSIvarB;

public:
   // Initialisierung der Strategie
   int               Initialization(int period,bool virtual_trade_flag);  // BEACHTEN SIE DEN URSPRÜNGLICHEN CODE

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//Handle des Indikators erstellen 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

Mit anderen Worten, die Eingabevariablen sollten in der Include-Datei der Strategie vor der Klassendeklaration verwendet werden (Beispiel2, nur das hier oben) oder die Eingabevariablen sollten

aus dem "for"-Zyklus in der CAdaptive-Strategie ableiten und alle Klasseninitialisierungen und Eingabeparameter berücksichtigen? (ich meine für dieses erste Beispiel (gerade über diesen Code oben) :)

public:
// Initialisierung der Strategie
int Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

Wie anders wird sich der Kern des Systems auswirken, wenn Eingabevariablen in der Datei CStrategyRSI.mqh verwendet werden oder in der Datei CAdaptiveStrategy.mqh?

Ich nehme an, wenn es nur um das Testen geht, kann ich Eingabevariablen in der Datei CStrategyRSI.mqh verwenden, wenn ich stattdessen sowohl testen als auch

das Kernsystem der EA-Idee (das adaptive System und der Handelssimulator, der virtuelle Trader enthalten) beeinflussen möchte, sollte ich die

Eingangsvariablen nicht im Strategie-Include, sondern in der Adaptive-Include-Datei deklarieren, mit allen richtigen Verbindungen und Aufrufen

von Input/Output der Inizialisierung und Deklaration von Klassen/Funktionen?

Richtig?

Ich hoffe, Sie haben meinen Punkt verstanden.

Tnkx

 
forexistence:

....Aber die Frage, jetzt, ist eine andere. Ich arbeite daran, den EA zu "inputisieren", um mit Optimierungen arbeiten zu können....

Wenn Sie die besten Parameter der Strategie mit Hilfe der Optimierungsoption im Strategy Tester finden wollen, ist es besser, den EA mit einer bestimmten Strategie neu zu schreiben und damit zu spielen.

Das Konzept des adaptiven EA und seine Struktur erlauben es nicht, seine Parameter direkt im Strategy Tester zu optimieren, da es keine bestimmte Strategie und Parameter zum Optimieren gibt.

Wenn wir den adaptiven EA im Handel verwenden oder ihn im Strategy Tester testen, haben wir ein Handelssystem als eine Reihe von Signalen aus den verschiedenen Strategien. Mit anderen Worten, der Tester hat keinen Zugang zu den virtuellen Sandboxen, die wir erstellt haben, und er weiß nichts über sie.

Wenn Sie die Eingabeparameter verwenden möchten, um die Parameter der zu verwendenden Handelsstrategien zu konfigurieren, ist es besser, die Dateien zu verwenden, die es Ihnen ermöglichen, die Parameter und die Liste der Handelsstrategien zu konfigurieren.

 
Quantum:

Wenn Sie die besten Parameter der Strategie mithilfe der Optimierungsoption im Strategietester finden wollen, ist es besser, den EA mit einer bestimmten Strategie neu zu schreiben und damit zu spielen.

>> Ok, ich habe den Punkt verstanden. Es wird keine leichte Aufgabe sein...

Das Konzept des adaptiven EA und seine Struktur erlauben es nicht, seine Parameter direkt im Strategy Tester zu optimieren, da es keine bestimmte Strategie und Parameter zum Optimieren gibt.

>> Ja. Der EA ist idealisiert, um mit noch optimiertenParametern für die Strategien zu arbeiten. Was ich verstanden habe, ist, dass es verschiedene Strategien in der Basis verwendet, wie/welche der Markt reagiert (oder umgekehrt auf einem anderen Standpunkt..)

Wenn wir den adaptiven EA im Handel verwenden oder ihn im Strategy Tester testen, haben wir ein Handelssystem als eine Reihe von Signalen aus den verschiedenen Strategien. Mit anderen Worten, der Tester kann nicht auf die virtuellen Sandboxen zugreifen, die wir erstellt haben, und er weiß nichts über sie.

>> Ich habe dieses Konzept verstanden, aber nicht ganz.

Ich verstehe, dass es keinen Sinn macht, den Tester mit virtuellen Sandboxen interagieren zu lassen, keinen logischen Sinn.

Mein einziges Ziel war es, den EA zu modifizieren, um ihn mit einem Addon zu verwenden: das Ziel, diesen EA auch für die Optimierung der Parameter zu verwenden, ohne einen anderen EA neu zu schreiben, oder alle Strategien neu zu schreiben, oder jede Strategie einzeln zu testen. Meine Idee waren nur für "Komfort" auf die Möglichkeit, die Parameter zu optimieren, innerhalb der gleichen EA, aber diese Optimierung ist nicht beabsichtigt, mit dem virtuellen Handel / adaptive System zu arbeiten. Es geht nur darum, die Möglichkeit zu haben, die Parameter der Strategien zu optimieren, indem man das gleiche EA-Eingabefenster benutzt, und nicht darum, für jede Strategie einen anderen EA zu schreiben, die optimierten Parameter zu erhalten und sie als feste Werte in das adaptive Strategiesystem zu setzen. Ich hoffe, Sie haben meinen Standpunkt verstanden.

Wenn Sie die Eingabeparameter verwenden wollen, um die Parameter der zu verwendenden Handelsstrategien zu konfigurieren, ist es besser, die Dateien zu verwenden, die es Ihnen erlauben, die Parameter und die Liste der Handelsstrategien zu konfigurieren.

>> ( Wenn Sie die Eingabeparameter verwenden möchten, um die Parameter der zu verwendenden Handelsstrategien zu konfigurieren, ist es besser, die Dateien zu verwenden )

Meinen Sie die Verwendung von CStrategyXXX.mqh oder die Tatsache, dass Sie für jede Strategie einen eigenen EA schreiben, ihn optimieren und die Parameter als feste Werte in CStrategyXXX.mqh kopieren?

 

Are you talking about to use CStrategyXXX.mqh or the fact to write another individual EA for each strategy, optimize it, and copy the parameters as fixed values in CStrategyXXX.mqh?

Ich meine, dass der Strategie-Container entsprechend einiger Einstellungen des adaptiven EA gefüllt werden kann.

Zum Beispiel kann in der Adaptive_Expert.Expert_OnInit() eine Datei mit adaptiven EA-Einstellungen geladen werden:

MA;3
MA;15
MA;25
Stoch;3;12;20
Stoch;3;15;30

Strategie1;Param1;Param2;
Strategie2;Param1;Param2;

Durch das Parsen jeder Zeile erkennt es die Strategie, die einbezogen werden muss, und fügt sie mit den entsprechend angegebenen Parametern hinzu. Dies ist eine der Möglichkeiten, den adaptiven EA ohne Kompilierung zu konfigurieren. Der Einfachheit halber habe ich es in diesem Artikel nicht berücksichtigt.

Ich verstehe, dass es keinen Sinn hat, den Tester mit virtuellen Sandboxen zu interagieren, keinen logischen Sinn zu handeln.

Mein einziges Ziel war es, den EA zu modifizieren, um ihn mit einem Addon zu verwenden: das Ziel, diesen EA auch für die Optimierung der Parameter zu verwenden, ohne einen anderen EA neu zu schreiben, oder alle Strategien neu zu schreiben, oder jede Strategie einzeln zu testen. Meine Idee waren nur für "Komfort" auf die Möglichkeit, die Parameter zu optimieren, innerhalb der gleichen EA, aber diese Optimierung ist nicht beabsichtigt, mit dem virtuellen Handel / adaptive System zu arbeiten. Es geht nur darum, die Möglichkeit zu haben, die Parameter der Strategien zu optimieren, indem man das gleiche EA-Eingabefenster benutzt, und nicht darum, für jede Strategie einen anderen EA zu schreiben, die optimierten Parameter zu erhalten und sie als feste Werte in das adaptive Strategiesystem zu setzen. Ich hoffe, Sie haben meinen Standpunkt verstanden.

Es gibt eine Möglichkeit, die Sandboxen zu betrachten. Das kann man indirekt mit dem Strategy Tester machen.

Nehmen wir an, wir wollen die Ergebnisse reproduzieren, die in Abb. 2 des Artikels dargestellt sind.

Wir benötigen die Debug-Version des adaptiven EA adaptive-systems-mql5-sources-debug-de.zip (sie meldet die Sandboxen). Dann kompilieren und öffnen Sie Adaptive_Expert_Sample im Strategy Tester, wählen Sie EURUSD H1 01.01.2010 bis 20.08.2010 und starten Sie den Test. Die Sandboxen und die Ergebnisse der adaptiven Strategie werden in tester\files\equity_res.txt gespeichert. Auf diese Weise ist es sehr einfach, alle Zahlen zu reproduzieren.

Die Analyse der virtuellen Handelsaktien/-bilanzen wird es Ihnen ermöglichen, die Optimierung zu vereinfachen.

 

Hallo zusammen,

Danke für diesen tollen Artikel, ich arbeite jetzt nur noch an einem adaptiven EA.

Allerdings bin ich mir nicht sicher, wo ich eine Trailing-Stop-Funktion in diese Art von EA einfügen kann.

Ich denke, eine solche Funktion könnte in den CAdaptiveStrategy.mqh Teil eingefügt werden.

Könnte mir jemand von euch dabei helfen? Vielleicht habt ihr ja schon eine solche Funktion entwickelt?

Herzlichen Dank im Voraus!

Mit freundlichen Grüßen,

Patrick

 
Hat jemand eine Version von Adaptive Trading, die mit den Experten auf der Basis der OO Expert Class funktioniert?
 
MQL5 eröffnet uns enorme Möglichkeiten, die noch nicht viele Händler zu schätzen wissen - und noch weniger können sie nutzen.
 
Vielen Dank für den tollen Artikel. Ich habe mir überlegt, wie ich ein adaptives System implementieren kann, dies war ein Ansatz, den ich mir ausgedacht habe, aber ich hatte noch nicht die Zeit, ihn auszuarbeiten. Haben Sie in Betracht gezogen, eine der eingebauten Backtesting-Funktionen in Verbindung mit den Live-Daten zu verwenden?
 

Ich kann die Ergebnisse aus dem Artikel nicht reproduzieren.

Ich habe die Quelldateien heruntergeladen, kompiliert und über denselben Zeitrahmen (EURUSD H1, 04/01/2010 - 20/08/2010) ausgeführt, und ich erhalte ein anderes Ergebnis.

Ich habe die Debug-Dateien verwendet und die virtuellen Handelsergebnisse überprüft... die virtuellen Aktiengrafiken sind identisch, aber die tatsächlichen Trades stimmen nicht überein.

Ohne eine Protokolldatei der tatsächlichen Trades ist es schwer herauszufinden, warum meine Trades nicht mit denen des Artikels übereinstimmen.

Haben Sie eine Idee, warum ich nicht übereinstimme?

 
Sehr schöner Artikel. Die Ablenkung kommt von Leuten, die versuchen, die Ergebnisse zu reproduzieren, anstatt die vorgeschlagenen funktionalen Möglichkeiten zu übernehmen und zu integrieren. Jetzt ist die Wahrscheinlichkeit der Schaffung eines voll funktionsfähigen und profitablen automatisierten und halbautomatischen Handel EA realisiert. Das Testen von Indikatoren auf breiter Ebene, das Zusammenstellen der Ergebnisse und das Extrahieren von statistischen Daten der Indikatoren zusätzlich zu den Konformitätsstatistiken der besagten Daten ermöglicht es dem EA, die beste Handelsstrategie für die Umsetzung zu wählen. Noch nie wurden fundamentale und technische Analyse in einem EA kombiniert, bis jetzt mit dem Hilfsmittel der MQL5 Sprache. Mit Blick in die Zukunft sehe ich die Realisierung EA's in allen Märkten kommen zusammen, um Marktschwankungen vorherzusagen.