Necessidade de ajuda para detectar algum pequeno erro . - página 2

 
Qualquer pessoa pode dar uma mão, por favor .....
 

Parte do problema é a maneira como você escreveu aquele código com grandes caracteres, se as condições de &&, ||, e chamada de função após chamada de função torna difícil a depuração, você teria sorte de encontrar alguém com tempo para desvendar essa confusão. Você deve olhar os exemplos de codificação nos documentos para ver como o código deve ser formatado em linhas muito mais curtas e comentado.

 

" Torna difícil a depuração "?? :( Nunca ouvi falar disto, no entanto, isto é real ....

O compilador também tem dificuldade em depurar meu código :( ?

Se essa é a razão pela qual eu tive que repensar toda a minha idéia de codificação para esta parte ?? Então vai aparecer uma coisa totalmente diferente ...... :( :(

 

Sim, é difícil de depurar, por exemplo, olhar para este código para a parada de rastreamento. É fácil ver o que cada linha faz, portanto, é fácil detectar erros.

   int total=OrdersTotal();
   
   for(int cnt=0; cnt<total; cnt++)
   {if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
    {if(OrderType()==OP_BUY)
     {if(TrailingStop>0)
      {if(Bid-OrderOpenPrice()>Point*TrailingStop)
       {if(OrderStopLoss()<Bid-Point*TrailingStop)
        {if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
         {Print("OrderModify error ",GetLastError());
          return;
   }}}}}}}
 
Tentei remover o && condição e colocá-los como se fosse uma declaração como depois de .... Mas ainda não funcionava o tempo todo, às vezes só movia o stop loss uma vez, às vezes funcionava muito bem tanto para ordens de compra como para ordens de venda.
 
SDC: Sim, é difícil de depurar, por exemplo, olhar para este código para a parada de rastreamento. É fácil ver o que cada linha faz, portanto, é fácil detectar erros.
   int total=OrdersTotal();
   
   for(int cnt=0; cnt<total; cnt++)
   {if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
    {if(OrderType()==OP_BUY)
     {if(TrailingStop>0)
      {if(Bid-OrderOpenPrice()>Point*TrailingStop)
       {if(OrderStopLoss()<Bid-Point*TrailingStop)
        {if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
         {Print("OrderModify error ",GetLastError());
          return;
   }}}}}}}
  1. Você DEVE contar para baixo ao fechar/apagar na presença de várias ordens. Pense na EA em outros gráficos. Tenha o hábito.
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       {if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
        {if(OrderType()==OP_BUY)
         {if(TrailingStop>0)
          {if(Bid-OrderOpenPrice()>Point*TrailingStop)
           {if(OrderStopLoss()<Bid-Point*TrailingStop)
            {if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
             {Print("OrderModify error ",GetLastError());
              return;
       }}}}}}}
    Também prefira ++x sobre x+++ (especialmente quando se trata de aulas)
  2. A linguagem é para() declaração, se() declaração, então faz pouco sentido colocar aparelho em torno de uma única declaração.
    Você não escreveria
    mas
    { i = 1 + 2; }
    { if(i == 3) { Print(i); } }
    i = 1 + 2;
    if(i == 3) Print(i);
    Então Simplifique
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
       if(OrderType()==OP_BUY)
       if(TrailingStop>0)
       if(Bid-OrderOpenPrice()>Point*TrailingStop)
       if(OrderStopLoss()<Bid-Point*TrailingStop)
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
       {  Print("OrderModify error ",GetLastError());
          return;
       }
  3. Agora que "&&" (e "|||") são operadores de curto-circuito, os "ifs" não se acorrentam
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop>0)
       && Bid-OrderOpenPrice()>Point*TrailingStop)
       && OrderStopLoss()<Bid-Point*TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
       {  Print("OrderModify error ",GetLastError());
          return;
       }
  4. Você deseja modificar o pedido quando a seleção do pedido falhou?
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(O rderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop>0)
       && Bid-OrderOpenPrice()>Point*TrailingStop)
       && OrderStopLoss()<Bid-Point*TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
       {  Print("OrderModify error ",GetLastError());
          return;
       }
  5. Remova todos os testes que não mudam fora do loop.
    if TrailingStop>0){
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && Bid-OrderOpenPrice()>Point*TrailingStop)
       && OrderStopLoss()<Bid-Point*TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
       {  Print("OrderModify error ",GetLastError());
          return;
       }
    }
  6. Não continue calculando a mesma coisa.
       if(Bid-OrderOpenPrice()>Point*TrailingStop)
       if(OrderStopLoss()<Bid-Point*TrailingStop)
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,O...
    Descubra o que você quer fazer e murcha.
    if TrailingStop>0){
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY){
          double SL = Bid - Point*TrailingStop;
          if(SL > OrderOpenPrice()    // Start trailing above open price
          && SL > OrderStopLoss()     // And it moves up ONLY
          && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Green))
          {  Print("OrderModify error ",GetLastError());
             return;
          }
       }
    }
  7. E quanto aos outros casos? E quanto aos outros gráficos e EAs?
    if TrailingStop>0){
       for(int cnt=OrdersTotal() - 1; cnt >= 0; --cnt)
       if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)
       && OrderMagicNumber() == MyExternal
       && OrderSymbol()      == Symbol()  
       ){  
          if(OrderType()==OP_BUY)
          {
             double SL = Bid - Point*TrailingStop;
             if(SL > OrderOpenPrice()    // Start trailing above open price
             && SL > OrderStopLoss()     // And it moves up ONLY
             && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Green))
             {  Print("OrderModify error ",GetLastError());
                return;
             }
          }  // OP_BUY
          else // OP_SELL (or pending)
          { ...                       
          }                           
       }  // OrderSelect
    }  // Trailing

 
