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

 
Bogdan Bovykin:

Quero dizer, fazer isso como um painel e verificá-lo dessa forma ou como?

No momento, basta abrir qualquer negociação manualmente, e esse EA é anexado ao gráfico no ticket da ordem aberta.

ok

Se VOCÊ mesmo escreveu o utilitário, poderá abrir uma negociação no testador em INIT e o assistente a gerenciará.

 

Se o Expert Advisor passou nos testes no terminal e abre negociações, na verificação automática ele escreve um erro informando que nenhuma negociação foi aberta (o par e o TF são os mesmos), respectivamente, ele não passa na "Verificação automática"

Coincidência? Acho que não!

O que fazer?

 
Tive o mesmo erro recentemente, mas precisei forçar a abertura de uma negociação no inite
 

É possível que a MetaQuotes gere um modelo para os desenvolvedores? Isso tornará mais fácil para os desenvolvedores e também economizará toneladas de dinheiro e recursos da MetaQuotes na verificação de EAs enviados.

Ter o modelo para desenvolvedores na base de código

https://www.mql5.com/pt/code/mt4/experts/best

 
Alain Verleyen:

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)  There is no opened positions
     {
      //--- 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.

Por quê? Nesse caso, também verificamos o volume das ordens pendentes.
 
Alain Verleyen:


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

Obrigado! Corrigido

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.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- chegou ao fim, sem alterações na ordem
   return(false);       // não vale a pena modificar 
  }
 
Alain Verleyen:

Erro semelhante ao do ponto 2° acima.

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


Tudo corrigido, obrigado!

 
Alain Verleyen:

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);

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

Pelo que me lembro, usamos essa prática apenas para não recebermos uma recusa do servidor de negociação devido à mudança de preço durante o tempo em que nossa solicitação de negociação chega ao servidor

É apenas uma abordagem mais segura.

 
Alain Verleyen:

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)

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

Obrigado! corrigido
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);