Necesito ayuda para detectar un pequeño error. - página 4

 
Si eso es así entonces estoy en lo cierto en mi 1er código también entonces , llamo a OrderSelect() justo después del 1er bucle for ..... El problema ahora es que el trailing stop loss no está funcionando correctamente y todavía no tengo idea de dónde está el problema .
 
juniorlcq: utiliza el bucle de cuenta atrás pero con x-- . Sin embargo, no entiendo por qué sugieres --x .
  1. x++ lee el valor, guarda una copia, incrementa el valor, almacena el nuevo valor en x yrecupera la copia para su uso posterior.
  2. ++x lee el valor, incrementa el valor, almacena el nuevo valor en x
  3. Para los números enteros hay poca diferencia. En algunas plataformas, esta última es una sola instrucción, lo que la hace varias veces más rápida.
  4. Para las clases (como los iteradores) tienes una llamada extra al constructor y al destructor, lo que lo hace mucho más rápido.
    Operador prefijo++
    Operador postfijo++
    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.
    }
    
    En la mayoría de las implementaciones de la STL verás con frecuencia "iterador last=end; --end;" en lugar de "iterador last=end--"

 

Digamos que el precio sube 600 puntos desde OrderOpenprice(), = StartTraillingStop (200) + 8(xai)*50

el código está aquí :

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

pero el código hará todos los xai de 0 a 8, digamos que el código está en xai = 4; ¿esta condición es verdadera?

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

si entonces el SL se fijará en : StartTraillinStop (200) + 4(xai)*50 ( bajando desde el anterior )

entonces xai 5, el SL se fijará en : StartTraillinStop (200) + 5(xai)*50

y así sucesivamente, por lo que no es posible poner una pausa una vez que el SL se establece;

 

juniorlcq Tu código es mucho más fácil de leer ahora que lo has reformateado. Lo he reformateado un poco más para hacerlo más pequeño para publicarlo, he resaltado los posibles problemas. Estoy pensando que podrías tener un problema de "doble == doble calculado" que está impidiendo que tu código ejecute algunos de los recorridos. ¿Has leído el hilo sobre puede precio != precio ?

Yo sospecho más de la 2ª y 4ª ya que son cálculos más complicados.

Poner declaraciones Print() después de esos cálculos para ver si realmente hacen == o no.

El error conocido como error de punto flotante podría hacerlos != incluso cuando parece que deberían ser ==.

== es realmente solo 100% seguro para usar con enteros así que podrías cambiar el == a <= o >= como prueba.

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


También como una nota al margen: Su código sería mucho más eficiente si usted llama OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() una vez al principio de su bucle OrderSelect() y asignar sus valores a vars locales para utilizar en el resto del código. Los vares locales son de acceso mucho más rápido que las llamadas a funciones, por lo que debe evitar hacer repetidas llamadas a funciones para el mismo resultado... Como regla general, cuanto más escritura rosa tengas en tu código más lento será el rendimiento del EA.

 

Entiendo, no puedo hacer que funcione, este puede funcionar con orden de compra, SL son gioing abajo como se explica :

   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++ lee el valor, guarda una copia, incrementa el valor, almacena el nuevo valor en x yrecupera la copia para su uso posterior.
  2. ++x lee el valor, incrementa el valor, almacena el nuevo valor en x
  3. Para los números enteros hay poca diferencia. En algunas plataformas, esta última es una sola instrucción, lo que la hace varias veces más rápida.
  4. En el caso de las clases (como los iteradores) tienes una llamada extra al constructor y al destructor, lo que lo hace mucho más rápido.
    Operador prefijo++
    Operador postfijo++
    En la mayoría de las implementaciones de la STL verás con frecuencia "iterador last=end; --end;" en lugar de "iterador last=end--"


Ohhhhhhh no sabía de esto . Gracias WHRoeder :) .

Entonces, ¿significa que ,

digamos que OrdersTotal() == 3 , con el bucle for count down for ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) x guardará el 1er valor como 2 , luego continuará el bucle for desde el 2 en adelante sin volver a pasar por OrdersTotal() ?

 
SDC:

juniorlcq Tu código es mucho más fácil de leer ahora que lo has reformateado. Lo he reformateado un poco más para hacerlo más pequeño para publicarlo, he resaltado los posibles problemas. Estoy pensando que podrías tener un problema de "doble == doble calculado" que está impidiendo que tu código ejecute algunos de los recorridos. ¿Has leído el hilo sobre puede precio != precio ?

Yo sospecho más de la 2ª y 4ª ya que son cálculos más complicados.

Poner declaraciones Print() después de esos cálculos para ver si realmente hacen == o no.

El error conocido como error de punto flotante podría hacerlos != incluso cuando parece que deberían ser ==.

== es realmente solo 100% seguro para usar con enteros así que podrías cambiar el == a <= o >= como prueba.



Nope no he leído ese hilo antes . Solo lo hice .

Lo que has sugerido suena lógico. En un segundo pensamiento, a veces dibujar líneas en MT4 en las propiedades de los precios que realmente no muestran 5 dígitos de precios, en lugar de mostrar a veces algo más que eso.

Pero aquí está uno de mi comercio flotante en el de la cuenta anterior , lo imprimí para ver lo que era el doble como con una simple codificación de impresión . Raro MQL4 supongo @.@ ?

Todavía estoy pensando cómo debo modificar el doble == doble parte .....

SDC:


También como nota al margen: Tu código sería mucho más eficiente si llamas a OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() una vez al principio de tu bucle OrderSelect() y asignas sus valores a vars locales para usarlos en el resto del código. Los vares locales son de acceso mucho más rápido que las llamadas a funciones, por lo que debe evitar hacer repetidas llamadas a funciones para el mismo resultado... Como regla general, cuanto más escritura rosa tengas en tu código más lento será el rendimiento del EA.

Ohhh no sabía que habría una gran diferencia en la velocidad de ejecución , gracias por la guía SDC . Se modificará de acuerdo a su guía después de la parada de la pista comenzó a trabajar .

 

Intenta sustituir el último bloque de código por esta versión de depuración. Comprueba mi código, no lo he compilado.

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

Eso podría revelar algo, podrías hacer algo similar con las otras condiciones == también.

 
SDC:

Intente reemplazar el último bloque de código con esta versión de depuración. Podrías hacer algo similar con el xa

Eso podría revelar algo, podrías hacer algo similar con las otras == condiciones también.


Sí, el problema aparece, es el "problema de doble == doble calculado". Gracias por señalar el problema SDC .

Gracias ffoorr por señalar también el mismo problema antes , pero no lo edité de la manera correcta y pensé que no era el problema .

Tengo una pregunta que necesita alguna sugerencia, para el segundo y tercer if en el segundo bucle for, ¿es mejor poner una declaración "entre" en él? Como OrderStopLoss() >= x + 1 && x - 1 ? ¿O debería usar simplemente >= o <= ?

 

Espero que WHR no lea esto, le dará un ataque, pero te voy a decir que pruebes con NormalizeDouble() .... debería hacer que esas condiciones sean iguales cuando se supone que deben serlo. No debería ser necesario hacerlo también al lado de OrderStopLoss(), pero si aún así no se igualan cuando deberían podrías intentar hacerlo a ambos lados de la condición....

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