Discusión sobre el artículo "Asesor Experto multiplataforma: las clases CExpertAdvisor y CExpertAdvisor"

 

Artículo publicado Asesor Experto multiplataforma: las clases CExpertAdvisor y CExpertAdvisor:

En el artículo final de la serie sobre el asesor comercial multiplataforma, hablaremos sobre las clases CExpertAdvisor y CExpertAdvisors, que sirven de contendores para los componentes del experto anteriormente descritos. Asimismo, analizaremos la implementación del monitoreo de las nuevas barras y el guardado de datos.

El método OnTick de la clase CExpertAdvisor se usa con mayor frecuencia en esta clase. Precisamente él ejecuta la mayor parte de las acciones. La principal operación de este método se muestra en el diagrama:


CExpertAdvisorBase OnTick

Autor: Enrico Lambino

 

Hola Enrico. Parece que has completado tu proyecto. Estaba mirando tu último artículo y me he dado cuenta de lo que creo que puede ser un error:

bool CExpertAdvisorBase::Init(string symbol,int period,int magic,bool every_tick=true,bool one_trade_per_candle=true,bool position_reverse=true)
  {
   m_symbol_name=symbol;
   CSymbolInfo *instrument;
   if((instrument=new CSymbolInfo)==NULL)
      return false;
   if(symbol==NULL) symbol=Symbol();
   if(!instrument.Name(symbol))
      return false;
   instrument.Refresh();
   m_symbol_man.Add(instrument);
   m_symbol_man.SetPrimary(m_symbol_name);
   m_period=(ENUM_TIMEFRAMES)period;
   m_every_tick=every_tick;
   m_order_man.Magic(magic);
   m_position_reverse=position_reverse;
   m_one_trade_per_candle=one_trade_per_candle;
   CCandle *candle=new CCandle();
   candle.Init(instrument,m_period);
   m_candle_man.Add(candle);
   Magic(magic);
   return false;
  }

He resaltado en naranja arriba. Creo que la declaración de retorno debe ser un verdadero en lugar de falso. Estoy reiniciando mi PC, cogí un virus realmente malo que arruinó mi día, así que decidí hacer un poco de lectura. Tu trabajo es una de las mejores lecturas del foro. Te has superado con este proyecto, bien hecho.

Mi idea es similar a la tuya, y he cogido algunas ideas realmente buenas de tu trabajo, gracias. Cuando termine, me tomaré un tiempo para compartirlo aquí.

 
Shephard Mukachi:

Hola Enrico. Parece que has completado tu proyecto. Estaba mirando tu último artículo y me he dado cuenta de lo que creo que puede ser un error:

He resaltado en naranja arriba. Creo que la declaración de retorno debe ser un verdadero en lugar de falso. Estoy reiniciando mi PC, cogí un virus realmente malo que arruinó mi día, así que decidí hacer un poco de lectura. Tu trabajo es una de las mejores lecturas del foro. Te has superado con este proyecto, bien hecho.

Mi idea es similar a la tuya, y he cogido algunas ideas realmente buenas de tu trabajo, gracias. Cuando termine, me tomaré un tiempo para compartirlo aquí.

 

Hola Shep,

Shephard Mukachi:

Hola Enrico. Parece que has completado tu proyecto. Estaba mirando tu último artículo y me he dado cuenta de lo que creo que puede ser un error:

He resaltado en naranja por encima. Creo que la declaración de retorno debe ser un verdadero en lugar de falso. Estoy reiniciando mi PC, cogí un virus realmente malo que arruinó mi día, así que decidí hacer un poco de lectura. Tu trabajo es una de las mejores lecturas del foro. Te has superado con este proyecto, bien hecho.

Mi idea es similar a la tuya, y he cogido algunas ideas realmente buenas de tu trabajo, gracias. Cuando termine, me tomaré un tiempo para compartirlo aquí.

Lamento lo sucedido, pero gracias por sus comentarios. Sí, tiene razón. No me había dado cuenta hasta ahora. Lo corregiré. La llamada al método Init() en los ejemplos no está comprobada, pero parte de mis planes futuros para la librería es hacer las llamadas a funciones y métodos más formales (como en la librería estándar), así como una plantilla EA para facilitar la codificación. Más tarde, voy a subir la última versión de la biblioteca en el codebase, y hacer público el repositorio. Vuestros comentarios y pull requests son bienvenidos.

De nada y espero ver tu biblioteca.

 
Enrico Lambino:

Hola Shep,

Siento lo ocurrido, pero gracias por tu comentario. Sí, tienes razón. No me había dado cuenta hasta ahora. Lo corregiré. La llamada al método Init() en los ejemplos no está comprobada, pero parte de mis planes futuros para la librería es hacer las llamadas a funciones y métodos más formales (igual que en la librería estándar), así como una plantilla EA para facilitar la codificación. Más tarde, voy a subir la última versión de la biblioteca en el codebase, y hacer público el repositorio. Vuestros comentarios y pull requests son bienvenidos.

De nada y espero ver tu biblioteca.


Hola Enrico. Finalmente estoy a punto de completar la instalación de un nuevo sistema. He luchado durante horas ayer por la noche, ya que no podía conseguir el control de mi sistema en absoluto, pero es casi hecho ahora. Usando mi tableta para navegar para hacer un poco de lectura. Su biblioteca es realmente un gran trabajo. Ahora que está completa, puedo ver toda la lógica - ¡guau!

Así que mi idea es la siguiente

- El EA crea una lista de Robots (como en entidad AI) basado en una combinación de Magic, Symbol y Timeframe (usando Watch Window)

- La entidad AI entonces va a una bolsa de trucos (las señales - MA, PSAR, etc) y determina la mejor señal o una combinación de señales. Mejor aquí se basa en un motor interno de back-testing que le permite comparar entre las señales.

- A continuación, la IA añade la señal/es en una lista, y las operaciones basadas en eso, y vuelve a aprender si es necesario.

- Cada IA tendrá objetos Stop, Orden y Posición que gestionará individualmente, y acceso a un objeto optimizador (GA) para el aprendizaje. Pensé en utilizar la Teoría de la Utilidad para la toma de decisiones de la IA (similar a la ponderación utilizada en el Sistema EA MQL5), pero no me gustó la arbitrariedad aplicada, así que opté por el aprendizaje a través de la negociación virtual en su lugar, dando a la IA un comportamiento casi como el de una persona real.


Tuve un tiempo difícil entender cómo poner en práctica algunas de las ideas, y la lectura de artículos como el tuyo y un montón de otros artículos en el foro y los libros me ha llevado a un punto en el que estoy a punto de completar un proyecto realmente fresco - así que creo que de todos modos.

Uno de los principales problemas que has mencionado es la serialización. Debido a que una orden o posición en vivo no tiene todos los atributos del objeto que la abrió, una caída del sistema pondrá las IA's en un estado inválido, dejando un montón de operaciones huérfanas. Se me ocurrió usar el comentario de la orden. Así que al enviar una orden, cree un comentario con Timeframe, SignalName,SignalSettings concatenados. Pronto me di cuenta de que se convierte en difícil de manejar muy rápidamente y sólo propensos a problemas de implementación. Así que escribir en un archivo parece ser lo único que tiene sentido.


Bueno, te dejo saber de mi progreso si usted está interesado. Pero su trabajo es realmente grande, gracias por su tiempo en el proyecto.


Shep

 

Hola Shep,

Shephard Mukachi:

Hola Enrico. Por fin estoy a punto de completar la instalación de un nuevo sistema. He luchado durante horas ayer por la noche, ya que no podía conseguir el control de mi sistema en absoluto, pero es casi hecho ahora. Usando mi tableta para navegar a hacer un poco de lectura. Su biblioteca es realmente un gran trabajo. Ahora que está completa, puedo ver toda la lógica - ¡guau!

Así que mi idea es la siguiente

- El EA crea una lista de Robots (como en entidad AI) basado en una combinación de Magic, Symbol y Timeframe (usando Watch Window)

- La entidad AI entonces va a una bolsa de trucos (las señales - MA, PSAR, etc) y determina la mejor señal o una combinación de señales. Mejor aquí se basa en un motor interno de back-testing que le permite comparar entre las señales.

- A continuación, la IA añade la señal/es en una lista, y las operaciones basadas en eso, y vuelve a aprender si es necesario.

- Cada IA tendrá objetos Stop, Orden y Posición que gestionará individualmente, y acceso a un objeto optimizador (GA) para el aprendizaje. Pensé en utilizar la Teoría de la Utilidad para la toma de decisiones de la IA (similar a la ponderación utilizada en el Sistema EA MQL5), pero no me gustó la arbitrariedad aplicada, así que opté por el aprendizaje a través de la negociación virtual en su lugar, dando a la IA un comportamiento casi como el de una persona real.


Tuve un tiempo difícil entender cómo poner en práctica algunas de las ideas, y la lectura de artículos como el tuyo y un montón de otros artículos en el foro y los libros me ha llevado a un punto en el que estoy a punto de completar un proyecto realmente fresco - así que creo que de todos modos.

Uno de los principales problemas que has mencionado es la serialización. Debido a que una orden o posición en vivo no tiene todos los atributos del objeto que la abrió, una caída del sistema pondrá las IA's en un estado inválido, dejando un montón de operaciones huérfanas. Se me ocurrió usar el comentario de la orden. Así que al enviar una orden, cree un comentario con Timeframe, SignalName,SignalSettings concatenados. Pronto me di cuenta de que se convierte en difícil de manejar muy rápidamente y sólo propensos a problemas de implementación. Así que escribir en un archivo parece ser lo único que tiene sentido.


Bueno, te dejo saber de mi progreso si usted está interesado. Pero su trabajo es realmente grande, gracias por su tiempo en el proyecto.


Shep

Parece un proyecto interesante. Sin embargo, ese parece un proyecto muy grande (probablemente más grande y más desafiante que este). Permítanme compartir algunos de mis pensamientos que creo que podría ayudarle:

Una vez escribí un script backtester antes. Conseguí que funcionara como quería con operaciones virtuales, pero su rendimiento sería lento si se utilizara en un EA real (¡por no hablar de uno autooptimizado!). Usted podría llegar a un mejor éxito en su trabajo si usted puede de alguna manera hacer que los otros núcleos de CPU (o incluso GPU) hacer cálculos, así (es decir, DLL o OpenCL).

La lista de robots funciona, pero tiene un fallo importante: no se ejecutan en paralelo. El retraso está bien si el número es de pocos a varios, pero si tienes más, los del final de la lista se procesarían los últimos. Y éstos también tendrían que competir con los recursos que el EA necesita para realizar su trabajo real.

El trading virtual puede hacer buenos modelos, pero no captura el ruido real del mercado (es decir, las noticias). Esto lo aprendí por las malas.

Comparto los mismos pensamientos con usted con respecto al sistema de pesaje utilizado en la clase CSignal de la biblioteca estándar. En mi opinión, el sistema es muy propenso a overfitting si se pone en un optimizador. Tengo un bot creador de mercado que utiliza un modelo de puntuación de mercado (LMSR, pero todavía trabajando en la mejora de riesgo de inventario). Creo que esto es una muy buena alternativa, ya que el peso de las señales de compra y venta de señales (e incluso ninguna señal) puede ser colectivamente en cuenta, y los resultados son en términos de probabilidades. Y consume muchos menos recursos que el aprendizaje profundo.

Guardar en un archivo es probablemente la mejor opción ahora mismo para guardar datos volátiles. Usar GVs es otra, pero puede ser incluso más lioso que usar comentarios de órdenes. Además, algunos brokers insertan otros códigos en los comentarios de órdenes (por ejemplo, opciones binarias), por lo que tampoco es un método muy bueno en mi opinión. Otra opción es guardar todos los datos en un objeto diccionario, así evitarás tener que escribir líneas de código implementando una serie de métodos Load y Save, pero también necesitas guardar en disco. Pero hay un problema importante cuando el usuario quiere iniciar una nueva sesión con un EA. Esto tiene que ser abordado manualmente (ya sea borrando el archivo de guardado, o asignando un nuevo nombre de archivo de guardado).

Rompí algunas reglas de programación orientada a objetos al implementar las clases de archivo en esta biblioteca. Experimenté algún problema con el manejador de archivo que pierde su valor (convirtiéndose en INVALID_HANDLE) cuando se pasa a través de métodos y funciones (incluso con el calificador const). No estoy seguro de si sigue siendo el caso ahora, pero estoy bastante satisfecho con la solución actual. Para ser honesto, el uso de un descendiente CFile en la biblioteca no era muy elegante, pero funciona, y los resultados a mucho menos código.

Os deseo lo mejor,

Enrico

 

Muchas gracias por su aportación. Agradezco sus ideas en cualquier momento.

Sí, tienes razón en que será un gran proyecto, y espero que no más grande que el tuyo, es un montón de trabajo y estresante en eso también. Sin embargo, me encanta la programación, y pensar que en realidad soy un analista financiero. Empecé a programar por necesidad, porque necesitaba automatizar algunos de los modelos financieros más complejos. Tengo la extraña habilidad de que se me ocurran ideas locas y extrañas. Ojalá pudiera programar tanto como tú.

