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

 
Fernando Carreiro:

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 nenhuma outra EA em execução, nem mesmo ela mesma em outro gráfico!

Muito obrigado por me ajudar com meu código até agora e seu tempo, vou tentar fazer os ajustes necessários.
 
Keith Watford:

    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.
Enquanto escrevia isto antes de não ter a variável ticket ali, eu estava apenas vendo se colocá-la ali teria um impacto na maneira como o código foi succionado, e obrigado por sua contribuição e tempo.
 
Matt_Townsend:
Muito obrigado por me ajudar com meu código até agora e seu tempo, vou tentar fazer os ajustes necessários.

Como você tem muitos problemas lógicos em sua EA, sugiro que você dê uma olhada no código de amostra por MetaQuotes, a saber"Moving Average.mq4" e/ou "MACD Sample.mq4" e, com base nisso, até entender os princípios básicos de como uma EA funciona.

Anexei os arquivos, mas você os encontrará em sua pasta "MQL4\Experts".

Arquivos anexados:
 
Fernando Carreiro:

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 da Ordem como OrderTicket() no seu fechamento, que pode falhar se a OrderSelect() inicial também falhar.

Depois de notar sua edição.....

eu sempre assumi que uma OrderSelect() seria perdida quando houvesse um novo tick.

Portanto, eu verifiquei e descobri que uma vez que uma ordem é selecionada, ela permanece selecionada mesmo em tiquetaques novos subseqüentes.

Aprenda algo novo todos os dias :)

 
Keith Watford: Depois de ter notado sua edição.....

Sempre presumi que uma OrderSelect() se perderia quando houvesse um novo tick.

Então, eu verifiquei e descobri que uma vez que uma ordem é selecionada, ela permanece selecionada mesmo em carrapatos novos subseqüentes.

Aprenda algo novo todos os dias :)

Na prática, porém, é de pouca utilidade, pois esses detalhes ficam congelados no tempo, portanto coisas como OrderClosePrice() não serão atualizadas até que você os selecione novamente!
 
Usando OrderTotal diretamente e/ou sem filtragem de número mágico em seu loopOrderSelect significa que seu código é incompatível com cada EA (incluindo-se em outros gráficos e negociação manual.) Símbolo Não é igualOrdersymbol quando outra moeda é adicionada a outro gráfico separado. - MQL4forum
 
Fernando Carreiro:

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 nenhuma outra EA em funcionamento, nem mesmo ela mesma em outro gráfico!


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

Aqui está a seção OrderClose, eu não estou mais recebendo o erro do bilhete inválido, mas agora estou recebendo o preço inválido.

Aqui está diretamente do tronco

2016.12.09 10:47:10.243 Estratégia de Crossover Média Móvel Simples EURUSDi,H1: preço inválido 1,05454000 para a função OrderClose


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

Aqui está a seção OrderClose, eu não estou mais recebendo o erro do bilhete inválido, mas agora estou recebendo o preço inválido

Aqui está diretamente do tronco

2016.12.09 10:47:10.243 Estratégia de Crossover Média Móvel Simples EURUSDi,H1: preço inválido 1,05454000 para a função OrderClose


Não use Bid/Ask ao fechar, use OrderClosePrice(). Será automaticamente o bom preço.
 
Alain Verleyen:
Não use Bid/Ask ao fechar, use OrderClosePrice(). Será automaticamente o bom preço.

Devo simplesmente substituí-lo na função OrderClose? e se sim, devo remover o OrderClosePrice na função OrderClosePrice na função de impressão abaixo dele?

Editar:

Acabei de fazer isso, mas agora ele não terá nenhuma posição em aberto. Apenas abre e fecha posições, embora agora não esteja tendo nenhum problema trabalhando em múltiplos pares.

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

Não há batedor para os retornos ou o intervalo, pois você precisa completar o laço

Além disso, sua impressão de erro depende de


           if(fastma < slowma)


ser falso, não relacionado ao fato de a OrderClose() falhar



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }


Razão: