Características da linguagem mql5, subtilezas e técnicas - página 41

 
Slava:
Você esqueceu de especificar que o início da medição é no início do primeiro OnTick. O fim da medição está no início do OnDeinit.
Ou no início do OnTester, porque
// После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

No tópico

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bugs, bugs, perguntas

fxsaber, 2016.08.25 11:13

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


E retornar o resultado da medição como o código de retorno do OnTester.
 
Slava:
E retornar o resultado da medição como um código de retorno do OnTester.

Eu ainda não testei oGetTickCount no testador. Eu assumi que esta função será emulada pelo testador, o que pode ser lógico em algumas situações.

A propósito, como entender a hora atual no testador para a ms mais próxima? SymbolInfoTick+Tick.time_msc permite-lhe saber a hora da chamada OnTick do símbolo principal. E assim mesmo para verificar a correção do modo de escorregamento do testador. Mas parece não haver outra maneira.


A sério, eu queria perguntar sobre outra coisa. Para automatizar um lote no otimizador com descarte do primeiro e último valores, devo agir através de quadros (para passar o resultado do OnTester), ou isso irá distorcer o resultado?

 
GetTickCount no testador funciona normalmente e não é emulado, ao contrário do Sleep
 
fxsaber:

A sério, eu queria perguntar sobre outra coisa. Para automatizar as bancadas do otimizador com descartando o primeiro e o último valor, preciso agir através de quadros (para passar o resultado do OnTester), ou isso irá distorcer o resultado?

Não deveria. É enviado após a medição. Experimente
 
Slava:
Não utilizar um temporizador de microssegundo para medições de massa. Use o GetTickCount em milissegundos.

GetMicrosecondCount atrasa mais o testador do que GetTickCount (ou é emulado)?

Ou foi o fracasso do EventSetMillisecondTimer?

 
fxsaber:

GetMicrosecondCount atrasa mais o teste do que GetTickCount (ou é emulado)?

Ou foi o fracasso do EventSetMillisecondTimer?

Queria dizer GetMicrosecondCount. Não posso dizer com certeza se isso torna o servidor mais lento. Pode ter um efeito indirecto. Portanto, é melhor usar o GetTickCount nativo do sistema

GetMicrosecondCount é usado para medir curtos períodos de execução de código. Para medir um grande número de execuções do OnTick, é melhor usar o GetTickCount.

Tente usar o GetMicrosecondsCount em vez do GetTickCount quando obtiver resultados estáveis. Vais falar-me sobre isso aqui. Talvez esteja a preocupar-me demasiado com isso.

 
Existem duas tabelas de históricos atuais cujos dados são acessíveis através das funções de Histórico - a tabela de Pedidos e a tabela de Negociações.

O seu conteúdo só pode ser influenciado através das funções HistorySelect. E isso acontece da seguinte forma

  • HistorySelect e HistorySelectByPosition - afetam ambas as tabelas simultaneamente.
  • O HistóricoDealSelect afecta SOMENTE a tabela de Pedidos (não tem efeito na tabela de Pedidos-histórico actual).
  • HistoryOrderSelect afecta SOMENTE a tabela de Pedidos (não afecta a tabela actual de Deals-history).

 
Em ordens é possível definir o campo Request.expiration até e incluindo LONG_MAX + 2. Seu valor estará totalmente disponível via ORDER_TIME_EXPIRATION se a ordem estiver ativa (não na tabela do histórico).
 
PositionIdentifier do saldo de negócios é zero. Portanto, é fácil escrever, por exemplo, esta função
// Возвращает сумму всех балансовых не торговых операций (начисления + списания)
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 tais negócios é DEAL_ENTRY_IN (0).