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

 

Novo artigo Que testes deve passar o robô de negociação antes da publicação no Mercado foi publicado:

Todos os produtos do Mercado, antes de serem publicados, passam uma revisão preliminar obrigatória para garantir um único padrão de qualidade. Neste artigo, vamos falar sobre os erros mais comuns que os desenvolvedores cometem ao trabalhar com os seus indicadores técnicos e robôs de negociação. Além disso, mostraremos como testar por si mesmo o seu produto antes de enviá-lo para o Mercado.

O testador de estratégias embutido na plataforma permite não só verificar com base no histórico dos sistemas de negociação, mas também identificar erros lógicos e algorítmicos, ao escrever o robô de negociação. Durante o teste, todas as mensagens sobre as operações de negociação e erros detetados são exibidos no Diário do testador. Você pode analisar convenientemente essas mensagens no Visualizador de entradas, que é chamado a partir do menu de contexto.

Autor: MetaQuotes Software Corp.

 

Essa é a parte que levanta dúvidas:

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- obter o preço de abertura
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- valores de patrimônio líquido e margem necessária
   double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY);
   //--- chamar a função de teste
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- algo deu errado, informe e retorne false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- se não houver fundos suficientes para realizar a operação
   if(margin>equity)
     {
      //--- relata um erro e retorna falso
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- o teste foi bem-sucedido
   return(true);
  }

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

 
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?

Razoável - vamos corrigir isso.
 

Obrigado pelo artigo, mas até agora não consegui obter um resultado funcional com o Expert Advisor.

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- se não houver dinheiro suficiente
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- o teste foi bem-sucedido
   return(true);
  }

Quaisquer variações de AccountFreeMarginCheck geram erros, é impossível configurar o Expert Advisor para o mercado. Tentei descobrir com os usuários e, em seguida, o artigo apareceu, não há como, não importa o que você faça ou deixe de fazer

Se você adicionar GetLastError()!=134 à condição GetLastError()!=134 ou usar a função acima, ela simplesmente falhará com erros.

A função acima consegue gerar erros como este.

2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function
2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051

Posso estar errado, mas 0,1 é um lote normal especificado manualmente. MODE_MINLOT para um par de moedas é 0,01.

Mas, para ser sincero, quanto mais me aprofundo, menos entendo qual é o(s) problema(s).

 

Talvez o lote deva ser normalizado nessa função para que não haja nenhuma deficiência.

e então a função escreve que não há dinheiro, mas não envia uma solicitação ao servidor para abrir posições, o que satisfaz as regras do mercado.

Comecei a usar essa instrução recentemente, há cerca de 2 anos:

double margin=EMPTY_VALUE;
      margin=AccountFreeMarginCheck(sy,op,ll);
      if(margin>0)
        {

        ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)),
coomment,mn,0,clOpen);
         
        }
      else Print("Not Enought Money Margin Required"+(string)margin);

Na verdade, tudo funciona.

Ao abrir uma negociação, o Expert Advisor simplesmente retorna astring Print("Not Enought Money Margin Required "+( string)margin) ;

O Expert Advisor foi testado no mercado e todos estão satisfeitos com ele

 

Eu uso essa opção para o cálculo exato, pois foi a única que me ajudou a resolver esse problema. Assim, você pode compará-los livremente.

Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE);  //Ombro 
RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE);  //TradeVol*1 lote 
MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits());
MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits());
FreeMargin  = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
 

Há meio ano, testei um Consultor Especialista do Mercado, que estava falhando no testador no segundo ou terceiro dia com um erro de divisão por zero. Expert Advisor com várias dezenas de avaliações, ou seja, foi comprado. E várias centenas de comentários.

E muitos escrevem que há esse problema e aconselham uns aos outros a reiniciar uma vez por dia!!!!

Acontece que o rigor das regras do Mercado é compensado pela opcionalidade de sua implementação?

SUS: Não me lembro o nome do Expert Advisor, mas é um top e não é barato. Algum tipo de scalper.

 

Caro autor, obrigado pelo artigo.

Há um pequeno erro no código para MQL4, se me permite. Para a função CheckMoneyForTrade:

double free_margin=AccountFreeMarginCheck(symb,lots,type);

required:

double free_margin=AccountFreeMarginCheck(symb,type,lots);
 

Na função

bool CheckMoneyForTrade(string symb, double lots,int type)

é necessário alterar a função de verificação de margem livre de,

double free_margin=AccountFreeMarginCheck(symb,lots,type);

para,

double free_margin=AccountFreeMarginCheck(symb,type,lots);

para que ela funcione corretamente.

 
Artigo corrigido em todos os idiomas, obrigado.
 
Circo de dardo. Em vez de programar todas as verificações necessárias uma vez no terminal, os desenvolvedores decidiram não se incomodar e fazer com que cada usuário escrevesse e depurasse os mesmos códigos, organizando "danças com pandeiros" em torno de um comando elementar OrderSend. Muito obrigado ao autor do artigo por dedicar tempo à descrição das armadilhas, que não deveriam existir se os desenvolvedores de terminal tivessem uma abordagem amigável com os usuários. Pessoalmente, só tenho desprezo pelos desenvolvedores de terminal por essa abordagem. Porque a preguiça deles custa milhares de horas de desenvolvedores perdidas em MQL.