MT4 iMAOnArray y iBandsOnArray efecto del número de elementos en los cálculos - página 6

 

Por algo he sugerido una calculadora o un Excell. Ayuda a entender cómo funciona esta mierda. Sólo puedes utilizar un número de elementos distinto de cero para calcular si ya tienes un array preparado. Suponga que tiene una matriz de 1000 elementos, y quiere promediar sólo los últimos 100. Tenemos dos opciones: convertir estos 100 elementos en un array personalizado y recalcularlos, o utilizar el bucle de 100 a 0 y no 0, sino 100 elementos en el array.

Pero aquí nos enfrentamos al problema de cambiar el tamaño de la matriz, algo inevitable en los indicadores.

De nuevo, me refería a otras formas de limitar el número de elementos para el cálculo. Bien, puedes establecer la condición iMAOnArray() sólo si(rates_total-i >= rates_total-100); y sólo se recalcularán las últimas 100 barras y todo estará bien cuando llegue una nueva barra.

int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
      if(rates_total-i >= rates_total-100)
      BufferMA[i] = NormalizeDouble(iMAOnArray(Buffer, 0, 5, 0, MODE_LWMA, i), _Digits);
      
     }

return(rates_total);


 
Alexey Viktorov:

Por algo he sugerido una calculadora o un Excell. Ayuda a entender cómo funciona esta mierda. Sólo puedes utilizar un número de elementos distinto de cero para calcular si ya tienes un array preparado. Supongamos que tienes un array de 1000 elementos, y necesitas promediar sólo los últimos 100. Tenemos dos opciones: convertir estos 100 elementos en un array personalizado y recalcularlos, o utilizar el bucle de 100 a 0 y no convertir el número de elementos en 0, sino en 100.

Pero aquí nos enfrentamos al problema de cambiar el tamaño de la matriz, algo inevitable en los indicadores.

De nuevo, me refería a otras formas de limitar el número de elementos para el cálculo. Pues bien, establezca la condición para leer iMAOnArray() sólo si(rates_total-prev_calculated-i >= 100); y sólo se recalcularán las últimas 100 barras y todo estará bien cuando llegue una nueva barra.


Dígame, ¿es usted programador o lo hace por afición, o por necesidad? No necesito un excel o un papel para entender cómo funciona, y Barabashka demostró todas las "dificultades" en la captura de pantalla anterior. Vayamos por orden.

1. iMAOnArray (al igual que iBandsOnArray) puede funcionar en dos versiones, puede leer todo el array y hacerlo correctamente (pero se ha ralentizado durante el cálculo primario) o puede leer una parte del array, pero lo hará sólo para los elementos iniciales, a pesar de que el desplazamiento está especificado para los finales. Es decir, sin embargo, traté de limitar el cálculo a las barras que todavía necesito para calcular ya sea toda la matriz (es decir, la versión inicial de "frenado"), o para hacer una variante similar a la suya con la copia de búfer y el recuento de todos los elementos de este búfer, que, como se describe en mis mensajes anteriores, no da resultado correcto para los métodos de suavizado complejos y también aumentar el tiempo de procesamiento de datos en general.

2. el problema, descrito por usted en los indicadores con el redimensionamiento del array, ocurre sólo si el array no es uno de los buffers del indicador, es decir, su "baile" descrito también tiene un efecto negativo, porque volviendo al código fuente primario el problema era sólo en el cálculo lento y sólo en el primer paso.

3. La variante ofrecida por usted con el recálculo de sólo una parte de los arrays en 100 (N) barras, da de nuevo pérdida de productividad general y problemas innecesarios de implementación con la copia de arrays o recálculo innecesario. Además en tu captura de pantalla y en el código de arriba todos los cálculos están hechos (sospecho que en algún lugar del array interno, es muy probable que por eso se produzcan los desfases primarios), de lo contrario en este tipo de suavizado los primeros resultados rellenados serían diferentes, y simplemente no has llenado el array del buffer con ellos. Porque el 0 en el parámetro de tamaño del array para calcular la función le dice explícitamente que lea todos los datos, esa es la pega.

La única forma de hacerlo bien es utilizar mi propia función, que funcionará como debe y no recalculará todos los datos (N parte de ellos) cuando llegue una nueva barra, sino que sólo los leerá, especialmente porque tengo y utilizo dicha función de promediación en muchos de mis productos. La pregunta de este tema del foro era cómo "superar" las funciones estándar de MT4, sin empeorar la velocidad de procesamiento y el resultado. Si creo en el mensaje anterior,la "desviación estándar" en la matriz se calcula sin frenos, o como un recurso puedo escribir mi propio cálculo de la desviación, sobre todo porque las fórmulas para el cálculo están disponibles para todos aquí en la documentación.

 

Tantas letras... Y todo ello con el único objetivo de no estar de acuerdo con la opción propuesta.

Gracias por la idea, por lo menos ya me he enterado de cómo funciona, por lo demás no me he metido en los entresijos de estas funciones ya que no me hacía falta.

Si no te gusta, utiliza los que se escriben solos.

 
Alexey Viktorov:

