Errores, fallos, preguntas - página 3129

 
Alexey Viktorov #:

En su caso no es así, ya que deben cumplirse ambas condiciones. Pero si pones esto

entonces, sí. Si se cumple la condición "a", no se comprobará la segunda condición. Llevan muchos años luchando por ello y ahora propones volver al siglo anterior...

Curiosamente, pero con a=true no sólo en || sino también en && no hay comprobación del resto. Si no, cómo se explica esto (no busques el significado en el funcionamiento del indicador, aquí estamos hablando del código):

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_label1  "Fractal Up"
//--- indicator buffers
double ExtUpperBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;

void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
//--- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
//--- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<5)
      return(0);

   int start;
//--- clean up arrays
   if(prev_calculated<7)
     {
      start=2;
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
     }
   else
      start=rates_total-5;

   for(int i=start; i<rates_total-3 && !IsStopped(); i++)
     {
      //--- Upper Fractal
      if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])
         ExtUpperBuffer[i]=high[i];
      else
         ExtUpperBuffer[i]=EMPTY_VALUE;
     }

   return(rates_total);
  }

El terminal es silencioso. Pero si cambias

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])

a

if(high[i]>high[i+4] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+1])

el programador lo cambia y aparece el consabido mensaje 'array out of range' porque el program ador tropieza inmediatamente con un array con un índice excesivo a diferencia del primer caso.

 
x572intraday #:

No me atrevo a llamarlo "bug". Así que sólo diré que me he dado cuenta de una peculiaridad de la sentencia if. Sospecho que esto puede aplicarse también a otros idiomas.

Si a resulta ser cierto, la comprobación salta a Array[over_index] y aquí el terminal empieza a colapsar por la parte de'array out of range', que es bastante cierta. Pero si a resulta ser falso, el terminal no comprobará la condición Array[over_index] y por tanto la redundancia de índices, y si saltará más allá y el codificador no sabrá que hay un array con un índice inexistente en su programa... o más bien una existente pero redundante.

¿Tal vez debería haber una solución para que la comprobación de "matriz fuera de rango" se lleve a cabo hasta el final del bucle if y se emita el mismo mensaje? ¿O reducirá significativamente la velocidad del operador?


¿En qué idioma es diferente la sintaxis? "Sintaxis significa literalmente no sólo componer, sino también ordenar...".

Si quieres comprobar si hay un 'array fuera de rango', cambia el orden.

if(Array[over_index]>val && a) {...}
 
Lilita Bogachkova #:

¿En qué idioma es diferente la sintaxis?"Sintaxis significa literalmente no sólo componer, sino también ordenar...".

Si quieres comprobar si hay un 'array fuera de rango', cambia el orden.

El pedido es deseable ya que hay que comprobarlo.

Por ejemplo, si "a" se cambia más a menudo, es mejor ponerlo como primer argumento.

 
Vitaly Muzichenko #:

El orden es deseable ya que los controles son necesarios.

Por ejemplo, si "a" cambia más a menudo, es mejor ponerlo como primer argumento.

No, la primera depende de las condiciones principales, las otras son sólo condiciones adicionales.

Por ejemplo, es irrelevante comprobar la hora del tiempo de trabajo actual si el tiempo de trabajo aún no ha comenzado.
 

De hecho, me encontré con esta característica por accidente. Eso no es lo que quería...

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && ... && high[i]>high[i+n])

o

if(high[i]>high[i+1])
   if(high[i]>high[i+2])
      if(high[i]>high[i+3])
         if(...)
            if(high[i]>high[i+n])

El problema es que n puede ser bastante grande, por lo que quería envolver esta larga cadena de condiciones en una forma compacta para. Lo intenté de esta manera:

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

pero resultó ser un poco desordenado. Bueno al menos porque h_plus con este algoritmo tendrá que tomar toda la suma de condiciones comprobadas, incluyendo la condición con comprobación de matriz de índices redundante, cosa que no ocurría en el primer if desenvuelto, sin for. Y otros barnices estropean la imagen.

¿Vale la pena considerar esto? ¿Es posible hacerlo?

 
Lilita Bogachkova #:

¿En qué idioma es diferente la sintaxis? "Sintaxis significa literalmente no sólo componer, sino también ordenar...".

Si quieres comprobar si hay un 'array fuera de rango', cambia el orden.

No siempre se sabe de antemano qué poner antes y qué poner después.

 
Lilita Bogachkova #:

No, la primera determina las condiciones básicas, las otras son sólo condiciones adicionales.

Por ejemplo, es irrelevante comprobar la hora del tiempo de trabajo actual si el tiempo de trabajo aún no ha comenzado.

Sí, primero se comprueban las condiciones de la señal, se recorre la matriz y se compara, se comprueba el precio actual, y luego resulta que el tiempo no es el adecuado, pero antes se realizan un montón de acciones complicadas.

¿Verdad?

 
Vitaly Muzichenko #:

Sí, primero se comprueban las condiciones de la señal, se recorre la matriz y se compara, se comprueba el precio actual, y luego resulta que el momento no es el adecuado, pero antes se han realizado un montón de acciones complicadas.

¿Verdad?

Cierto, no deberías hacer eso.
 
Vitaly Muzichenko #:

Consulte

¿Quién te dijo que "a" de la condición anterior sería siempre falsa?

 
x572intraday #:

De hecho, me encontré con esta característica por accidente. Eso no es lo que quería...

o

El problema es que n puede ser bastante grande, por lo que quería envolver esta larga cadena de condiciones en una forma compacta para. Lo intenté de esta manera:

pero resultó ser un poco desordenado. Bueno al menos porque h_plus con este algoritmo tendrá que tomar toda la suma de condiciones comprobadas, incluyendo la condición con comprobación de matriz de índices redundante, cosa que no ocurría en el primer if desenvuelto, sin for. Y otros barnices estropean la imagen.

¿Vale la pena considerar esto? ¿Es posible sobrepasarse?

Aquí está este código que no entiendo en absoluto

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

¿Qué significa la marca & en este código? ¿Y en qué bucle debe ejecutarse if(h_plus)? ¿No te faltaron soportes curvos?