Calcul des différences, exemples. - page 4

 
Yousufkhodja Sultonov:

Lorsque vous augmentez l'échantillon à N=100, l'équation du 4ème degré donne le résultat suivant :



Mathématiquement parlant, les limites de votre recherche sont très floues. Pouvez-vous nous expliquer à quoi cela ressemble ?

 
Nikolai Semko:

Oui, je me suis trompé. Je pensais que vous utilisiez vraiment l'approximation. J'ai regardé de plus près votre code et je me suis rendu compte qu'il ne s'agit pas d'une approximation, mais simplement d'une moyenne triviale, bien que très inhabituelle. Ensuite, vous déplacez la ligne violette et la ligne rouge de 72 barres vers la gauche et vous finissez de dessiner la queue rouge de 92 barres, et elle est redessinée à chaque nouvelle barre. La ligne bleue est formée à partir de la ligne violette décalée. Et d'ailleurs, il est plus correct d'utiliser le prix de clôture plutôt que le prix d'ouverture. Si vous passez à la fermeture, vous pouvez immédiatement voir qu'à chaque tick la queue rouge des 92 barres saute.

Déplacer les moyennes mobiles vers la gauche n'a aucune utilité et aucune application pratique. Il ne sert qu'à la beauté, à la tenue et au charme.

Nous devons comprendre la différence entre approximation et lissage (moyenne). L'approximation calcule les coefficients d'une fonction (polynôme, Fourier, Bézier, spline, etc.) sur un intervalle de données donné et ces coefficients changent en règle générale tout lorsque au moins une valeur de données change, la fonction est donc redessinée sur l'intervalle de données observé. Mais dans le cas du moyennage, on ne considère qu'un seul point actuel sur la base des données précédentes ; par conséquent, le moyennage (lissage) n'est pas redessiné, mais il est toujours en retard sur les données, contrairement à l'approximation.
Et je ne comprends pas ce que le polynôme d'un certain degré et le binôme de Newton ont à voir avec cela, s'il n'y a même pas de degrés dans le code.

))

Uh-huh, et maintenant aussi une sinusoïde sans fonction Sin explicite.

L'équation de différence pour le sinus: 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] ;  }}

Le calcul des ondes sinusoïdales de période 144 est mis en évidence. La première est proche de la constante (en vert sur la figure), la seconde est proche de la ligne inclinée (en rouge sur la figure).

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

J'aurais probablement dû joindre tout de suite une "liste de lecture" à la branche. ))

Il existe une abondante littérature sur le sujet, je vous proposerai donc quelques ouvrages minces à mon goût :

Calcul des différences finies par Leonid Kuzmich Lakhtin.

Séquences de retour de l'I.A. Markushevich

 
Aleksey Panfilov:

))

Uh-huh, et maintenant aussi une sinusoïde sans fonction Sin explicite.

L'équation de différence pour le sinus: https://dxdy.ru/post1247421.html#p1247421

Le calcul des sinusoïdes de période 144 est mis en évidence. La première est proche de la constante (en vert sur la figure), la seconde est proche de la ligne inclinée (en rouge sur la figure).


Merci, Alexey, pour la littérature. J'admets que la récursion peut être utile et appliquée avec succès pour accélérer certaines fonctions ou algorithmes, mais à vrai dire, je n'en suis pas si sûr.
Je préconise simplement d'appeler les choses par leur nom et d'utiliser une terminologie conventionnelle, afin d'éviter toute confusion. A mon avis, il aurait été plus logique de mentionner la récursion au début de ce fil, et de ne pas mentionner l'interpolation, l'approximation et les polynômes, car ils ne sont pas montrés dans votre exemple. Et il aurait mieux valu se concentrer sur le déplacement de l'indicateur vers la gauche, afin de ne pas induire les autres en erreur par une correction excessive des formes, car tout le monde n'aime pas comprendre le code des autres, je suis aussi tombé dans le panneau.

Alexey, d'après ce que j'ai compris, vous êtes un pro en matière de récursion. Personnellement, je n'y connais rien. J'ai une question, une demande et une suggestion. Pouvez-vous utiliser vos méthodes pour accélérer l'approximation par la méthode de Fourier ? Quelque chose me dit que c'est possible. Si vous pouvez le faire, ce sera wow ! !! et l'utilisation pratique sera énorme. Je joins un exemple d'approximation avec extrapolation de Fourier sur MT5 (cela fonctionne beaucoup plus rapidement et simplement mieux). J'ai pris cet exemple ici et je l'ai un peu amélioré pour plus de clarté en ajoutant le contrôle de la souris avec la touche Ctrl (qui change la position de départ) et Shift (qui change la période d'observation avec le changement simultané du nombre d'harmoniques). Pouvez-vous faire un essai ?

Cet indicateur est le suivant : tout d'abord, cliquez sur le graphique avec la souris (pour activer la fenêtre), appuyez sur Ctrl (et relâchez-la) et déplacez la souris pour changer la position de départ ; pour terminer le processus, appuyez sur n'importe quelle touche (sauf Ctrl et Shift). Il en va de même pour la touche Shift qui permet de modifier la période (intervalle de barres pour la fonction d'approximation).

Dossiers :
Fourier.mq5  16 kb
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Calcul des différences, exemples.

Nikolai Semko, 2018.01.12 00:43


Je préconise simplement d'appeler les choses par leur nom et d'utiliser une terminologie généralement acceptée, afin d'éviter toute confusion. A mon avis, il aurait été plus logique de mentionner la récursion au début de ce fil, et de ne pas mentionner l'interpolation, l'approximation et les polynômes, car ils ne sont pas montrés dans votre exemple. Et il aurait été plus correct de se concentrer sur le déplacement de l'indicateur vers la gauche, afin de ne pas induire les autres en erreur par une correction excessive des formes, car tout le monde n'aime pas regarder dans le code des autres, je m'y étais laissé prendre aussi.


Nikolaï, merci pour le post et l'indicateur joint.

Et je suis tout à fait d'accord, tout d'abord il devrait y avoir une compréhension sans ambiguïté des termes et des noms.

Permettez-moi d'expliquer ma position.

Vous pouvez tracer une ligne entre deux points, ce qui signifie que vous pouvez trouver n'importe quel point de cette ligne soit à l'intérieur de l'intervalle entre les points (interpolation), soit à l'extérieur de l'intervalle entre les points (extrapolation).

Vous pouvez dessiner une courbe à valeur unique correspondant, par exemple, à une parabole carrée qui, dans le système de coordonnées cartésiennes, est exprimée par une équation linéaire au carré. Cela signifie qu'il est également possible de trouver n'importe quel point de cette courbe soit dans l'intervalle entre les points extrêmes (interpolation), soit en dehors de cet intervalle (extrapolation). La loi selon laquelle ces points sont tracés reste polynomiale. J'ajouterai qu'il est possible, au moins par trois points, de dessiner sans ambiguïté une onde sinusoïdale, si l'on suppose une loi sinusoïdale, ou un cercle, si l'on suppose sa présence.

Ainsi l'interpolation par un polynôme du second degré sur trois points (dans notre cas, deux d'entre eux accumulent l'histoire précédente et le troisième porte de nouvelles informations) du quatrième, s'avère être une définition nécessaire (il peut y avoir d'autres lois) et suffisante de l'action ou du processus.

À moins, bien sûr, que vous ne suggériez d'autres termes pour le désigner.

Cela dit, je suis tout à fait d'accord pour dire que si l'on veut tracer une courbe en fonction du nombre de valeurs dépassant le nombre minimum requis, il faut utiliser des méthodes statistiquement (ou autrement) solides pour pondérer les valeurs, y compris la régression.
 
Aleksey Panfilov:


Nikolaï, merci pour le post et l'indicateur joint.

Et je suis tout à fait d'accord, il faut tout d'abord bien comprendre les termes et les noms.

Permettez-moi d'expliquer ma position.

On peut tracer une ligne sur deux points, cela signifie trouver n'importe quel point de cette ligne, soit à l'intérieur de l'intervalle entre les points (interpolation), soit à l'extérieur de l'intervalle entre les points (extrapolation).

Vous pouvez dessiner une courbe à valeur unique correspondant, par exemple, à une parabole carrée qui, dans le système de coordonnées cartésiennes, est exprimée par une équation linéaire au carré. Cela signifie qu'il est également possible de trouver n'importe quel point de cette courbe soit dans l'intervalle entre les points extrêmes (interpolation), soit en dehors de cet intervalle (extrapolation). La loi selon laquelle ces points sont tracés reste polynomiale. J'ajouterai qu'il est possible, au moins par trois points, de dessiner sans ambiguïté une onde sinusoïdale, si l'on suppose une loi sinusoïdale, ou un cercle, si l'on suppose sa présence.

Ainsi l'interpolation par un polynôme du second degré sur trois points (dans notre cas, deux d'entre eux accumulent l'histoire précédente et le troisième porte de nouvelles informations) du quatrième, s'avère être une définition nécessaire (il peut y avoir d'autres lois) et suffisante de l'action ou du processus.

À moins, bien sûr, que vous ne suggériez d'autres termes pour le désigner.

Cela dit, je suis tout à fait d'accord pour dire que si vous devez tracer une courbe pour un nombre de valeurs supérieur au nombre minimum requis, vous devez utiliser des méthodes de pondération des valeurs justifiées statistiquement (ou autrement), y compris la régression.

Comment construire une courbe polynomiale par trois points J'ai récemment mis en œuvre dans ce code . Je vous suggère d'y jeter un coup d'œil.

Mais votre code ne calcule pas le polynôme par trois points :

Aleksey Panfilov:

Ça ressemble à ça sur le graphique :

La ligne bleu-rouge est une interpolation (trouver un point dans un intervalle) par un polynôme de 4ème degré avec un épaulement 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 ligne bleue fine est l'extrapolation (trouver un point en dehors de l'intervalle) par le polynôme de degré 2 avec un levier 78.

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

La ligne rouge est la ligne de construction du polynôme de puissance 4. Il est redessiné et basé sur le point d'ouverture de la dernière barre.

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];  }}


Ce que vous appelez un polynôme du 2ème degré et un polynôme du 4ème degré ne sont pas des polynômes.

Puisque la formule pour un polynôme du 2ème degré

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

mais la formule d'un polynôme du 4ème degré :

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

a,b,c,d,f - coefficients à calculer

i est le numéro de la barre.

Et vous disposez d'une méthode de calcul de la moyenne très élaborée, dans laquelle (en utilisant l'exemple de ce que vous appelez un polynôme de degré 2) le point actuel d'une ligne i est calculé à partir des trois derniers points (i,i+1 et i+2) d'une autre ligne avec des coefficients de pondération différents. C'est ce qu'on appelle le moyennage (ou lissage). C'est pourquoi vous avez déplacé le graphique de 72 barres vers la gauche afin de masquer le décalage qui résulte du calcul de la moyenne.

Dans monexemple, le calcul du polynôme par trois points est clairement visible.

 
Nikolai Semko:

Dans monexemple, cependant, le calcul du polynôme sur les trois points est clairement et nettement visible.

Votre indicateur est très bon.

Si vous avez le même pour un quatre, alors attachez-le à trois points quelconques de la ligne indicatrice grise du post 23 de ce fil.

Cette ligne (grise) est calculée dans le tampon :

 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 - équation de différence d'une parabole du second degré. Pour les points équidistants.
 
Aleksey Panfilov:

Votre indicateur est très bon.

Si vous avez le même pour un quatre, attachez-le à trois points quelconques de la ligne indicatrice grise du post 23 de ce fil.

Cette ligne (grise) est calculée dans le tampon :

1*Y1-3*Y2+3*Y3-1*Y4=0 est l'équation différentielle d'une parabole du second degré. Pour les points équidistants.

J'ai le code pour MT4 plus bas dans les commentaires.

Oui, la ligne grise que vous avez est un polynôme. Et la queue rouge de la barre 92 du message 2 que vous redessinez à la moyenne décalée est aussi un polynôme et est juste redessinée. Mais vous appelez tout le reste un polynôme et prétendez en même temps que votre polynôme n'est pas redessiné. Et ce n'est pas le cas. C'est pourquoi je vous demande d'appeler les choses par leur nom.

Et d'ailleurs, dans mon exemple, la formation des points suivants dans le polynôme se fait par le calcul des coefficients et cet algorithme est plus rapide que votre "calcul de différence", bien que j'applique aussi la différence avec la valeur précédente :

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

votre choix :

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:

J'ai le code pour MT4 plus bas dans les commentaires.

Oui, la ligne grise que vous avez est un polynôme. Et la queue rouge des 92 barres du 2ème message, que vous tirez vers la moyenne décalée, est également un polynôme et elle est surdimensionnée. Mais vous appelez tout le reste un polynôme et prétendez en même temps que votre polynôme n'est pas redessiné. Et ce n'est pas le cas. C'est pourquoi je vous demande d'appeler les choses par leur nom.


Oui, je suis d'accord avec le polynôme du second degré, seulement 4 points impliqués dans la construction, ou 6 points pour le polynôme du quatrième degré. La ligne entière obtenue et non redessinée n'est bien sûr pas un polynôme, elle est seulement construite dans les cas considérés en utilisant un polynôme d'un certain degré.

Les lignes fines visualisent uniquement les polynômes avec lesquels le point suivant est construit.

On dirait qu'on est d'accord sur les termes. :)


Et d'ailleurs, dans mon exemple, la formation des points suivants du polynôme se fait par le calcul des coefficients et cet algorithme est plus rapide que votre "calcul des différences", bien que j'applique aussi la différence avec la valeur précédente :

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

votre choix :

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 ce qui concerne la vitesse, vous avez probablement raison.

Je suggère que nous n'abordions pas les questions de vitesse et probablement de négligence (la mienne en premier lieu :)) ) dans le codage, bien sûr, s'ils ne sont pas critiques.

 
Nikolai Semko:

Pouvez-vous utiliser vos méthodes pour accélérer l'approximation de Fourier ? Quelque chose me dit que c'est possible. Si vous y parvenez, vous serez épaté et les avantages pratiques seront énormes. Je joins un exemple d'approximation avec extrapolation de Fourier sur MT5 (cela fonctionne beaucoup plus vite et simplement mieux). J'ai pris cet exemple ici et je l'ai un peu amélioré pour plus de clarté en ajoutant le contrôle de la souris avec la touche Ctrl (qui change la position de départ) et Shift (qui change la période d'observation avec le changement simultané du nombre d'harmoniques). Pouvez-vous faire un essai ?

Cet indicateur est le suivant : tout d'abord, cliquez sur le graphique avec la souris (pour activer la fenêtre), appuyez sur Ctrl (et relâchez-la) et déplacez la souris pour changer la position de départ ; pour terminer le processus, appuyez sur n'importe quelle touche (sauf Ctrl et Shift). Même chose avec la touche Shift pour changer la période (intervalle de barres pour calculer la fonction d'approximation).


En ce qui concerne Fourier, le sujet est riche. S'il y a un intérêt, nous y toucherons de temps en temps.

Le plus souvent, les principales questions découleront de l'énoncé du problème (en raison de l'autre méthode). Maintenant, d'après ce que je comprends, l'indicateur sélectionne les fréquences ayant le plus d'amplitude dans le spectre de Fourier.

J'ai eu l'idée de visser l'indicateur deFourier à une ligne polynomiale déjà moyennée. Je soupçonne que ses relevés extrapolés changeront plus lentement.

Raison: