Bibliotheken: Expert - Seite 11

 
Wenn Sie die Namen der Eingaben kennen, ist die zweite Option besser. Sie ermöglicht es Ihnen, sich keine Gedanken über die Reihenfolge der Eingaben im Expert Advisor zu machen. Außerdem ist sie technisch besser umgesetzt.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Weg zum Counsellor
  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);
}


Trotz der Tatsache, dass inpFirst der zweite in der Reihenfolge ist, kann er auf irgendetwas gesetzt werden (in diesem Fall ist er auf den ersten und einzigen gesetzt). Diejenigen, die nicht eingestellt sind, werden als Standardwerte verwendet.

 
Für Experimente musste ich einen Roboter für mehrere Diagramme klonen. Das habe ich mit dieser Funktion gemacht.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/code/19003

// Kopiert den laufenden Expert Advisor mit den aktuellen Einstellungen von einem Chart zum anderen
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);
}


Ich habe sie wie folgt verwendet.

#property script_show_inputs

input int inAmount = 5; // Wie viele Klone

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)); // Führen Sie den aktuellen EA auf neuen Chart-Symbolen aus.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

Es stellt sich die Aufgabe, ein Dutzend verschiedener Expert Advisors auf mehr als einem Terminal neu zu starten. Im Allgemeinen eine große Routine.

Zum Beispiel haben wir etwas korrigiert. Dann Batchkompilierung in ME und Neustart. Ich verwende dafür ein solches Skript.

// Lädt EAs auf allen Charts neu.
input int inInterval = 5; // Intervall in Sekunden zwischen den Neustarts des Diagramms

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Stellen Sie die Aufgabe in die Diagrammwarteschlange.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Bewegen Sie die Warteschlange.
}

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

Ich habe eine wichtige Stelle im Code markiert. Ohne sie wird die Anwendung der Vorlage nicht bis zum Ende des Skripts sein. Analog dazu kann man den Start von Expert Advisors nach dem Neuladen des Terminals lösen , etc.

 
fxsaber:

Es stellt sich die Aufgabe, ein Dutzend verschiedener Expert Advisors auf mehr als einem Terminal neu zu starten. Generell eine große Aufgabe.

Zum Beispiel haben wir etwas korrigiert. Dann Batchkompilierung in ME und Neustart. Ich verwende dafür dieses Skript.

Ich habe eine wichtige Stelle im Code hervorgehoben. Ohne sie wird die Vorlage nicht bis zum Ende des Skripts verwendet werden. In Analogie dazu können Sie den Start von Expert Advisors nach dem Neuladen des Terminals usw. lösen.

Ein komplettes Set wird es, wenn Sie den Namen des EA auf dem angegebenen Chart erhalten können. Wenn es für Sie nicht schwierig ist, beenden Sie es.

 
Vladimir Pastushak:

Er ist vollständig, wenn Sie den Namen des Ratsmitglieds auf der angegebenen Karte eintragen können. Wenn es Ihnen nichts ausmacht, füllen Sie es bitte aus.

ChartGetString(Chart, CHART_EXPERT_NAME)

Dies ist MT5. Wenn Sie plattformübergreifende oder vollständigen Pfad zum Expert Advisor benötigen, dann über Expert.mqh.

 
fxsaber:

Dies ist MT5. Wenn Sie plattformübergreifende oder vollständigen Pfad zu den Expert Advisor benötigen, dann über Expert.mqh.

Sie benötigen plattformübergreifende...

 
Vladimir Pastushak:

Ich brauche einen Cros-Platformer...

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: Expert

fxsaber, 2019.09.12 06:17 Uhr.

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

// Gibt die Daten des laufenden EA aus
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);    
}
 
// Setzt die Dateieingabevariable gleich der ausgewählten Datei.
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);
}

Mit dieser Funktion können Sie eine Datei als Eingabevariable auswählen. Diese Implementierung.

input string inFileName = NULL; // Ausgewählte Datei

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Code, wenn eine gültige Datei in der Eingabevariablen angegeben ist.

  return(INIT_SUCCEEDED);
}


Starten.


Klicken Sie auf OK und wählen Sie.


Klicken Sie auf Öffnen und sehen Sie die Eigenschaften (F7) des laufenden EA.


Das Gleiche funktioniert mit einer beliebigen Anzahl von Dateien.

input string inFileName1 = NULL; // Ausgewählte Datei1
input string inFileName2 = NULL; // Ausgewählte Datei2

#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, wenn eine gültige Datei in der Eingabevariablen angegeben ist.

  return(INIT_SUCCEEDED);
}
 
Und das Laden von Parametern aus Set-Dateien wird, soweit ich weiß, noch nicht unterstützt?
 
traveller00:
Und das Laden von Parametern aus Set-Dateien wird, soweit ich weiß, noch nicht unterstützt?

Das habe ich nicht. Aber es ist sehr einfach.