A EA não funcionará em múltiplos pares, precisa de ajuda

 
Sou muito novo na codificação do mql4, e completei minha primeira EA. Meu único problema agora é que não consigo fazer com que ele abra negócios em mais de um par. Na seção EA no terminal ao lado do diário, ele envia um fluxo do erro, bilhete inválido para a função de fechamento de pedidos, mesmo que o EA abra e feche comércios em apenas um par. Qualquer um pode dar uma mãozinha.
 
Matt_Townsend:
Sou muito novo na codificação do mql4, e completei minha primeira EA. Meu único problema agora é que não consigo fazer com que ele abra negócios em mais de um par. Na seção EA no terminal ao lado do diário, ele envia um fluxo do erro, bilhete inválido para a função de fechamento de pedidos, mesmo que o EA abra e feche comércios em apenas um par. Qualquer um pode dar uma mãozinha.

Como você espera que saibamos se você não mostrar seu código nem seu registro dos erros?

Se você quiser nossa ajuda, terá que mostrar seu código, assim como os erros que ele dá (os resultados no log). Também será útil saber em que pares de moedas e prazos você está testando, quando tivermos uma olhada em seu código.

Além disso, observe que no MetaTrader 4 você só pode testar uma única moeda de cada vez no Strategy Tester. Se sua EA negocia várias moedas simultaneamente a partir de um único gráfico, você não poderá testá-lo no Testador de Estratégia - somente em uma Demonstração ao vivo ou em uma conta real!

 
Matt_Townsend: mesmo que a EA abra e feche as negociações com apenas um par.
É por isso que eu recomendo
Não negocie várias moedas em um único EA
 
Matt_Townsend: Aqui está meu código, e eu estou tendo o problema em uma demonstração ao vivo, eu até tentei ver se poderia usar vários terminais, para resolver o problema. Obrigado por seu feedback, portanto.

Por favor, edite seu post e use o botão SRC para adicionar seu código! Não se limite a copiar/colar como texto padrão, pois é difícil de ler. Tenho certeza de que você pode ver por outros tópicos como deve ser feito. Por favor, use o botão SRC para postar seu código.

EDITAR: Como solicitado antes - . .. Também será útil saber quais pares de moedas e prazos você está testando em ...

EDIT2: Como solicitado antes - ... bem como os erros que ele dá (os resultados no log) ...

 
Fernando Carreiro:
Por favor, edite seu post e use o botão SRC para adicionar seu código! Não se limite a copiar/colar como texto padrão, pois é difícil de ler. Tenho certeza de que você pode ver por outros tópicos como deve ser feito. Por favor, use o botão SRC para postar seu código.
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
Solicitei que você EDITAR seu post anterior, não adicionar um novo, para não tornar o fio tão longo!
Desculpe-me, também sou muito novo neste fórum, posso apagar as 2 mensagens?
 
Matt_Townsend:
Eu estava testando em 1 hora de tempo, EURUSD e 1hr GBPUSD
Já existem dois avisos de compilação para o seguinte código:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Você não está verificando corretamente o resultado para a operação de fechamento.

Em termos de lógica, há vários problemas com sua EA, mas como ela está no momento, está funcionando sem nenhum erro da minha parte no Testador de Estratégia, portanto, por favor, forneça a lista de erros que você está recebendo!

 
Fernando Carreiro:
Já existem dois avisos de compilação para o seguinte código:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Você não está verificando corretamente o resultado para a operação de fechamento.

Em termos de lógica, há vários problemas com sua EA, mas como ela está no momento, ela está funcionando sem nenhum erro da minha parte, portanto, por favor, forneça a lista de erros que você está recebendo!

O único erro que estou recebendo da EA é umticket inválido para a função defechamento de pedido, com um número ao lado, eu gostaria de mostrar o log real, mas no segundo gráfico com a EA rodando ela não está fazendo nada, pois normalmente ela tentaria abrir uma troca imediatamente. Se, e quando o log começar a ser preenchido com o erro, como eu iria mostrar o log real?
 
Matt_Townsend:
O único erro que tenho recebido da EA é umticket inválido para a função de fechamento de pedido, com um número ao lado, gostaria de mostrar o log real, mas no segundo gráfico com a EA rodando ela não está fazendo nada, pois normalmente tentaria abrir uma negociação imediatamente. Se, e quando o log começar a ser preenchido com o erro, como eu iria mostrar o log real?

Selecione as linhas em questão com Click, Ctrl-Click ou Shift-Click (operação com janelas padrão), depois com Right-Click a seleção e escolha "Copy"!

EDIT: Com relação ao código, você está usando o OrderSelect, mas você está sempre assumindo que ele funciona sempre. E quando ele não funciona, você simplesmente continua a usar as funções de detalhes do OrderTicket() em seu fechamento, que pode falhar se o OrderSelect() inicial também falhar. Como eu disse, você tem muitos problemas lógicos em seu código!

 

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
Re-escreva a seção de ordem de fechamento do código para ser lógico, você não deve estar usando o bilhete variável aqui de forma alguma.
 
Matt_Townsend:
O único erro que tenho recebido da EA é oticket inválido para a função defechamento de pedidos, com um número ao lado, gostaria de mostrar o log real, mas no segundo gráfico com a EA rodando ela não está fazendo nada, pois normalmente tentaria abrir uma negociação imediatamente. Se, e quando o log começar a ser preenchido com o erro, como eu iria mostrar o log real?

Outra nota muito importante com relação ao uso de sua EA em múltiplos pares de moedas ou períodos de tempo.

Seu código não usa a seleção "Número mágico" nem verifica o Símbolo (nem "Número mágico") em uso ao verificar as ordens em aberto no Histórico. Portanto, em essência, sua EA não funcionará corretamente nem consigo mesma nem com outras EA.

Como está, você só pode usar esta EA por si só sem outra EA rodando, nem mesmo ela mesma em outro gráfico!

Razão: