Résultats du test expert multi-devises

 

Après avoir lu les articles sur la construction d'EA multi-devises, posé des questions et obtenu des réponses de la part des "gardiens" de la communauté, pour moi la question reste : "Comment composer le code de l'EA de manière à ce que les résultats des tests soient corrects ?". L'objectif de ce sujet est simplement de répondre à cette question.

Je l'ai testé en utilisant trois méthodes différentes suggérées par les membres de la communauté.

-OnTick().

- Cetteméthode est suggérée par Konstantin Gruzdev dans son article"Implementation of Multicurrency Mode in MetaTrader 5".

-OnTimer().

J'ai emprunté le schéma du conseiller expert multidevises à Nikolay Kositsin, qu'il a décrit en détail dans son article"Creating an Expert Advisor that trades on different symbols".

Pour le test, j'ai écrit un simple EA car l'essentiel est dans la comparaison des résultats du test. La "référence" sera le résultat du graphique quotidien de l'EURUSD depuis 2000. Ensuite, ce résultat avec les mêmes paramètres sera comparé au résultat qui a été obtenu à partir du graphique GBPUSD. En principe, un seul instrument est impliqué dans les tests, mais les résultats devraient être identiques quel que soit l'instrument testé.

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

Un test sur l'EURUSD à partir du graphique EURUSD:

Étiquette : 01_tick

Un test sur EURUSD à partir du graphique GBPUSD:

Étiquette :02_tick

Les résultats du test ne sont pas cohérents.

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 sur EURUSD à partir du graphique EURUSD:

Étiquette :01_event == 01_tick

Le résultat est identique au résultat marqué 01_tick.

Test sur EURUSD à partir du graphique GBPUSD:

Étiquette :02_event ~= 02_tick

Les résultats des tests ne sont pas cohérents.

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

La minuterie est réglée sur 10 secondes.

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

Étiquette: 01_time == 01_tick && 01_time == 01_ event

Un test sur EURUSD à partir du graphique GBPUSD:

Étiquette: 02_time == 01_tick && 02_time == 01_ event

Les résultats des tests sont identiques. Ce n'est qu'à un seul endroit que j'ai constaté une petite imprécision. J'ai également remarqué que plus l'intervalle du chronomètre est petit, plus le résultat est précis. En d'autres termes, même si le test est effectué sur des barres quotidiennes et que l'intervalle dans le testeur est réglé sur, par exemple, 1 heure, le test s'exécutera beaucoup plus rapidement que 10 secondes, mais les résultats du test ne correspondront pas.

------

C'est tout. Intéressé par l'opinion de chacun et encore plus par les méthodes de solution.))))


 

À mon avis, il n'est pas correct de comparer ces options séparément.

Personnellement, j'adhère à l'opinion selon laquelle le timer du dessin animé doit être, et ce qui lui sera ajouté (ticks ou événements) est une question distincte.

A mon avis, tous les gestionnaires disponibles devraient être utilisés, la question est seulement dans leur remplissage et la mise en œuvre de l'algorithme général.

 
tol64:

"Comment assembler le code de l'examinateur pour que les résultats des tests soient corrects ?"

Au départ, je n'ai pas compris l'énoncé de la question. Qu'entendez-vous par des résultats d'essai "corrects", et pourquoi faut-il les obtenir ?
 
Interesting:

À mon avis, il n'est pas correct de comparer ces options séparément.

Personnellement, je suis d'avis que le timer du dessin animé doit être présent, et ce qui lui sera ajouté (ticks ou événements) est une question distincte.

L'idée est que tous les gestionnaires disponibles devraient être utilisés dans la mule, il s'agit seulement de leur remplissage et de la mise en œuvre de l'algorithme général.


Pourquoi est-il incorrect de comparer ces options ? Dans les limites d'un simple conseiller expert, lorsque la décision est prise après la formation de la barre au niveau du symbole et du TF nécessaires, je pense que c'est correct.

Incorrect comme il est mentionné ci-dessous, serait si nous ajoutons un algorithme plus complexe pour analyser la situation actuelle en utilisant les mêmes ticks. Mais je ne suis intéressé que par les barres formées.

 
Yedelkin:
Au départ, je n'ai pas compris la formulation de la question. Qu'entendez-vous par des résultats d'essai "corrects", et pourquoi faut-il les obtenir ?

C'est-à-dire celles qui correspondent à la réalité. Quel que soit le personnage à partir duquel on effectue le test, les résultats devraient être identiques. Dans ce cas, le résultat identique a été obtenu uniquement en utilisant la fonction OnTimer().

Je suis très intéressé par la méthode de Konstantin Gruzdev. Peut-être que je fais quelque chose de mal, c'est pourquoi je n'ai pas obtenu les bons résultats (fiables). J'espère également recevoir ses commentaires sur ce sujet.

 
tol64:

Pourquoi est-il incorrect de comparer ces options ? Dans le cadre de ce simple Expert Advisor, lorsque la décision est prise après la formation de la barre au bon symbole et au bon TF, je pense qu'elle est correcte.

Incorrect comme il est mentionné ci-dessous, serait si nous ajoutons un algorithme plus complexe pour analyser la situation actuelle en utilisant les mêmes ticks. Mais je ne suis intéressé que par les barres formées.

Je ne discute pas, c'est correct en théorie, mais en pratique il y a beaucoup de questions.

Par exemple, voici le suivant - il est implémenté dans le handler des ticks, mais la connexion avec le serveur est perdue. Comment le système fonctionnera-t-il et comment détectera-t-il si quelque chose ne va pas ?

Réalisation uniquement dans le temps - Option plus ou moins acceptable, mais elle nécessite un compromis raisonnable dans le choix de la période (mais même dans ce cas, il y aura quelques difficultés).

