Ergebnisse des Expertentests mit mehreren Währungen - Seite 4

 
tol64:
Und könnten Sie ein ähnliches Beispiel zeigen, wie ich es zu Beginn des Zweigs gemacht habe? Schließen Sie den Handel nur für ein Symbol ein, aber testen Sie ihn für ein anderes. Machen Sie ein Bildschirmfoto und testen Sie es auf dem Symbol, auf dem der Test läuft. Wird es eine Divergenz geben, wie sie am Anfang des Zweigs zu sehen ist? Wenn die Balkenformation auf allen Symbolen verfolgt wird, sollte sie jedoch identisch sein. Aber Sie müssen trotzdem alles überprüfen...

Nun, ich werde es nicht testen. Ich kann den Code posten und Sie testen ihn ;-):

string Instruments[] = ...
int SymbolCount = ArraySize(Instruments);

void RefreshRates(string symbol)
{
  MqlTick tick;
  SymbolInfoTick(symbol, tick);
  SymbolInfoDouble(symbol, SYMBOL_BID);
}

bool Synchronization()
{
  static bool Sync = true;

  string StrUnsync;
  int u = 0;

  datetime dt0 = (datetime)SeriesInfoInteger(_Symbol, Period(), SERIES_LASTBAR_DATE);
  
  for(int j = 0; j < SymbolCount; j++)
  {
    RefreshRates(Instruments[j]);
    datetime dt = (datetime)SeriesInfoInteger(Instruments[j], Period(), SERIES_LASTBAR_DATE);
    if(dt != dt0)
    {
      StrUnsync = StrUnsync + Instruments[j] + " ";
      u++;
    }
  }
  if(u > 0)
  {
    Print("Some symbols are unsynchonized:", StrUnsync);
    Sync = false;
    return(false);
  }
  else
  {
    if(!Sync)
    {
      Print("Synchronization done");
    }
    Sync = true;
  }
  return(true);
}

void OnTick()
{
  if(!Synchronization()) return;
  ...
}
 
marketeer:

Nun, ich werde es nicht testen. Ich kann den Code posten und Sie testen ihn ;-):

)) Danke für die angegebene Variante. Ich werde jetzt nur noch meinen Vorschlag prüfen, der durch den Hinweis auf einen möglichen Fehler durch die Forumsteilnehmer Yedelkin und Interesting entstanden ist, und dann werde ich gerne Ihre Variante testen. Ich werde über die Ergebnisse im Detail berichten. ))
 

Yedelkin 

Beachten Sie den Teil des Codes:

Hier können Sie sehen, dass Sie eine Art "Spy Control Panel MCM"-Anzeige an zwei verschiedenen Zeichen "aufhängen". Das heißt, Sie haben verschiedene Symbole als Signalquellen. Aber Sie behaupten, dass "wir auf EURUSD handeln", d.h. die Signalquelle ist ein und dasselbe Symbol. Damit wir uns richtig verstehen.

Wir handeln nur auf EURUSD.

In meinen Tests berücksichtige ich das von Konstantin Gruzdev geschriebene Schema -Implementation of the Multicurrency Mode in MetaTrader 5. ))) Alles ist definiert. Die angehängten Dateien enthalten den Spy Control Panel MCM Indikator und den exSpy Control Panel MCM Expert Advisor. Wenn Sie den Expert Advisor auf einem Chart installieren, können Sie sehen, wie er funktioniert. Das Protokoll zeigt deutlich die spezifizierten Ereignisse, die der Expert Advisor von verschiedenen Symbolen erhält. Alles ist klar, nichts ist vermischt.

Ich habe jetzt versucht, in OnChartEvent() das Symbol anzugeben, von dem die ID empfangen wird, aber das hat die Ergebnisse nicht verändert. Ich habe das zweite Zeichen aus OnInit() entfernt, um die Möglichkeit auszuschließen, dass die falschen Ereignisse empfangen werden. Der Test wurde nun mit dieser Variante durchgeführt:

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);}

 return(0);
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if(id >= CHARTEVENT_CUSTOM)
   {
    if(sparam == Symbol_01)
      {
       // Получение торговых сигналов
       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 des EURUSD-Symbols auf dem EURUSD-Chart:

Test mit dem EURUSD-Tool anhand des GBPUSD-Charts:

Die Ergebnisse sind nicht einheitlich.

Interessant

Diesem Code nach zu urteilen, stammen die Signale tatsächlich von zwei Symbolen. Der Expert Advisor kann jedoch eines dieser Signale mit einer Verzögerung verarbeiten.

Das zweite Symbol ist nicht mehr vorhanden, die Signale kommen nur vomEURUSD. Aber leider ist das Problem damit nicht gelöst.

 
marketeer:

Nun, ich werde es nicht testen. Ich kann den Code posten und Sie testen ihn ;-):

Ich habe Ihre Version getestet. )) Die Ergebnisse sind fast identisch. Für vorläufige (schnelle) Tests könnte es ausreichen. Wir werden die Funktion OnTimer() verwenden, um absolut identische Ergebnisse zu erzielen.

