Backtesting EA multidivisa - página 3

 

Quería publicar esto en ese momento, pero se veía horriblemente en la primera página:

Lógica de un EA de cartera

 

Hola chicos y chicas,

Yo también me encontré con este problema hace algún tiempo y lo discutimos aquí: https://www.mql5.com/en/forum/1642

Mi EA tiene una estrategia de sólo precios abiertos y quería ceñirme a eso para ahorrar tiempo durante el backtesting (obviamente).

La solución que he ideado es la siguiente:

  1. utiliza el par más activo durante el periodo principal de negociación de tu EA como "driver" (el gráfico que produce los ticks).
  2. en cada onTick() comprueba si tu driver ha entrado en una nueva barra
    1. si no hay una nueva barra, espere un poco más
    2. si hay una nueva barra, distribuya el mensaje OnTick() a sus operadores individuales (cada operador es responsable de un par de divisas)
  3. en el trader compruebe si el último tiempo del par de divisas del trader es igual al "tiempo de la nueva barra" del controlador
    1. en caso afirmativo, puede continuar con normalidad
    2. si no, tiene que tratar el precio de cierre de la barra actual como el precio de apertura que está buscando y si está buscando información de barras anteriores tenga en cuenta esta situación de "desviación por uno".

Voy a cortar y pegar las secciones importantes de código de mi EA aquí abajo. ¡Espero que esto le sirva de ayuda!

¡Saludos!


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void onTick() {
        MqlRates rates[1];
    
        // check the rates of the tick stream we're attached to (_Symbol!!!)
        if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
            Print("CopyRates of ", _Symbol, " failed");
            return;
        }

        if (_newBar = (rates[0].time != _currBarTime)) {
            _prevBarTime = _currBarTime;  // remember the previous bar time
            _currBarTime = rates[0].time;  // remember the current bar time
        }

    }


// this is the actual trader for a specific currency pair

    // checks whether a new trade (closing or opening) is to be performed
    void checkForTrade(void) {    
    
        MqlRates rates[3];

        if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
            Print("CopyRates of ", _symbol, " failed");
            return;
        }

        bool inSameBar = (rates[2].time == _currBarTime);  // _currBarTime determined in OnTick()!


        double sBuf[3];  // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 

        if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
            Print("copy signal from indicator failed, no data");
            return;
        }    
        
        
        // first close exiting orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

Acabo de encontrarme con este problema. ¡Usted ha adivinado, tratando de puerto de JForex a MQL5! Estoy empezando a desear que no me había molestado, aunque supongo que la extensión de la fecha límite ayuda :)

Parece que MetaQuotes todavía no lo ha arreglado.

MT5 forex no parece soportar DOM.

isNewBar no me ayuda.

Parece un estado de cosas ridículo.

¿Alguien sabe si algo ha cambiado dentro de MT5 con respecto a este problema?

¿Alguien sabe de una solución que funcione para una estrategia multidivisa que espera ser alimentada con ticks?

Suyo en la frustración,

Jim

 
TradingGurus:

Acabo de encontrarme con este problema. ¡Usted ha adivinado, tratando de puerto de JForex a MQL5! Estoy empezando a desear que no me había molestado, aunque supongo que la extensión de la fecha límite ayuda :)

Parece que MetaQuotes todavía no lo ha arreglado.

MT5 forex no parece soportar DOM.

isNewBar no me ayuda.

Parece un estado de cosas ridículo.

¿Alguien sabe si algo ha cambiado dentro de MT5 con respecto a este problema?

¿Alguien sabe de una solución que funcione para una estrategia multidivisa que espera ser alimentada con ticks?

Suyo en la frustración,

Jim


Intenta usar OnTimer() con un temporizador de 1 segundo en lugar de OnTick().
 

Hola enivid,

enivid:
Intente utilizar OnTimer() con un temporizador de 1 segundo en lugar de OnTick().

Gracias por la sugerencia. Tu solución funciona mucho mejor que cualquiera de las otras que he probado, ciertamente para nuestros requerimientos.

Sin embargo, la ejecución de pruebas retrospectivas con varias divisas contra diferentes pares sigue produciendo resultados ligeramente diferentes.

No inspira mucha confianza.

¡Me voy a quemar mucho más aceite de medianoche ahora!

Gracias,

Jim

 
enivid:
Intente usar OnTimer() con un temporizador de 1 segundo en lugar de OnTick().

TradingGurus:

Sin embargo, la ejecución de backtests multidivisa contra diferentes pares sigue produciendo resultados ligeramente diferentes.

Jim, yo utilizo la solución OnTimer con 1 segundo en mi cartera de concurso EA. Si su estrategia se basa en cada tick, entonces sí, obtendrá resultados diferentes al utilizar OnTimer vs OnTick en una sola moneda, ya que es posible más de un tick por segundo. Encontré que generalmente hace la mayor diferencia cuando el tick "faltante" creó una nueva barra alta o baja. Usted puede comprobar la barra anterior alta/baja y la barra actual alta/baja para cualquier cambio e insertar estos como un "tick perdido" cuando se producen, a menos que, por supuesto, el tick actual creó la nueva barra alta/baja.

También recuerde que el Probador de Estrategias de MetaTrader sólo simula datos de ticks. Dependiendo de lo sensible que sea su estrategia con el movimiento de los ticks, esta simulación puede tener un impacto significativo en el back-testing frente al forward testing.

- Patrick

 
Hola Patrick,
Pix:

Si su estrategia se basa en cada tick, entonces sí, obtendrá resultados diferentes al utilizar OnTimer frente a OnTick en una sola divisa ya que es posible más de un tick por segundo.

- Patrick


Eso no es exactamente lo que quería decir. Nuestro (¡todavía sólo potencial!) EA de concurso negocia los 12 pares. Usando OnTimer() solamente, obtengo diferentes resultados de backtest si selecciono GBP/USD en el probador de estrategias en lugar de EUR/USD por ejemplo.

Estoy muy familiarizado con las limitaciones de MT4 cuando backtesting utilizando garrapatas simuladas. Por desgracia, parece que MT5 no es mucho mejor.

Jim

 

Teníamos muchas ganas de poner en marcha todo esto con garrapatas por razones históricas, pero nos hemos rendido. Simplemente no podemos conseguir que las cosas sean consistentes.

Hemos mordido la bala, y ahora estamos trabajando con barras de 1 minuto con la ayuda de OnTimer() y isNewBar().

Por fin las cosas empiezan a tener sentido, y además aún faltan 4 horas para que termine el campeonato :)

Jim
 

Finalmente enviamos nuestro EA con unos 5 minutos de sobra antes de la fecha límite.

Un backtest en su cinturón, y ninguna optimización.

No habiendo hecho esto antes, ¿puede alguien decirme si todavía tiene una oportunidad de ser aprobado?

Si es así, ¿se nos permitirá jugar con los ajustes de entrada durante la próxima semana, o no?

Jim

 
TradingGurus:

Finalmente enviamos nuestro EA con unos 5 minutos de sobra antes de la fecha límite.

Un backtest en su cinturón, y ninguna optimización.

No habiendo hecho esto antes, ¿puede alguien decirme si todavía tiene una oportunidad de ser aprobado?

Si es así, ¿se nos permitirá jugar con los ajustes de entrada durante la próxima semana, o no?

Jim

¡Buena suerte Jim!

Si tu EA ha hecho backtesting correctamente desde el 2010.01.01 hasta el 2010.08.01 sin ningún error(errores en las operaciones, etc.) y con beneficios, entonces es probable que te aprueben, siempre y cuando tu información personal también sea correcta. Sin embargo, usted no será capaz de cambiar nada de este punto en adelante, incluyendo la configuración (parámetros de entrada)

¡Espero ver tu bot en acción!

- Patrick