RefreshRates() no funciona en Probador de Estrategias

 

Hola a todos.
Soy nuevo programando en mql4 y tengo una duda.
Me he dado cuenta que la función Refreshrates() nunca devuelve true en el probador de estrategias.
A alguien le ha pasado ??

 Me di cuenta al ejecutar un código similar al siguiente:

 

void OnTick()  {

  int i=0;

   while (true){

      i++;

     Print(i);

      Print(Ask);

      Sleep(10000);

      RefreshRates();

     } 

}

En este caso "Ask" nunca se ve alterado a pesar de ejecutar RefreshRates()  mediante una prueba en el probador de estrategias, en cambio sí funciona durante la depuración o la ejecución en tiempo real.

 

El problema me surgió en el bucle de un EA que estoy programando. En el debug se ejecuta con normalidad, pero en el tester obtengo un bucle infinito al no refrescar la variable Ask con RefreshRates():

 while (Ask>M1) { 

            RefreshRates(); 

                                             //espera a que el precio toque M1

            Comment("waiting " + string(Ask-M1));

            M1 = iMA(NULL,timeframe,M1_period,0,MODE_EMA,PRICE_CLOSE,0);  //refresco el valor de M1

            

            if (Ask>high) high = Ask;  //calcula el precio máximo alcanzado

            

            Sleep (10000);

            } 

 

Gracias de antemano. 

 

Si los datos están en el terminal (caso del probador de estrategia) los ticks se simulan en cada paso de OnTick() pero, con el bucle que has montado, nunca se sale de él para volver a entrar en OnTick() leyendo un nuevo tick simulado con lo cual Ask se actualiza pero con el mismo valor porque no ha entrado tick nuevo.

Si lo haces en real o en debug, los tick llegan al terminal desde el mercado y la variable Ask se actualiza lo pida RefreshRates() o San Pedro.

 
Jose Miguel Soriano:

Si los datos están en el terminal (caso del probador de estrategia) los ticks se simulan en cada paso de OnTick() pero, con el bucle que has montado, nunca se sale de él para volver a entrar en OnTick() leyendo un nuevo tick simulado con lo cual Ask se actualiza pero con el mismo valor porque no ha entrado tick nuevo.

Si lo haces en real o en debug, los tick llegan al terminal desde el mercado y la variable Ask se actualiza lo pida RefreshRates() o San Pedro.

Gracias por la respuesta Jose Miguel.

De acuerdo a tu comentario, entiendo que no puedo montar el código dentro del evento OnTick() si deseo testear con el probador de estrategias.

Existe tal vez alguna solución como insertar el código en algún otro evento donde sí se actualicen las variables con un nuevo valor para poder ser testeado ? O debo replantear todo el código ?

Saludos. 

 
Yeray Banot Pérez Jiménez:

Gracias por la respuesta Jose Miguel.

De acuerdo a tu comentario, entiendo que no puedo montar el código dentro del evento OnTick() si deseo testear con el probador de estrategias.

Existe tal vez alguna solución como insertar el código en algún otro evento donde sí se actualicen las variables con un nuevo valor para poder ser testeado ? O debo replantear todo el código ?

Saludos. 

En el Probador de Estrategias de MT4 solo funcionan los eventos OnInit(), OnDeinit(), OnTester() y OnTick() (o bien OnCalculate() si se trata de un indicador). Por retrocompatibilidad también funcionan las arcaicas funciones init(), deinit() y start(). Pero no funciona ningún otro tipo de evento (ni OnTimer() ni OnChartEvent(), etc).

Lo puedes ver en este enlace:  https://docs.mql4.com/runtime/testing

Por cierto, tampoco funciona la función Sleep().

Ya te lo ha dicho el compañero José Miguel, no puedes montar un bucle infinito del que solo se salga cuando se refresquen los precios, porque en el Tester no vas a salir del bucle.

Yo lo que te aconsejo es que uses el Probador de Estrategias de MT5, infinitamente superior al de MT4, donde sí funcionan otros eventos como OnTimer(), OnTradeTransaction(), etc, etc, etc, sí tienes el tiempo modelizado con precisión de milisegundos, puedes hacer el backtest con ticks reales y no simulados, puedes operar en todos los instrumentos que quieras a modo multipar, etc, etc, etc, etc

Saludos.

Operation of Programs in the Strategy Tester - MQL4 programs - MQL4 Reference
Operation of Programs in the Strategy Tester - MQL4 programs - MQL4 Reference
  • docs.mql4.com
Operation of Programs in the Strategy Tester - MQL4 programs - MQL4 Reference
 
Jose Francisco Casado Fernandez:

En el Probador de Estrategias de MT4 solo funcionan los eventos OnInit(), OnDeinit(), OnTester() y OnTick() (o bien OnCalculate() si se trata de un indicador). Por retrocompatibilidad también funcionan las arcaicas funciones init(), deinit() y start(). Pero no funciona ningún otro tipo de evento (ni OnTimer() ni OnChartEvent(), etc).

Lo puedes ver en este enlace:  https://docs.mql4.com/runtime/testing

Por cierto, tampoco funciona la función Sleep().

Ya te lo ha dicho el compañero José Miguel, no puedes montar un bucle infinito del que solo se salga cuando se refresquen los precios, porque en el Tester no vas a salir del bucle.

Yo lo que te aconsejo es que uses el Probador de Estrategias de MT5, infinitamente superior al de MT4, donde sí funcionan otros eventos como OnTimer(), OnTradeTransaction(), etc, etc, etc, sí tienes el tiempo modelizado con precisión de milisegundos, puedes hacer el backtest con ticks reales y no simulados, puedes operar en todos los instrumentos que quieras a modo multipar, etc, etc, etc, etc

Saludos.

Gracias por la aportación Jose Francisco.

Me ha quedado todo bastante claro. 

Seguiré el consejo.

Saludos.