Analyse des résultats des tests et optimisation dans le testeur de stratégie MetaTrader 5 - page 2

 
Anatoli Kazharski:

Le paramètre long (lparam) est vérifié. L'identifiant de l'événement tick y est contenu.

L'identifiant de l'événement utilisateur (int id) est égal à zéro.

On peut l'écrire de cette façon pour le rendre plus clair :

Je comprends que tout doit être réécrit pour que cela fonctionne correctement. Je vais vous montrer maintenant.

 
fxsaber:

Je me suis rendu compte que tout doit être réécrit pour que cela fonctionne correctement. Je suis sur le point de le faire.

Et je ne peux pas, parce que cette merde est en train de se produire.

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
et je n'arrive pas à faire fonctionner le testeur.
 

Indicateur

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Conseiller expert

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, no lag, Core1-agent only, ticks réels 01.09.2017 - 28.01.2018.


Un symbole

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Deux symboles

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Trois symboles

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. En mode symbole unique, le "spy" est 2,5 fois plus lent que le OnTick pur. C'est-à-dire que l'indicateur vide (construit sur PERIOD_W1 pour que l'historique des barres soit minimal) a une énorme surcharge dans le Tester !
  2. Deux symboles sont 3,5 fois plus lents qu'un seul.
  3. Mais trois symboles ne sont que 1,8 fois plus lents que deux symboles. C'est-à-dire que le passage de deux à trois est dû à l'évolutivité. par opposition au point 2.
 

Anatoly, je suggère de déplacer le sujet vers les experts du Forex, les robots de trading et les conseillers experts et de le placer en haut de la page.

De cette façon, il sera toujours en vue. Il y a déjà beaucoup de sujets postés ici

 
Rashid Umarov:

Anatoly, je suggère de déplacer le sujet vers les experts du Forex, les robots de trading et les conseillers experts et de le placer en haut de la page.

De cette façon, il sera toujours en vue. Il y a déjà beaucoup de sujets postés ici

Cela ne me dérange pas si le sujet peut être utile.
 
fxsaber:

...

  1. En mode symbole unique, Spy est 2,5 fois plus lent que le pur OnTick. Par exemple, un indicateur vide (construit sur PERIOD_W1, de sorte que l'historique des barres est minimal) a une énorme surcharge dans le testeur !
  2. Deux symboles sont 3,5 fois plus lents qu'un seul.
  3. Mais trois symboles ne sont que 1,8 fois plus lents que deux symboles. C'est-à-dire que le passage de deux à trois est dû à l'évolutivité. contrairement au point 2.

Votre résultat est 6, 25, 46. Pourquoi pas 6, 12 et 18 ?

Il faut regarder la décélération par rapport à un seul caractère. Ensuite, trois caractères sont presque 8 fois plus lents qu'un seul, et non 3 comme prévu.

La question est exactement la suivante. Pourquoi y a-t-il un tel résultat avec l'évolutivité ? Et si le résultat ne peut être amélioré, une option pour un nouveau mode de test a été suggérée. Cela permettrait de résoudre le problème des tests longs lorsque l'on utilise plusieurs caractères.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Analyse des tests et optimisation dans le testeur de stratégie MetaTrader 5

Anatoli Kazharski, 2018.01.27 20:15

Question :

Est-il possible de créer un tel schéma de conseiller expert multi-symboles dans MQL, de sorte que la durée des tests n'augmente pas de manière répétée lors de l'ajout de symboles au test ?

//---

Si cela n'est pas possible, l'une des options pour les développeurs du terminal est d'ajouter un mode supplémentaire, lorsque le test peut être effectué symbole par symbole, plutôt que tous les symboles à la fois. Cela produirait au final le temps de test attendu. Le fait est que les EA multi-symboles sont très souvent utilisés simplement pour les cas où :

  1. Des données supplémentaires sont nécessaires pour les tests.
  2. Pour tester l'algorithme de trading sur une plus grande variété de comportements de prix, de conditions (spread, niveaux de stop/limite), etc., avec les mêmes paramètres.

C'est pour de tels cas que nous avons besoin d'un nouveau mode qui nous permettrait de réduire considérablement la durée des tests et d'optimiser les paramètres. Et déjà pour le test final de tester tous les symboles simultanément.


 
Anatoli Kazharski:

Vous avez un résultat de 6, 25, 46. Pourquoi pas 6, 12 et 18 ?

La décélération doit être examinée par rapport à un symbole.

Deux personnages avec des pointes est un mode de test bien différent de celui d'un seul personnage. Il est donc logique d'examiner l'évolutivité par rapport à deux.

De plus, la tête de l'indicateur est si sauvage que travailler par le biais des espions est une béquille. En attendant les services, où l'extensibilité devrait être presque parfaite, par rapport à un seul symbole. Comme c'est le cas avec la minuterie. Ce n'est que là qu'il n'y aura pas de saut de coche.

 
Accéléré de manière significative
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


Un symbole

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Deux chiffres

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Trois symboles

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Quatre symboles

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

Deux personnages avec des espions est un mode de fonctionnement très différent pour un testeur qu'un seul personnage. Il est donc logique d'examiner l'évolutivité par rapport à deux.

De plus, la tête de l'indicateur est si sauvage que travailler par le biais des espions est une béquille. En attendant les services, où l'extensibilité devrait être presque parfaite, par rapport à un seul symbole. Comme c'est le cas avec la minuterie. Seulement là, il n'y aura pas de saut de tique.

fxsaber:
Accéléré de manière significative

Un symbole

Deux symboles

Trois personnages

Quatre personnages

Si l'on considère les résultats relatifs à deux symboles, alors le résultat de deux symboles divisé par deux : 17 / 2 = 8,5

Ensuite, lors de l'ajout de symboles, nous multiplions cette valeur par le nombre de symboles pour obtenir le temps de test prévu.

  • trois caractères : 8,5 * 3 = 25, et le temps réel est de35,462 s.
  • quatre caractères : 8,5 * 4 = 34, alors que le temps réel est de68,459 s.

Mais c'est en tout cas le meilleur résultat obtenu jusqu'à présent. Une variante intéressante consiste à utiliser le symbole en cours dans OnTick, tandis que le reste dans des événements personnalisés.

Vous pouvez l'utiliser tant qu'il n'y a pas de services.

Il s'agit d'un forum pour le trading, les systèmes de trading automatisés et les tests de stratégies.

Séquence d'exécution de Init() et DeInit()

Slava, 2017.04.14 10:18

Ces services disposeront, entre autres, de fonctions de négociation et de la possibilité de gérer des objets. Et des graphiques.

Le fournisseur de données de marché n'est qu'une possibilité.

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Séquence d'exécution de Init() et DeInit()

Slava, 2017.04.14 10:21

Les services auront OnTick(string symbol). Mais il faudra s'abonner aux ticks d'un symbole particulier.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Séquence d'exécution de Init() et DeInit()

fxsaber, 2017.04.14 10:46

Il s'avère que les Services auront presque toutes les fonctions de On : OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

Et si vous n'avez pas besoin de tampons d'indicateurs et que vous ne voulez pas vous occuper des béquilles des indicateurs/conseillers, écrivez dans un nouveau type de programme - Services - qui n'a aucune limitation (étirement des versions précédentes de MT).

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Séquence d'exécution de Init() et DeInit()

Slava, 2017.04.14 10:56

Exactement.

Il n'y aura pas de OnCalculate.

Il n'y a pas encore de solution avec OnChartEvent.

 
Raison: