Erros, bugs, perguntas - página 214

 
Ashes:

Deixem-me lembrar-vos que o resultado foi obtido com um simples Expert Advisor, que praticamente não gasta tempo em qualquer análise e não utiliza indicadores, ou seja, os resultados teriam sido ainda mais tristes com uma EA funcional.

Por favor, afixar o código da EA.
 
Ashes:

Permitam-me lembrar que o resultado foi obtido com um simples Expert Advisor, que praticamente não gasta tempo em qualquer análise e não utiliza indicadores, ou seja, os resultados seriam ainda mais tristes com um Expert Advisor a trabalhar.

Para comparação:

Executando este teste com 10000 negócios numa máquina Windows 7, Intel Pentium Dual-Core E5400 @ 2,70 GHz, 2038 MB (PR111) levou 472866ms.

luz do acima exposto, existe alguma probabilidade de alguns dos candidatos ao Campeonato 2010 poderem ter sido eliminados injustamente devido à barreira dos 15 minutos e às peculiaridades do testador (se houvesse muitos acordos).

** - houve várias vezes em que o testador não exibiu o gráfico de símbolos com as trocas exibidas no final do teste.

Não fui capaz de escrever uma "simples EA" que mostrasse tais resultados. Aqui está o meu código:

//+------------------------------------------------------------------+
//|                                                  TimeOnDeals.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      deals=1000;
input double   lot=0.01;
uint start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   start=GetTickCount();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   PrintFormat("deals=%d  time=%d",deals,(GetTickCount()-start));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(GetTickCount()-start);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int done_deals=0;
//---
   if(done_deals<deals)
     {
      if(Buy(lot)) done_deals++;
      else Print("Не удалось выполнить Buy, ошибка ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Buy(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_BUY;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool Sell(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+


Aqui estão os resultados da optimização, a coluna Resultado mostra o tempo de execução em milissegundos.


 
Rosh:

Não fui capaz de escrever uma "simples EA" que mostre estes resultados. Aqui está o meu código:

Aqui estão os resultados da optimização, a coluna Resultado mostra o tempo de execução em milissegundos.

Interessante...

Alexandre:
Código EA, por favor afixar o código.

O Consultor Especialista baseia-se no modelo do artigo Como escrever rapidamente um Consultor Especialista para o Campeonato Automatizado de Comércio de 2010.

A classe CExpertAdvisor é utilizada sem quaisquer alterações. Talvez isto seja um efeito secundário da utilização de aulas? Os resultados dos testes dão a impressão de que a desaceleração começa depois de algum limiar ter sido ultrapassado. Talvez seja uma tabela de transacções de tamanho limitado, após a qual a realocação de memória / recolha de lixo começa a ter efeito?

PS. Mais uma vez, gostaria de lembrar que o Expert Advisor utiliza a funcionalidade de conta Alpari-Demo (margem zero), caso contrário, o número de transacções pode mudar.

Arquivos anexados:
 
Rosh:

Não fui capaz de escrever uma "simples EA" que mostre estes resultados. Aqui está o meu código:

Aqui estão os resultados da optimização, a coluna Resultado mostra o tempo de execução em milissegundos.

Também não há problema com a saída para XLSX?

 
Rosh:

Não fui capaz de escrever uma "simples EA" que mostre estes resultados. Aqui está o meu código:

Aqui estão os resultados da optimização, a coluna Resultado mostra o tempo de execução em milissegundos.

Tabela - Resultado do Optimizer: Logging OFF? Um efeito secundário do abate de árvores?

 
Ashes:


Uma EA baseada no modelo do artigo Como escrever uma EA rápida para o Automated Trading Championship 2010.

A classe CExpertAdvisor é utilizada sem quaisquer alterações. Talvez isto seja um efeito secundário da utilização de aulas? Os resultados dos testes dão a impressão de que a desaceleração começa depois de algum limiar ter sido ultrapassado. Talvez seja uma tabela de transacções de tamanho limitado, após a qual a realocação de memória / recolha de lixo começa a ter efeito?

PS. Mais uma vez gostaria de lembrar que o Expert Advisor utiliza uma funcionalidade da conta Alpari-Demo (margem zero), caso contrário o número de transacções pode mudar.

Esta classe contém o método GetDealByOrder(ulong order)

ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки 
     }
   return(0);
  }

que é chamada em todos os ofícios. Assim, de cada vez que toda a história das transacções é percorrida e há um abrandamento no tempo de teste que é proporcional ao quadrado do número de transacções.

Tais coisas são melhores para não serem utilizadas num Expert Advisor que precisa de ser optimizado ou testado, porque as perdas de tempo são inevitáveis. É melhor substituir estes algoritmos de chamadas para estes casos.

 
Rosh:

Esta classe contém o método GetDealByOrder(ulong order)

que é chamada em cada transacção. Assim, cada vez que se procura toda a história das trocas e há um abrandamento no tempo de teste, proporcional ao quadrado do número de trocas.

É melhor não usar tais coisas no Expert Advisor que precisa de ser optimizado ou testado, porque as perdas de tempo são inevitáveis. É melhor substituir estes algoritmos de chamadas por estes casos.

Ou seja, todos os que usaram o modelo do Expert Advisor são "afectados"...

E o XLSX? Não tem nada a ver com o código do Expert Advisor, pois não?

 
Rosh:

Esta classe contém o método GetDealByOrder(ulong order)

 ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки
     }
   return(0);
  } 

que é chamada em cada transacção. Assim, neste Expert Advisor nestas condições especificadas, todo o histórico de transacções é pesquisado de cada vez, e o tempo de teste que é proporcional ao quadrado do número de transacções, está a abrandar.

É melhor não utilizar tais coisas num Expert Advisor que precisa de ser optimizado ou testado, porque as perdas de tempo são inevitáveis. É melhor substituir estes algoritmos de chamadas para estes casos.

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Este método pesquisa toda a história, e não apenas aquela parte da história, que está associada a uma posição aberta? Se não tiver mais de 5 negócios ligados a uma posição aberta, penso que é melhor usar HistorySelectByPosition do que olhar para toda a história HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor não olhou

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Este método pesquisa toda a história? E não apenas aquela parte da história, que está ligada a uma posição aberta? Se não tiver mais de 5 negócios ligados a uma posição aberta, penso que é melhor usar HistorySelectByPosition do que olhar para toda a história HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor não olhou

Neste caso, temos milhares de negócios numa só posição, e todos eles têm o mesmo identificador de posição POSITION_IDENTIFIER. Portanto, a chamada de HistorySelectByPosition neste caso é equivalente à chamada deHistorySelect(0,TimeCurrent()), a enumeração destes negócios leva a uma pesquisa de todos os negócios da história.

Digamos , foi feito um infeliz exemplo de utilização do padrão do artigo. É como na história sobre os homens siberianos e as motosserras japonesas.

 
Ashes:

E o XLSX? O código EA tem alguma coisa a ver com isto?

Este lugar será arranjado. Os criadores estão cientes disso, obrigado.