Bibliothèque: MultiTester - page 9

 
fxsaber:

Il est désormais possible d'automatiser le testeur en toute liberté.

Un des exemples d'application réelle (tout est fait automatiquement)

  1. Tous les symboles sont pris et les étapes suivantes sont effectuées pour chaque symbole.
  2. Je commence l'optimisation.
  3. À la fin de la meilleure passe, les données sont prises et, à partir d'elles, plusieurs tâches d'optimisation sont formées (plages définies de paramètres d'entrée).
  4. Toutes les optimisations à partir du point 3 sont effectuées.
  5. Les meilleures passes sont extraites de toutes les optimisations du point 4 et sauvegardées en tant qu'ensembles pour la négociation de portefeuilles.


Il s'est avéré être un scanner de marché et un ajusteur de TS très puissant. Les sources de CT ne sont pas nécessaires pour de telles manipulations.

 
// Exemple de chargement d'un fichier Set dans le testeur.
#property script_show_inputs

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/fr/code/26132

input string inFileName = "SetFile.set"; // Set-file (Fichier)

string FileToString( const string FileName )
{
  ushort Buffer[];
  
  return(FileLoad(FileName, Buffer) ? ShortArrayToString(Buffer) : NULL);
}

void OnStart()
{  
  MTTESTER::SetSettings("[TesterInputs]\n" + FileToString(inFileName));
}
De même pour les fichiers ini du testeur.
 
Merci de votre attention.
 
La bibliothèque a été mise à jour pour MT5 build2209+.
 
fxsaber:

Il s'est avéré être un scanner de marché et un ajusteur de TS très puissant.

#property script_show_inputs

#include <fxsaber\MultiTester\MultiTester.mqh> // https://www.mql5.com/fr/code/26132
#include <fxsaber\MultiTester\Task.mqh>

input bool OnlyCustomSymbols = true; // Caractères personnalisés uniquement
input bool AllSymbols = false;       // Tous les caractères ou le courant

void Add( const string SymbName )
{
  TesterSettings.Add(NULL, SymbName, 0, 0, 0, TASK::InitBase, TASK::DeinitBase);

  for (int i = 0; i < ::inAmount; i++)
    TesterSettings.Add(NULL, NULL, 0, 0, 0, TASK::InitSub, TASK::DeinitSub);
}

// Cette fonction est responsable de la génération de la liste des tâches.
void SetTesterSettings()
{
  if (AllSymbols)
    // Recherche de tous les symboles dans le Market Watch.
    for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
    {
      const string Name = SymbolName(i, true);

      if (!OnlyCustomSymbols || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
        Add(Name);
    }
  else if (!OnlyCustomSymbols || SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM))
    Add(_Symbol);
}


Le conseiller expert doit avoir

sinput int inMinTrades = 500; // Nombre minimum de transactions (positions).
sinput int inMaxTrades = 90000; // Nombre maximal de transactions (positions).

double OnTester()
{
  return(((TesterStatistics(STAT_TRADES) >= inMinTrades) && (TesterStatistics(STAT_TRADES) <= inMaxTrades)) ? TesterStatistics(STAT_PROFIT) : 0);
}
 
Il a contourné quelques écueils. Mise à jour.
 

Je ne sais pas ce qu'il en est des versions précédentes. Mais la dernière version peut exécuter plusieurs fois un test pour le même instrument.

Done apparaît dans le log, puis vide (Start n'apparaît pas), et le terminal a démarré une nouvelle passe en même temps. Il semble que else if (IsRun = (Init = TesterSettings.Init(Pos)) && TesterSettings.Run(Pos)) renvoie un faux, parce que TesterSettings.Run(Pos) renvoie un faux. Et au prochain passage du timer, else if (MTTESTER::IsReady()) renverra false, ce qui fera tourner la boucle en attendant. TesterSettings.Run(Pos)) lui-même renvoie false, cela semble être trivial à cause du timeout, c'est à dire qu'il n'attend pas et sort.

 

traveller00:

TesterSettings.Run(Pos)) renvoie false semble être trivial à cause du timeout, c'est-à-dire qu'il n'attend pas et sort.

Si c'est le cas, essayez d'augmenter ce nombre

  static bool ClickStart( const bool Check = true, const int Attempts = 5 )

Je n'ai jamais eu de cas où le bouton Start ne s'est pas transformé en bouton Stop pendant une longue période après avoir été pressé.


J'ai exécuté l'exemple 3 pour une centaine de caractères et tout a bien fonctionné.

 
Oui, c'est ce que j'ai fait pour moi, j'ai augmenté la limite à 50. Mais juste au cas où quelqu'un d'autre aurait un problème similaire ou voudrait le modifier dans la version générale.
 
traveller00:
Oui, c'est ce que j'ai fait pour moi, j'ai augmenté la limite à 50. Mais juste au cas où quelqu'un d'autre aurait un problème similaire ou voudrait le modifier dans la version générale.

Mise en place d'un enregistrement du nombre de tentatives nécessaires pour changer l'état du bouton. Résultats intéressants.


ZY Ce bogue est peut-être toujours d'actualité.