Événements - Les événements eux-mêmes ne sont pas très efficaces non plus. D'une manière générale, le traitement des ticks et des événements doit être mis en œuvre de manière à utiliser les ressources le plus efficacement possible et à permettre au conseiller expert de passer au traitement d'une nouvelle portion de données assez rapidement.

Yedelkin:
Je n'ai pas compris la question dès le début. Que signifient des résultats de test "corrects" et pourquoi il faut les obtenir ?

Je pense aussi qu'il ne faut pas obtenir des résultats 100% identiques. De plus, il est étrange de limiter les possibilités de multiplication à la négociation d'UN seul symbole.

Disons qu'au moins deux symboles seront échangés (dont l'un pourrait éventuellement être un symbole graphique).

 
tol64:

C'est-à-dire celles qui correspondent à la réalité. Quel que soit le symbole à partir duquel nous testons, les résultats devraient être identiques.

Croyez-moi, trouver une non-identité à 100% est une auto-illusion et une illusion. Tout aussi illusoire qu'un GRAAL fonctionnant éternellement. Un certain degré d'erreur/de non-identité doit toujours être pris en compte.

Et en l'état, tester un dessin animé n'est pas très révélateur. La discussion sur les multis devrait uniquement porter sur la négociation de plusieurs symboles ou sur la négociation de plusieurs stratégies sur un symbole.

Je veux dire que les résultats PROSTANTIELLEMENT identiques ne sont pas importants dans un multi-symbole, mais les mécanismes qui permettent aux experts de prendre des décisions de trading en tenant compte des positions et de l'historique.

Par exemple, essayez de négocier deux symboles EURUSD et GBPUSD, alors que la négociation doit être effectuée en utilisant la couverture et les signaux sur le deuxième symbole.

 
Interesting:

Croyez-moi, la recherche d'une non-identité à 100% est une auto-illusion et une illusion. Tout aussi illusoire que l'éternel GRAAL. Il faut toujours tenir compte d'une certaine marge d'erreur/de non-identité.

Et en l'état, tester un dessin animé n'est pas très révélateur. La discussion sur les multis devrait uniquement porter sur la négociation de plusieurs symboles ou sur la négociation de plusieurs stratégies sur un symbole.

Je veux dire que les résultats PROSTANTIELLEMENT identiques ne sont pas importants dans un multi-symbole, mais les mécanismes qui permettent aux experts de prendre des décisions de trading en tenant compte des positions et de l'historique.

Par exemple, essayez de négocier deux symboles EURUSD et GBPUSD, alors que la négociation doit être effectuée en utilisant la couverture et les signaux sur le deuxième symbole.

Vous avez maintenant une vue d'ensemble du fonctionnement de l'EA. Passons sur toutes les difficultés et les détails techniques de la mise en œuvre du programme pour le trading réel. La question est très critique dans cet article.

1. Un système de trading simple. Il est basé sur les barres formées.

2. Un test sur un symbole, mais à partir d'un autre symbole.

J'ai intentionnellement simplifié la structure au minimum. Cela permet de faciliter l'analyse des résultats des tests. Vous pouvez tester tous les symboles, mais les résultats ne s'amélioreront pas. Vous obtiendrez un désordre qui sera plus difficile et plus long à analyser. Le Conseiller Expert montrera l'action exacte sur le symbole sur lequel il se trouve, mais il fera un désordre sur tous les autres, ce qui est exactement ce que ces résultats montrent. Les résultats des tests doivent être identiques, sinon il s'avère que le conseiller expert effectue des entrées correctes sur un symbole, alors que sur d'autres il ne le fait pas, ou ne suit pas exactement le système. Cet écart est tout à fait perceptible.

Jusqu'à présent, l'identité ne peut être réalisée que par la fonction OnTimer().

P.S. Je ne crois pas aux GRAVES. Ou plutôt, je le comprends différemment de beaucoup d'autres).

 

Voici le résultat en une fois sur cinq caractères via la fonction OnTimer() :

Quel que soit le symbole à partir duquel le test est effectué, le résultat est toujours le même.

Mais en utilisant d'autres méthodes(OnTick() et OnChartEvent()), les résultats seraient différents en changeant le symbole où se trouve le conseiller expert. Et cela confirme simplement que le conseiller expert effectue des actions incorrectes sur d'autres symboles.

La raison pour laquelle cela se produit avec OnTick() est claire. Ce sujet a déjà été abordé à de nombreuses reprises. Mais la méthode OnChartEvent() est toujours discutable.

 

tol64:

Avec OnTick(), on comprend pourquoi cela se produit. Ce point a déjà été discuté à de nombreuses reprises. Mais la méthode OnChartEvent() est toujours discutable.

Nous devons envisager un éventuel retard dans le traitement de l'événement, voire une éventuelle PERTE de l'événement.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

C'est-à-dire celles qui correspondent à la réalité. Quel que soit le personnage à partir duquel on effectue le test, les résultats devraient être identiques. Dans ce cas, le résultat identique n'a été obtenu que lorsque OnTimer() a été utilisé.

Je le vois en gros. En fait, vous choisissez un "moteur" sur lequel vous allez construire votre Expert Advisor multi-devises. Pour cela, vous prenez une stratégie de trading primitive et vous l'exécutez d'abord selon le schéma "la source de signal et le gestionnaire de signal sur un symbole", puis selon le schéma "la source de signal et le gestionnaire de signal sur différents symboles". Est-ce correct ?

Si c'est le cas, je ne comprends pas bien des phrases comme "Test sur l'outil EURUSD à partir du graphique GBPUSD". Dans ce cas, quel symbole est la source du signal, et auquel est attaché le gestionnaire de signal ?