Résultats du test expert multi-devises - page 4

 
tol64:
Et pourriez-vous montrer un exemple similaire à ce que j'ai fait au début de la branche. Inclure la négociation sur un seul symbole, mais la tester sur un autre. Faites une capture d'écran et testez-la sur le symbole sur lequel le test est en cours. Y aura-t-il une divergence comme celle montrée au début de la branche ? Bien que si la formation de la barre est suivie sur tous les symboles, elle devrait être identique. Mais vous devez quand même tout vérifier...

Eh bien, je ne le testerai pas. Je peux poster le code et vous le tester ;-) :

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:

Eh bien, je ne le testerai pas. Je peux poster le code et vous le tester ;-) :

)) Merci pour la variante donnée. Maintenant, je vais seulement vérifier ma suggestion, qui a été générée en signalant une erreur possible par les participants au forum Yedelkin et Interesting, et ensuite je serai heureux de tester votre variante. Je vous présenterai les résultats en détail. ))
 

Yedelkin 

Notez la partie du code :

Ici, vous pouvez voir que vous "articulez" une sorte d'indicateur "Panneau de contrôle espion MCM" sur deux caractères différents. C'est-à-dire que vous avez différents symboles comme sources de signaux. Mais vous affirmez que "nous traitons sur l'EURUSD", c'est-à-dire que la source du signal est un seul et même symbole. Soyons clairs.

Nous ne traitons que l'EURUSD.

Dans mes tests, je considère le schéma écrit par Konstantin Gruzdev -Implementation of the Multicurrency Mode in MetaTrader 5. ))) Tout est défini. Les fichiers joints contiennent l'indicateur MCM du panneau de contrôle Spy et le conseiller expert exSpy Control Panel MCM. En installant le conseiller expert sur un graphique, vous pouvez voir comment il fonctionne. Le journal montre clairement les événements spécifiques reçus par le conseiller expert à partir de différents symboles. Tout est clair, rien n'est mélangé.

J'ai maintenant essayé de spécifier dans OnChartEvent() le symbole à partir duquel l'ID est reçu, mais cela n'a pas changé les résultats. J'ai supprimé le deuxième caractère de OnInit() pour éliminer toute possibilité de recevoir les mauvais événements. Le test a maintenant été effectué en utilisant cette variante :

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

Un test sur le symbole EURUSD à partir du graphique EURUSD:

Test sur l'outil EURUSD à partir du graphique GBPUSD:

Les résultats ne sont pas cohérents.

Intéressant

A en juger par ce code, les signaux proviennent bien de deux symboles mais le Conseiller Expert peut traiter l'un de ces signaux avec un délai.

Le deuxième symbole n'est plus présent, les signaux proviennent uniquement de l'EURUSD. Mais malheureusement, cela ne résout pas le problème.

 
marketeer:

Eh bien, je ne le testerai pas. Je peux poster le code et vous le tester ;-) :

J'ai testé votre version. )) Les résultats sont presque identiques. Elle peut être suffisante pour un test préliminaire (rapide). Nous utiliserons la fonction OnTimer() pour obtenir des résultats absolument identiques.

Voici les résultats des tests :

Test sur l'outil EURUSD à partir du graphique EURUSD:

Test sur l'outil EURUSD à partir du graphique GBPUSD:

 
MetaDriver:

Je pense que 10 secondes est un intervalle trop court. Si seules les barres formées sont intéressantes, l'intervalle doit être d'au moins une minute.

Il ne sert à rien de le raccourcir, une minute est l'intervalle minimum raisonnable...

J'ai fait une autre série de tests pour montrer l'incohérence des résultats au-delà de 10 secondes. Nous allons comparer avec le même "benchmark", qui a été fourni au début du sujet. C'est-à-dire, à partir de la fonction OnTick() par les barres quotidiennes formées lorsque l'Expert Advisor est sur le symbole testé. C'est ici :

Ensuite, tous les résultats seront issus de la fonction OnTimer(). L'Expert Advisor est sur le symbole GBPUSD:

Test sur le symbole EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 10 secondes :

C'est le résultat le plus précis.

Test sur le symbole EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 1 minute :

Ce n'est pas vrai. Le résultat était même nettement meilleur, ce qui est également incorrect et trompeur.

Un test sur EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie était de 60 minutes :

Le résultat ne coïncide pas avec le point de référence dans de nombreux endroits.

Test sur EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 1 jour :

Le résultat est surtout non-identique.

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

En général, pour être totalement sûr d'obtenir des résultats corrects, les Expert Advisors multi-devises doivent être testés par la fonction OnTimer(), en fixant l'intervalle minimum.

 
tol64:

J'ai fait une autre série de tests pour montrer l'incohérence des résultats au-delà de 10 secondes. Nous allons comparer avec le même "benchmark", qui a été fourni au début du sujet. C'est-à-dire, à partir de la fonction OnTick() par les barres quotidiennes formées lorsque l'Expert Advisor est sur le symbole testé. C'est ici :

Ensuite, tous les résultats seront issus de la fonction OnTimer(). L'Expert Advisor est sur le symbole GBPUSD:

Test sur le symbole EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 10 secondes :

C'est le résultat le plus précis.

Test sur le symbole EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 1 minute :

C'est faux. Le résultat est même nettement meilleur, ce qui est également faux et trompeur.

Un test sur EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 60 minutes :

Le résultat ne coïncide pas avec le point de référence dans de nombreux endroits.

