Testador em nova construção 604 não funciona corretamente - página 4

 

Criou este simples EA para testar em 509 e 604, ambos na conta demo MQ 444 do mesmo servidor, com teste de backtest nas mesmas datas.

  • A EA faz operações alternativas de compra, venda, venda, venda.
  • SL/TP fixo. Dimensionamento do lote com base no saldo da conta. Códigos fonte abaixo.
  • 509 compilado no 509 e testado no 509
  • 600 compilado no 604 e testado no 604
Relatório de teste de estratégia
Teste EA 509
MetaCotações - Novo Teste MT4 (Build 509)

SímboloEURUSD (Euro vs Dólar americano)
Período1 Hora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModeloCada carrapato (o método mais preciso baseado em todos os prazos mínimos disponíveis)
Barras em teste1384Carrapatos modelados1448514Qualidade de modelagem46.42%
Erros de gráficos não correspondentes0
Depósito inicial10000.00
Lucro líquido total-1199.25Lucro bruto20200.90Perda bruta-21400.15
Fator de lucro0.94Pagamento previsto-8.75
Drawdown absoluto2515.20Desembolso máximo3725.52 (33.23%)Drawdown relativo33.23% (3725.52)
Total de negócios137Posições curtas (ganhadas %)68 (41.18%)Posições longas (ganho %)69 (44.93%)
Lucros comerciais (% do total)59 (43.07%)Perdas comerciais (% do total)78 (56.93%)
A maiorcomércio lucrativo394.33comércio de perdas-337.74
Médiacomércio lucrativo342.39comércio de perdas-274.36
Máximovitórias consecutivas (lucro em dinheiro)4 (1494.97)perdas consecutivas (perda em dinheiro)12 (-3337.77)
Maximallucro consecutivo (contagem de vitórias)1494.97 (4)perda consecutiva (contagem de perdas)-3337.77 (12)
Médiavitórias consecutivas2perdas consecutivas2
Médiavitórias consecutivas2perdas consecutivas2

 
Teste EA 600+
MetaCotações - Novo Teste MT4 (Build 604)

SímboloEURUSD (Euro vs Dólar americano)
Período1 Hora (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
ModeloCada carrapato (o método mais preciso baseado em todos os prazos mínimos disponíveis)
Barras em teste1384Carrapatos modelados1459801Qualidade de modelagem46.42%
Erros de gráficos não correspondentes0
Depósito inicial10000.00DivulgaçãoAtual (6)
Lucro líquido total-1985.08Lucro bruto19147.44Perda bruta-21132.52
Fator de lucro0.91Pagamento previsto-14.81
Drawdown absoluto2677.75Máximo de drawdown4021.28 (35.45%)Drawdown relativo35.45% (4021.28)
Total de negócios134Posições curtas (ganhadas %)67 (40.30%)Posições longas (ganho %)67 (44.78%)
Lucros comerciais (% do total)57 (42.54%)Perdas comerciais (% do total)77 (57.46%)
A maiorcomércio lucrativo394.33comércio de perdas-337.74
Médiacomércio lucrativo335.92comércio de perdas-274.45
Máximovitórias consecutivas (lucro em dinheiro)4 (1494.97)perdas consecutivas (perda em dinheiro)12 (-3336.50)
Maximallucro consecutivo (contagem de vitórias)1494.97 (4)perda consecutiva (contagem de perdas)-3336.50 (12)
Médiavitórias consecutivas2perdas consecutivas2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509 Gráfico:

Gráfico 604:

 

Eles parecem executar testes idênticos, exceto no último trimestre, acho que é porque eu estava executando uma versão beta de teste no mesmo servidor (albiet uma conta demo diferente) Provavelmente, os dados de alimentação ao vivo que podem ter lacunas estão interferindo no teste. Vou apagar o histórico do gráfico e deixar os dois terminais baixarem o mesmo histórico e depois refazer o teste.

Editar: Eu poderia saber que isso seria um teste em si mesmo. É bom que a MQ tenha 1 minuto de dados gráficos que remontam a 1974, mas eu não queria tudo isso!! É como se você não pudesse ter nenhum ou tanto que precisasse da metade do vale Silcon em seu PC!! meu terminal agora está rodando 700mb de RAM *rollseyes*

 
SDC:

Eles parecem executar testes idênticos, exceto no último trimestre, acho que é porque eu estava executando uma versão beta de teste no mesmo servidor (albiet uma conta demo diferente) Provavelmente, os dados de alimentação ao vivo que podem ter lacunas estão interferindo no teste. Vou apagar o histórico do gráfico e deixar os dois terminais baixarem o mesmo histórico e depois refazer o teste.

Editar: Eu poderia saber que isso seria um teste em si mesmo. É bom que a MQ tenha 1 minuto de dados gráficos que remontam a 1974, mas eu não queria tudo isso!! É como se você não pudesse ter nenhum ou tanto que precisasse da metade do vale Silcon em seu PC!! meu terminal agora está rodando 700mb de RAM *rollseyes*


olá, você pode tentar os testes M15 e M1 para isto. você converteu o código do antigo mq4 para o novo? você pode tentar com um antigo complexo mq4 EA, com conversão para o novo mq4.

incluindo outros tipos de dados, como data/hora, etc., incluindo indicadores internos e personalizados... não pude ver nenhum indicador utilizado neste código...

O possível problema do 604 é, algumas precisões numéricas perdidas, para indicadores e outros números.

Preciso desenvolver um método de teste numérico para comparar valores exatos de variáveis, para dois ambientes...

 

Provavelmente não é a causa raiz de seu problema, mas em 60x você precisa incluir um ResetLastError() em algum lugar? (1º comando dentro enquanto loop?)

 
cbalta:


olá, você pode tentar os testes M15 e M1 para isto. você converteu o código do antigo mq4 para o novo? você pode tentar com um antigo complexo mq4 EA, com conversão para o novo mq4.

incluindo outros tipos de dados, como data/hora, etc. incluindo indicadores internos e personalizados... não consegui ver nenhum indicador usado neste código...

O possível problema do 604 é, algumas precisões numéricas perdidas, para indicadores e outros números.

preciso desenvolver um método de teste numérico para comparar os valores exatos das variáveis, para dois ambientes...


usei o mesmo código fonte que coloquei, compilei o código de teste 509 no Metaeditor 509, compilei o código fonte 600 no Metaeditor 604, as únicas diferenças entre os dois são o novo usa OnTick() vazio o antigo usa start()

Não usei nenhum indicador porque queria que este fosse um teste básico com o menor número possível de desconhecidos, podemos modificar os EA's para usar indicadores e outros critérios comerciais, se você quiser ampliar os parâmetros de teste.

 
ydrol:

Provavelmente não é a causa raiz de seu problema, mas em 60x você precisa incluir um ResetLastError() em algum lugar? (1º comando dentro enquanto loop?)

Eu não tenho certeza se preciso ? Vou procurar, os EA's fizeram os testes sem erros, então não pude ver como o GetLastError() funcionava no novo terminal. Meu uso pesado de RAM (máximo de 1 GB) foi devido a décadas de dados gráficos de 1 minuto que foram baixados do servidor de demonstração de metaquotas quando apertei o botão de download no centro de histórico, tive que apagar alguns deles.