Cálculo de diferencias, ejemplos. - página 4

 
Yousufkhodja Sultonov:

Cuando se aumenta la muestra a N=100, la ecuación de 4º grado da el siguiente resultado:



Matemáticamente hablando, los límites de su búsqueda son muy borrosos. ¿Podría explicar con más detalle cómo es?

 
Nikolai Semko:

Sí, me he equivocado. Pensaba que realmente estabas usando la aproximación. He mirado más detenidamente tu código y me he dado cuenta de que no es una aproximación, sino un promedio trivial, aunque muy poco habitual. A continuación, se desplaza la línea púrpura y la línea roja 72 barras hacia la izquierda y se termina de dibujar la cola roja de 92 barras, y se redibuja con cada nueva barra. La línea azul se forma a partir de la línea púrpura desplazada. Y por cierto, es más correcto utilizar el precio de cierre que el de apertura. Si se cambia al cierre, se puede ver inmediatamente que con cada tick salta la cola roja de 92 barras.

Desplazar las medias móviles hacia la izquierda no tiene ninguna utilidad ni aplicación práctica. Sólo sirve para la belleza, el ajuste y el encanto.

Tenemos que entender la diferencia entre aproximación y suavización (promedio). La aproximación calcula los coeficientes de una función (polinómica, Fourier, Bezier, spline, etc.) sobre un intervalo de datos determinado y estos coeficientes, por regla general, lo cambian todo cuando cambia al menos un valor de los datos, por lo que la función se redibuja sobre el intervalo de datos observado. Pero en el caso de la promediación, sólo se considera un punto actual sobre la base de los datos anteriores; por lo tanto, la promediación (alisamiento) no se vuelve a trazar, sino que siempre va por detrás de los datos, a diferencia de la aproximación.
Y no entiendo qué tienen que ver el polinomio de algún grado y el Binomio de Newton, si ni siquiera hay grados en el código.

))

Ajá, y ahora también una sinusoide sin una función Sin explícita.

La ecuación de diferencia para el seno:https://dxdy.ru/post1247421.html#p1247421

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  2701*a1_Buffer[i]   -5328   *a1_Buffer[i+1 ]    +  2628 *a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

      a3_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a3_Buffer[i+0+z]=  2.998096443*a3_Buffer[i+1+z]  -  2.998096443*a3_Buffer[i+2+z]   +   1*a3_Buffer[i+3+z]   ;  }}

      a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}

      a6_Buffer[i+292]=a1_Buffer[i];   if(i<=1) { for(z=292-1;z>=0;z--){         a6_Buffer[i+0+z]=  3.998096443*a6_Buffer[i+1+z]  -  5.996192886*a6_Buffer[i+2+z]   +   3.998096443*a6_Buffer[i+3+z]  -  1*a6_Buffer[i+4+z] ;  }}

Se destaca el cálculo de las ondas sinusoidales con periodo 144. El primero está cerca de la constante (verde en la figura), el segundo está cerca de la línea inclinada (rojo en la figura).

Рекуррентная формула для синуса : Дискуссионные темы (М) - Страница 7
  • dxdy.ru
В принципе, используется и рекуррентное вычисление через возвратное уравнение второго порядка, и через комплексную экспоненту. Первое менее расходно по ресурсам (умножение и два сложения и две ячейки памяти) по сравнению со вторым (два умножения, четыре сложения, две ячейки памяти при постоянной частоте), но накапливается погрешность быстрее...
Archivos adjuntos:
 

Probablemente debería haber adjuntado una "lista de lectura" a la rama desde el principio. ))

Hay mucha literatura sobre el tema, por lo que voy a sugerir un par de libros delgados a mi gusto:

Cálculo de diferencias finitas por Leonid Kuzmich Lakhtin.

Secuencias de retorno de la I.A. Markushevich

 
Aleksey Panfilov:

))

Ajá, y ahora también una sinusoide sin una función Sin explícita.

La ecuación de diferencia para el seno:https://dxdy.ru/post1247421.html#p1247421

Se destaca el cálculo de las sinusoides con periodo 144. El primero está cerca de la constante (verde en la figura), el segundo está cerca de la línea inclinada (rojo en la figura).


