¿Puede el precio != el precio ? - página 6

 

Eso es lo que yo llamo una doble lata de gusanos.... (juego de palabras;)

Parece que de varias funciones personalizadas propuestas, ninguna llegó a un consenso. ¿Alguien quiere compartir en este punto (sin juego de palabras), cuál es la función CompareDouble que utiliza en su día a día?

Obviamente debemos usar alguna función CompareDouble personalizada, si queremos sistemas fiables.

 

El problema se puede ignorar, sobre todo a menos que el valor EXACTO sea importante.

Si quiero abrir por encima de un precio de activación (posiblemente no normalizado), utilizo Oferta > activación. Si sucede que se dispara en el precio debido al redondeo, realmente no me importa.

Si estoy buscando abrir en o alrededor de un precio de activación (posiblemente no normalizado), pruebo si hay un hueco: Bid > trigger && Bid < trigger+3*pips2dbl. El mercado puede moverse fácilmente un pip entero en un tick, por lo que Bid == trigger es siempre incorrecto y MathAbs(bid-trigger) < Point/2 es correcto pero lo más probable es que no funcione.

Si las igualdades son importantes, como buscar mover un SL pero estoy demasiado cerca del mercado(nivel de stop) entonces y uso Bid - newSL > StopLelvel - Point/2

 
WHRoeder:

El problema puede ser ignorado, sobre todo a menos que el valor EXACTO es importante.

Si quiero abrir por encima de un precio de activación (posiblemente no normalizado), utilizo Oferta > activación. Si resulta que se dispara en el precio debido al redondeo, realmente no me importa.

Si estoy buscando abrir en o alrededor de un precio de activación (posiblemente no normalizado), pruebo si hay un hueco: Bid > trigger && Bid < trigger+3*pips2dbl. El mercado puede moverse fácilmente un pip entero en un tick, por lo que Bid == trigger es siempre incorrecto y MathAbs(bid-trigger) < Point/2 es correcto pero lo más probable es que no funcione.

Si las igualdades son importantes, como buscar mover un SL pero estoy demasiado cerca del mercado (nivel de parada) entonces y uso Bid - newSL > StopLelvel - Point/2


Gracias. Ahora que es lo que yo llamaría hilo decocted..

De hecho lo que mencionas es muy cercano a mi aplicación: Estoy estableciendo si el nuevo TakeProfit es diferente (según los estándares del broker o de MQL4) que el TakeProfit original ya establecido y enviado. Estoy comparando dos valores del indicador y dos valores del TakeProfit antes de llamar a OrderModify.

if (Volume[0]>1)return;
 
       for(int b=OrdersTotal()-1;b>=0; b--)
       {
       if(atr2kTP == atr2kTPAdjust|| btphold==btp)) return;//-----------This is where I am comparing them, and where the function would go.
         if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
           if(OrderMagicNumber()==MAGICMA)
             if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)                                  
                  atr2kTPAdjust=atr2kTP; 
                       OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);                          
 
       }              
         for(int s=OrdersTotal()-1;s>=0; s--)
         {
          if(atr2kTP == atr2kTPAdjust|| stphold==stp) return;
           if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
             if(OrderMagicNumber()==MAGICMA)
               if(OrderSymbol()==Symbol())
                  if(OrderType()==OP_SELL)                      
                      atr2kTPAdjust=atr2kTP;                      
                        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
         }
 }
 

Este fue mi código final de OrderMod, utilizando el filtro Point/2 para comparar los valores de los pedidos dobles. Funcionó sin errores y modificó los pedidos cada vez. Gracias.

void AutoAdjustTakeProfit()
{
if (Volume[0]>1 || atr2kTP == atr2kTPAdjust)return;  

       for(int b=OrdersTotal()-1;b>=0; b--)
          { 
            if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==MAGICMA)
                 if(OrderSymbol()==Symbol())
                    {          
                      if(OrderType()==OP_BUY)// buy ordeer section
                        {  
                          if((btphold-btp> Point/2) || (btphold-btp<-Point/2))  //--------------------------This is the DoubleCompare Code
                            {                                                                             
                              atr2kTPAdjust=atr2kTP; 
                              OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);                          
                            }
                        } 
                     
                      if(OrderType()==OP_SELL) // Sell ordeer section
                        {   
                          if((stphold-stp>Point/2) || (stphold-stp <-Point/2)) //--------------------------This is the DoubleCompare Code
                            {                                                  
                               atr2kTPAdjust=atr2kTP;                      
                               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
                            }
                        }
                    }
           }
}
 
  1. if (Volume[0]>1)return;
    Si se te escapan algunos ticks al inicio de una nueva barra, tu código no se ejecuta. Utiliza siempre el tiempo
  2.   if((stphold-stp>Point/2) || (stphold-stp <-Point/2))
      if( MathAbs(stphold - stp) > Point/2) // Simplified
    De nuevo, ¿realmente te importa la igualdad? Si usas
      if( MathAbs(stphold - stp) >= Point)
    podría dispararse en un punto ligeramente inferior. Eso sigue siendo lo mismo que no es igual.
  3. Por qué moverlo un punto, muévelos por pips y evita el problema de roundoff, y ERR_TOO_FREQUENT_REQUESTS
 

newBar funciona muy bien.

MathAbs mola, creía que sólo convertía los negativos en la parte izquierda de las ecuaciones, no sabía que también convertía la diferencia en un valor positivo.

La precisión de punto/2 no es importante para mis propósitos de señal. Sólo quería evitar los errores de redondeo para evitar la codificación débil.

Prefiero que los errores de frecuencia sean tan buenos como los de redondeo. Así que quiero usar los cálculos estables más libres de errores, en lugar del código de cálculo más preciso.

Así que aumentando mis comparaciones TakeProfit MathAbs (stphold - stp) aún más a >2*pips debería tener la mayor oportunidad de eliminar los errores de redondeo y los errores de frecuencia?

Muchas gracias.

removed.

 
moneycode:

newBar funciona muy bien.

Anteriormente encontré problemas con IsNewCandle, por eso cambié a un disparador de Volumen. Si el procesamiento de los ticks de volumen puede ser lento o faltar, entonces las velas también podrían serlo. Así que ambos fueron una mala idea..

Ya que newBar funciona bien, ahora traté de identificar las ocurrencias de fallo de IsNewCandle, con este código de abajo:

La llamada a la función IsNewCandle() está dentro de start(), POR ENCIMA de la línea de código de newBar. (vender la imagen de código más baja) Esta prueba de impresión no funcionó, en su lugar se imprimió en cada nueva barra.

En mi opinión es una mala idea poner una comprobación de nueva barra en una función, una función se utiliza para hacer el código reutilizable. . . intente llamar a IsNewCandle() dos veces durante el mismo primer tick de una nueva barra y vea qué respuestas obtiene.

Por cierto . . . esto se sale del tema de este hilo, si quieres continuar la discusión por favor muévela a un nuevo hilo. Ya lo ordenaré más tarde. . .

 
WHRoeder:

....Como los precios sólo pueden cambiar por un múltiplo de punto, punto/2 es sólo eso....


Si estás comparando precios, bien. Sin embargo, si está comparando dobles, por ejemplo, promedios de precios, Punto/2 no servirá
 
HarriMQL4:

Si estás comparando precios, bien. Sin embargo, si se trata de comparar dobles, por ejemplo, promedios de precios, Point/2 no servirá.


¿Te has fijado en el título de este tema?

;)

 
HarriMQL4:

Si está comparando precios, está bien. Sin embargo, si está comparando dobles, por ejemplo, promedios de precios, Point/2 no servirá
Los precios son dobles . . .