Errores, fallos, preguntas - página 2437

 
Alexey Navoykov:

¿Así que se llama a OnTesterPass sin que haya fotogramas presentes? Pues entonces es un error evidente. Este evento significa recibir un fotograma, no el final de un pase.

Todos los cuadros deben llegar a OnTesterPass antes de que se llame al evento OnTesterDeinit. Es una lógica normal y saludable. A menos que, de nuevo, estemos hablando de una interrupción forzada de la prueba.

Se llama a OnTesterPass cuando ha llegado al menos una trama. Puede venir en un paquete de marcos. Por lo tanto, OnTesterPass debe aceptar fotogramas en un bucle, no un fotograma a la vez. Pero si "después de la última vez - nunca", OnTesterPass no se llama.

La optimización se detiene cuando llega el último resultado. Las tramas pueden llegar más tarde, especialmente si se pasa una gran cantidad de datos en una trama, o si se pasan varias tramas a la vez en una sola pasada. Por lo tanto, tenemos que organizar la recepción de los fotogramas restantes en OnTesterDeinit, que se lanza después de la optimización ha terminado - también en el bucle.

Esta es una lógica normal y saludable.

He dado repetidamente ejemplos de recepción de tramas exactamente en OnTesterDeinit, no sólo en OnTesterPass. Y es la recepción de tramas complejas de diferentes tipos

 
Slava:

si se pasan varios cuadros a la vez en una sola pasada.

Lo intenté una vez y no funcionó. Sólo funcionó un FrameAdd.

 
Slava:

La optimización se detiene cuando llega el último resultado. Las tramas pueden llegar más tarde, especialmente si se transfiere una gran cantidad de datos en una trama o si se transfieren varias tramas a la vez en una sola pasada. Por lo tanto, es necesario organizar la recepción de las tramas restantes en OnTesterDeinit, que se lanza cuando la optimización ha terminado - también en el bucle.

Si las tramas pueden llegar más tarde, no hay garantía de que también lleguen a la vez en OnTesterDeinit? Es decir, hay que hacer un bucle de espera de cuánto tiempo?

Anteriormente pensé que la situación es la siguiente: OnTesterPass es llamado sólo para aquellos fotogramas que llegaron desde el final de OnTesterPass anterior, pero si un nuevo fotograma llegó mientras OnTesterPass estaba en progreso, y específicamente - desde la última llamada de FrameNext y antes de la finalización de la función, este fotograma se colgará, hasta que llegue un nuevo fotograma que genere el evento. Por eso es necesario que OnTesterDeinit reciba estas tramas inactivas.

 
Alexey Navoykov:

Si los cuadros pueden llegar más tarde, entonces no hay garantía de que estén disponibles inmediatamente en OnTesterDeinit? Es decir, ¿hay que hacer un ciclo de espera? ¿Y cuánto tiempo hay que esperar?

Anteriormente pensé que la situación es la siguiente: OnTesterPass es llamado sólo para aquellos fotogramas que llegaron desde el final de OnTesterPass anterior, pero si un nuevo fotograma llegó mientras OnTesterPass estaba en progreso, y específicamente - desde la última llamada de FrameNext y antes de la finalización de la función, este fotograma se colgará, hasta que llegue un nuevo fotograma que genere el evento. Por eso es necesario que OnTesterDeinit recoja estos cuadros inactivos.

FrameNext es una tonta lectura de archivos mqd y nada más.

FrameFirst es FileSeek.
 
fxsaber:

Lo intenté una vez, pero no funcionó. Sólo funcionó un FrameAdd.

Aquí mostré un ejemplo.
 

Gracias.


PS FrameFirst es redundante aquí

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Prueba de estrategias en horario con autosustitución del resultado al Asesor Experto

Slava, 2013.04.10 15:04

He aquí un ejemplo. En OnTester, el Asesor Experto envía dos cuadros: el historial de operaciones y el historial en el que estaba trabajando.

En OnTesterDeinit, recibe y procesa todas las tramas del primer y segundo tipo

void OnTesterDeinit()
  {
   string        name;
   ulong         pass;
   long          id;
   double        value;
   int           handle,i;
   BalanceInTime balance[];
   MqlRates      rates[];
//---
   FrameFirst();
   FrameFilter("",1);
   while(FrameNext(pass,name,id,value,balance))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(balance); i++)
            FileWrite(handle,balance[i].date,EnumToString(balance[i].entry),DoubleToString(balance[i].price,5),DoubleToString(balance[i].balance,2));
         FileClose(handle);
        }
     }
//---
   FrameFirst();
   FrameFilter("",2);
   while(FrameNext(pass,name,id,value,rates))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(rates); i++)
            FileWrite(handle,rates[i].time,DoubleToString(rates[i].open,5),DoubleToString(rates[i].high,5),DoubleToString(rates[i].low,5),DoubleToString(rates[i].close,5),string(rates[i].tick_volume));
         FileClose(handle);
        }
     }
//---
  }
 
fxsaber:


PS FrameFirst es superfluo aquí.

No. No es superfluo, es puramente metodológico. Un bloque completo de código sin ningún tipo de valores por defecto

Este código fue arrancado de un código más complejo. Se transmitieron cuatro tipos de tramas diferentes. Al mismo tiempo leemos también OnTesterPass. Aquí está el código "refinado".

 
Slava:

No. No es redundante, es puramente metodológico. Un bloque completo de código sin ningún tipo de valores por defecto

Este código fue arrancado de un código más complejo. Se transmitieron cuatro tipos de tramas diferentes. Al mismo tiempo, leemos también OnTesterPass. Aquí presentamos el código "refinado".

Sobre FrameFirst es siempre superfluo si se llama antes de FrameFilter.

No recomendaría la transferencia de datos a través de más de un marco.

 
fxsaber:

Acerca de FrameFirst es siempre redundante si se llama antes de FrameFilter.

No se recomienda pasar los datos por más de un marco.

1. Sí. Puede ser superfluo.

2. un tipo de cuadros se lee en OnTesterPass y se termina en OnTesterDeinit. Los otros cuadros se leen en OnTesterDeinit

Esta posibilidad de enviar y recibir varios tipos de tramas nos permitió solucionar varios errores que eran difíciles de reproducir en el probador. Y las tramas se transmitían sólo si había una diferencia con algún valor de referencia.

 
Slava:

¿Abrirás el opt-format?