Ergebnisse des Expertentests mit mehreren Währungen

 

Nachdem ich die Artikel über die Konstruktion von Mehrwährungs-EAs gelesen, Fragen gestellt und Antworten von den "Gatekeepern" der Community erhalten habe, bleibt für mich die Frage: "Wie kann man den EA-Code so zusammenstellen, dass die Testergebnisse korrekt sind?" Das Ziel des Themas ist es, genau diese Frage zu klären.

Ich habe es mit drei verschiedenen Methoden getestet, die von Mitgliedern der Gemeinschaft vorgeschlagen wurden.

-OnTick().

- Diese Methode wird von Konstantin Gruzdev in seinem Artikel"Implementation of the multi-currency mode in MetaTrader 5" vorgeschlagen.

-OnTimer().

Das Schema des Multicurrency Expert Advisor habe ich von Nikolay Kositsin übernommen, den er in seinem Artikel"Creating an Expert Advisor that trades on different symbols" ausführlich beschrieben hat.

Für den Test habe ich einen einfachen EA geschrieben, denn das Wesentliche liegt im Vergleich der Testergebnisse. Als "Referenz" wird das Ergebnis des EURUSD-Tagescharts seit 2000 verwendet. Dann wird dieses Ergebnis mit denselben Parametern mit dem Ergebnis verglichen, das aus dem GBPUSD-Chart gewonnen wurde. Im Prinzip ist nur ein Gerät an den Tests beteiligt, aber die Ergebnisse sollten unabhängig davon, welches Gerät getestet wird, identisch sein.

OnTick()

int OnInit()
{
 return(0);
}

void OnDeinit()
{
}

void OnTick()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

Ein Test von EURUSD auf dem EURUSD-Chart:

Etikett: 01_tick

Ein Test für EURUSD anhand des GBPUSD-Charts:

Etikett:02_tick

Die Ergebnisse des Tests sind nicht einheitlich.

OnChartEvent()

enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO        =0,          // События отключены
   CHARTEVENT_INIT      =0,          // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1 =0x00000001, // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2 =0x00000002, // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3 =0x00000004, // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4 =0x00000008, // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5 =0x00000010, // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6 =0x00000020, // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10=0x00000040, // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12=0x00000080, // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15=0x00000100, // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20=0x00000200, // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30=0x00000400, // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1 =0x00000800, // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2 =0x00001000, // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3 =0x00002000, // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4 =0x00004000, // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6 =0x00008000, // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8 =0x00010000, // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12=0x00020000, // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1 =0x00040000, // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1 =0x00080000, // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1=0x00100000, // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK      =0x00200000, // Событие "новый тик"
   
   CHARTEVENT_ALL       =0xFFFFFFFF, // Все события включены
  };

...

int OnInit()
{
 if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
 if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

void OnDeinit()
{
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 if(id >= CHARTEVENT_CUSTOM)      
   {
    // Объявление массивов переменных для торговых сигналов
    static datetime New_Bar[1];  
    static bool UpSignal[1], DnSignal[1];
      
    // Получение торговых сигналов
    TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
   
    // Совершение торговых операций
    TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
   }
}

Test auf EURUSD aus dem EURUSD-Chart:

Kennzeichnung:01_event == 01_tick

Das Ergebnis ist identisch mit dem als 01_tick markierten Ergebnis.

Test auf EURUSD anhand des GBPUSD-Charts:

Kennzeichnung:02_event ~= 02_tick

Die Testergebnisse sind nicht einheitlich.

OnTimer()

int OnInit()
{
 EventSetTimer(10);

 return(0);
}

void OnDeinit()
{
 EventKillTimer();
}

void OnTimer()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

Der Timer ist auf 10 Sekunden eingestellt.

Testen Sie das Instrument EURUSD im EURUSD-Chart:

Etikett: 01_time == 01_tick && 01_time == 01_ event

Ein Test von EURUSD anhand des GBPUSD-Charts:

Etikett: 02_time == 01_tick && 02_time == 01_ event

Die Testergebnisse sind identisch. Nur an einer Stelle habe ich eine kleine Ungenauigkeit festgestellt. Ich habe auch festgestellt, dass das Ergebnis umso genauer ist, je kleiner das Intervall des Timers ist. Das heißt, selbst wenn der Test auf täglichen Balken durchgeführt wird und das Intervall im Tester z. B. auf 1 Stunde eingestellt ist, wird der Test deutlich schneller als 10 Sekunden laufen, aber die Testergebnisse werden nicht übereinstimmen.

------

Das ist alles. Ich bin an jedermanns Meinung und noch mehr an den Lösungsmethoden interessiert.)))


 

Meiner Meinung nach ist es nicht richtig, diese Optionen getrennt zu vergleichen.

Ich persönlich vertrete die Meinung, dass der Timer in der Karikatur sein muss, und was ihm hinzugefügt wird (Ticks oder Ereignisse) ist eine andere Frage.

