28 !!! pares de moedas, 1 especialista. Outro graal, mas este eu acho que ninguém jamais mostrou. + CONTA DEMO - página 12

 
Rosh:
Eu testei "EURUSD na faixa 2007.07.10 a 2007.07.14, e separadamente na faixa 2007.07.09 a 2007.07.14" como você pediu, não há diferença.


Tive que me atualizar também para a última construção. :-) De fato, os problemas com o tempo desapareceram, isso é bom. No entanto, ao que parece, a história não termina aí.

Eu executei a EA no mesmo período - nenhuma diferença entre Alto e Baixo na M1 e no H1/D1. Nota - Eu fiz o teste com meus dados normais, ilesos. Sem sincronização, etc. Portanto, não pode ser a razão para a discrepância.

Então decidi experimentar em outro intervalo só para o caso (bem, meu mau feitio). E acontece que ainda não acabou.

Tente o intervalo de 2007.08.06 a 2007.08.11, que na verdade é a última semana. E a comparação não é com D1, mas com H1. Há 4 operadores no texto do consultor especializado que devem ser comentados, e 4 operadores que não devem ser comentados. Não é que a possibilidade de espionagem para o futuro tenha sido provada, não. Mas a falha está presente.

E como parecia que a ausência de problemas em um intervalo semanal não é uma garantia de que não há problemas, talvez devêssemos fazer o teste em um intervalo muito maior, por exemplo, um ano ou seis meses...

 
Eu revisei o código de sua Prospecção Simples EA. Infelizmente, não foi impecável, então eu o consertei um pouco:

 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {   
//----
  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
 
  mm = TimeMinute(TimeCurrent());
  hh = TimeHour(TimeCurrent());
  dd = TimeDay(TimeCurrent());
  if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
        {  
           Print("Новые сутки наступили");
           curHi=NormalizeDouble(Bid,Digits);
           curLo=NormalizeDouble(Bid,Digits);
           curD1=dd;
        }
        //curHi=NormalizeDouble(Bid,Digits);
        //curLo=NormalizeDouble(Bid,Digits);
        curH1=hh;
     }
     curM1=mm;
  }
  if (NormalizeDouble(Bid,Digits)==0) Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"  Bid=",Bid);
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);
  //LoH1 =  iLow(NULL,PERIOD_H1,0);
  HiH1 = iHigh(NULL,PERIOD_D1,0);
  LoH1 =  iLow(NULL,PERIOD_D1,0);
  HiH1 = NormalizeDouble(HiH1,Digits);
  LoH1 = NormalizeDouble(LoH1,Digits);
 
  str = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
  mHi = ", curHi=" + DoubleToStr(curHi,Digits);
  mLo = ", curLo=" + DoubleToStr(curLo,Digits);
  hHi = ", HiH1="  + DoubleToStr(HiH1, Digits);
  hLo = ", LoH1="  + DoubleToStr(LoH1, Digits);
  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
 
  if (HiH1!=curHi||LoH1!=curLo) 
  {  //Print(str,mHi,hHi,mLo,hLo);
     if (handle>0) FileWrite(handle,TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),curHi,HiH1,curLo,LoH1);
  }
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{  Print("Работа закончена");
   if (handle>0)
      {FileWrite(handle,"записано ",TimeToStr(TimeLocal()));
      FileClose(handle);
      } 
//---- done
   return(0);
}
O fato de um novo dia é fixado tarde demais em seu código, na verdade, no segundo dia, enquanto a verificação da correção da simulação começa logo após o início do teste. Para excluir esta assimetria, introduzi um início variável booleano, com o qual fixei todos os valores do teste no início do teste.

  if (start)
   {
     curHi=NormalizeDouble(Bid,Digits);
     curLo=NormalizeDouble(Bid,Digits);
     curM1 = TimeMinute(TimeCurrent());
     curH1 = TimeHour(TimeCurrent());
     curD1 = TimeDay(TimeCurrent());
     start=false;
   }
Como você pode ver, funciona apenas uma vez e não afeta mais a EA. Mais adiante, tudo acontece de acordo com seu algoritmo. Se você não fizer a inicialização primária, então verifique as cordas

  if (curLo==0) Print("Curlo=",curLo);
  if (curHi==0) Print("curHi=",curHi);
dará valor curLo=0, enquanto o curHi não é igual a zero. A explicação é simples: ambas as variáveis curLo e curHi são inicialmente iguais a zero, uma vez que não são inicializadas. No primeiro tick, a condição

  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
é acionado e o CurHi já difere de zero, porque a atual Licitação é maior que zero. Ao mesmo tempo, a licitação atual não pode ser inferior a zero (o curLo não foi inicializado e portanto é zero), e portanto a condição

  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
