Bibliothèque: Expert - page 11

 
Si vous connaissez les noms des entrées, la deuxième option est préférable. Elle vous permet de ne pas vous soucier de l'ordre des entrées dans le conseiller expert. De plus, elle est techniquement mieux mise en œuvre.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Parcours pour devenir conseiller
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


Bien que inpFirst soit le deuxième dans l'ordre, il peut être défini à n'importe quelle valeur (dans ce cas, il est défini comme étant le premier et le seul). Ceux qui ne sont pas définis le seront par défaut.

 
Pour mes expériences, j'ai eu besoin de cloner un robot pour plusieurs graphiques. Je l'ai fait à l'aide de cette fonction.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/fr/code/19003

// Copie le conseiller expert en cours d'exécution avec les paramètres actuels d'un graphique à l'autre.
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


Je l'ai utilisée comme suit.

#property script_show_inputs

input int inAmount = 5; // Combien de clones ?

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // Exécutez l'EA actuel sur de nouveaux graphiques-symboles.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

La tâche de redémarrer une douzaine d'Expert Advisors différents sur plus d'un Terminal se pose. En général, il s'agit d'une grande routine.

Par exemple, nous avons corrigé quelque chose. Ensuite, compilation par lots dans ME et redémarrage. J'utilise un tel script pour cela.

// Recharge les EAs sur tous les graphiques.
input int inInterval = 5; // Intervalle en secondes entre les redémarrages du graphique

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Placer la tâche dans la file d'attente du graphique.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Faire bouger la file d'attente.
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

J'ai marqué un endroit important dans le code. Sans cela, l'application du modèle ne se fera pas avant la fin du script. Par analogie, vous pouvez résoudre le lancement des Expert Advisors après avoir rechargé le Terminal, etc.

 
fxsaber:

La tâche de redémarrer une douzaine d'Expert Advisors différents sur plus d'un Terminal se pose. En général, c'est une grosse corvée.

Par exemple, nous avons corrigé quelque chose. Ensuite, compilation par lots dans ME et redémarrage. J'utilise ce script pour cela.

J'ai mis en évidence un endroit important dans le code. Sans cela, le modèle ne sera pas utilisé jusqu'à la fin du script. Par analogie, vous pouvez résoudre le lancement des Expert Advisors après avoir rechargé le Terminal, etc.

Le jeu sera complet si vous pouvez obtenir le nom de l'EA sur le graphique spécifié. Si ce n'est pas difficile pour vous, finissez-le.

 
Vladimir Pastushak:

Il sera complet si vous pouvez faire figurer le nom du conseiller sur ce tableau. Si cela ne vous dérange pas, veuillez le compléter.

ChartGetString(Chart, CHART_EXPERT_NAME)

Il s'agit de MT5. Si vous avez besoin d'une plateforme croisée ou d'un chemin d'accès complet à l'Expert Advisor, utilisez Expert.mqh.

 
fxsaber:

Il s'agit de MT5. Si vous avez besoin d'une plateforme croisée ou d'un chemin d'accès complet à l'Expert Advisor, utilisez Expert.mqh.

Vous avez besoin d'une plateforme croisée...

 
Vladimir Pastushak:

Besoin d'un cros-platformer...

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

Bibliothèques : Expert

fxsaber, 2019.09.12 06:17 pm.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/fr/code/19003

// Produit les données de l'EA en cours d'exécution
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}
 
// Rend la variable d'entrée file égale au fichier sélectionné.
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

Cette fonction permet de sélectionner un fichier comme variable d'entrée. Cette implémentation.

input string inFileName = NULL; // Fichier sélectionné

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Code si un fichier valide est spécifié dans la variable d'entrée.

  return(INIT_SUCCEEDED);
}


Démarrage.


Cliquez sur OK et sélectionnez.


Cliquez sur Ouvrir et voyez les propriétés (F7) de l'EA en cours d'exécution.


La même chose fonctionnera avec n'importe quel nombre de fichiers.

input string inFileName1 = NULL; // Fichier sélectionné 1
input string inFileName2 = NULL; // Fichier sélectionné2

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // Code si un fichier valide est spécifié dans la variable d'entrée.

  return(INIT_SUCCEEDED);
}
 
Et le chargement des paramètres à partir des fichiers set n'est pas encore pris en charge, si j'ai bien compris ?
 
traveller00:
Et le chargement des paramètres à partir des fichiers set n'est pas encore pris en charge, si j'ai bien compris ?

Je ne l'ai pas fait. Mais c'est très simple.