Estou com problema, na conta demo o EA funciona normal mas no testador de estrategia ele abre infinitas ordens ate meu saldo zerar.
Estou usando esse estrutura para abrir somente uma ordem.
As duas funções tem que retornar falso caso alguma posição ou ordem estiver aberta, mas isso não acontece.
Coloquei um Print pra verificar o estado enquanto o testador de estrategia estava testando e o retorno é sempre true mesmo com varias posicões aberta.
olá, sugestão é verificar se realmente existe posição para o ativo assim como fez com as ordens pendentes, mais seguro.
bool SemPosicao() { for(int i=PositionsTotal()-1;i>=0;i--) { string t_symbol=PositionGetSymbol(i); ulong ticket=PositionGetTicket(i); if(PositionSelectByTicket(ticket)) // se o ticket foi confirmado if(PositionGetInteger(POSITION_MAGIC)==m_magic) // m_magic é o numero magico de seu EA se vc o utiliza return false; } return true; }
Estou com problema, na conta demo o EA funciona normal mas no testador de estratégia ele abre infinitas ordens ate meu saldo zerar.
Estou usando esse estrutura para abrir somente uma ordem.
As duas funções tem que retornar falso caso alguma posição ou ordem estiver aberta, mas isso não acontece.
Coloquei um Print pra verificar o estado enquanto o testador de estratégia estava testando e o retorno é sempre true mesmo com varias posições aberta.
Em contas netting há somente uma posição para cada ativo. Talvez você queira dizer ordens abertas.
int SymbolOrdersTotal(const string &SYMBOL) { int result = 0; for(int i=0;i<OrdersTotal();i++) { if( OrderSelect(OrderGetTicket(i)) && (OrderGetString(ORDER_SYMBOL)==SYMBOL) ) result = result + 1; }; return(result); };
Também tenho este problema, até postei uma parte em outro tópico. para resolver as infinitas ordens usei mais ou menos isso (modifiquei para alguns nomes q o pessoal costuma usar aqui pelo forum):
if((last_time==0) || (last_time!=lastbar_time)){ // Sinal de COMPRA pelo Setup if(EntradaCompra) { if ( Trade.Buy(Volume, Preço, "Ordem de Compra") ){ if (Trade.ResultRetcode() == 10009) { Print("Ordem executada (Retcode): ", Trade.ResultRetcode()," Descrição: ", Trade.ResultRetcodeDescription()); last_time=lastbar_time; } } } if(EntradaVenda) { if ( Trade.Sell(Volume, Preço, "Ordem de Venda") ){ if (Trade.ResultRetcode() == 10009) { Print("Ordem executada (Retcode): ", Trade.ResultRetcode()," Descrição: ", Trade.ResultRetcodeDescription()); last_time=lastbar_time; } } } }
esse código é uma junta do famoso IsNewBar() que o pessoal usa mto embutido dentro das ordens, nesse trecho eu tirei toda a parte que checa ordem em aberto, ordens pendentes, magic, etc para dar uma resumida
resolveu o problema das ordem "infinitas", porém minha plataforma/pc tem algum bug, pois as ordens entram e saem no mesmo instante. No histórico mostra o TP e SL (corretos e "longos") e que atingiu um dos dois mesmo o preço não tendo andado ainda. No resultado não contabiliza esse suposto TP e SL atingido e continua rodando o backteste
A princípio achei q era problema no código, porém testei vários EA disponiveis para download por aqui e todos apresentaram os mesmos problemas: lançam varias ordens (quando n fazem esse controle) ou lançam ordens que encerram instantaneamente com TP / SL e sem contabilizar
Já alterei o tipo de moeda (de BRL para outras para ver se muda algo), já deletei caches variados, já reinstalei o MT5, já instalei versão beta e nem sei mais o q fiz e até agora nada
ja
Também tenho este problema, até postei uma parte em outro tópico. para resolver as infinitas ordens usei mais ou menos isso (modifiquei para alguns nomes q o pessoal costuma usar aqui pelo forum):
esse código é uma junta do famoso IsNewBar() que o pessoal usa mto embutido dentro das ordens, nesse trecho eu tirei toda a parte que checa ordem em aberto, ordens pendentes, magic, etc para dar uma resumida
resolveu o problema das ordem "infinitas", porém minha plataforma/pc tem algum bug, pois as ordens entram e saem no mesmo instante. No histórico mostra o TP e SL (corretos e "longos") e que atingiu um dos dois mesmo o preço não tendo andado ainda. No resultado não contabiliza esse suposto TP e SL atingido e continua rodando o backteste
A princípio achei q era problema no código, porém testei vários EA disponiveis para download por aqui e todos apresentaram os mesmos problemas: lançam varias ordens (quando n fazem esse controle) ou lançam ordens que encerram instantaneamente com TP / SL e sem contabilizar
Já alterei o tipo de moeda (de BRL para outras para ver se muda algo), já deletei caches variados, já reinstalei o MT5, já instalei versão beta e nem sei mais o q fiz e até agora nada
ja
Eu uso essa estrutura :
if(PositionsTotal() == 0 && OrdersTotal() == 0){ if(trade.Buy(lot, Symbol(), 0, 0, 0, "Compra")){ addTakeStop(sl, tp); } }
E realmente, associando com o IsNewBar() reduziu bastante o número de entradas consecutivas.
Você conseguiu resolver essa situação?
Fiz esse código aqui, sempre uso ele, claro que para funcionar precisam adequar para o código de voces, mas no caso esse ele ve se existe posição aberta naquele ativo e com aquele numero magico, não copiem e cole pois não irá funcionar se não colocar o número magico dentro do EA.
Se existir o bloco retorna true caso contrário false
bool PosicaoTotal() { for(int i=PositionsTotal(); i>=0; i--) { string symbol = PositionGetSymbol(i); if(symbol == _Symbol) { if(magicNumber==PositionGetInteger(POSITION_MAGIC)) { return true; } } } return false; }
- www.mql5.com
- 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
Estou com problema, na conta demo o EA funciona normal mas no testador de estrategia ele abre infinitas ordens ate meu saldo zerar.
Estou usando esse estrutura para abrir somente uma ordem.
As duas funções tem que retornar falso caso alguma posição ou ordem estiver aberta, mas isso não acontece.
Coloquei um Print pra verificar o estado enquanto o testador de estrategia estava testando e o retorno é sempre true mesmo com varias posicões aberta.