Gracias, Alexey, por la literatura. Admito que la recursividad puede ser digna de atención y puede aplicarse con éxito para acelerar algunas funciones o algoritmos, pero a decir verdad no estoy tan seguro de ello.
Sólo defiendo que las cosas se llamen por su nombre y se utilice la terminología convencional, para que no haya confusión. En mi opinión, hubiera sido más lógico mencionar la recursión al principio de este hilo, y no mencionar la interpolación, la aproximación y los polinomios, ya que no se muestran en tu ejemplo. Y hubiera sido mejor centrarse en el desplazamiento del indicador hacia la izquierda, para no engañar a los demás por una excesiva corrección de las formas, porque no a todo el mundo le gusta entender el código de los demás, yo también caí en ello.

Alexey, por lo que tengo entendido eres un profesional en materia de recursividad. Personalmente no tengo ni idea. Tengo una pregunta, una petición y una sugerencia. ¿Puede utilizar sus métodos para acelerar la aproximación por el método de Fourier? Algo me dice que es posible. Si lo consigues, será ¡¡¡WOW!!! y el uso práctico será tremendo. Adjunto un ejemplo de aproximación con extrapolación de Fourier en MT5 (funciona mucho más rápido y simplemente mejor). Tomé este ejemplo de aquí y lo mejoré un poco, para mayor claridad, añadiendo el control del ratón con la tecla Ctrl (que cambia la posición inicial) y Shift (que cambia el período de observación con el cambio simultáneo del número de armónicos). ¿Puedes probarlo?

Este indicador es el siguiente: primero, haga clic en el gráfico con el ratón (para activar la ventana), pulse Ctrl (y suéltelo) y mueva el ratón para cambiar la posición inicial, para terminar el proceso, pulse cualquier tecla (excepto Ctrl y Shift). Lo mismo ocurre con la tecla Shift para cambiar el periodo (rango de barras para la función de aproximación).

Archivos adjuntos:
Fourier.mq5  16 kb
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Cálculo de diferencias, ejemplos.

Nikolai Semko, 2018.01.12 00:43


Simplemente defiendo que las cosas se llamen por su nombre y que se utilice la terminología generalmente aceptada, para que no haya confusión. En mi opinión, hubiera sido más lógico mencionar la recursión al principio de este hilo, y no mencionar la interpolación, la aproximación y los polinomios, ya que no se muestran en tu ejemplo. Y hubiera sido más correcto centrarse en el desplazamiento del indicador hacia la izquierda, para no engañar a los demás por la excesiva corrección de las formas, porque no a todo el mundo le gusta mirar en el código de los demás, yo también había caído.


Nikolai, gracias por el post y el indicador adjunto.

Y estoy completamente de acuerdo, en primer lugar es necesario que los términos y los nombres se entiendan sin ambigüedades.

Permítanme explicar mi posición.

Se puede trazar una línea por dos puntos, lo que significa que se puede encontrar cualquier punto de esta línea tanto dentro del intervalo entre los puntos (interpolación) como fuera del intervalo entre los puntos (extrapolación).

Se puede dibujar una curva de un solo valor correspondiente, por ejemplo, a una parábola cuadrada expresada en un sistema de coordenadas cartesianas por una ecuación cuadrática lineal. Esto significa que también es posible encontrar cualquier punto de esta curva dentro del intervalo entre puntos extremos (interpolación) o fuera de este intervalo (extrapolación). La ley según la cual se trazan estos puntos sigue siendo polinómica. También debo añadir que, al menos por tres puntos, es posible dibujar una onda sinusoidal de un solo valor, si suponemos una ley sinusoidal, o un círculo, si suponemos su presencia.

Así, la interpolación por un polinomio de segundo grado sobre tres puntos (en nuestro caso, dos de los cuales acumulan la historia anterior y el tercero lleva información nueva) del cuarto, resulta ser una definición necesaria (puede haber otras leyes) y suficiente de la acción o proceso.

A menos que, por supuesto, sugieras otros términos para ello.

Dicho esto, estoy totalmente de acuerdo en que si se quiere trazar una curva por el número de valores que superan el número mínimo exigido, hay que utilizar métodos estadísticos (o de otro tipo) para ponderar los valores, incluida la regresión.
 
