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

 
Se assim for, então eu também estou certo em meu primeiro código, então eu chamo OrderSelect() imediatamente após o primeiro para o loop ..... O problema agora é que a perda do trailing stop não está funcionando corretamente e eu ainda não tenho nenhuma pista de onde está o problema.
 
juniorlcq: utiliza o ciclo de contagem regressiva, mas com x... . Eu não entendo porque você sugere --x, no entanto...
  1. x++ lê o valor, guarda uma cópia, incrementa o valor, armazena o novo valor em x, erecupera a cópia para uso posterior.
  2. +++x lê o valor, incrementa o valor, armazena o novo valor em x
  3. Para os inteiros, faz pouca diferença. Em algumas plataformas, esta última é uma única instrução, tornando-a várias vezes mais rápida.
  4. Para as aulas (como os iteradores) você tem uma chamada extra de construtor e destruidor, tornando-o muitas vezes mais rápido.
    Prefixo operador++
    Operador Postfix++
    RaRev* RaRev::operator++(void){         // prefix
       ++mPos;
       return GetPointer(this); // Allow (++It).Get()
    }
    
    RaRev RaRev::operator++(int){               // postfix
       RaRev  orig(this); // Make a copy to return.
       ++this;            // Increment myself.
       return orig;       // Return the original position.
    }
    
    Na maioria das implementações STL você verá freqüentemente "iterator last=end; --end;" ao invés de "iterator last=end--".

 

Digamos que o preço sobe 600 ponto do OrderOpenprice(), = StartTraillingStop (200) + 8(xai)*50

o código está aqui :

  if ( xai >= 8 ) 
    {
    if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
        {
        if ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) )
           {
            Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
       }
    }

mas o código fará todo o xai de 0 a 8, digamos que o código está em xai = 4; esta condição é verdadeira ?

if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )

sim, então o SL será fixado em : StartTraillinStop (200) + 4(xai)*50 ( descendo do anterior )

então xai 5, o SL será fixado em : StartTraillinStop (200) + 5(xai)*50

e assim por diante, de modo que não é possível colocar uma pausa uma vez que o SL esteja definido;

 

juniorlcq Seu código é muito mais fácil de ler agora que você o reformatou. Eu o reformatei um pouco mais para torná-lo menor para postar, eu tenho destacado possíveis problemas. Estou pensando que você pode ter um problema "duplo == duplo calculado" que está impedindo que seu código execute algumas das trilhas. Você já leu o tópico sobre preço de latas != preço ?

Estou mais desconfiado do 2º e 4º, pois são cálculos mais complicados.

Coloque Print() declarações após esses cálculos para ver se eles realmente fazem == ou não.

O erro conhecido como erro de ponto flutuante pode fazê-los != mesmo quando parece que eles deveriam ser ==.

== é realmente apenas 100% seguro para usar com inteiros, então você pode mudar o == para <= ou >= como um teste.

  void ProcessTrailingStop()
 {
  bool Result;
  for(int x=(OrdersTotal()-1); x>=0; x--)
  {if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==True)
   {PointsDetection();
    if(OrderType()==OP_BUY)
    {for(int xai=0; xai<NumberOfTrail; xai++)
     {if(xai==0)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=StartTrailingStop)
       {if(( OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()+(TrailingStop*Figure))))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai==1)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+CummulativeValue))
       {if(OrderStopLoss()==(OrderOpenPrice()+(TrailingStop*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+((TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai>=2)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xai)))
       {if(OrderStopLoss()==(OrderOpenPrice()+(( TrailingStop+(CummulativeValue *(xai-1)))*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(( TrailingStop+(CummulativeValue*xai))*Figure)),OrderTakeProfit(),0,Color);
    }}}}}else
    {if(OrderType()==OP_SELL)
     {for(int xaii=0; xaii<NumberOfTrail; xaii++)
      {if(xaii==0)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=StartTrailingStop)
        {if(( OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() -(TrailingStop*Figure))))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii==1)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+CummulativeValue))
        {if(OrderStopLoss()==(OrderOpenPrice() -(TrailingStop*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
 }}}}}}}}}


Também como uma nota lateral: Seu código seria muito mais eficiente se você chamasse OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() uma vez no início de seu loop OrderSelect() e atribuísse seus valores aos vars locais para usar durante todo o resto do código. Os vars locais são de acesso muito mais rápido do que as chamadas de função, portanto você deve evitar fazer chamadas de função repetidas para o mesmo resultado... Como regra geral, quanto mais escrita cor-de-rosa você tiver em seu código, mais lento será o desempenho da EA.

 

Eu entendo, eu não posso fazer funcionar, este pode funcionar com a compra de encomenda, SL estão gioingando para baixo como explicado :

   extern double CummulativeValue = 50.0 ;
   extern int    NumberOfTrail = 100 ;



  void ProcessTrailingStop()
   {
       double Figure = Point;
    color Color = Yellow;
  
    bool Result ;
         for ( int x =  OrdersTotal(); x >= 0 ; x-- )
         {
         if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == false) continue;
        if ( OrderType() == OP_BUY )
           {
                 for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                        if ( xai == 0 )
                        {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop )
                           {
                              if ( OrderStopLoss() == 0 ) 
                              {
                               Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } } }                        
                  
                        if ( xai == 1 )
                           {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } }                         
                        
                        if ( xai >= 2 )
                           {
                          if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                        } }                         
                     }
                  }
                  
       }}           
 
