Discussão do artigo "Que testes deve passar o robô de negociação antes da publicação no Mercado" - página 2

 

Obrigado, o artigo é muito útil.

Não estou muito claro no subtópico "Limitando o número de lotes por um símbolo", o código da função PositionVolume() é fornecido duas vezes.
Logo abaixo está a descrição da função NewOrderAllowedVolume() e sua chamada:

double orders_volume_on_symbol=PendingsVolume(symbol);

Apenas a descrição da função PendingsVolume() não pode ser vista em nenhum lugar do artigo.

Se, em vez da função PendingsVolume() , a função PositionVolume() for fornecida novamente por engano, favor corrigi-la.

 
Preciso de um exemplo de um EA simples que possa ser 100% aprovado na validação para estudar seu código e compará-lo com o meu para descobrir o que pode ser um erro e, melhor ainda, mais detalhes sobre a validação - como ela acontece, o que ela faz.
 

Esse é um artigo interessante, mas infelizmente há muitos erros (erros de digitação ou até mesmo erros lógicos no código proposto), e provavelmente confundirá mais pessoas do que as ajudará em alguns pontos.

//+------------------------------------------------------------------+
//| Retorna o volume máximo permitido para uma ordem no símbolo
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- obter a limitação do volume máximo de um pedido
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obter a limitação do volume por um símbolo
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obter o volume da posição aberta por um símbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- se tivermos esgotado o volume
      if(max_volume-opened_volume<=0)
         return(0);

      //--- o volume da posição aberta não excede max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Erro lógico. Se ainda não houver uma posição, você ainda precisa verificar o volume de pendências e calcular o volume permitido. Esse código retorna allowed_volume=0 se não houver nenhuma posição já aberta sem levar em conta as pendências.

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- selecionar ordem por tíquete
   if(orderinfo.Select(ticket))
     {
      //--- tamanho do ponto e nome do símbolo, para o qual foi colocada uma ordem pendente
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- verificar se há alterações no preço de abertura
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- verificar se há alterações no nível de StopLoss
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- verificar se há alterações no nível Takeprofit
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- se houver alguma alteração nos níveis
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // a ordem pode ser modificada 
      //--- não há alterações nos níveis Open, StopLoss e Takeprofit
      else
      //--- notificar sobre o erro
         PrintFormat("Order #%d already has levels of Open=%.5f SL=.5f TP=%.5f",
                     ticket,orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- chegou ao fim, sem alterações na ordem
   return(false);       // não vale a pena modificar 
  }

Um outro erro lógico. É permitido alterar um SL/TP em 1 ponto. Deveria ser >=

+ erro de digitação, deveria ser "-tp)>=ponto);"

+ parâmetro ausente (PrintFormat tem para %, mas apenas 3 parâmetros são fornecidos).

bool PositionModifyCheck(ulong ticket,double sl,double tp)

Erro semelhante ao do ponto 2° acima.

E os mesmos erros também na versão OrderModifyCheck() mql4.

Obrigado por corrigir esses erros. Observe que não verifiquei todo o artigo em profundidade, portanto, talvez haja mais.

 

Alguns outros comentários sobre este artigo, mas não relacionados a erros desta vez, mas mais sobre minha opinião pessoal:

Access violation

Esse erro ocorre ao tentar endereçar a memória, cujo acesso é negado. Em cada um desses casos, é necessário entrar em contato com os desenvolvedores por meio do Service Desk em seu perfil ou da página Contatos.
  • Curiosamente, isso não tem nada a ver com um artigo sobre erros de usuários (programadores). Uma violação de acesso significa que há um erro no código do Metaquotes

Esse tipo de erro é relativamente raro, muitos deles têm códigos prontos, que são projetados para ajudar a encontrar a causa.

Constante Valor Descrição
ERR_INTERNAL_ERROR 4001 Erro interno inesperado
ERR_WRONG_INTERNAL_PARAMETER 4002 Parâmetro errado na chamada interna da função do terminal do cliente
  • Os códigos de erro existem para ajudar, mas "Unexpected internal error" (Erro interno inesperado) é completamente inútil e "Wrong parameter in the inner call of the client terminal function" (Parâmetro errado na chamada interna da função do terminal do cliente) é realmente enigmático (pelo menos para mim).

Recomenda-se que os novatos leiam todos os artigos sobre tratamento de erros, bem como façam perguntas no fórum e nos comentários dos artigos. Outros membros mais experientes da comunidade MQL5.community o ajudarão a esclarecer quaisquer pontos que não estejam claros. Esperamos que as informações reunidas no artigo o ajudem a criar robôs de negociação mais confiáveis e em um tempo mais curto.

  • Discordo totalmente dessa prática, o Mercado é um serviço comercial proposto pela Metaquotes, eles deveriam assumir o suporte e não depender da comunidade. Na minha opinião, essa não é uma abordagem profissional.

Apesar das críticas, gostaria de agradecer à Metaquotes por seu excelente trabalho no MT4/MT5 e incentivá-la a continuar aumentando seu nível de qualidade e profissionalismo.

 
Andrey Barinov:

Essa é a parte que levanta dúvidas:

Por que a margem necessária é comparada ao patrimônio líquido e não à margem livre?

http://prntscr.com/dgd6s4

Agora, o que está errado?

verifica a margem, não tem dinheiro suficiente, não negocia, mas não permite que você aumente a coruja.

Снимка на екрана
Снимка на екрана
  • prnt.sc
Снимано с Lightshot
 
Por favor, diga-me como fazer isso! Quero lançar um produto, o Expert Advisor Assistant, que precisa estar vinculado à abertura de negociações para funcionar. Sem a vinculação, não haverá negociações no testador e ele não passará no teste
 
Você já experimentou ou foi apenas um comentário de improviso?
 
Vladislav Andruschenko:
Você tentou ou acabou de dizer isso?
Eu tentei! Apareceu uma mensagem de que não foi verificado, nenhuma coruja abriu nenhuma negociação! Bem, ele não abrirá se for um assistente.
 
Bogdan Bovykin:
Tentei usá-lo! Recebi uma mensagem de que não foi verificado e nenhuma negociação foi aberta! Bem, ele não será aberto se for um assistente.

Se for um utilitário, os moderadores verificarão o EA pessoalmente.

O utilitário pode ser configurado para que o testador abra pelo menos algumas negociações e o acompanhe como assistente. Isso não é um problema.

 
Vladislav Andruschenko:

Se for um utilitário, os moderadores verificarão o EA pessoalmente.

O utilitário pode ser configurado para que o testador abra pelo menos algumas negociações e o acompanhe como assistente. Isso não é um problema.

Quero dizer, você quer fazer isso como um painel e verificá-lo dessa forma? Ou o quê?

Basta abrir qualquer negociação manualmente no momento e anexar esse EA ao gráfico no ticket da ordem aberta.