Meiner Meinung nach sollten alle verfügbaren Handler verwendet werden, die Frage ist nur, wie sie gefüllt werden und wie der gemeinsame Algorithmus umgesetzt wird.

 
tol64:

"Wie setzen Sie den Code des Prüfers zusammen, damit die Testergebnisse korrekt sind?"

Ich habe die Aussage der Frage zunächst nicht verstanden. Was verstehen Sie unter "korrekten" Testergebnissen, und warum sollten diese erzielt werden?
 
Interesting:

Meiner Meinung nach ist es nicht richtig, diese Optionen getrennt zu vergleichen.

Ich persönlich bin der Meinung, dass der Timer im Cartoon vorhanden sein muss, und was ihm hinzugefügt wird (Ticks oder Ereignisse) ist eine andere Frage.

Die Idee ist, dass alle verfügbaren Handler im Mule verwendet werden sollten, es ist nur eine Frage der Füllung und Implementierung des allgemeinen Algorithmus.


Warum ist es falsch, diese Optionen zu vergleichen? Innerhalb der Grenzen eines einfachen Expert Advisors, wenn die Entscheidung getroffen wird, nachdem der Balken bei dem erforderlichen Symbol und der erforderlichen TF gebildet wurde, halte ich sie für richtig.

Falsch wäre es, wie unten erwähnt, wenn wir einen komplexeren Algorithmus zur Analyse der aktuellen Situation mit denselben Ticks hinzufügen. Aber ich bin nur an den geformten Stäben interessiert.

 
Yedelkin:
Zunächst habe ich die Formulierung der Frage nicht verstanden. Was verstehen Sie unter "korrekten" Testergebnissen, und warum sollten diese erzielt werden?

Das heißt, diejenigen, die der Realität entsprechen. Unabhängig davon, von welchem Zeichen aus wir testen, sollten die Ergebnisse identisch sein. In diesem Fall wurde das gleiche Ergebnis nur durch die Verwendung der Funktion OnTimer() erzielt.

Ich interessiere mich sehr für die Methode von Konstantin Gruzdev. Vielleicht mache ich etwas falsch, und deshalb habe ich nicht die richtigen (zuverlässigen) Ergebnisse erhalten. Ich hoffe auch auf seine Kommentare zu diesem Thema.

 
tol64:

Warum ist es falsch, diese Optionen zu vergleichen? Im Rahmen dieses einfachen Expert Advisors, wenn die Entscheidung nach der Bildung des Balkens beim richtigen Symbol und der richtigen TF getroffen wird, halte ich sie für richtig.

Falsch wäre es, wie unten erwähnt, wenn wir einen komplexeren Algorithmus zur Analyse der aktuellen Situation mit denselben Ticks hinzufügen. Aber ich bin nur an geformten Stäben interessiert.

Ich bestreite nicht, dass es in der Theorie richtig ist, aber in der Praxis gibt es eine Menge Fragen.

Zum Beispiel, hier ist die folgende - es ist in der Handler von Ticks implementiert und die Verbindung mit dem Server verloren geht. Wie wird das System funktionieren und wie wird es erkennen, wenn etwas schief läuft?

Realisierung nur mit Zeitschaltuhr - Eine mehr oder weniger akzeptable Option, die jedoch einen vernünftigen Kompromiss bei der Wahl des Zeitraums erfordert (aber auch dann wird es einige Schwierigkeiten geben).

Veranstaltungen - Auch die Veranstaltungen selbst sind nicht sehr effizient. Generell sollte die Verarbeitung von Ticks und Ereignissen so implementiert werden, dass die Ressourcen möglichst effektiv genutzt werden und der Expert Advisor relativ schnell zur Verarbeitung eines neuen Teils der Daten übergehen kann.

Yedelkin:
Ich habe die Frage von Anfang an nicht verstanden. Was bedeuten "korrekte" Testergebnisse und warum sollten sie eingeholt werden?

Ich bin auch der Meinung, dass man keine 100%ig identischen Ergebnisse erzielen sollte. Außerdem ist es merkwürdig, die Multiplikationsmöglichkeiten auf den Handel mit EINEM Symbol zu beschränken.

Nehmen wir an, es werden mindestens zwei Symbole gehandelt (von denen eines möglicherweise ein Chart-Symbol ist).

 
tol64:

Das heißt, diejenigen, die der Realität entsprechen. Unabhängig davon, von welchem Symbol aus wir testen, sollten die Ergebnisse identisch sein.

Glauben Sie mir, die Suche nach 100%iger Nicht-Identität ist Selbstbetrug und Illusion. Genauso eine Illusion wie ein ewig funktionierender GRAAL. Ein gewisses Maß an Irrtum/Nicht-Identität muss immer berücksichtigt werden.

Und so wie es aussieht, ist der Test eines Cartoons nicht sehr aufschlussreich. Die Diskussion über Mults sollte sich nur auf den Handel mit mehreren Symbolen oder den Handel mit mehreren Strategien für ein Symbol beziehen.