WHRoeder:
  1. Você DEVE contar para baixo ao fechar/apagar na presença de várias ordens. Pense na EA em outros gráficos. Tenha o hábito. Prefira também ++x a x++ (especialmente quando se trata de aulas)
  2. A linguagem é para() declaração, se() declaração, então faz pouco sentido colocar aparelho em torno de uma única declaração.
    Você não escreveria
    mas
    Então Simplifique
  3. Agora que "&&" (e "|||") são operadores de curto-circuito, os "ifs" não se encadeam.
  4. Você deseja modificar o pedido quando a seleção do pedido falhou?
  5. Remova todos os testes que não mudam fora do loop.
  6. Não continue calculando a mesma coisa. Descubra o que você quer fazer e murcha.
  7. E quanto aos outros casos? E quanto aos outros gráficos e EAs?

Eu afixei esse código apenas como um exemplo de código de fácil leitura, ele não foi feito para ser um exemplo de uma função stand alone completa.

É a seção de ordens de compra do código de parada móvel da amostra da MetaQuotes MACD EA incluída com o MT4.

1) Não é verdade, você pode contar para cima ou para baixo, o laço é mais eficiente, OrdensTotal() é chamado uma vez e atribuído a uma var local.

 
SDC: Eu afixei esse código apenas como exemplo o
Eu afixei apenas uma ampliação do assunto.
 

Obrigado SDC . Obrigado também pelas dicas do WHRoeder . É útil .

Tentei trocar OrderClosePrice() pelo MarketInfo do código anterior e o editado (removendo o && condição e colocando-os como uma declaração como depois , o do 2º para loop ) , mas o resultado às vezes ainda está funcionando às vezes não está funcionando .

O loop de contagem para o total de pedidos no pool I usa loop de contagem regressiva, mas com x... . Eu não entendo porque você sugere --x, no entanto...

Eu pesquisei "operadores de curto circuito" no Google, mas não entendo o que significa em mql4 , você se importa em explicar um pouco ^_^ ?? Por que é ruim acorrentar "se"?

A propósito , o código acima sugerido pela SDC , não é o código que estou usando >.< .

 

Não é ruim acorrentar ses. Os desenvolvedores da linguagem MQL4 escreveram o código que coloquei acima. É um código que eu cortei de sua amostra MacD EA como exemplo.

WHR estava se referindo a uma recente mudança na forma como && || as condições são avaliadas, o que agora as torna tão eficientes quanto se as condições fossem encadeadas. Anteriormente, elas eram menos eficientes. Você pode usar qualquer um dos métodos. Os ifs encadeados são úteis quando há divergências no código para que você possa usar 'outro'.

Linhas longas de condições de if( && || ) podem criar confusão entre parênteses o que torna mais difícil encontrar erros, é por isso que não gosto de fazer isso. Também há um padrão aceito para codificação que diz que não deve ter mais de 80 caracteres de largura. Muitos codificadores não se preocupam em aderir a esse padrão, e os desenvolvedores da MQL4 continuam criando identificadores numerados com nomes longos grandes para serem usados em suas chamadas de funções para funções com nomes longos igualmente grandes, o que não ajuda muito na formatação de código.