Estoy mirando Diccionarios, y Lists<T> en el momento. List<T> específicamente como un medio más fácil para compartir las listas de objetos, sino también para la unión. Y diccionario para el almacenamiento y la serialización. He estado experimentando con algunas ideas para que yo pueda hacer mi base de código más ligero, pero también tienen un sistema que es rápido, ligero en el mantenimiento y que es, literalmente, manos libres una vez caído en un Gráfico. Tu punto sobre las listas es realmente valioso por lo que esta idea puede no ser tan ideal.

Tienes razón con respecto al procesamiento de escoria si no utilizo ejecuciones paralelas - e incluso entonces es lento. Este es uno de los problemas que descubrí en mis pruebas. Los últimos objetos de la lista llegan muy tarde, especialmente si el mercado es realmente volátil, el OnTick, puede ser llamado varias veces antes incluso de que los primeros objetos de la lista sean llamados. Como sugeriste, miré OpenCL como posible solución. Tendré que invertir en un sistema a medida.

De hecho, el comercio virtual hace grandes modelos que pueden limpiar completamente su cuenta en los mercados ruidosos. Un día vi con pánico como mi EA luchaba por colocar y mucho menos cerrar las operaciones durante las noticias. Esta es la cruda realidad del trading, pero debemos intentarlo.

Sí, estoy de acuerdo con usted en que el enfoque del modelo de puntuación es mejor. El LMSR es definitivamente un enfoque superior, especialmente teniendo en cuenta que los movimientos alcistas y bajistas son muy diferentes para cada instrumento. Un enfoque de probabilidad ponderada definitivamente mejora la precisión.

Con el autoaprendizaje, sí será bastante lento. Sólo se utilizará al principio para configurar los agentes de IA, para armarlos con las señales apropiadas, y luego a intervalos determinados, digamos al final del día para los agentes de 5Min y un viernes para los agentes de 1Hr. De hecho, esto trae el punto que usted hizo sobre la formación virtual que hace miles de millones sólo para perder todo su dinero en el comercio en vivo. Así que es la búsqueda para mí encontrar las señales que son muy simple y rápido para que no pierda demasiada velocidad. Quiero que el sistema de cuero cabelludo, por ejemplo, para unos pocos pips después de la propagación y la comisión. Esto significa que los oficios tienen que ser muy alta probabilidad de configuraciones, como el martillo que está en el más bajo de los últimos 20 bares o algo así.

Como quiero centrarme en scalping, puede que no necesite supervisar tanto las operaciones. Los agentes solo verificarán el setup, luego ordenarán con Stop y Takeprofit que serán parados o cerrados en ganancia. Una vez más, todavía experimentando con esto.

Todavía tengo mucho trabajo, experimentando con ideas alrededor de las señales. Cuando encuentre algo con realmente grandes resultados voy a compartir con ustedes.

Rompiste algunas reglas, ¡pero no es esa la belleza de la programación! Es increíble cómo puedes ceñirte a las reglas y quedarte completamente atascado y sentir que podrías subirte por las paredes. Y a veces romper las reglas es lo que necesitas para progresar. Tu trabajo es genial, y por eso te tengo mucho respeto. Enrico programar es un trabajo duro. Es agradable cuando va bien, y un verdadero dolor cuando no funciona según lo previsto.

Muchas gracias por tu aportación. Te estoy muy agradecido y te mantendré informado.

Gracias de nuevo,

Shep

 
Shephard Mukachi:

Muchas gracias por su aportación. Agradezco sus ideas en cualquier momento.

Sí, tienes razón en que será un gran proyecto, y espero que no más grande que el tuyo, es un montón de trabajo y estresante en eso también. Sin embargo, me encanta la programación, y pensar que en realidad soy un analista financiero. Empecé a programar por necesidad, porque necesitaba automatizar algunos de los modelos financieros más complejos. Tengo la extraña habilidad de que se me ocurran ideas locas y extrañas. Ojalá pudiera programar tanto como tú.

Estoy mirando Diccionarios, y Lists<T> en el momento. List<T> específicamente como un medio más fácil para compartir las listas de objetos, sino también para la unión. Y diccionario para el almacenamiento y la serialización. He estado experimentando con algunas ideas para que yo pueda hacer mi base de código más ligero, pero también tienen un sistema que es rápido, ligero en el mantenimiento y que es, literalmente, manos libres una vez caído en un Gráfico. Tu punto sobre las listas es realmente valioso por lo que esta idea puede no ser tan ideal.

