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

 

Esta es la cuestión. Si no necesito calcular todo el array, sino sólo los últimos N elementos.

No entiendo muy bien la lógica del cálculo de estas funciones al limitar. Tengo un array de series de tiempo (uno de los buffers de indicadores), si dejo el número de elementos igual a 0, no hay preguntas, todo se cuenta y se calcula, pero si disminuyo el número de elementos que intervienen en el cálculo por los mismos desplazamientos, sólo obtengo los primarios. Simplemente hay un array de 5000 elementos (barras en el gráfico), para ahorrar tiempo necesito calcular sólo los últimos 300, pero cuando especifiqué el valor 300 en el segundo parámetro obtuve los elementos primarios 5000-4700, pero en el offset 300-0, y los valores posteriores en una llamada no cambian. ¿Para qué sirve este parámetro?

 
Sergey Efimenko:

Esta es la cuestión. Si no necesito calcular todo el array, sino sólo los últimos N elementos.

No entiendo muy bien la lógica del cálculo de estas funciones al limitar. Tengo un array de series de tiempo (uno de los buffers de indicadores), si dejo el número de elementos igual a 0, no hay preguntas, todo se cuenta y se calcula, pero si disminuyo el número de elementos que intervienen en el cálculo por los mismos desplazamientos, sólo obtengo los primarios. Simplemente hay un array de 5000 elementos (barras en el gráfico), para ahorrar tiempo necesito calcular sólo los últimos 300, pero cuando especifiqué el valor 300 en el segundo parámetro obtuve los elementos primarios 5000-4700, pero en el offset 300-0, y los valores posteriores en una llamada no cambian. ¿Para qué sirve este parámetro?

Dame un ejemplo de código para entender bien la pregunta.
 
Alexander Voronkov:
Dame un código de ejemplo para entender bien la pregunta.

esto funciona bien:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer, 0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

esto no funciona bien:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer, 300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

 
Sergey Efimenko:

esto funciona bien:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

esto no funciona normalmente:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

Para ahorrartiempo y contar sólo las últimas 300(barras del gráfico) utilice los operadores for() o if().
 
Alexander Voronkov:
Para ahorrartiempo y contar sólo las últimas 300(barras en el gráfico) utilice los valores de los operadores for() o if().

Cómo puedo decir esto con delicadeza... ¿Tienes idea de lo que estás hablando? ¿Has utilizado alguna vez las funciones mencionadas en el título en tu código y has intentado calcular parte de un array en lugar de todo el array? Bueno, pruébalo y quizá entiendas "visualmente" de qué estamos hablando. Su oferta es relevante cuando se calculan barras u otras situaciones en las que se puede especificar explícitamente cuánto contar, pero no para un array que utilice estas funciones. La parte del código anterior es absolutamente idéntica, la única diferencia es que en el primer caso estoy contando todo el array, y en el segundo sólo cuento 300 de sus valores, pero los valores se cuentan al final del array, mientras que las referencias se usan al principio. Tal vez no estoy describiendo la situación con claridad, pero el código ayudará a ver esto si lo adjuntas a algún indicador y comparas el resultado...

PS Acerca de la versión "auto-escrito" de análogos de funciones alternativas es claro, pero me gustaría obtener el resultado requerido por medio de un lenguaje.

 
Sergey Efimenko:

Cómo puedo decir esto con delicadeza... ¿Tienes idea de lo que estás hablando? ¿Has utilizado alguna vez las funciones mencionadas en el título en tu código y has intentado calcular parte de un array en lugar de todo el array? Bueno, pruébalo y quizás entiendas "visualmente" de qué estamos hablando. Su oferta es relevante cuando se calculan barras u otras situaciones en las que se puede especificar explícitamente cuánto contar, pero no para un array que utilice estas funciones. La parte del código anterior es absolutamente idéntica, la única diferencia es que en el primer caso estoy contando todo el array, mientras que en el segundo sólo cuento 300 de sus valores, pero los valores se cuentan al final del array, mientras que las referencias se usan al principio. Tal vez no estoy describiendo la situación con claridad, pero el código ayudará a ver esto si lo adjuntas a algún indicador y comparas el resultado...

PS Acerca de la versión "autoescrito" de análogos de funciones alternativas está claro, pero me gustaría obtener el resultado deseado por medio de un lenguaje.

Dígalo como es, está bien.

Así que te he entendido mal.

 
¿Nadie utiliza estas funciones y se enfrenta a esta situación?
 
Sergey Efimenko:

esto funciona bien:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

esto no funciona normalmente:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

¿Cuál es el resultado esperado y cómo debería funcionar normalmente?
 
Alexey Viktorov:
¿Cuál es el resultado esperado y cómo debería funcionar normalmente?
¿Qué quieres decir, qué espero? Escribí arriba, que necesito los últimos (actuales) 300 valores reales, y no los 300 primeros (iniciales), además, que accedo a un array en el offset 299-0, pero obtengo los datos en el offset desde el "final del array" hasta el "final del array - 300" valores (en mi caso desde 4999 hasta 4700), lo que significa, que en el offset 299 está el valor que debería estar en el offset 4999 y de forma similar en el offset 0 está el valor, que debería estar en el offset 4700. Al reducir el número de cálculos de la matriz, es importante obtener no los datos históricos iniciales, sino los datos actuales; la pregunta es ¿para qué se calculan los valores más antiguos, mientras que los actuales no se calculan?
 
Sergey Efimenko:
¿Cómo que qué espero? Escribí que necesito 300 valores reales últimos (actuales), no 300 primeros (iniciales), además, que acceda a un array en el offset 300-0, pero que obtenga datos en el offset de los valores de "fin de array" a "fin de array - 300" (en mi caso de 4999 a 4700), es decir, en el offset 300 está el valor que debería estar en el offset 4999 y del mismo modo en el offset 0 está el valor que debería estar en el offset 4700. Al reducir el número de cálculos de la matriz, es importante obtener los datos actuales en lugar de los datos históricos iniciales, la pregunta es ¿para qué sirve calcular los valores más antiguos cuando no se calculan los valores actuales?

¿AyudaArraySetAsSeries()?

Una vez me enfrenté a algo así: no pude ganar, así que me rendí. Lo hice sin iMAOnArray().

 
Artyom Trishkin:

¿Ayuda ArraySetAsSeries()?

Una vez me enfrenté a algo así: no pude ganar, así que me rendí. Lo hice sin iMAOnArray().

Ese es el problema: el array es inicialmente un buffer "en serie". El problema está en limitar el número de cálculos, como ya escribí, los datos son normales cuando se utiliza el cálculo de toda la matriz pero se ralentiza el terminal durante la inicialización y aún más cuando se utilizan varios indicadores para diferentes marcos temporales, por no hablar de la optimización de un EA para dicho indicador; el problema es de naturaleza interna de MT4, es decir, la única solución es utilizar mi propio análogo de las funciones especificadas pero quiero evitarlas

PD Yo también uso mi propio análogo de iMAOnArray, pero no seré sólo yo quien tenga el código fuente. Aunque es posible usar librerías e iBands también es necesario, pero habrá que hacer el cálculo de las desviaciones. En general, es una pena que esta sea la situación de las funciones estándar.

Razón de la queja: