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.
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.
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](https://c.mql5.com/36/11/operation-of-programs-in-the-strategy.png)
- docs.mql4.com
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.
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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.