Discussão do artigo "Que testes deve passar o robô de negociação antes da publicação no Mercado"
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?
Essa é a parte que levanta dúvidas:
Por que a margem necessária é comparada ao patrimônio líquido e não à margem livre?
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);
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.