Ich meine damit, dass die STÄNDIG identischen Ergebnisse in einem Multisymbol nicht wichtig sind, sondern die Mechanismen, die es Experten ermöglichen, Handelsentscheidungen unter Berücksichtigung von Positionen und Historie zu treffen.

Versuchen Sie zum Beispiel, mit zwei Symbolen zu handeln : EURUSD und GBPUSD, wobei der Handel mit Hedging und Signalen auf dem zweiten Symbol erfolgen sollte.

 
Interesting:

Glauben Sie mir, die Suche nach 100%iger Nicht-Identität ist eine Selbsttäuschung und eine Illusion. Genauso illusorisch wie der ständig arbeitende GRAAL. Man muss immer einen gewissen Spielraum für Fehler bzw. Nichtidentität einkalkulieren.

Und so wie es aussieht, ist der Test eines Cartoons nicht sehr aufschlussreich. Die Diskussion über Mults sollte sich nur auf den Handel mit mehreren Symbolen oder den Handel mit mehreren Strategien für ein Symbol beziehen.

Ich meine, dass die STÄNDIG identischen Ergebnisse in einem Multisymbol nicht wichtig sind, sondern die wichtigen Mechanismen, die es dem Experten erlauben, Handelsentscheidungen unter Berücksichtigung der Positionen und der Historie zu treffen.

Versuchen Sie zum Beispiel, mit zwei Symbolen zu handeln: EURUSD und GBPUSD, wobei der Handel mit Hedging und Signalen auf dem zweiten Symbol erfolgen sollte.

Jetzt sehen Sie sich das Gesamtbild an, wie der EA funktionieren soll. Lassen wir alle Schwierigkeiten und technischen Details der Programmimplementierung für den realen Handel beiseite. Die Angelegenheit ist in diesem Artikel sehr kritisch.

1. Ein einfaches Handelssystem. Sie basiert auf den geformten Stäben.

2. Ein Test mit einem Symbol, aber mit einem anderen Symbol.

Ich habe die Struktur absichtlich auf ein Minimum vereinfacht. Damit soll die Analyse der Testergebnisse erleichtert werden. Sie können alle Symbole testen, aber die Ergebnisse werden dadurch nicht besser. Das Ergebnis ist ein Durcheinander, das schwieriger und länger zu analysieren sein wird. Der Expert Advisor zeigt die exakte Aktion für das Symbol an, auf dem er sich befindet, aber er bringt alle anderen durcheinander, und das ist genau das, was diese Ergebnisse zeigen. Die Testergebnisse sollten identisch sein, sonst stellt sich heraus, dass der Expert Advisor bei einem Symbol korrekte Eingaben macht, bei den anderen aber nicht oder nicht genau dem System folgt. Diese Diskrepanz ist sehr auffällig.

Bislang kann die Identität nur durch die Funktion OnTimer() erreicht werden.

P.S.: Ich glaube nicht an GRAILS. Oder besser gesagt, ich verstehe es anders als viele andere).

 

Hier ist das Ergebnis auf einmal für fünf Zeichen mit der Funktion OnTimer():

Unabhängig davon, von welchem Symbol aus der Test durchgeführt wird, ist das Ergebnis immer das gleiche.

Bei der Verwendung anderer Methoden(OnTick() und OnChartEvent()) würden die Ergebnisse jedoch anders ausfallen, wenn das Symbol, in dem sich der Expert Advisor befindet, geändert wird. Und es bestätigt nur, dass der Expert Advisor bei anderen Symbolen falsche Aktionen durchführt.

Es ist klar, warum dies mit OnTick() geschieht. Darüber ist bereits mehrfach diskutiert worden. Aber die Methode OnChartEvent() ist immer noch fragwürdig.

 

tol64:

Mit OnTick() ist klar, warum dies geschieht. Dies wurde bereits mehrfach erörtert. Aber die Methode OnChartEvent() ist immer noch fragwürdig.

Wir müssen eine mögliche Verzögerung bei der Ereignisbehandlung oder sogar einen möglichen VERLUST des Ereignisses in Betracht ziehen.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

Das heißt, diejenigen, die der Realität entsprechen. Unabhängig davon, von welchem Zeichen aus wir testen, sollten die Ergebnisse identisch sein. In diesem Fall wurde das gleiche Ergebnis nur bei Verwendung von OnTimer() erzielt.

Ich sehe es grob. Sie entscheiden sich für einen "Motor", auf dem Sie Ihren Multiwährungs-Expert Advisor aufbauen werden. Dazu nehmen Sie eine primitive Handelsstrategie und führen sie zunächst nach dem Schema "Signalquelle und Signalbehandler auf einem Symbol" und dann nach dem Schema "Signalquelle und Signalbehandler auf verschiedenen Symbolen" aus. Ist dies richtig?

Wenn ja, verstehe ich Sätze wie "Test on EURUSD tool from GBPUSD chart" nicht ganz. Welches Symbol ist in diesem Fall die Signalquelle, und an welches Symbol ist der Signalhandler angehängt?