Características del lenguaje mql5, sutilezas y técnicas - página 41

 
Slava:
Olvidaste especificar que el inicio de la medición es al comienzo del primer OnTick. El final de la medición está al principio de OnDeinit.
O al inicio de OnTester, porque
// После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

En el tema

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

Bichos, errores, preguntas

fxsaber, 2016.08.25 11:13

Ciclo de vida
// Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding(void)
     {
      return(::TesterStatistics(STAT_BALANCEMIN) > 0);
     }
 
fxsaber:
O al inicio del OnTester, como


Y devolver el resultado de la medición como código de retorno de OnTester
 
Slava:
Y devolver el resultado de la medición como código de retorno de OnTester

Todavía no he probadoGetTickCount en el probador. Supuse que esta función sería emulada por el probador, lo que puede ser lógico en algunas situaciones.

Por cierto, ¿cómo entender el tiempo actual en el probador a los ms más cercanos? El SymbolInfoTick+Tick.time_msc puede utilizarse para averiguar la hora de llamada del símbolo principal OnTick. Y así hasta comprobar la corrección del modo de deslizamiento del probador. Pero parece que no hay otra manera.


En realidad, quería preguntar sobre otra cosa. Para automatizar un lote en el optimizador con la caída de los primeros y últimos valores, debo actuar a través de marcos (para pasar OnTester-resultado), o se distorsionará el resultado?

 
GetTickCount en el probador funciona normalmente y no se emula, a diferencia de Sleep
 
fxsaber:

En realidad, quería preguntar sobre otra cosa. Para automatizar los bancos en el optimizador con descarte de los primeros y últimos valores, necesito actuar a través de marcos (para pasar el OnTester-resultado), o se distorsionará el resultado?

No debe. Se envía después de la medición. Prueba con
 
Slava:
No utilice un temporizador de microsegundos para las mediciones de masa. Utiliza el GetTickCount regular de milisegundos.

¿GetMicrosecondCount ralentiza el probador más que GetTickCount (o está emulado)?

¿O el fallo de EventSetMillisecondTimer fue intencionado?

 
fxsaber:

¿GetMicrosecondCount ralentiza el probador más que GetTickCount (o está emulado)?

¿O el fallo de EventSetMillisecondTimer fue intencionado?

Me refería a GetMicrosecondCount. No puedo decir con seguridad si ralentiza el servidor. Puede tener un efecto indirecto. Por lo tanto, es mejor utilizar el GetTickCount nativo del sistema

GetMicrosecondCount se utiliza para medir periodos cortos de ejecución de código. Para medir un gran número de ejecuciones OnTick, es mejor utilizar GetTickCount.

Intente utilizar GetMicrosecondsCount en lugar de GetTickCount cuando obtenga resultados estables. Me lo contarás aquí. Quizás me estoy preocupando demasiado.

 
Hay dos tablas de historial actuales cuyos datos son accesibles a través de las funciones de historial: la tabla de Pedidos y la tabla de Operaciones.

Su contenido sólo puede ser influenciado a través de las funciones de HistorySelect. Y ocurre lo siguiente

  • HistorySelect y HistorySelectByPosition - afectan a ambas tablas simultáneamente.
  • El HistoryDealSelect afecta SOLO a la tabla Deals (no tiene ningún efecto sobre la tabla actual Orders-history).
  • HistoryOrderSelect afecta SÓLO a la tabla de Pedidos (no afecta a la tabla actual de Historial de Ofertas).

 
En los pedidos es posible establecer el campo Request.expiration hasta LONG_MAX + 2 inclusive. Su valor estará totalmente disponible a través de ORDER_TIME_EXPIRATION si la orden está activa (no en la tabla de historial).
 
PositionIdentifier de las operaciones de saldo es cero. Por lo tanto, es fácil escribir, por ejemplo, esta función
// Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
  double Res = 0;
  
  if (HistorySelectByPosition(0))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_PROFIT);
      
  return(Res);
}

DEAL_ENTRY de estas operaciones es DEAL_ENTRY_IN (0).