Tienes razón con respecto al procesamiento de escoria si no utilizo ejecuciones paralelas - e incluso entonces es lento. Este es uno de los problemas que descubrí en mis pruebas. Los últimos objetos de la lista llegan muy tarde, especialmente si el mercado es realmente volátil, el OnTick, puede ser llamado varias veces antes incluso de que los primeros objetos de la lista sean llamados. Como sugeriste, miré OpenCL como posible solución. Tendré que invertir en un sistema a medida.

De hecho, el comercio virtual hace grandes modelos que pueden limpiar completamente su cuenta en los mercados ruidosos. Un día vi con pánico como mi EA luchaba por colocar y mucho menos cerrar las operaciones durante las noticias. Esta es la cruda realidad del trading, pero debemos intentarlo.

Sí, estoy de acuerdo con usted en que el enfoque del modelo de puntuación es mejor. El LMSR es definitivamente un enfoque superior, especialmente teniendo en cuenta que los movimientos alcistas y bajistas son muy diferentes para cada instrumento. Un enfoque de probabilidad ponderada definitivamente mejora la precisión.

Con el autoaprendizaje, sí será bastante lento. Sólo se utilizará al principio para configurar los agentes de IA, para armarlos con las señales apropiadas, y luego a intervalos determinados, digamos al final del día para los agentes de 5Min y un viernes para los agentes de 1Hr. De hecho, esto trae el punto que usted hizo sobre la formación virtual que hace miles de millones sólo para perder todo su dinero en el comercio en vivo. Así que es la búsqueda para mí encontrar las señales que son muy simple y rápido para que no pierda demasiada velocidad. Quiero que el sistema de cuero cabelludo, por ejemplo, para unos pocos pips después de la propagación y la comisión. Esto significa que los oficios tienen que ser muy alta probabilidad de configuraciones, como el martillo que está en el más bajo de los últimos 20 bares o algo así.

Como quiero centrarme en scalping, puede que no necesite supervisar tanto las operaciones. Los agentes solo verificarán el setup, luego ordenarán con Stop y Takeprofit que serán parados o cerrados en ganancia. Una vez más, todavía experimentando con esto.

Todavía tengo mucho trabajo, experimentando con ideas alrededor de las señales. Cuando encuentre algo con realmente grandes resultados voy a compartir con ustedes.

Rompiste algunas reglas, ¡pero no es esa la belleza de la programación! Es increíble cómo puedes ceñirte a las reglas y quedarte completamente atascado y sentir que podrías subirte por las paredes. Y a veces romper las reglas es lo que necesitas para progresar. Tu trabajo es genial, y por eso te tengo mucho respeto. Enrico programar es un trabajo duro. Es agradable cuando va bien, y un verdadero dolor cuando no funciona según lo previsto.

Muchas gracias por tu aportación. Te estoy muy agradecido y te mantendré informado.

Gracias de nuevo,

Shep

De nada y gracias a ti también por compartirlo. También, recientemente, empecé a trabajar en Dictionary<T> mientras trabajaba con almacenamiento de datos (para ser específico, con controles gráficos creados dinámicamente). Utiliza FNV1-a como función hash, y puede almacenar tanto primitivas como punteros a objetos (pero no structs). La parte de guardado y carga aún no están terminadas, pero lo compartiré en CodeBase tan pronto como estén terminadas. Si programas la optimización para cada agente (en lugar de procesarlos todos al mismo tiempo), creo que podrías mejorar la velocidad de ejecución obteniendo los agentes por hash y procesándolos en un hilo separado. Para ello necesitarías un objeto diccionario o alguna estructura de datos relacionada. Y sí, si usted está apuntando a scalping, usted realmente necesitaría tanta velocidad como usted puede conseguir.
 

Hola Enrico,

¿Tiene alguna idea de cómo puedo añadir un comentario específico a la orden / posición en función de la señal en la que se activó el comercio? Digamos que la señal 1 trabajó - comentario "Señal A" y así sucesivamente.

Gracias.

 

No me resulta fácil seguirlo porque acabo de llegar, pero doy las gracias a todos los que me permiten progresar gracias a sus conocimientos.

 

Se ha hecho mucho trabajo.

¡Muchas gracias!