Verificação de posição mini índice

 

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.

if(SemPosicao() && SemOrdem()){
  
   // Aqui faço a execução da ordem send


   }

      bool SemPosicao()
     {
     return !PositionSelect(_Symbol);
      }
      
      
      bool SemOrdem()
      { 
      for(int i=OrdersTotal()-1; i>=0; i--)
   {
      OrderGetTicket(i);
      if(OrderGetString(ORDER_SYMBOL)==_Symbol)
         return false;
   }
   return true;
      
      }

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.

 
Willian De Caldas Leite:

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


 
Willian De Caldas Leite:

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

vc pode verificar se existe posicoes abertas 


if (PositionsTotal() > 0)

//existe posicao aberta

else

// nao existe posicao aberta

 

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

 
DenerKroger:

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;
  }
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
A rede de hospedagem virtual em nuvem foi desenvolvida especialmente para o MetaTrader 4 e o MetaTrader 5, possuindo todas as vantagens de uma solução nativa. Obtenha os benefícios de nossa oferta gratuita por 24 horas - teste um servidor virtual agora mesmo.
Razão: