Discusión sobre el artículo "Desarrollamos un Asesor Experto multidivisas (Parte 20): Ordenando la cadena de etapas de optimización automática de proyectos (I)"

 

Artículo publicado Desarrollamos un Asesor Experto multidivisas (Parte 20): Ordenando la cadena de etapas de optimización automática de proyectos (I):

Ya hemos creado bastantes componentes que ayudan a organizar la optimización automática. Durante la creación, seguimos la estructura cíclica tradicional: desde la creación de código mínimo funcional hasta la refactorización y la obtención de código mejorado. Es hora de empezar a limpiar nuestra base de datos, que también es un componente clave en el sistema que estamos creando.

En esta serie de artículos, intentamos crear un sistema de optimización automática que permita encontrar buenas combinaciones de parámetros de una estrategia comercial sin intervención humana. Estas combinaciones luego se combinarán en un EA final. El objetivo se detalla con mayor precisión en la parte 9 y la parte 11. El proceso de dicha búsqueda estará controlado por un EA (EA optimizador), y todos los datos que deban guardarse durante su funcionamiento se almacenarán en la base de datos principal.

En la base de datos, tenemos tablas para almacenar información sobre varias clases de objetos. Algunas tienen un campo de estado que puede tomar valores de un conjunto fijo de valores («Queued» (En cola), «Process» (Proceso), «Done» (Listo)), pero no todas las clases utilizan este campo. Más concretamente, por ahora solo se utiliza para tareas de optimización (task). Nuestro EA optimizador busca en la tabla de tareas (tasks) las tareas en cola para seleccionar la siguiente tarea que se va a ejecutar. Una vez completada cada tarea, su estado en la base de datos cambia a «Completed».

Intentemos implementar actualizaciones automáticas de estado no solo para las tareas, sino también para todas las demás clases de objetos (trabajos, etapas, proyectos) y organicemos la ejecución automática de todas las etapas necesarias hasta obtener el EA final, que puede funcionar de forma independiente sin conectarse a la base de datos.

Autor: Yuriy Bykov

 

He intentado ejecutar su ejemplo.

He establecido groupId_ = 1.

Pero el experto no se crea en la función de inicialización. Aquí sale:

int OnInit() {
// Establecer parámetros en la clase de gestión de capital
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

// Cadena de inicialización con conjuntos de parámetros de estrategia
   string strategiesParams = NULL;

// Si el índice seleccionado del grupo de estrategias de la biblioteca es válido, entonces
   if(groupId_ >= 0 && groupId_ < ArraySize(CGroupsLibrary::s_params)) {
      // Tomar la cadena de inicialización de la biblioteca para el grupo seleccionado
      strategiesParams = CGroupsLibrary::s_params[groupId_];
   }

// Si no se especifica el grupo de estrategias de la biblioteca, aborta la operación
   if(strategiesParams == NULL) {
      return INIT_FAILED;
   }

// Preparar la cadena de inicialización para un Asesor Experto con un grupo de varias estrategias
   string expertParams = StringFormat(
                            "class CVirtualAdvisor(\n"
                            "    class CVirtualStrategyGroup(\n"
                            "       [\n"
                            "        %s\n"
                            "       ],%f\n"
                            "    ),\n"
                            "    class CVirtualRiskManager(\n"
                            "       %d,%.2f,%d,%.2f,%.2f,%d,%.2f,%.2f,%d,%.2f,%d,%.2f,%.2f"
                            "    )\n"
                            "    ,%d,%s,%d\n"
                            ")",
                            strategiesParams, scale_,
                            rmIsActive_, rmStartBaseBalance_,
                            rmCalcDailyLossLimit_, rmMaxDailyLossLimit_, rmCloseDailyPart_,
                            rmCalcOverallLossLimit_, rmMaxOverallLossLimit_, rmCloseOverallPart_,
                            rmCalcOverallProfitLimit_, rmMaxOverallProfitLimit_, rmMaxOverallProfitDate_,
                            rmMaxRestoreTime_, rmLastVirtualProfitFactor_,
                            magic_, "SimpleVolumes", useOnlyNewBars_
                         );

   PrintFormat(__FUNCTION__" | Expert Params:\n%s", expertParams);

// Crear un Asesor Experto que trabaje con posiciones virtuales
   expert = NEW(expertParams);

// Si no se crea el Asesor Experto, devuelve un error
   if(!expert) return INIT_FAILED;

...
}


Si profundizamos, el objeto no se crea en CVirtualFactory():

class CVirtualFactory {
public:
   // Creación de un objeto a partir de la cadena de inicialización
   static CFactorable* Create(string p_params) {
      // Leer el nombre de la clase del objeto
      string className = CFactorable::ReadClassName(p_params);
      
      // Puntero al objeto a crear
      CFactorable* object = NULL;

      // Dependiendo del nombre de la clase, llama al constructor correspondiente
      if(className == "CVirtualAdvisor") {
         object = new CVirtualAdvisor(p_params);
...

¿Puedes decirme cuál es el problema, y cómo probar tu ejemplo en acción después de todo?

Gracias.

 

Hola.

Es posible que no haya completado el trabajo de creación de entradas en la biblioteca de parámetros o incluso todos los demás pasos necesarios de la optimización automática. Por ejemplo, puedes leer más sobre el último paso -rellenado de la biblioteca- en la Parte 17.

Es posible, sin embargo, que el punto sea diferente. Lo ideal es no necesitar una base de datos para ejecutar el EA final. Voy a comprobar el código y responder más tarde.
 
He mirado el código de este artículo. De hecho, hasta ahora no hemos llegado a la última etapa en la automatización, donde el EA final que no está vinculado a la base de datos de optimización se genera automáticamente. Esto se hará en un próximo artículo. Por ahora, la ejecución preliminar de las primeras etapas de la tubería es necesaria para obtener los resultados.
 

Hola Yuriy

He utilizado Google Translate para llegar a la parte 20. Busca en Google "Google Translate" y ponlo en una nueva pestaña del navegador. Colocará un icono en la barra de búsqueda en el extremo derecho. Carga la página en su idioma nativo y pulsa el icono para seleccionar el idioma del artículo y el que se traducirá a él. Presto, ¡estoy en la parte 20! No hace un trabajo perfecto pero la traducción es útil en un 99%.

He cargado tu Fuente de Archivo en Excel y he añadido unas cuantas columnas para ordenar los contenidos. Además de la clasificación en Excel, la hoja de cálculo puede importarse directamente a una base de datos OutLook.


Estoy teniendo problemas para identificar el artículo de inicio para establecer la base de datos SQL. Intenté ejecutar Simple Volume Stage 1 y obtuve una línea plana que me indica que probablemente necesite retroceder y crear otra base de datos SQL. Sería extremadamente útil disponer de una tabla con el orden de ejecución de los programas necesarios para obtener un sistema que funcione. Tal vez podría añadirla a la tabla Fuente de archivos.

Otra pequeña petición es utilizar la opción <> para las especificaciones de archivos include en lugar de "". Mantengo su sistema separado en mis directorios Experts e Include, #include <!!!! MultiCurrency\VirtualAdvisor.mqh>, así que este cambio hará más fácil añadir la especificación del subdirectorio/.

Gracias por tu aportación

CapeCoddah

Archivos adjuntos:
 

Hola.

Sobre el llenado inicial de la base de datos con información sobre el proyecto, etapas, obras y tareas se puede ver en las partes 13, 18, 19. Este no es el tema principal, por lo que la información que necesita estará en algún lugar más cerca del final de los artículos. Por ejemplo, en la parte 18:

Проверив, что в базу данных теперь корректно попадают результаты проходов, совершаемых с использованием форвард-периода, проведём более приближенный к реальным условиям тест работы автоматической оптимизации. Для этого в чистую базу данных добавим уже два этапа. На первом будет оптимизироваться одиночный экземпляр торговой стратегии, но только на одном символе и периоде (EURGBP H1) на промежутке 2018 - 2023 годов. Форвард-период на этом этапе использоваться не будет. На втором этапе будет оптимизироваться группа из хороших одиночных экземпляров, полученных на первом этапе. Теперь форвард период уже будет использоваться: под него отводится весь 2023 год.

O en la parte 19:

Vamos a crear cuatro etapas en la base de datos para nuestro proyecto llamado "Primero", "Clustering pasa de la primera etapa", "Segundo", y "Segundo con clustering". Para cada etapa crearemos dos trabajos para los símbolos EURGBP y GBPUSD en el marco temporal H1. Para los trabajos de la primera etapa crearemos tres tareas de optimización con diferentes criterios (complejo, beneficio máximo y personalizado). Para el resto de los trabajos crearemos una tarea cada uno. Tomaremos el periodo de 2018 a 2023 como intervalo de optimización. Para cada trabajo especificaremos los valores correctos de los parámetros de entrada.

O puede esperar al próximo artículo, que estará dedicado, entre otras cosas, a la cuestión del llenado inicial de la base de datos con la ayuda de un script auxiliar.

El cambio al uso de la carpeta include para almacenar los archivos de la biblioteca está en los planes, pero todavía no se ha llegado a eso.

 
Yuriy Bykov almacenar la biblioteca en los planes, pero hasta ahora no ha llegado a ella.

muchas gracias

 

Hola Yuriy,

¿Has enviado el próximo artículo o sabes cuándo se publicará?

 
Hola, lo más probable es que dentro de un mes.