Bibliothèque: MultiTester - page 30

 
Stanislav Korotky #:

Je n'ai pas vu dans les changements de source que quelque chose avait été fait avec le presse-papiers.

  static bool GetSettings2( string &Str, const int Attempts = 10 )
  {
    bool Res = false;

    if (MTTESTER::LockWaiting())
    {
      Res = MTTESTER::GetSettings(Str, Attempts);

      MTTESTER::Lock(false);
    }

    return(Res);
  }

Si vous lancez l'optimisation, ne va-t-elle pas prendre tous les cœurs disponibles en même temps ? Je ne comprends pas comment un seul test a pu "enlever" un coeur à l'optimisation (en fait, même 2 agents d'optimisation de MT sont marqués comme désactivés).

Je crois que je l'ai écrit tout de suite. Optimising Terminal a deux agents désactivés. Chaque agent activé prend un cœur.

 
fxsaber #:

Je crois que je l'ai écrit tout de suite. Optimising Terminal a deux agents désactivés. Chaque agent activé prend un noyau.

Il ne dit explicitement rien sur la désactivation manuelle (ou autre configuration des agents) - et cette nuance est toujours contournée. C'est précisément la raison pour laquelle je m'interroge sur la quantité de travail parallèle automatisé. Je pensais naïvement, d'après le sujet et la description du blog, que l'automatisation était totale.

LockWaiting a été vu - c'est celui que j'ai formulé comme verrouillant le travail sur les fichiers. Il est clair que le verrouillage peut être utilisé pour accéder aux ressources, y compris le presse-papiers. Confusion terminologique.

PS. Peut-être ai-je mal compris quelque chose, mais si seul un accès exclusif au presse-papiers était nécessaire, alors le même verrouillage (une boucle avec des vérifications périodiques) est plus logique à faire sur les fonctions du presse-papiers lui-même (OpenClipboard, qui est déjà mentionné dans le code source).

 
Stanislav Korotky #:

Il ne dit explicitement rien sur la désactivation manuelle (ou la configuration d'autres agents) - et cette nuance est toujours contournée. C'est la raison même pour laquelle je m'interroge sur le degré d'automatisation du travail parallèle. Je pensais naïvement, d'après le sujet et la description du blog, que l'automatisation était totale.

Une automatisation complète du côté de MQ. Sur n'importe quelle machine, même si je travaille avec un seul terminal, je désactive 1 ou 2 agents afin de pouvoir travailler sur la machine sans décalage.


Terminal1 (Optimisation) : Agents 3000-3017 - activés, 30018-3019 - désactivés. Il en va de même pour tous les terminaux, car tous les autres terminaux sont une copie intégrale du premier. Aucun réglage manuel n'est effectué.

Terminal 2 - pour les passages uniques.


Deux scénarios.

  1. J'ai d'abord lancé l'optimisation sur le terminal 1, les paramètres 3000-3017 ont été activés. Ensuite, les passes en simple sur le terminal 2 - 3018 fonctionne.
  2. J'ai d'abord exécuté des passes simples sur Terminal2, 3000 s'est allumé. Puis optimisation sur Terminal1 - 3001-3018.
Tout est automatisé du côté de MQ. Il vous suffit d'une minute pour le vérifier. Le dialogue a pris beaucoup plus de temps.
 
Stanislav Korotky #:

PS. J'ai probablement mal compris quelque chose, mais si seul un accès exceptionnel au presse-papiers était requis, alors il serait plus logique d'effectuer le même verrouillage (boucle avec vérifications périodiques) sur les fonctions du presse-papiers lui-même (OpenClipboard, qui est déjà mentionné dans les sources).

Je ne vois pas la logique d'une telle solution.

 
fxsaber #:

Automatisation complète du côté MQ. Sur n'importe quelle machine, même si je travaille avec un seul terminal, je désactive 1 ou 2 agents afin de pouvoir travailler sur la machine sans décalage.


Terminal1 (Optimisation) : Agents 3000-3017 - activés, 30018-3019 - désactivés. Il en va de même pour tous les terminaux, car tous les autres terminaux sont une copie complète du premier. Aucun réglage manuel n'est effectué.

Terminal 2 - pour les passes uniques.


Deux scénarios.

  1. Tout d'abord, j'ai lancé l'optimisation sur Terminal1, 3000-3017 sont activés. Ensuite, j'ai lancé l'optimisation sur Terminal2 - 3018 est en marche.
  2. J'ai d'abord lancé l'optimisation sur Terminal2 - 3000 fonctionne. Puis optimisation sur Terminal1 - 3001-3018 fonctionne.
Tout est automatisé du côté de MQ. Il vous suffit d'une minute pour le vérifier. Le dialogue a pris beaucoup plus de temps.

Si cette description figurait dans le blog, il n'y aurait pas de question. Encore une fois, cette description signifie une configuration manuelle des agents, imho, et non une automatisation. Il n'y a rien à vérifier.

 
Stanislav Korotky #:

Si cette description figurait dans le blog, il n'y aurait pas de question. Encore une fois, cette description signifie une configuration manuelle des agents, imho, et non une automatisation. Il n'y a rien à vérifier.

Il n'y a pas de configuration manuelle. Vous ne pouvez rien faire avec les agents, le comportement ne changera pas. Surprenant.

 
fxsaber #:

Il n'y a pas de configuration manuelle. Vous ne pouvez rien faire aux agents, leur comportement ne changera pas. Surprenant.

Il a été déclaré "pour éviter les conflits possibles lorsque l'on travaille avec des testeurs en parallèle". Cette phrase est trompeuse dans le contexte des cœurs, car il s'agit en fait d'une configuration manuelle des agents. Pour une raison ou une autre, vous persistez à associer l'allocation des ports aux cœurs. Les ports ne peuvent pas se chevaucher, mais les noyaux (processus) peuvent le faire - cela dépend simplement de la préconfiguration. Je suppose que nous avons simplement des notions différentes de la résolution automatique des conflits entre les processus parallèles.

 
Stanislav Korotky #:

Il a été déclaré "pour éviter les conflits possibles lorsque l'on travaille avec des testeurs en parallèle". Cette phrase est trompeuse dans le contexte des noyaux, car en fait la configuration des agents se fait manuellement.

Vous avez mal interprété le mot "contournement". Le problème se pose lorsque plusieurs terminaux travaillent en même temps avec le presse-papiers. Auparavant, les travaux d'un terminal pouvaient accidentellement se retrouver dans un autre terminal. Aujourd'hui, c'est exclu.

 

Les modifications suivantes sont disponibles dans MTTester.mqh.

  • GetLastTstCacheFileName renvoie désormais le nom du fichier tst SANS le chemin d'accès.
  • GetLastTstCache a la capacité de récupérer le fichier tst qui correspond à la passe qui vient de se terminer. Cela évite de récupérer des fichiers tst erronés.
  • ClickStart fonctionne correctement même lorsque le testeur réagit instantanément à la pression du bouton de démarrage. Dans ce cas, ClickStart reconnaît que le bouton de démarrage a été actionné avec succès.
 

Parfois, vous devez faire la même chose sur les terminaux de travail. L'automatisation de cette action est montrée ci-dessous sur l'exemple.


Il faut collecter les données sur chaque terminal en exécutant un script similaire RunMe.mq5.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/fr/code/26132
  
void OnStart()
{
  if (MTTESTER::LockWaiting()) // Si vous souhaitez effectuer des actions de manière séquentielle.
  {
    const int handle = ::FileOpen(__FILE__, FILE_WRITE | FILE_READ | FILE_ANSI | FILE_COMMON);

    // Écrire les données requises dans le fichier.
    if (handle != INVALID_HANDLE)      
    {
      FileSeek(handle, 0, SEEK_END);
      FileWriteString(handle, "Account = " + (string)AccountInfoInteger(ACCOUNT_LOGIN) + ", " +
                              "Balance = " + (string)AccountInfoDouble(ACCOUNT_BALANCE) + "\n");
      
      FileClose(handle);
    }

    MTTESTER::Lock(false); // Libère le verrou d'exécution parallèle.
  }
}


Voici comment procéder.

// Exécuter le script sur tous les terminaux.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/fr/code/26132
  
void OnStart()
{
  HANDLE Handles[]; 
  
  // Passer en revue tous les terminaux
  for (int i = MTTESTER::GetTerminalHandles(Handles) - 1; i >= 0; i--)
    MTTESTER::RunEX5("Scripts\\RunMe.ex5", Handles[i], true); // et exécuter le script approprié sur chacun d'entre eux.
}


Ainsi, nous avons collecté les données de tous les terminaux en un seul clic. Merci à MTTESTER::RunEX5 - qui exécute EX5 sur le terminal requis (portable).