Hier sind die Ergebnisse der Tests:

Testen Sie das EURUSD-Tool anhand des EURUSD-Charts:

Test mit dem EURUSD-Tool anhand des GBPUSD-Charts:

 
MetaDriver:

Ich denke, dass 10 Sekunden ein zu kurzes Intervall sind. Wenn nur geformte Balken von Interesse sind, sollte das Intervall mindestens eine Minute betragen.

Es hat keinen Sinn, die Zeitspanne zu verkürzen, eine Minute ist das Minimum...

Ich habe eine weitere Testreihe durchgeführt, um die Unstimmigkeit der Ergebnisse über 10 Sekunden hinaus aufzuzeigen. Wir werden mit demselben "Benchmark" vergleichen, der zu Beginn des Themas angegeben wurde. Das heißt, von der Funktion OnTick() durch die gebildeten Tagesbalken, wenn der Expert Advisor auf dem zu testenden Symbol steht. Hier ist sie:

Dann werden alle Ergebnisse von der Funktion OnTimer() stammen. Der Expert Advisor bezieht sich auf das GBPUSD-Symbol:

Testen Sie das EURUSD-Symbol im GBPUSD-Chart. Das Intervall des Timers beträgt 10 Sekunden:

Dies ist das genaueste Ergebnis.

Testen Sie das EURUSD-Symbol im GBPUSD-Chart. Das Timer-Intervall beträgt 1 Minute:

Das ist nicht wahr. Das Ergebnis war sogar deutlich besser, was ebenfalls falsch und irreführend ist.

Ein Test für EURUSD anhand des GBPUSD-Charts. Das Intervall des Timers betrug 60 Minuten:

Das Ergebnis deckt sich an vielen Stellen nicht mit der Benchmark.

Test auf EURUSD anhand des GBPUSD-Charts. Das Timer-Intervall beträgt 1 Tag:

Das Ergebnis ist mehr als alles andere nicht identisch.

-------------------------

Im Allgemeinen sollten Expert Advisors mit mehreren Währungen mit der Funktion OnTimer() getestet werden, um ein korrektes Ergebnis zu erzielen, indem das Mindestintervall festgelegt wird.

 
tol64:

Ich habe eine weitere Testreihe durchgeführt, um die Unstimmigkeit der Ergebnisse über 10 Sekunden hinaus aufzuzeigen. Wir werden mit demselben "Benchmark" vergleichen, der zu Beginn des Themas angegeben wurde. Das heißt, von der Funktion OnTick() durch die gebildeten Tagesbalken, wenn der Expert Advisor auf dem zu testenden Symbol steht. Hier ist sie:

Dann werden alle Ergebnisse von der Funktion OnTimer() stammen. Der Expert Advisor bezieht sich auf das GBPUSD-Symbol:

Testen Sie das EURUSD-Symbol im GBPUSD-Chart. Das Intervall des Timers beträgt 10 Sekunden:

Dies ist das genaueste Ergebnis.

Testen Sie das EURUSD-Symbol im GBPUSD-Chart. Das Intervall des Timers beträgt 1 Minute:

Nicht korrekt. Das Ergebnis ist sogar deutlich besser, was ebenfalls falsch und irreführend ist.

Ein Test für EURUSD anhand des GBPUSD-Charts. Das Intervall des Timers beträgt 60 Minuten:

Das Ergebnis deckt sich an vielen Stellen nicht mit der Benchmark.

Test auf EURUSD anhand des GBPUSD-Charts. Das Intervall des Timers beträgt 1 Tag:

Das Ergebnis ist mehr als alles andere nicht identisch.

-------------------------

Im Allgemeinen sollten Expert Advisors mit mehreren Währungen durch die Funktion OnTimer() getestet werden, während das Mindestintervall eingestellt wird, um sich der Richtigkeit der Ergebnisse sicher zu sein.

Das verstehe ich nicht ganz. Sie haben einen falschen Vergleich angestellt.

Der erste Test ist richtig: Vergleich von zwei Testmethoden - mit "Ihrem" Werkzeug und mit einem anderen. Und dann haben Sie dieses erste Ergebnis als Benchmark genommen und alle anderen Ergebnisse damit verglichen.

Sie sollten die restlichen Identitätsläufe nicht mit dem ersten Ergebnis vergleichen, sondern mit Läufen der gleichen Tickfrequenz auf "Ihrem" Instrument.

Sie werden sich von den "10 Sekunden" unterscheiden, das ist nur natürlich, die Hauptsache ist, dass sie paarweise identisch sein sollten.

Bitte füllen Sie den Test aus.

Andernfalls wird sich herausstellen, dass Sie nur Ihre Zeit vergeudet haben und es seltsamerweise gelungen ist, Ihre anfängliche Illusion "über die Vorteile des 10-Sekunden-Tests" zu bestätigen.

 
tol64:

Ich habe Ihre Option getestet. )) Die Ergebnisse sind fast identisch. Sie ist für erste (schnelle) Tests gut genug. Um völlig identische Ergebnisse zu erzielen, werden wir die Funktion OnTimer() verwenden.