não pode mudar o curLo de forma alguma. Execute você mesmo minha versão do Expert Advisor e verifique se o arquivo de erro Fu.xls conterá apenas uma linha - a hora da última citação simulada no testador.

O código completo está anexado ao correio, é melhor baixá-lo, pois não cabe no correio.
Arquivos anexados:
 

Obrigado, é claro, a Rosh por sua revisão, mas não creio que tenha sido necessária.

Talvez você não tenha notado, mas no meu código em função init() há o seguinte bloco:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Como resultado da execução deste bloco, nenhuma das condições pode ser satisfeita no início da execução da EA.

if (mm!=curM1)
  {  if (hh!=curH1)
     {  if (dd!=curD1)
 

Portanto, não importa onde na história a EA comece, será sempre um novo minuto, uma nova hora, ou um novo dia. E o primeiro par de operadores do bloco mencionado explica por que sua afirmação: "É explicado de forma simples: ambas as variáveis curLo e curHi são inicialmente iguais a zero, porque não são inicializadas. Como o Bid no primeiro tick é maior que zero, mas menor que 1000, ambas as declarações condicionais correspondentes são necessariamente acionadas e as variáveis curLo e curHi obtêm os mesmos valores iniciais que você lhes atribui no bloco if (start) {...}.

Sua versão funciona igualmente bem, mas não afeta de forma alguma o algoritmo. Portanto, esta alteração não terá nenhum efeito sobre a presença ou ausência de erros.

Anote novamente meu post anterior. O problema não ocorre na transição para um novo dia e não no início da EA, mas quando se testa o t/f H1. O problema ocorre apenas uma vez neste intervalo, em 10.08.2007 e dura 3 minutos, das 17:00 às 17:03. Durante este tempo são gerados 28 ticks com divergência de Altos valores para M1 e H1. Estou lhes mostrando a imagem apropriada.

Se não for difícil para você, por favor, execute o EA (o código que você corrigiu) nesse intervalo que eu pedi. Basta corrigir o uso de comentários. Agora em seu código se compara com o t/f D1 e não há erros neste modo. Preciso dele para comparar com H1.

 

Mudei um pouco o código, para manter a correção em casos especialmente patológicos (tenho apenas uma vela na M1 para 2007.01.01, a mesma para H1 e D1). Fiz o teste de 2007.01.01 a 2007.08.11. Recebi 4 casos errôneos para D1 e 2 para H1. Todos os erros acontecem na transição para uma nova vela em uma TF superior. Aqueles que querem ver com os seus próprios olhos.

Isso não nos dá a possibilidade de olhar para o futuro. Pelo menos na variante de espreitar, eu verifiquei.

Arquivos anexados:
future-2h.mq4  4 kb
 
Yurixx:

Obrigado, é claro, a Rosh por sua revisão, mas não creio que tenha sido necessária.

Talvez você não tenha notado, mas em meu código na função init() há o seguinte bloco:

  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Se não for difícil para você, execute o EA (o código que você corrigiu) no intervalo que eu pedi. Basta corrigir o uso de comentários. Agora em seu código se compara com o t/f D1 e não há erros neste modo. Preciso dele para comparar com H1.


Se você mesmo notou, ao testar meu código em H1, os valores não serão inicializados:
  if (Period()>PERIOD_M1)
  {  Print("Период тестирования не соответствует задаче");
     return(-1);
  }
  Print("Период тестирования ",Period()," минут");
  FileWrite(handle,"Date","Time","curHi","HiH1","curLo","LoH1");
  nn=D'2007.07.12 23:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:58:59';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
  nn=D'2007.07.13 00:02:00';
  FileWrite(handle,TimeToStr(nn,TIME_DATE|TIME_SECONDS),
                   TimeSeconds(nn),TimeMinute(nn),TimeHour(nn),TimeDay(nn));
 
  curHi=0.0;
  curLo=1000.0;
  curD1=-1;
  curH1=-1;
  curM1=-1;

Ou seja, será exatamente como eu escrevi. Se é difícil para você estabelecer o código para que eu não adivinhe do que se trata, então você mesmo deve resolvê-lo, eu tenho outras coisas a fazer do que praticar telepatia.
 

Realmente, eu não entendo porque você está ficando irritado.

Como escrevi na última página quando publiquei a EA com os resultados, ela se destina a testes exclusivamente na M1. Ao mesmo tempo, compara o Alto e o Baixo que gera por si só, com o Alto e o Baixo do t/f mais alto, que poderia ser H1 ou D1, dependendo disso, como os comentários são organizados no texto do procedimento de início().

Francamente falando, pensei que o retorno(-1); no procedimento init() interromperá o trabalho da EA e, portanto, só será possível iniciá-lo na M1. Entretanto, agora, graças ao seu posto, estou convencido de que ele pode ser executado em qualquer TF: A idéia por trás desta EA é tentar espionar o futuro de um t/f inferior (especificamente M1) em um t/f superior (especificamente H1 ou D1). Portanto, ela só deve ser executada na M1. O que os testes no H1 podem mostrar que eu nem sei.

Eu postei o código EA pouco antes do seu post. Este código pode ser usado diretamente para comparar os dados M1 com os dados H1. No texto da EA há indicações claras das mudanças (elementares) que precisam ser feitas para que ela compare os dados M1 com os dados D1. Portanto, aqui também não tenho certeza sobre o que você está infeliz.

Uma última coisa. Seu código é tão adequado para um teste como o meu. É apenas uma questão de conseguir fazer isso.

Se você tem outras coisas a fazer, eu não o incomodarei. Não estava me dirigindo a você como um pedido pessoal, mas como um representante da MQ em conexão com a possível descoberta de algumas falhas no testador.

 
Yurixx:

Realmente, eu não entendo porque você está ficando irritado.

Como escrevi na última página quando publiquei a EA com os resultados, ela se destina a testes exclusivamente na M1. Ao mesmo tempo, compara o Alto e o Baixo que gera por si só, com o Alto e o Baixo do t/f mais alto, que poderia ser H1 ou D1, dependendo disso, como os comentários são organizados no texto do procedimento de início().

Francamente falando, pensei que isso interromperia o trabalho do Consultor Especialista e que só seria possível iniciar o trabalho na M1. Entretanto, agora, graças ao seu posto, estou convencido de que ele pode ser executado em qualquer TF: A idéia por trás desta EA é tentar espionar o futuro de um t/f inferior (especificamente M1) para um t/f superior (especificamente H1 ou D1). Portanto, ela só deve ser executada na M1. O que os testes no H1 podem mostrar que eu nem sei.

Eu postei o código EA pouco antes do seu post. Este código pode ser usado diretamente para comparar os dados M1 com os dados H1. No texto da EA há indicações claras das mudanças (elementares) que precisam ser feitas para que ela compare os dados M1 com os dados D1. Portanto, aqui também não tenho certeza sobre o que você está infeliz.

Uma última coisa. Seu código é tão adequado para um teste como o meu. É apenas uma questão de conseguir fazer isso.

Se você tem outras coisas a fazer, eu não o incomodarei. Eu não estava me dirigindo a você como um pedido pessoal, mas como representante da MQ em relação à possível descoberta de algumas falhas no testador.

Eu não entendo que prazo devo usar para executar este teste. Eu o executei em três períodos de tempo sem intervir no código.

2007.08.14 16:29:03 2007.08.10 23:59 futuro-2h EURUSD,Diariamente: Trabalho finalizado
2007.08.14 16:29:03 2007.08.10 23:59 futuro-2h EURUSD,Diário: 2007.08.10 23:59:59, curHi=1.3693, HiH1=1.3702, curLo=1.3693, LoH1=1.3689
2007.08.14 16:29:02 2007.08.03 23:59 EURUSD,Diário: 2007.08.03 23:59:59, curHi=1.3773, HiH1=1.3787, curLo=1.3773, LoH1=1.3772
2007.08.14 16:29:02 2007.07.27 23:59 EURUSD,Diário: 2007.07.27 23:59:59, curHi=1.3635, HiH1=1.3641, curLo=1.3635, LoH1=1.3627
2007.08.14 16:29:02 2007.07.20 23:59:59 EURUSD,Diário: 2007.07.20 23:59:59, curHi=1.3826, HiH1=1.3827, curLo=1.3826, LoH1=1.3821
2007.08.14 16:29:01 2007.07.16 23:59:59 EURUSD,Diário: 2007.07.16 23:59:59, curHi=1.3772, HiH1=1.3773, curLo=1.3772, LoH1=1.3772
2007.08.14 16:29:01 2007.07.13 23:59:59 EURUSD,Diário: 2007.07.13 23:59:59, curHi=1.3782, HiH1=1.3787, curLo=1.3782, LoH1=1.3780
2007.08.14 16:29:01 2007.07.06 23:59:59 EURUSD,Diário: 2007.07.06 23:59:59, curHi=1.3625, HiH1=1.3630, curLo=1.3625, LoH1=1.3623
2007.08.14 16:29:01 2007.07.02 00:00 EURUSD,Daily: O período de teste não é apropriado
2007.08.14 16:29:01 futuro - 2h início dos testes
2007.08.14 16:28:34 2007.08.10 22:59 futuro-2h EURUSD,H1: Trabalho finalizado
2007.08.14 16:28:32 2007.07.02 00:00 futuro-2h EURUSD,H1: O período de testes não é apropriado
2007.08.14 16:28:32 futuro - 2h início dos testes
2007.08.14 16:28:22 2007.08.10 22:59 futuro-2h EURUSD,M1: Trabalho Concluído
2007.08.14 16:28:19 2007.07.02 00:00 futuro-2h EURUSD,M1: Período de teste de 1 minuto
2007.08.14 16:28:19 futuro-2h início dos testes
2007.08.14 16:24:28 2007.08.10 22:59 futuro-2h EURUSD,M1: Trabalho Concluído
2007.08.14 16:24:28 2007.08.06 00 00:00 futuro-2h EURUSD,M1: Período de teste de 1 minuto
 
Agora mude
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1

para

  else if (hh!=curH1)
  {  //curHi=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     //curLo=NormalizeDouble(Bid,Digits);  // Закомментировать при тесте D1
     curH1=hh;
     curM1=mm;
  }
  else if (mm!=curM1) curM1=mm;
  
  if (NormalizeDouble(Bid,Digits)>curHi) curHi=NormalizeDouble(Bid,Digits);
  if (NormalizeDouble(Bid,Digits)<curLo) curLo=NormalizeDouble(Bid,Digits);
  //HiH1 = iHigh(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  //LoH1 =  iLow(NULL,PERIOD_H1,0);      // Закомментировать при тесте D1
  HiH1 = iHigh(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
  LoH1 =  iLow(NULL,PERIOD_D1,0);    // Раскомментировать при тесте D1
e o testou novamente por três períodos do mesmo intervalo de tempo de 2007.07.01 a 2007.08.11:
<br/ translate="no">
2007.08.14 16:32:03 2007.08.10 23:59 futuro-2h EURUSD,Daily: Work Finished
2007.08.14 16:32:03 2007.07.27 23:59 futuro-2h EURUSD,Daily: 2007.07.27 23:59:59, curHi=1.3753, HiH1=1.3753, curLo=1.3627, LoH1=1.3626
2007.08.14 16:32:01 2007.07.02 00:00 futuro-2h EURUSD,Daily: O período de testes não é apropriado
2007.08.14 16:32:01 futuro-2h iniciado para testes
2007.08.14 16:31:56 2007.08.10 22:59 futuro-2h EURUSD,H1: Trabalho concluído
2007.08.14 16:31:54 2007.07.02 00 00:00 futuro-2h EURUSD,H1: Período de testes não cumpre com a tarefa
2007.08.14 16:31:54 futuro-2h iniciado para testes
2007.2007.08.14 16:31:48 2007.08.10 22:59 futuro-2h EURUSD,M1: Trabalho concluído
2007.08.14 16:31:46 2007.07.02 00:00 futuro-2h EURUSD,M1: Período de teste 1 minuto
2007.08.14 16:31:46 futuro-2h iniciado para testes
O que diz? Tenho que analisar o código novamente para detectar presença/ausência de erros.
 

Estou vendo. Você fez tudo certo. E este EA tem que ser executado somente na M1. Acho que o escrevi claramente. O Expert Advisor é executado no M1 e testará a coincidência de dados altos e baixos do período M1 com o período H1 ou D1. Se houvesse uma olhada no futuro, então os dados t/f sênior o deixariam saber Alto e Baixo antes que esses Alto e Baixo fossem alcançados no M1. É isso aí.

O resultado do seu teste D1 corresponde ao meu, neste intervalo para D1 eu também não recebi erros. Mas o teste H1 não confirma o que recebi e afixei um pouco mais cedo. Não há necessidade de analisar o código. Como você vê, confirma o funcionamento normal do testador.

Se você acha que é suficiente, pode parar aqui. Se você quiser ter certeza de que não é por acidente, não porque o período é muito pequeno, então faça os mesmos dois testes em um período mais longo. Mais de um ano, por exemplo, ou desde o início de 2007.

PS

Só por precaução, vou repetir. Teste somente no período M1. Somente em todos os modos de carrapatos.

Obrigado por sua participação.

 
Obrigado pelo EAs de teste, às vezes é difícil encontrar o seu próprio, pois há muitas opções de teste e você nem sempre sabe o que testar. E aborrecimento... Você sabe, você se irrita mais vezes com seu próprio povo, porque você espera que eles entendam. Você se torna involuntariamente mais duro, e onde você perdoa os outros, você fica frustrado com o seu. Sinto muito.

Estes testes realmente ajudam a melhorar o testador MetaTrader 4. Especialmente com o código fonte.
Razão: