Discusión sobre el artículo "Desarrollamos un Asesor Experto multidivisas (Parte 5): Tamaños de posición variables"

 

Artículo publicado Desarrollamos un Asesor Experto multidivisas (Parte 5): Tamaños de posición variables:

En las partes anteriores, el Asesor Experto (EA) en desarrollo sólo podía utilizar un tamaño de posición fijo para operar. Esto es aceptable para las pruebas, pero no es aconsejable cuando se opera en una cuenta real. Hagamos posible el comercio utilizando tamaños de posición variables.

En la parte anterior, añadimos la capacidad de restaurar el estado del EA después de un reinicio. No importa cuál fue la razón - reiniciar el terminal, cambiar el marco de tiempo en el gráfico con el EA, lanzar una versión más reciente del EA - en todos los casos, restaurar el estado permitió que el EA no comenzara a trabajar desde cero y no perdiera las posiciones ya abiertas, sino que continuara manejándolas.

Sin embargo, el tamaño de las posiciones abiertas permaneció invariable para cada instancia de la estrategia durante todo el periodo de prueba. Su tamaño se fijó en el lanzamiento de EA. Si, como resultado del funcionamiento del EA, el saldo de la cuenta de operaciones aumentara, entonces esto permitiría utilizar un tamaño de posición mayor sin aumentar el riesgo. Sería razonable aprovechar esto, así que empecemos a implementar el uso de tamaños de posición variables.

Autor: Yuriy Bykov

 

Cuando ejecuto el EA SimpleVolumesExpert con (3+3+3) y escalado 2.18, El registro muestra operaciones virtuales abiertas pero no operaciones reales en el probador de estrategias. ¿Me he perdido algo?

 
Nigel Philip J Stephens #:

Cuando ejecuto SimpleVolumesExpert con (3+3+3) y escalado 2.18, el registro muestra operaciones virtuales abiertas, pero no operaciones reales en el probador de estrategias. ¿Quizás me he perdido algo?

Compruebe que el saldo inicial en el probador es de $10000 o más. Tengo este comportamiento cuando el saldo no es lo suficientemente grande. En este caso, no todas las posiciones virtuales generan una posición real. Pero la razón es probablemente otra, ya que su saldo es probablemente correcto.

¿Hay operaciones reales si el EA se ejecuta con otras variantes de agrupación de estrategias?

 
He leído detenidamente su artículo y me ha parecido exactamente lo que necesitaba para ampliar mis conocimientos. Agradezco sus elaboradas explicaciones sobre el tema y sus meditadas decisiones de codificación. Muchas gracias.
 

Buenas tardes. Gracias por su trabajo. Estoy muy interesado en su arquitectura y estoy tratando de entenderlo paso a paso. He cambiado sólo la clase de estrategia - Yo uso mi propia. Pero en esta etapa he tenido dificultades con el escalado de la estrategia. Para la pureza del experimento, he utilizado una instancia de la estrategia y dos variantes de la escala multiplier_ 1 y 2 (fixedBalance_ = 0;). En ambos casos, el resultado es el mismo - el tamaño del lote no cambia. El lugar en el código donde se determina el tamaño del lote

//+------------------------------------------------------------------+
//| Determinar el tamaño real de la posición virtual ||
//+------------------------------------------------------------------+
double CMoney::Volume(CVirtualOrder *p_order) {
   // Solicitar el balance normalizado de la estrategia para esta posición virtual 
   double fittedBalance = p_order.FittedBalance();
   
   // Si es igual a 0, el volumen real es igual al volumen virtual
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }
   
   // En caso contrario, hallamos el valor de la balanza comercial total
   double totalBalance = s_fixedBalance > 0 ? s_fixedBalance : AccountInfoDouble(ACCOUNT_BALANCE);
   
   // Devuelve el volumen real calculado por el volumen virtual
   return p_order.Volume() * totalBalance * s_depoPart / fittedBalance ;
}
//+------------------------------------------------------------------+

Sin embargo, los parámetros m_fittedBalance y m_fixedLot se establecen por defecto en el constructor de la estrategia virtual.

//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CVirtualStrategy::CVirtualStrategy(double p_fittedBalance = 0,
                                   double p_fixedLot = 0.01) :
   m_fittedBalance(p_fittedBalance),
   m_fixedLot(p_fixedLot) {}

por lo que el tamaño del lote no cambia.

// Si es igual a 0, el volumen real es igual al volumen virtual
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }

Aunque lógicamente debería escalar. ¿Pueden decirme cuál es la razón? No quiero entrometerme con mis propias ediciones para no romperlo, y ya he añadido algunos métodos a la clase CVirtualOrder porque mi estrategia prevé el cierre parcial, el stop loss y el cierre en la señal del contador.

 

Hola.

Todo es correcto, para operar con lote variable es necesario que a una instancia de la estrategia se le de el valor de m_fittedBalance > 0. Esto lo hacen los herederos de la clase base de la estrategia de trading. Se les pasa este parámetro y lo sustituyen en la llamada al constructor de CVirtualStrategy:

class CSimpleVolumesStrategy : public CVirtualStrategy {
...

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

   ...
};

...

//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   ...
   int              p_maxCountOfOrders,
   double           p_fittedBalance = 0) :
// Lista de inicialización
   CVirtualStrategy(p_fittedBalance, 0.01),
   m_symbol(p_symbol),
   m_timeframe(p_timeframe),
   ...
}

Cuando creamos instancias, especificamos un valor específico para el último parámetro para que el valor por defecto de 0 no sea sustituido en él:

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

   // Crear un Asesor Experto que trabaje con posiciones virtuales
   expert = new CVirtualAdvisor(magic_, "SimpleVolumes_" + EnumToString(group_));

   // Crear y rellenar un array de todas las instancias de estrategia
   CVirtualStrategy *strategies[] = {
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  13, 0.3, 1.0, 0, 10500,  465,  1000, 3, 1600),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  17, 1.7, 0.5, 0, 16500,  220,  1000, 3,  900),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  51, 0.5, 1.1, 0, 19500,  370, 22000, 3, 1600),

     ...
   };

   ...

   return(INIT_SUCCEEDED);
}

En el Asesor Experto SimpleVolumesExpertSingle.mq5 no hacemos esto, ya que la optimización sólo se realiza sobre un tamaño de posición inicial fijo. Tenga en cuenta que el parámetro m_fixedLot no tiene que ser utilizado en la estrategia exclusivamente como el tamaño de todas las posiciones virtuales abiertas. Es sólo un valor base a partir del cual podemos calcular cualquier otro. En la estrategia modelo del artículo, simplemente los tamaños de todas las posiciones son iguales y este parámetro se utiliza sin transformación. Pero nada impide abrir una posición virtual de tamaño 10*m_fixedLot en otra estrategia y luego aplicar su cierre gradual.

 
Yuriy Bykov #:

Hola.

Todo es correcto, para operar con lote variable es necesario que a una instancia de la estrategia se le de el valor de m_fittedBalance > 0. Esto lo hacen los herederos de la clase base de la estrategia de trading. Se les pasa este parámetro y lo sustituyen en la llamada al constructor de CVirtualStrategy:

Cuando creamos instancias, especificamos un valor específico para el último parámetro para que el valor por defecto de 0 no sea sustituido en él:

En el Asesor Experto SimpleVolumesExpertSingle.mq5 no hacemos esto, ya que la optimización sólo se realiza sobre un tamaño de posición inicial fijo. Tenga en cuenta que el parámetro m_fixedLot no tiene que ser utilizado en la estrategia exclusivamente como el tamaño de todas las posiciones virtuales abiertas. Es sólo un valor base a partir del cual podemos calcular cualquier otro. En la estrategia modelo del artículo, simplemente los tamaños de todas las posiciones son iguales y este parámetro se utiliza sin transformación. Pero nada impide abrir una posición virtual de tamaño 10*m_fixedLot en otra estrategia y luego aplicar su cierre gradual.

Hola. Gracias por tu rápida respuesta. Ya me he dado cuenta. No me di cuenta de inmediato que el último parámetro se añadió, porque yo estaba usando mi propia clase de estrategia y tiene un conjunto ligeramente diferente de los parámetros.