Soweit ich weiß, ist es nicht meine Art der Synchronisation, die Sie jetzt testen, sondern der Tick-Generator von MetaTrader. Der Punkt ist, dass bei der Durchführung des Tests verschiedene Tickbasen erzeugt wurden - unter dem Namen eurusd und unter dem Namen gbpusd, und die Ergebnisse sind fast nie gleich. Wenn Sie zwei EAs mit dem angegebenen Synchronisationsblock auf verschiedenen Symbolen laufen lassen, sollte der Unterschied in der Realität vernachlässigbar oder gar nicht vorhanden sein.
 
MetaDriver:

Ich verstehe das nicht ganz. Sie haben etwas falsch verglichen.

Der erste Test ist richtig: Sie vergleichen zwei Arten der Prüfung - auf "Ihrem" Instrument und auf einem anderen. Und dann haben Sie dieses erste Ergebnis als Benchmark genommen und alle anderen Ergebnisse damit verglichen.

Sie sollten die restlichen Identitätsläufe nicht mit dem ersten Ergebnis vergleichen, sondern mit Läufen der gleichen Tickfrequenz auf "Ihrem" Instrument.

Sie werden sich von den "10 Sekunden" unterscheiden, das ist nur natürlich, die Hauptsache ist, dass sie paarweise identisch sein sollten.

Bitte füllen Sie den Test aus.

Andernfalls wird sie sich als Zeitverschwendung erweisen, denn sie schafft es seltsamerweise, ihre anfängliche Illusion von den "Vorteilen des 10-Sekunden-Tests" zu bestätigen.

Gut. Jetzt habe ich bereits einen weiteren langen Test begonnen. Wenn ich aufwache, wird es vorbei sein. Aber ich kann Ihnen schon sagen, dass sie paarweise identisch sind, denn ich habe es gesehen. Jetzt muss ich es Ihnen nur noch zeigen. Aber Sie können den gleichen Test auch selbst durchführen. Dies ist ein wichtiger Aspekt beim Testen von Handelssystemen. Vielleicht mache ich etwas falsch)).

P.S. Die Hauptsache war, dass sie paarweise nicht identisch sein dürfen, denn beim Testen durch die Funktion OnTimer() scheinen sie auf jeden Fall identisch zu sein. Ursprünglich sollten sie mit dem Ergebnis identisch sein, das im normalen Modus mit der Funktion OnTick() mit expliziter Prüfung der Balken erzielt wird. Expert Advisors, die auf ein einziges Symbol handeln, machen das perfekt. Aber im Mehrwährungsmodus war es notwendig, dies herauszufinden. Das Ergebnis ist offensichtlich.

 
marketeer:
Soweit ich weiß, haben Sie nicht meine Art der Synchronisierung getestet, sondern den Tick-Generator von MetaTrader. Der Punkt ist, dass Sie bei der Durchführung der Tests unterschiedliche Tick-Basen erzeugt haben - unter dem Namen eurusd und unter dem Namen gbpusd, und die Ergebnisse für beide werden fast nie gleich sein. Wenn Sie zwei EAs mit dem angegebenen Synchronisationsblock auf verschiedenen Symbolen laufen lassen, sollte der Unterschied in der Realität vernachlässigbar oder gar nicht vorhanden sein.
Von welcher Realität sprechen Sie? Prüfung in Echtzeit? Wenn ja, dann stimme ich natürlich zu. Wenn Sie zwei EAs an ihren Symbolen aufhängen, wird alles richtig sein. Aber ich teste gerade den Mehrwährungsmodus. Und ein identisches Ergebnis wird nur mit OnTimer() (10 Sekunden) angezeigt.
 
tol64:

Gehandelt wird nur mit EURUSD.

Beginnen wir mit der richtigen Formulierung. Im ersten Beispiel möchten Sie "Handel auf EURUSD" haben. In der Tat wurden benutzerdefinierte Ereignisse von zwei Symbolen empfangen, und im Event-Handler wurden TradeSignalCounter()+TradePerformer() aufgerufen, wenn Ereignisse von einem dieser beiden Symbole empfangen wurden. Wir können davon ausgehen, dass die Ereigniswarteschlange immer voll war.

Nun haben Sie eine der Signalquellen entfernt, aber aus irgendeinem Grund die Prüfung"if(sparam == Symbol_01)" in den Eventhandler eingetragen. Aber die nächste Frage ist anders. Dem Code nach zu urteilen, wird das Lizar-Schema im Modus "Alle Ticks" verwendet und die Funktionen TradeSignalCounter()+TradePerformer() werden bei jedem Tick von der Signalquelle (EURUSD) aufgerufen. Interesting hat bereits auf einen möglichen Überlauf der Ereigniswarteschlange hingewiesen. Aber ich möchte wissen, welches Instrument als Symbol_01-Parameter dieser beiden Funktionen verwendet wird, und ob Sie versucht haben, die Periodizität der Ereignisse im Schema von Lizar zu ändern.