Errores, fallos, preguntas - página 1394

 
Ilya Malev:

Bien, aquí está el código

No soy muy bueno con los indicadores, pero esta línea es cuestionable

return(CopyBuffer(hnd, buf, index, 1, Arr)==1?Arr[0]:EMPTY_VALUE);

Valor de retorno

El número de elementos del array copiados o -1 en caso de error.

Si sólo se copia 1 elemento, la función devolverá su valor. Si no hay elementos o si hay más de 1, la función devolverá EMPTY_VALUE.

¿Tal vez sería mejor?

return(CopyBuffer(hnd, buf, index, 1, Arr)>=1?Arr[0]:EMPTY_VALUE);
 
Ilya Malev:

Bien, aquí está el código

Se ha corregido la línea y parece que funciona ))))

buffer2[i]=-MathRand()%5*Point();
 
Vladimir Pastushak:

Se ha corregido la línea y parece que funciona ))))

Yo mismo acabé retocándolo así. Pero me pregunto por qué han cambiado la lógica (en MT4 la escala era buena sin la multiplicación por Punto). Y por qué no hay posibilidad de hacer que los buffers sin dibujo (c DRAW_NONE) no tengan efecto en la escala del gráfico.

 
Vladimir Pastushak:

No soy muy bueno con los indicadores, pero esta línea es cuestionable

1. Valor devueltoNúmero de elementos del array copiados o -1 en caso de error.

2. Si se copia un elemento, la función devolverá su valor

Las afirmaciones 1 y 2 están en contradicción, ¿no crees?
 
Ilya Malev:
Las afirmaciones 1 y 2 están en contradicción, ¿no cree?

No )))

1 Puede ser desde 1 hasta el límite

2 sólo si se copia 1 elemento Si 2 o más, devuelve EMPTY_VALUE

En la ayuda dice

Valor de retorno

Número de elementos del array copiados o -1 en caso de error. ¿En qué condiciones se copiará 1 elemento?

 
Ilya Malev:

Yo mismo acabé retocándolo así. Pero me pregunto por qué han cambiado la lógica (en MT4 la escala era buena sin la multiplicación por Punto). Y por qué no hay posibilidad de que los buffers sin dibujo (c DRAW_NONE) no afecten a la escala del gráfico.

No se recorre todo el búfer del indicador. Escribir

for(int i=rates_total-MathMax(1, prev_calculated); i>=0; i--)

no es correcto en absoluto. Tiene las variables rates_total, prev_calculated y el indicador offset iStdDev. En la primera pasada hay que rellenar los índices vacíos:

cambio de indicador

y luego recorrer los índices restantes del buffer de indicadores (recorrer significa asignar valores).

 
Karputov Vladimir:

No se recorre toda la memoria intermedia del indicador. La entrada

no es correcto en absoluto. Tiene las variables rates_total, prev_calculated y el indicador offset iStdDev. En la primera pasada hay que rellenar los índices vacíos:

y luego recorrer los índices restantes del buffer de indicadores (recorrer significa asignar valores).

En la versión original, tenía una función que rellenaba todo con ceros del tipo

      for(int i=(int)SeriesInfoInteger(Symbol(), Period(), SERIES_BARS_COUNT)-1; i>=0; i--){
         buffer1[i]=0;
         buffer1[i]=0;
      }

Esto no importa en este caso. Si hubiera valores vacíos, estarían al principio del gráfico y no afectarían a la escala de la ventana al final. Este no es el caso aquí, el compañero de arriba ya lo ha descubierto.

 
Ilya Malev:

Yo mismo acabé retocándolo así. Pero me pregunto por qué han cambiado la lógica (en MT4 la escala era buena sin la multiplicación por Punto). Y por qué no hay posibilidad de que los buffers sin dibujo (c DRAW_NONE) no afecten a la escala del gráfico.

Aquí tienes cómo probarlo:

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PLOT_EMPTY_VALUE >>>
 
Vladimir Pastushak:

No )))

¿En qué condiciones se copiará un elemento?

Sí )))

int  CopyBuffer(
    int       indicator_handle,     // handle индикатора
    int       buffer_num,           // номер буфера индикатора
    int       start_pos,            // откуда начнем 
    int       count,                // сколько копируем
    double    buffer[]              // массив, куда будут скопированы данные
    );
 
Ilya Malev:

Sí )))

Sí, entonces su línea es correcta.