Tantas letras... Y todo va encaminado únicamente al desacuerdo con la opción propuesta.

Gracias por la idea, al menos ya he entendido cómo funciona, por lo demás no me he metido en los entresijos de estas funciones porque no lo necesitaba.

Si no te gusta, utiliza los que se escriben solos.

Bueno, por qué en desacuerdo, en la explicación, por qué no es necesario hacerlo, porque para escribir el código vinculado a las funciones de frenado o el código de la creación de bucles adicionales de copia - no es siempre la opción correcta, aunque, a veces, y menos laborioso :)
Y no se trata de "me gusta" / "no me gusta", sino en el hecho de que las funciones no funcionan exactamente como debería, porque de hecho, la creación de análogos es como reinventar la rueda, pero en este caso particular no podemos prescindir de ella.

He hecho conclusiones para mí hace varias páginas, pero su forma, tal vez, ayudará a alguien a entender que esta situación ya se ha resuelto aquí, y lo que tengo que hacer para resolver este problema, por lo que muchas letras :)

 

En esta última variante no hay copia ni ciclos adicionales. Y el método de cálculo MODE_LWMA del que hablabais antes Dimitri y tú no puede recalcularse correctamente.

Mira el código y la captura de pantalla. En la captura de pantalla, periodo MA 5 como en el código, método MODE_LWMA y prestar atención al número de barras calculadas, a la coincidencia de los valores de MA y del indicador con iMAOnArray() en el sótano. Si quieres recalcular todas las barras o sólo recalcular 100. Si no hay cambios, significa que otros cálculos son lentos.

 
¡Una auténtica pena!
 
Sergey Efimenko:

Dígame, ¿es usted programador o lo hace por afición, o por necesidad...?

Antes se ponía a balbucear que no era un programador, sino un aficionado y que por eso se le podía intimidar.
 
Alexey Viktorov:

En esta última variante no hay copia ni ciclos adicionales. Y el método de cálculo MODE_LWMA del que hablabais antes Dimitri y tú sobre la incapacidad de recalcular correctamente.

Mira el código y la captura de pantalla. En la captura de pantalla, periodo MA 5 como en el código, método MODE_LWMA y prestar atención al número de barras calculadas, a la coincidencia de los valores de MA y del indicador con iMAOnArray() en el sótano. Si quieres recalcular todas las barras o sólo recalcular 100. Si no hay cambios, significa que otros cálculos son lentos.

Esta última variante es esencialmente la misma que la original. Como escribí antes con el tamaño del array 0, se sigue contando como un todo. Mi primera solución para reducir el tiempo de cálculo, incluso antes de crear el hilo del foro, fue limitar el número de barras pero, desgraciadamente, no afectó a la productividad; entonces empecé a experimentar con la longitud del array para iMAOnArray y fue cuando comprendí la complejidad de la situación. Fue entonces y sólo entonces, después de haber probado casi todas las variantes fáciles, incluyendo el cambio de la indexación del array para diferentes combinaciones, que creé este tema. Bueno, después de eso recibí algunas respuestas, algunas de ellas confirmando que otros también los habían probado y todos habían llegado a su propia función. Por eso te pedí el código, sabiendo inicialmente que iba a funcionar :) No te ofendas :) Tal vez algunos usuarios superen este "rastrillo" leyendo este hilo. :)
 
Dmitry Fedoseev:
En el pasado, él mismo comenzaba a balbucear que no era un programador, sino un aficionado, y que por lo tanto podía ser intimidado.

Era más bien una pregunta retórica :)

PD Señores, seamos tolerantes con los demás. Al fin y al cabo, todos estamos aquí por una razón: "estafar" al mercado. :) Así que vayamos hacia esa meta sin ninguna distracción. Cada uno de nosotros tiene sus propias dificultades, y las características de la percepción, pero sólo en una disputa nació la verdad, aunque como dicen como Napoleón: "Para discutir, sabiendo que estás equivocado - estúpido, para discutir, sabiendo que usted está en lo cierto significa. Por eso nunca discuto".

 
Sergey Efimenko:
Esta última opción no difiere esencialmente de la original. Como ya he escrito, cuando el tamaño del array es 0, se sigue contando en su totalidad. Mi primera solución, antes de crear el hilo del foro, fue limitar el número de barras, pero desgraciadamente no afectó a la productividad; entonces empecé a experimentar con la longitud del array para iMAOnArray y fue cuando vi la complejidad de la situación. Fue entonces y sólo entonces, después de haber probado casi todas las variantes fáciles, incluyendo el cambio de la indexación del array para diferentes combinaciones, que creé este tema. Obtuve algunas respuestas, algunas de ellas me confirmaron que otros también las habían probado y que cada uno había creado su propia función. Por eso te pedí el código, sabiendo inicialmente que iba a funcionar :) No te ofendas :) Tal vez algunos usuarios superen este "rastrillo" leyendo este hilo. :)

¿Estás diciendo que después de if(rates_total-i >= rates_total-100);, cuando sólo quedan 100 barras por calcular, la función iMAOnArray() recalcula primero toda la matriz?

Razón de la queja: