Erros, bugs, perguntas - página 2438

 
Slava:

2. um tipo de molduras é lido em OnTesterPass, terminado em OnTesterDeinit. Outras molduras são lidas em OnTesterDeinit

Esta característica não nos permite trabalhar em tempo real com os resultados dos passes calculados, se houver vários quadros por passe.

 
Parece ser aqui uma falha puramente metodológica

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Teste de Calendários de Estratégia com Autosubstituição de Resultados em EAs

Slava, 2013.04.10 15:04

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);
        }
     }
//---
  }
Antes de FrameNext no laço, seria bom chamar ArrayFree em cada passagem do laço.
 
Slava:

1. Sim. Pode ser redundante.

2. um tipo de molduras é lido em OnTesterPass e terminado em OnTesterDeinit. Os restantes quadros são lidos em OnTesterDeinit

Esta capacidade de transmitir-receber vários tipos de quadros permitiu-nos corrigir alguns erros difíceis de reproduzir no testador. E os quadros só eram transmitidos se houvesse uma diferença com algum valor de referência.

Há pouco mencionei a perda de quadros, se muitos quadros forem passados num só passe e houver problemas com o agente - a ligação está quebrada - será que algo será feito para resolver esta situação?

 
fxsaber:

Abrirá o opt-format?

Sim.

Em troca da publicação do código para ler o ficheiro opt

 
fxsaber:

Esta característica não lhe permite trabalhar em tempo real com os resultados dos passes contados se houver vários quadros por passe.

Sim.

É por isso que temos de ler quadros do tipo "não-núcleo" após a optimização estar concluída.

 
Aleksey Vyazmikin:

Há pouco falei da perda de fotogramas, se muitos fotogramas forem transmitidos num só passe e houver problemas com o agente - uma quebra na comunicação - será que algo será feito para resolver esta situação?

O que se pode fazer?

O resultado da optimização irá, em qualquer caso, sair mais cedo e mais rapidamente do que a sua moldura. Se o agente tiver sido bloqueado (encerramento do computador, serviço parado), não há definitivamente nada que se possa fazer.

Poderíamos tentar fazer o seguinte: até que o quadro seja enviado, não enviar o resultado. Mas não sabemos quando o iremos consertar.

 
fxsaber:
Isto parece ser uma falha puramente metodológica
Antes de FrameNext no laço, é uma boa ideia chamar o ArrayFree em cada passe do laço.

Evitamos a reafectação desnecessária de memória.

Neste caso, há 99% de probabilidade de que o buffer da matriz seja atribuído uma vez

 
Slava:

O que se pode fazer?

O resultado da optimização irá de qualquer forma sair mais cedo e mais rapidamente do que a sua estrutura. Se o agente tiver sido bloqueado (encerramento do computador, serviço parado), não há exactamente nada que se possa fazer.

Poderíamos tentar o seguinte: até ser enviada uma moldura, não enviar o resultado. Mas não se sabe quando o iremos corrigir.

Talvez antes da transmissão dos quadros, possa dizer quantos quadros são esperados, e se for menos do que o esperado e o agente não estiver disponível, então dê o passe a outro agente e escreva por cima dos quadros já recebidos?

Ou no corpo de cada frame escreva o número total e o seu número de sequência nesse número, e da mesma forma, se todos não vieram, reoptimize.
 
Slava:

Sim.

Em troca da publicação do código para ler o ficheiro opt

Estou ainda mais interessado na gravação. Eu faço a leitura, se o formato for conhecido.

 
Aleksey Vyazmikin:

Pode dizer quantos fotogramas são esperados antes de começar a transmitir, e se chegar menos do que o esperado e o agente não estiver disponível, então dê o passe a outro agente e escreva por cima dos fotogramas já recebidos?

Ou no corpo de cada moldura para escrever o número total e o seu número de sequência nesta quantidade, e da mesma forma, se todos não vieram, re-optimizar.

E se nem todos os passes devolvem uma moldura?

Dei acima um exemplo sobre a captura de erros no testador. Os quadros só foram enviados quando algum valor de resultado não coincidiu com o valor de referência