Aleksey Panfilov:


Nikolai, gracias por el post y el indicador adjunto.

Y estoy completamente de acuerdo, en primer lugar se necesita una comprensión clara de los términos y nombres.

Permítanme explicar mi posición.

Trazar una línea sobre dos puntos, significa encontrar cualquier punto de esta línea, ya sea dentro del intervalo entre los puntos (interpolación), o fuera del intervalo entre los puntos (extrapolación).

Se puede dibujar una curva de un solo valor correspondiente, por ejemplo, a una parábola cuadrada que en el sistema de coordenadas cartesianas se expresa mediante una ecuación lineal-cuadrada. Esto significa que también es posible encontrar cualquier punto de esta curva dentro del intervalo entre puntos extremos (interpolación) o fuera de este intervalo (extrapolación). La ley según la cual se trazan estos puntos sigue siendo polinómica. También debo añadir que, al menos por tres puntos, es posible dibujar una onda sinusoidal inequívoca, si asumimos una ley sinusoidal, o un círculo, si asumimos su presencia.

Así, la interpolación por un polinomio de segundo grado sobre tres puntos (en nuestro caso, dos de los cuales acumulan la historia anterior y el tercero lleva información nueva ) del cuarto, resulta ser una definición necesaria (puede haber otras leyes) y suficiente de la acción o proceso.

A menos que, por supuesto, sugieras otros términos para ello.

Dicho esto, estoy totalmente de acuerdo en que si se necesita trazar una curva para un número de valores superior al mínimo requerido, hay que utilizar métodos de ponderación de valores justificados estadísticamente (o de otro modo), incluida la regresión.

Cómo construir una curva polinómica por tres puntos que he implementado recientemente en este código . Te sugiero que le eches un vistazo.

Pero tu código no calcula el polinomio por tres puntos:

Aleksey Panfilov:

Se ve así en el gráfico:

La línea azul-roja es una interpolación (encontrar un punto dentro de un intervalo) mediante un polinomio de 4º grado con un hombro de 72.

a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

La línea azul delgada es la extrapolación (encontrar un punto fuera del intervalo) por el polinomio de grado 2 con palanca 78.

a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

La línea roja es la línea de construcción del polinomio de potencia 4. Se redibuja y se basa en el último punto de apertura de la barra.

a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


Lo que tú llamas polinomio de 2º grado y polinomio de 4º grado no son polinomios.

Como la fórmula de un polinomio de 2º grado

Price = a+b*i+c*i²

sino la fórmula de un polinomio de 4º grado:

Price = a+b*i+c*i²+d*i³+f*i⁴

donde

a,b,c,d,f - coeficientes a calcular

i es el número de barra.

Y tienes una forma de promediar muy ornamentada, en la que (usando el ejemplo de lo que llamas un polinomio de grado 2) el punto actual de una recta i se calcula a partir de los tres últimos puntos (i,i+1 e i+2) de otra recta con diferentes coeficientes de peso. Esto se llama promediar (o suavizar). Por eso ha desplazado el gráfico 72 barras hacia la izquierda para ocultar el desfase que se produce como consecuencia del promediado.

En miejemplo, el cálculo del polinomio por tres puntos es claramente visible.

 
Nikolai Semko:

En miejemplo, sin embargo, el cálculo del polinomio sobre los tres puntos se ve clara y nítidamente.

Su indicador es muy bueno.

Si tienes el mismo para un cuatro, entonces únelo a tres puntos cualesquiera de la línea indicadora gris del post 23 de este hilo.

Esta línea (gris) se calcula en el buffer:

 a5_Buffer[i+92]=a1_Buffer[i];   if(i<=1) { for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }}
1*Y1-3*Y2+3*Y3-1*Y4=0 - ecuación en diferencia de parábola de segundo grado. Para puntos equidistantes.
 
Aleksey Panfilov:

Su indicador es muy bueno.

Si tienes el mismo para un cuatro, entonces únelo a tres puntos cualesquiera de la línea indicadora gris del post 23 de este hilo.