WHRoeder:
  1. x++ lê o valor, guarda uma cópia, incrementa o valor, armazena o novo valor em x, erecupera a cópia para uso posterior.
  2. +++x lê o valor, incrementa o valor, armazena o novo valor em x
  3. Para os inteiros, faz pouca diferença. Em algumas plataformas, esta última é uma única instrução, tornando-a várias vezes mais rápida.
  4. Para as aulas (como os iteradores) você tem uma chamada extra de construtor e destruidor, tornando-o muitas vezes mais rápido.
    Prefixo operador++
    Operador Postfix++
    Na maioria das implementações STL você verá freqüentemente "iterator last=end; --end;" ao invés de "iterator last=end--".


Ohhhhhhh Eu não sabia disso. Obrigado WHRoeder :) .

Isso significa, portanto, que ,

digamos OrderTotal() == 3 , com a contagem regressiva para loop for ( int x = ( OrderTotal() - 1 ) ; x >= 0 ; x-- ) x economizará o 1º valor como 2 , então continuará o laço de 2 em diante sem passar por OrderTotal() novamente ??

 
SDC:

juniorlcq Seu código é muito mais fácil de ler agora que você o reformatou. Eu o reformatei um pouco mais para torná-lo menor para postar, eu tenho destacado possíveis problemas. Estou pensando que você pode ter um problema "duplo == duplo calculado" que está impedindo que seu código execute algumas das trilhas. Você já leu o tópico sobre preço de latas != preço ?

Estou mais desconfiado do 2º e 4º, pois são cálculos mais complicados.

Coloque as declarações Print() após esses cálculos para ver se eles realmente funcionam == ou não.

O erro conhecido como erro de ponto flutuante pode fazê-los != mesmo quando parece que eles deveriam ser ==.

== é realmente apenas 100% seguro para usar com inteiros, então você pode mudar o == para <= ou >= como um teste.



Não, eu nunca li essa linha antes. Apenas li .

O que você sugeriu fazer parece lógico . Pensando bem, às vezes traçando linhas no MT4 sobre as propriedades do preço não mostra realmente o preço de 5 dígitos, em vez disso, às vezes mostra algo mais do que isso .

Mas aqui está um dos meus negócios flutuantes sobre o da conta anterior , eu o imprimi para ver como era o duplo com um simples código de impressão . Estranho MQL4 Acho que @.@ ?

Eu ainda estou pensando como devo modificar o duplo === dupla parte .....

SDC:


Também como uma nota lateral: Seu código seria muito mais eficiente se você chamasse OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() uma vez no início de seu loop OrderSelect() e atribuísse seus valores aos vars locais para usar durante todo o resto do código. Os vars locais são de acesso muito mais rápido do que as chamadas de função, portanto você deve evitar fazer chamadas de função repetidas para o mesmo resultado... Como regra geral, quanto mais escrita cor-de-rosa você tiver em seu código, mais lento será o desempenho da EA.

Ohhh Eu não sabia que haveria uma enorme diferença na velocidade de execução , obrigado pelo guia SDC . Será modificado de acordo com seu guia após a parada da trilha ter começado a funcionar .

 

Tente substituir o último bloco de código por esta versão debug. Verifique meu código que eu não compilei.

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.1: first condition true");
         if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Print("debug2.2: second condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.2: second condition false");
          Print("debug2.2: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}

Isso poderia revelar algo, você poderia fazer algo semelhante com as outras == condições também.

 
SDC:

Tente substituir o último bloco de código por esta versão de depuração. Você poderia fazer algo semelhante com o xa

Isso poderia revelar algo, você poderia fazer algo semelhante com as outras === condições também.


Yup os problemas surgem , é o " duplo == duplo problema calculado " . Obrigado por apontar o problema SDC .

Obrigado ffoorr por também apontar o mesmo problema antes, mas eu não o editei da maneira correta e achei que não era o problema.

Mas tenho uma pergunta a fazer, para o 2º e 3º, se no 2º para loop, é melhor colocar uma declaração "entre" ? Como OrderStopLoss() >= x + 1 && x - 1 ?? Ou devo apenas usar >= ou <= ??

 

Espero que WHR não leia isto, ele terá um ataque, mas vou lhe dizer para tentar NormalizeDouble() .... deve fazer com que essas condições sejam iguais quando supostamente devem ser iguais. Não deveria ser necessário fazê-lo também ao lado OrderStopLoss(), mas se ainda assim não vier igual quando deveria tentar fazê-lo a ambos os lados da condição....

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.0: condition true");
         if(OrderStopLoss()==NormalizeDouble((OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)),Digits));
         {Print("debug2.1: condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.1: condition false");
          Print("debug2.1: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}
Razão: