Librerías: Expert - página 11

 
Si conoce los nombres de las entradas, la segunda opción es mejor. Le permite no pensar en el orden de las entradas en el Asesor Experto. Y técnicamente está mejor implementada.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Camino a Consejero
  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);
}


A pesar de que inpFirst es el segundo en el orden, se puede establecer a cualquier cosa (en este caso se establece para ser el primero y el único). Los que no se establecen será por defecto.

 
Para los experimentos que necesitaba para clonar un robot para varios gráficos. Lo hice a través de esta función.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/es/code/19003

// Copia el Asesor Experto en ejecución con la configuración actual de un gráfico a otro
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);
}


La utilicé así.

#property script_show_inputs

input int inAmount = 5; // Cuántos 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)); // Ejecutar el EA actual en nuevos gráficos-símbolos.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

Surge la tarea de reiniciar una docena de Asesores Expertos diferentes en más de un Terminal. En general, una gran rutina.

Por ejemplo, corregimos algo. A continuación, la compilación por lotes en ME y reiniciar. Yo uso un script para ello.

// Recarga EAs en todos los gráficos.
input int inInterval = 5; // Intervalo en segundos entre reinicios del gráfico

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Poner la tarea en la cola de gráficos.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Haz que la cola se mueva.
}

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

He marcado un lugar importante en el código. Sin ella, la aplicación de la plantilla no será hasta el final de la secuencia de comandos. Por analogía, puede resolver el lanzamiento de Asesores Expertos después de recargar el Terminal, etc.

 
fxsaber:

Surge la tarea de reiniciar una docena de Asesores Expertos diferentes en más de un Terminal. En general, una gran tarea.

Por ejemplo, corregimos algo. Entonces compilación por lotes en ME y reiniciar. Yo uso este script para ello.

He resaltado un lugar importante en el código. Sin ella, la plantilla no se utilizará hasta el final de la secuencia de comandos. Por analogía, se puede resolver el lanzamiento de Asesores Expertos después de recargar el Terminal, etc.

Será un conjunto completo si puede obtener el nombre del EA en el gráfico especificado. Si no te resulta difícil, termínalo.

 
Vladimir Pastushak:

Estará completo si consigues poner el nombre del concejal en el cuadro especificado. Si no le importa, por favor, complételo.

ChartGetString(Chart, CHART_EXPERT_NAME)

Esto es MT5. Si necesita multiplataforma o ruta completa para el Asesor de Expertos, a continuación, a través de Expert.mqh.

 
fxsaber:

Esto es MT5. Si necesita multiplataforma o ruta completa al Asesor Experto, a continuación, a través de Expert.mqh.

Usted necesita cruz-plataforma...

 
Vladimir Pastushak:

Necesita un cros-platformer...

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Bibliotecas: Expert

fxsaber, 2019.09.12 06:17 pm.

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

// Emite los datos del EA en ejecución
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);    
}
 
// Hace que la variable de entrada del fichero sea igual al fichero seleccionado.
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);
}

Esta función permite seleccionar un fichero como variable de entrada. Esta implementación.

input string inFileName = NULL; // Fichero seleccionado

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Código si se especifica un archivo válido en la variable de entrada.

  return(INIT_SUCCEEDED);
}


Inicio.


Haga clic en Aceptar y seleccione.


Haga clic en Abrir y vea las propiedades (F7) del EA en ejecución.


Lo mismo funcionará con cualquier número de archivos.

input string inFileName1 = NULL; // Fichero1 seleccionado
input string inFileName2 = NULL; // Fichero2 seleccionado

#define  TOSTRING(A) #A          

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

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // Código si se especifica un archivo válido en la variable de entrada.

  return(INIT_SUCCEEDED);
}
 
Y la carga de parámetros desde archivos de configuración aún no está soportada, según tengo entendido.
 
traveller00:
¿Y la carga de parámetros desde archivos de configuración aún no está soportada, según tengo entendido?

Yo no lo he hecho. Pero es muy sencillo.