Esta línea (gris) se calcula en el buffer:

1*Y1-3*Y2+3*Y3-1*Y4=0 es la ecuación en diferencia de una parábola de segundo grado. Para puntos equidistantes.

Tengo el código para MT4 más abajo en los comentarios

Sí, la línea gris que tienes es un polinomio. Y la cola roja de la barra del 92 desde el mensaje 2 que se redibuja a la media desplazada también es un polinomio y se acaba de redibujar. Pero tú llamas polinomio a todo lo demás y al mismo tiempo afirmas que tu polinomio no está redibujado. Y no lo hace. Por eso te pido que llames a las cosas por su nombre.

Y por cierto, en mi ejemplo la formación de los siguientes puntos en el polinomio se hace mediante el cálculo de los coeficientes y este algoritmo es más rápido que tu "cálculo de diferencias", aunque yo también aplico la diferencia con el valor anterior:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

su opción:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }
 
Nikolai Semko:

Tengo el código para MT4 más abajo en los comentarios

Sí, la línea gris que tienes es un polinomio. Y la cola roja de 92 barras del 2º mensaje, que dibujas a la media desplazada, también es un polinomio y está sobredimensionado. Pero tú llamas polinomio a todo lo demás y al mismo tiempo afirmas que tu polinomio no está redibujado. Y no lo hace. Por eso te pido que llames a las cosas por su nombre.


Sí, estoy de acuerdo con el polinomio de segundo grado, sólo 4 puntos involucrados en la construcción, o 6 puntos para el polinomio de cuarto grado. La línea completa que se obtiene y no se redibuja no es, por supuesto, un polinomio, sólo se construye en los casos considerados utilizando un polinomio de cierto grado.

Las líneas finas sólo visualizan los polinomios con los que se construye el siguiente punto.

Parece que estamos de acuerdo en los términos. :)


Y por cierto en mi ejemplo la formación de los siguientes puntos en el polinomio se hace mediante el cálculo de los coeficientes y este algoritmo es más rápido que tu "cálculo de diferencias", aunque yo también aplico la diferencia con el valor anterior:

for(i=1; i<=Bar[0]; i++) { ArcDownBuffer[i]=ArcDownBuffer[i-1]+D2; D2+=2*C2;}

su opción:

for(z=92-1;z>=0;z--){        a5_Buffer[i+0+z]=  3*a5_Buffer[i+1+z]  -  3*a5_Buffer[i+2+z]   +   1*a5_Buffer[i+3+z]   ;  }

En cuanto a la velocidad, probablemente tengas razón.

Sugiero que no toquemos los temas de la velocidad y probablemente la negligencia (la mía en primer lugar:)) ) en la codificación, por supuesto, si no son críticos.

 
Nikolai Semko:

¿Puedes utilizar tus métodos para acelerar la aproximación de Fourier? Algo me dice que es posible. Si lo consigues, será una maravilla... y los beneficios prácticos serán enormes. Adjunto un ejemplo de aproximación con extrapolación de Fourier en MT5 (funciona mucho más rápido y simplemente mejor). Tomé este ejemplo de aquí y lo mejoré un poco para mayor claridad añadiendo el control del ratón con la tecla Ctrl (que cambia la posición inicial) y Shift (que cambia el período de observación con el cambio simultáneo del número de armónicos). ¿Puedes probarlo?

Este indicador es el siguiente: primero, haga clic en el gráfico con el ratón (para activar la ventana), pulse Ctrl (y suéltela) y mueva el ratón para cambiar la posición inicial; para terminar el proceso, pulse cualquier tecla (excepto Ctrl y Shift). Lo mismo con la tecla Shift para cambiar el periodo (rango de barras para calcular la función de aproximación).


En cuanto a Fourier, el tema es rico. Si hay interés, lo tocaremos de vez en cuando.

Lo más probable es que las principales preguntas surjan del planteamiento del problema (debido al otro método). Ahora, según tengo entendido, el indicador selecciona las frecuencias de mayor amplitud del espectro de Fourier.

Se me ocurrió atornillar el indicador deFourier a una línea polinómica ya promediada. Sospecho que sus lecturas extrapoladas cambiarán más lentamente.