Librerías: Expert - página 6

 
fxsaber:

El autor de un EA nunca abogará por el comercio de su EA donde los resultados en el probador son pésimos.

No lo hará, pero esto no son señales - Asesores Expertos se venden independientemente del centro de corretaje. Entonces debería ser obligatorio especificar el vendedor, donde obtiene tales resultados, y esto es una especie de publicidad de la DC....

 
Aleksey Vyazmikin:

No voy a agitar, pero estos no son señales - asesores se venden independientemente de la DC. Entonces debería ser obligatorio especificar el vendedor, donde obtiene tales resultados, y esto es una especie de publicidad de la DC....

Probablemente, el razonamiento teórico es a veces bueno. Pero todavía interesado en la práctica relacionada con este post. Fue escrito en este hilo por una razón.

Propongo dejar de fludding de todos los lados.

 
fxsaber:

En el Mercado he visto muchas veces que los autores adjuntan set-files de sus CTs para cada personaje. En consecuencia, los compradores los utilizan.


Propongo utilizar la siguiente lógica para las CTs del Mercado

  • Se añade un parámetro de entrada
  • Si esta carpeta es especificada por el usuario, el Asesor Experto automáticamente recoge todos los sets de esta carpeta y ejecuta sus versiones correspondientes.
  • El usuario sólo tiene que colocar el archivo de sets en la carpeta y especificar la ruta a esta carpeta al iniciar el Asesor Experto (el autor del Asesor Experto puede insertar esta ruta de una vez).
  • Si el usuario comete un error y lo ejecuta dos veces, se puede evitar automáticamente que lo haga.

Este enfoque también es conveniente para lanzar su propio TS con un solo clic.

Por supuesto, la solución puede ser universal para ambas plataformas. A grandes rasgos, sólo será necesario añadir una línea al código fuente de cualquier Asesor Experto.


Lo más probable es que así es como voy a lanzar EAs a partir de ahora. Si alguien ve un fallo en este método o una opción de mejora, que me lo haga saber.

Ejecutar en el probador será diferente de en línea (las carpetas son diferentes, después de todo), para que coincida con una copia particular de la EA a un conjunto que tiene que hacer algo extra.

Bueno, y sólo la gestión de este rebaño de EAs sin su propia visualización parece difícil.

Además, cambiar el conjunto de sets irá acompañado de reiniciar todos los EAs.


Los gráficos individuales de MT sirven como "archivos transparentes", que se archivan en la "carpeta dura" del perfil. Esto le permite poner la información necesaria en cada archivo o fácilmente sacar/reemplazar el archivo necesario. Y puede cambiar a otra "carpeta dura" cambiando el perfil. Muy práctico.

Me he enfrentado a la necesidad de reemplazar un parámetro en todos los EAs (por ejemplo, el riesgo). Lo hice mediante la sustitución masiva en los archivos de plantilla oa través de una variable maestra especial. Sería conveniente envolver esto en una función conveniente.

 
Andrey Khatimlianskii:

Ejecutar en el probador será diferente de en línea (las carpetas son diferentes), para que coincida con una copia específica de la EA para el conjunto que tiene que hacer algo extra.

No habrá ninguna diferencia.

Bueno, y simplemente la gestión de este rebaño de EAs sin su propia visualización parece difícil.

No más complicado de lo que es ahora.

Además los cambios de conjunto irán acompañados de un reinicio de todos los asesores.

El EA se iniciará normalmente. Sólo si lo desea, puede especificar una carpeta con los conjuntos.

Los gráficos MT individuales sirven como "archivos transparentes", que se archivan en la "carpeta dura" del perfil. Esto le permite poner la información necesaria en cada archivo o sacar/sustituir fácilmente el archivo necesario. Y puede cambiar a otra "carpeta dura" cambiando el perfil. Muy práctico.

Por supuesto, usted puede incluso automáticamente leer / escribir perfiles en MQL5\Profiles\Charts\.... Pero los perfiles son muy diferentes.

Me he encontrado con la necesidad de sustituir un parámetro en todos los EAs (por ejemplo, el riesgo). Lo hice por la sustitución masiva en los archivos de plantilla oa través de una variable maestra especial. Sería conveniente envolverlo en una función conveniente.

Tal funcionalidad se encuentra entre los ejemplos a la biblioteca.


Sin embargo, usted debe distinguir entre el cambio de los parámetros de entrada por el método de reinicio y a través de F7 a mano. El primero es un reinicio completo, el segundo no. Hay momentos en que usted necesita el segundo. Pero esto no se puede implementar en MQL.

 
fxsaber:

No habrá ninguna diferencia.

¿Cómo? ¿Seleccionando el conjunto que quieras?


fxsaber:

No es más complicado de lo que es ahora.

Ahora mismo, cada EA en ejecución tiene su propio conjunto.

Pero, ¿cómo se comportará el "gestor", que ejecuta 10 Asesores Expertos, si algunos de ellos cambian los parámetros manualmente? ¿Y qué pasará después de reiniciar el gestor? ¿Se ejecutarán los conjuntos originales?

 
Andrey Khatimlianskii:

¿Cómo? ¿Seleccionando un conjunto necesario?

MQL_TESTER.

Ahora cada Asesor Experto en ejecución tiene su propio conjunto.

Pero, ¿cómo se comportará un "gestor" que ejecuta 10 Asesores Expertos si algunos de ellos tienen sus parámetros cambiados manualmente? ¿Y qué pasará después de reiniciar el gestor? ¿Se ejecutarán los conjuntos originales?

Se supone que el gestor no se utiliza. Aparentemente, sólo mediante código podré mostrar lo que quiero decir. Gracias por su participación.

 
fxsaber:

MQL_TESTER.

¿Puede dar una respuesta un poco más detallada?

Es posible determinar que la puesta en marcha se encuentra en el probador, por supuesto. Pero no hay acceso a la carpeta sets (o lo hay si tiene acceso a la carpeta kamon), y no tiene sentido leer estos sets - necesita probar sólo uno de ellos.

Y después de la prueba que necesita para que coincida con el Asesor Experto en ejecución (por ejemplo, para detenerlo o cambiar algún parámetro). Para hacer esto, ¿tengo que ir a la carpeta con los sets, encontrar el necesario y editarlo?


Entonces el comercio en todos los conjuntos de un EA parece más razonable. Con la posibilidad de elegir una o varias estrategias (sets).

 
Andrey Khatimlianskii:

¿Puede darme una respuesta un poco más detallada?

Es posible determinar que la puesta en marcha se encuentra en el probador, por supuesto. Pero no hay acceso a la carpeta de conjuntos (o hay, si kamon), y no tiene sentido para leer estos conjuntos - que necesita para poner a prueba sólo uno de ellos.

Y después de la prueba que necesita para que coincida con el Asesor Experto en ejecución (por ejemplo, para detenerlo o cambiar algún parámetro). Para hacer esto, ¿tengo que ir a la carpeta con los sets, encontrar el necesario y editarlo?

El Probador utiliza un archivo opt personalizado. Desde él se lanza cualquier set con un solo clic. Es superconveniente.

Si no tienes un opt-file, trabajas a la antigua usanza. Es decir, no se complica nada.

Entonces parece más razonable operar todos los conjuntos desde un solo EA. Con la posibilidad de elegir una o varias estrategias (sets).

Tal opción está siempre disponible en el Probador - cargar un conjunto.

 
Yo recomendaría la construcción de este tipo de control en su EAs
// Ejemplo multiplataforma de protección contra el lanzamiento erróneo del clon de EA.

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

string GetExpertData( const ulong Chart = 0 ) 
{ 
  string Str = NULL; 

  MqlParam Parameters[]; 
  string Names[]; 

  if (EXPERT::Parameters(Chart, Parameters, Names)) 
  { 
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n"; 

    const int Amount = ::ArraySize(Names); 

    for (int i = 0; i < Amount; i++) 
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n"; 
  } 

  return(Str); 
} 

// ¿Está funcionando el mismo asesor?
long IsRunning( void )
{ 
  long Res = 0;
  const string Str = GetExpertData();
  long Chart = ::ChartFirst(); 

  while (!Res && (Chart != -1)) 
    if ((Chart != ::ChartID()) && EXPERT::Is() && (Str == GetExpertData(Chart)))
      Res = Chart;
    else
      Chart = ::ChartNext(Chart); 

  return(Res); 
}

input int Range1 = 1;
input int Range2 = 1;

int OnInit()
{
  return(!MQLInfoInteger(MQL_TESTER) && IsRunning() &&
         (MessageBox("This EA is already running." +
                     GetExpertData() + "\nRun?", MQLInfoString(MQL_PROGRAM_NAME), MB_YESNO) == IDNO) ?
         INIT_FAILED : INIT_SUCCEEDED);
}
 

// MT4-advisor muestra en qué modo Largo/Corto se ejecutó.

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

int GetLongShortFlag( const int Chart_ID = 0 )
{
  MqlParam Params[];
  string Names[];
  
  const int Res = EXPERT::Parameters(Chart_ID, Params, Names);
  
  return(((Res & 3) << 1) + (Res & 1));
}

string LongShortToString( const int Chart_ID = 0 )
{
  const int Flag = GetLongShortFlag(Chart_ID);
  string Str = NULL;
  
  if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY) && (bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Long & Short";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY))
    Str = "Only Long";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Only Short";
    
  return(Str);
}

int OnInit()
{
  Alert(LongShortToString());
  
  return(INIT_FAILED);
}