Test sur EURUSD à partir du graphique GBPUSD. L'intervalle de la minuterie est de 1 jour :

Le résultat est surtout non-identique.

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

En général, pour être totalement sûr d'obtenir des résultats corrects, les Expert Advisors multi-devises doivent être testés par la fonction OnTimer() tout en fixant l'intervalle minimum.

Je ne comprends pas bien. Vous avez fait une mauvaise comparaison.

Le premier test est correct : comparaison de deux façons de tester - sur "votre" outil et sur un autre. Et puis vous avez pris ce premier résultat comme référence et vous avez comparé tous les autres résultats à celui-ci.

Ce n'est pas correct. Vous devez comparer le reste des exécutions de l'identité non pas avec le premier résultat, mais avec des exécutions de la même fréquence de tic-tac sur "votre" instrument.

Ils seront différents des "10 secondes", c'est normal, l'essentiel est qu'ils soient identiques par paires.

Veuillez compléter le test.

Sinon, il s'avérera que vous n'avez fait que perdre votre temps, parvenant étrangement à confirmer votre illusion initiale "sur les avantages du test des 10 secondes" .

 
tol64:

J'ai testé votre option. )) Les résultats sont presque identiques. Il est suffisamment bon pour un test préliminaire (rapide). Pour obtenir des résultats totalement identiques, nous utiliserons la fonction OnTimer().

D'après ce que j'ai compris, ce n'est pas ma méthode de synchronisation que vous testez actuellement, mais le générateur de tics de MetaTrader. Le fait est que lorsque vous exécutez le test, différentes bases de tick ont été générées - sous le nom de eurusd et sous le nom de gbpusd, et les résultats ne sont presque jamais égaux. En réalité, si vous exécutez deux EA avec le bloc de synchronisation spécifié sur des symboles différents, la différence devrait être négligeable ou nulle.
 
MetaDriver:

Je ne comprends pas bien. Quelque chose que vous avez comparé de manière incorrecte.

Le premier test est correct : il s'agit de comparer deux façons de tester - sur "votre" instrument et sur un autre. Et puis vous avez pris ce premier résultat comme référence et vous avez comparé tous les autres résultats à celui-ci.

Ce n'est pas correct. Vous devez comparer le reste des exécutions de l'identité non pas avec le premier résultat, mais avec des exécutions de la même fréquence de tic-tac sur "votre" instrument.

Ils seront différents des "10 secondes", c'est normal, l'essentiel est qu'ils soient identiques par paires.

Veuillez compléter le test.

Sinon, il s'avérera être une perte de temps, car il parvient étrangement à confirmer son illusion initiale sur "les avantages du test de 10 secondes".

Bien. Maintenant, j'ai déjà commencé un autre long test. Ce sera fini quand je me réveillerai. Mais je peux déjà vous dire qu'ils sont identiques par paire, car je l'ai vu. Il ne me reste plus qu'à vous montrer. Mais vous pourriez faire le même test vous-même. Il s'agit d'un aspect important du test des systèmes de trading. Je fais peut-être quelque chose de mal)).

P.S. L'essentiel est qu'ils ne doivent pas être identiques par paires, car lorsqu'on les teste via la fonction OnTimer(), ils semblent de toute façon identiques. L'objectif était initialement de les rendre identiques au résultat obtenu en mode normal en utilisant la fonction OnTick() avec vérification explicite des barres. Les conseillers experts qui négocient sur un seul symbole le font parfaitement. Mais dans le mode multidevises, il était nécessaire de le découvrir. Le résultat est évident.

 
marketeer:
D'après ce que j'ai compris, ce n'est pas ma méthode de synchronisation que vous avez testée, mais le générateur de tics de MetaTrader. Le fait est que lorsque vous avez effectué les tests, vous avez généré des bases de tick différentes - sous le nom eurusd et sous le nom gbpusd, et les résultats ne seront presque jamais identiques. En réalité, si vous exécutez deux EA avec le bloc de synchronisation spécifié sur des symboles différents, la différence devrait être négligeable ou nulle.
De quelle réalité parlez-vous ? Des tests en temps réel ? Si c'est le cas, alors je suis d'accord, bien sûr. Si vous accrochez deux EA à leurs symboles, tout sera correct. Mais je suis en train de tester le mode multi-devises. Et un résultat identique est montré en utilisant uniquement OnTimer() (10 secondes).
 
tol64:

Le trading se fait uniquement sur l'EURUSD.

Commençons par la formulation correcte. Dans l'exemple initial, vous aimeriez avoir "trade on EURUSD". En fait, des événements personnalisés ont été reçus de deux symboles, et dans le gestionnaire d'événements, TradeSignalCounter()+TradePerformer() ont été appelés lorsque des événements ont été reçus de l'un de ces deux symboles. Nous pouvons supposer que la file d'attente des événements était toujours pleine.

Maintenant, vous avez supprimé l'une des sources de signaux, mais vous avez introduit la vérification"if(sparam == Symbol_01)" dans le gestionnaire d'événements pour une raison quelconque. Mais la question suivante est différente. Selon le code, le schéma de Lizar est utilisé en mode "All ticks" et à chaque tick de la source du signal (EURUSD) les fonctions TradeSignalCounter()+TradePerformer() sont appelées. Intéressant a déjà fait allusion à un possible débordement de la file d'attente des événements. Mais je veux savoir quel instrument est utilisé comme paramètre Symbole_01 de ces deux fonctions, et si vous avez essayé de modifier la périodicité des événements dans le schéma de Lizar.