Discusión sobre el artículo "Desarrollamos un Asesor Experto multidivisas (Parte 2): Transición a posiciones virtuales de estrategias comerciales"

 

Artículo publicado Desarrollamos un Asesor Experto multidivisas (Parte 2): Transición a posiciones virtuales de estrategias comerciales:

Hoy continuaremos con el desarrollo de un asesor multidivisa con varias estrategias funcionando en paralelo. Intentaremos transferir todo el trabajo relacionado con la apertura de posiciones de mercado desde el nivel de las estrategias al nivel de un experto que gestiona estas. Las propias estrategias solo negociarán virtualmente, sin abrir posiciones de mercado.

En el último artículo empezamos a desarrollar un asesor multidivisa que trabaja simultáneamente con diferentes estrategias comerciales. En la primera fase, solo había dos estrategias diferentes. Estas representaban la realización de la misma idea comercial, trabajaban con el mismo instrumento (símbolo) comercial y el mismo periodo del gráfico (marco temporal). Solo se diferenciaban entre sí por los valores numéricos de los parámetros.

También determinamos el tamaño óptimo de las posiciones abiertas según el nivel máximo de reducción deseado (10% del depósito). Lo hicimos para cada estrategia por separado. Al combinar las dos estrategias, tuvimos que reducir el tamaño de las posiciones abiertas para mantener el nivel de reducción establecido. En el caso de dos estrategias, la disminución era pequeña, pero, ¿y si queremos fusionar docenas o cientos de ejemplares de estrategias? Puede ocurrir que para algunas estrategias sea necesario reducir el tamaño de la posición a un valor inferior a las posiciones abiertas mínimas permitidas por el bróker. En este caso, dichas estrategias simplemente no podrán participar en la negociación. Entonces, ¿cómo conseguir que funcionen después de todo?

Para ello, privaremos a las estrategias del derecho a abrir posiciones y colocar órdenes pendientes por sí mismas. Las estrategias solo tendrán que negociar virtualmente, es decir, memorizar en qué niveles deben abrirse posiciones de un determinado tamaño y, a petición, informar sobre qué volumen debe abrirse ahora. Así, abriremos posiciones reales en el mercado solo después de haber estudiado todas las estrategias y calculado el volumen total necesario, considerando el escalado para soportar la reducción especificada.

Ahora solo nos interesa comprobar si dicho planteamiento resulta idóneo, no si su aplicación es eficaz. Por consiguiente, en este artículo trataremos de escribir al menos alguna implementación funcional de este enfoque, lo cual nos ayudará aún más a construir una implementación más bella desde el punto de vista de la arquitectura. Nos será de ayuda, no en el sentido de que mejoraremos una implementación que ya tengamos, sino en el sentido de que podremos darnos cuenta de que debemos hacerla de otra manera que será mejor.

Autor: Yuriy Bykov

 

Aún no he terminado de leerlo. Las entradas son un buen ejemplo.

1.

input string      symbol_              = "EURGBP";    // Instrumento de negociación (símbolo)
input ENUM_TIMEFRAMES  timeframe_       = PERIOD_H1;   // Período de programación

input group "=== Parámetros de la señal de apertura"
input int         signalPeriod_        = 13;    // Número de velas para promediar el volumen
input double      signalDeviation_     = 0.3;   // Desviación relativa de la media para la apertura de la primera orden
input double      signaAddlDeviation_  = 1.0;   // Desviación relativa de la media en la apertura de la segunda orden y siguientes

input group "=== Parámetros de órdenes pendientes."
input int         openDistance_        = 0;     // Distancia del precio a la orden pendiente
input double      stopLevel_           = 10500; // Stop Loss (en puntos)
input double      takeLevel_           = 465;   // Take Profit (en pips)
input int         ordersExpiration_    = 1000;  // Hora de vencimiento de las órdenes pendientes (en minutos)

input group "=== Opciones de gestión del capital"
input int         maxCountOfOrders_    = 3;     // Número máximo de órdenes abiertas simultáneamente
2.
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));
   expert.Add(new CSimpleVolumesStrategy(
                         symbol_, timeframe_,
                         fixedLot_,
                         signalPeriod_, signalDeviation_, signaAddlDeviation_,
                         openDistance_, stopLevel_, takeLevel_, ordersExpiration_,
                         maxCountOfOrders_)
                     );       // Añadir una instancia de la estrategia

   return(INIT_SUCCEEDED);
}
3.
class CSimpleVolumesStrategy : public CStrategy {
private:
   //--- Parámetros de la señal de apertura
   int               m_signalPeriod;       // Número de velas para promediar el volumen
   double            m_signalDeviation;    // Desviación relativa de la media para la apertura de la primera orden
   double            m_signaAddlDeviation; // Desviación relativa de la media en la apertura de la segunda orden y siguientes

   //--- Parámetros de órdenes pendientes
   int               m_openDistance;       // Distancia del precio a la orden pendiente
   double            m_stopLevel;          // Stop Loss (en puntos)
   double            m_takeLevel;          // Take Profit (en pips)
   int               m_ordersExpiration;   // Hora de vencimiento de las órdenes pendientes (en minutos)

   //--- Parámetros de gestión del capital
   int               m_maxCountOfOrders;   // Número máximo de órdenes abiertas simultáneamente

4.

public:
   //--- Métodos públicos
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      double           p_fixedLot,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders
   ); 

5-6.

//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   double           p_fixedLot,
   int              p_signalPeriod,
   double           p_signalDeviation,
   double           p_signaAddlDeviation,
   int              p_openDistance,
   double           p_stopLevel,
   double           p_takeLevel,
   int              p_ordersExpiration,
   int              p_maxCountOfOrders) :
   // Lista de inicialización
   CStrategy(p_symbol, p_timeframe, p_fixedLot), // Llamar al constructor de la clase base
   m_signalPeriod(p_signalPeriod),
   m_signalDeviation(p_signalDeviation),
   m_signaAddlDeviation(p_signaAddlDeviation),
   m_openDistance(p_openDistance),
   m_stopLevel(p_stopLevel),
   m_takeLevel(p_takeLevel),
   m_ordersExpiration(p_ordersExpiration),
   m_maxCountOfOrders(p_maxCountOfOrders) {
   ArrayResize(m_orders, m_maxCountOfOrders);

   // Cargar el indicador para obtener volúmenes de ticks
   iVolumesHandle = iVolumes(m_symbol, m_timeframe, VOLUME_TICK);

// Establecer el tamaño del array-receptor de volúmenes tick y el direccionamiento requerido
   ArrayResize(volumes, m_signalPeriod);
   ArraySetAsSeries(volumes, true);
}

Cada parámetro de entrada debe prescribirse cinco o seis veces.

 
Сравнивая эти результаты с результатами аналогичного советника, но не использующего виртуальные позиции, можно отметить улучшение некоторых показателей: немного увеличилась прибыль и уменьшилась просадка, подрос коэффициент Шарпа и профит-фактор.
A grandes rasgos, pasó de la cobertura a la compensación, obteniendo la estadística correspondiente. "mejoras". Por ejemplo, reducción de los volúmenes sobre los que se cargaban los swaps.
 

Lea el artículo. Gracias al autor, buen sondeo, en qué direcciones podemos movernos.


Нас сейчас будет интересовать только проверка пригодности такого подхода, а не эффективность его реализации. Поэтому в рамках этой статьи мы постараемся написать хотя бы какую-то рабочую реализацию этого подхода, которая в дальнейшем поможет нам построить более красивую с архитектурной точки зрения. Поможет не в том смысле, что мы будем улучшать уже имеющуюся, а в том, что мы сможем понять, что вот так делать не надо, а можно сделать по-другому, и это будет лучше.

Una observación poderosa, después de la cual no tiene sentido criticar, sino ir directamente a la parte constructiva: sugerir.


El artículo analiza el concepto de negociación virtual seguido de la sincronización unidireccional de la negociación virtual con la real. Como ejemplo para el Probador, servirá. Pero sólo como ejemplo.

En la práctica, dicha cartera TS se construye a partir de EX5 (de forma gratuita para el Probador) - ejecutar, obtener tst-archivos de ejecuciones individuales, hacer una sola ejecución conjunta con cualquier regla MM de ellos.


Para el Probador, se necesita velocidad. Intente estimar cuánto cambia la velocidad de optimización para la variante con y sin virtualización.


El concepto en sí es bueno para el comercio real. Pero para el sincronizador tendrá que mantener el historial de comercio virtual. Hay muchas cosas. Una forma seria, por decirlo suavemente.


Desde el punto de vista arquitectónico, la virtualización se separaría del ST. Sólo tengo la fuente actual de virtualización 350 Kb. Y crecerá.


Enfoque cuidadosamente la elección de la API de comercio para el comercio virtual. Elegir entre las disponibles. Es lógico dar preferencia a la API, en la que es tan fácil como sea posible para programar el TS. Realmente no entiendo la práctica común de todas las plataformas de comercio de inventar su propia bicicleta - API de comercio. Dotarla de OOP-entidades "out of the box", etc. En este sentido, MQ tomó un buen camino - todas las API sin OOP.

 

Antes de leer este tipo de artículos, siempre miro los resultados de las pruebas. Al menos en el probador. ¡Cuando vi 19% de ganancia durante 5 años, me sentí ligero y feliz! ¡Esto es mucho más que el autor de 75 artículos sobre redes neuronales! ))

Pero ahora está claro cómo hacer dinero garantizado en Forex. Yo solía pensar sólo para enseñar a los tontos en las ondas de Elliot, pero resulta que todavía hay una gran manera )).

 
fxsaber #:

Lea el artículo. Gracias al autor, una buena visión de las direcciones a seguir.

Muchas gracias por su interés y sus comentarios constructivos. Intento tenerlos en cuenta y utilizarlos en la medida de lo posible. Responderé con más detalle más tarde, ahora no tengo tiempo.

 
Alexey Volchanskiy resultados de las pruebas. Al menos en el probador. ¡Cuando vi 19% de ganancia durante 5 años, me sentí ligero y feliz! ¡Esto es mucho más que el autor de 75 artículos sobre redes neuronales! ))

Pero ahora está claro cómo hacer dinero garantizado en Forex. Yo solía pensar sólo para enseñar a los tontos en las ondas de Elliot, pero resulta que todavía hay una gran manera )).

No me puedo resistir a señalar aquí que el 19% de los beneficios durante cinco años en la prueba fueron hechas por un lote constante en las condiciones de reducción de menos de $ 1000, es decir, 1%. Si se centra en la reducción máxima de incluso el 10% y utiliza un lote variable, los resultados serán aún más interesantes.

 
//+------------------------------------------------------------------+
//|SimpleVolumesExpertSingle.mq5
//|Copyright 2024, Yuriy Bykov |
//| https://www.mql5.com/es/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link      "https://www.mql5.com/es/articles/14107"
#property description "La orden pendiente del Asesor Experto en el momento en que el volumen de ticks de la vela supera el volumen medio".
#property description "en la dirección de la vela actual."
#property description "Si las órdenes aún no se han convertido en posiciones, se eliminan a la hora de vencimiento".
#property description "Las posiciones abiertas sólo se cierran en SL o TP".

#include "Advisor.mqh"
#include "SimpleVolumesStartegy.mqh"

Un error tipográfico.

 
fxsaber #:

Un error tipográfico.

Sí, la he corregido en varios sitios, pero sigue ahí en alguna parte.

 
fxsaber #:

En la práctica, una cartera de TS de este tipo se construye a partir de EX5 (de forma gratuita desde el Mercado para el Probador) - ejecutar, obtener tst-files de pases individuales, a partir de ellos hacer una ejecución única conjunta con cualquier regla de MM.

Todavía no he considerado esta opción, tendré en cuenta que también es posible. Sin embargo, si me las arreglo para encontrar un buen conjunto de Asesores Expertos listos en el mercado, ¿cómo puedo utilizarlos juntos? ¿Simplemente ejecuto todo el conjunto con los parámetros de MM seleccionados?

 
fxsaber #:

Para el probador necesitas velocidad. Intenta estimar cuánto cambia la velocidad de optimización para la variante con y sin virtualización.

Lo intentaré, pero parece que la ganancia será notable cuando el número de estrategias que se ejecutan simultáneamente sea de decenas o cientos de instancias.

Tengo la intención de entrar en más detalles sobre el uso de su biblioteca virtual para acelerar las pruebas, pero no he llegado a hacerlo todavía. La razón principal es que estoy acostumbrado a las funciones de trading de MT5, aunque cuando tuve que rediseñar mis Expert Advisors de MT4 a MT5, hubo un montón de inconvenientes relacionados con ello, y aprendí sobre Virtual más tarde.

Ahora estoy considerando hacer una clase hija de CReceiver, que utilizará el entorno Virtual.