Saturday, December 17, 2016

Moving Average Code In C

Est-il possible de mettre en œuvre une moyenne mobile en C sans la nécessité d'une fenêtre d'échantillons Ive trouvé que je peux optimiser un peu, en choisissant une taille de fenêtre thats une puissance de deux pour permettre le décalage de bits au lieu de diviser, mais pas besoin Un tampon serait bien. Existe-t-il un moyen d'exprimer un nouveau résultat de la moyenne mobile uniquement en fonction de l'ancien résultat et du nouvel échantillon Définir un exemple de moyenne mobile, à travers une fenêtre de 4 échantillons pour être: Ajouter un nouvel échantillon e: Une moyenne mobile peut être implémentée récursivement , Mais pour un calcul exact de la moyenne mobile, vous devez vous souvenir de l'échantillon d'entrée le plus ancien dans la somme (c'est-à-dire l'a dans votre exemple). Pour une longueur N moyenne mobile que vous calculez: où yn est le signal de sortie et xn est le signal d'entrée. Eq. (1) peut être écrit récursivement comme So Il faut toujours se souvenir de l'échantillon xn-N pour calculer (2). Comme l'a souligné Conrad Turner, vous pouvez utiliser une fenêtre exponentielle (infiniment longue) qui vous permet de calculer la sortie uniquement à partir de la sortie passée et de l'entrée courante: mais ce n'est pas une moyenne mobile standard (non pondérée) mais une valeur exponentielle (Au moins en théorie) vous n'oubliez jamais rien (les poids sont de plus en plus petits pour les échantillons loin dans le passé). J'ai mis en œuvre une moyenne mobile sans mémoire élément individuel pour un programme de suivi GPS que j'ai écrit. Je commence par 1 échantillon et diviser par 1 pour obtenir le courant avg. J'ajoute ensuite un autre échantillon et divise par 2 la valeur actuelle. Cela continue jusqu'à ce que j'arrive à la longueur de la moyenne. Chaque fois par la suite, j'ajoute dans le nouvel échantillon, obtenez la moyenne et retirez cette moyenne du total. Je ne suis pas un mathématicien, mais cela semblait être une bonne façon de le faire. J'ai pensé que cela transformerait l'estomac d'un vrai mec de maths, mais il s'avère que c'est l'un des moyens acceptés de le faire. Et ça marche bien. Rappelez-vous juste que plus votre longueur est plus lente, il suit ce que vous voulez suivre. Cela peut ne pas importe la plupart du temps, mais en suivant les satellites, si vous êtes lent, le sentier pourrait être loin de la position réelle et il sera mauvais. Vous pourriez avoir un écart entre le sat et les points de fuite. J'ai choisi une longueur de 15 mise à jour 6 fois par minute pour obtenir un lissage adéquat et ne pas trop loin de la position réelle sat avec les points de sentier lissée. Réponse Nov 16 à 23:03 initialiser total 0, count0 (à chaque fois de voir une nouvelle valeur Puis une entrée (scanf), un ajouter totalnewValue, un incrément (count), une diviser moyenne (total / count) Ce serait une moyenne mobile Sur toutes les entrées Pour calculer la moyenne sur les seules 4 dernières entrées, il faudrait 4 variables d'entrée, peut-être copier chaque entrée à une variable d'entrée plus ancienne, puis calculer la nouvelle moyenne mobile comme somme des 4 variables d'entrée, divisée par 4 Être bon si toutes les entrées étaient positifs pour rendre le calcul moyen répondu Feb 3 15 à 4:06 Cela va effectivement calculer la moyenne totale et PAS la moyenne mobile. Comme le comptage devient plus grand l'impact de tout nouvel échantillon de l'entrée devient petit ndash Hilmar Je sais que c'est réalisable avec boost comme par: Mais je voudrais vraiment éviter d'utiliser boost. Je suis googlé et ne trouve aucun des exemples appropriés ou lisibles. Maintenant, je veux suivre La moyenne mobile d'un flux continu d'un flot de nombres à virgule flottante utilisant les plus récents numéros 1000 comme échantillon de données. Quel est le moyen le plus simple pour atteindre ce que j'ai expérimenté avec l'aide d'un tableau circulaire, moyenne mobile exponentielle et une moyenne mobile plus simple et a constaté que les résultats de la matrice circulaire convenait mieux à mes besoins. Si vos besoins sont simples, vous pouvez simplement essayer d'utiliser une moyenne mobile exponentielle. Autrement dit, vous créez une variable d'accumulateur, et comme votre code regarde chaque échantillon, le code met à jour l'accumulateur avec la nouvelle valeur. Vous choisissez un alpha constant qui se situe entre 0 et 1, et calculez ceci: Il vous suffit de trouver une valeur de alpha où l'effet d'un échantillon donné ne dure que pour environ 1000 échantillons. Hmm, je ne suis pas sûr que ce soit approprié pour vous, maintenant que Ive mis ici. Le problème est que 1000 est une fenêtre assez longue pour une moyenne mobile exponentielle Im pas sûr il ya un alpha qui serait la propagation de la moyenne sur les 1000 derniers chiffres, sans underflow dans le calcul en virgule flottante. Mais si vous voulez une moyenne plus petite, comme 30 nombres ou ainsi, c'est une manière très facile et rapide de le faire. A répondu 12 juin à 4:44 1 sur votre poste. La moyenne mobile exponentielle peut permettre à l'alpha d'être variable. Ainsi, cela permet de calculer des moyennes de base de temps (par exemple, des octets par seconde). Si le temps écoulé depuis la dernière mise à jour de l'accumulateur est supérieur à 1 seconde, laissez alpha be 1.0. Sinon, vous pouvez laisser alpha be (usecs depuis la dernière mise à jour / 1000000). Ndash jxh 12 juin à 6:21 Je veux essentiellement suivre la moyenne mobile d'un flux continu d'un flux de nombres à virgule flottante en utilisant les plus récents numéros 1000 comme un échantillon de données. Notez que le dessous met à jour le total en tant qu'éléments ajoutés / remplacés, en évitant le coûteux parcours O (N) pour calculer la somme nécessaire pour la moyenne sur demande. Le total est fait d'un paramètre différent de T par rapport au support, par ex. En utilisant un long long pour un total de 1000 s longs, un int pour char s, ou un flottant double au total. C'est un peu vicié en ce que les numsamples pourraient dépasser INTMAX - si vous vous inquiétez vous pourriez employer un unsigned long long. Ou utiliser un membre de données bool supplémentaire pour enregistrer quand le conteneur est rempli tout en cyclant numsamples autour du tableau (mieux renommé quelque chose d'inoffensif comme pos). Répondue 12 juin à 5:19 on suppose que l'opérateur quotvoid (échantillon T) est effectivement opérateur quotvoid (T échantillon) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bien repéré. En fait, je voulais qu'il soit vide opérateur () (T échantillon), mais bien sûr, vous pouvez utiliser n'importe quelle note que vous avez aimé. Correction, merci. Ndash Tony D Jun 8 14 at 14: 27Je veux développer le calcul de la moyenne mobile des cours des actions. Mais des calculs très complexes ont été planifiés plus tard. Ma première étape pour savoir comment calculer Moyenne mobile efficacement. J'ai besoin de savoir comment prendre les données d'entrée et de retour efficacement. Date et Prix considérés. Date, Prix et Moyenne mobile. Si j'ai 500 enregistrements et je veux calculer Moyenne mobile pendant 5 jours, quelle est la manière effient au lieu d'aller et venir dans le tableau de Date et Prix encore s'il vous plaît sugest quelle est la meilleure façon de recevoir des entrées (ArrayList, Table, array Etc) et de retour de sortie. Note: Aujourd'hui MA de 5 jours sera la moyenne des 5 derniers jours, y compris le prix d'aujourd'hui. Hier MA sera la moyenne des 5 derniers jours d'hier. Je veux garder les jours pour être flexible au lieu de 5, il pourrait être 9, 14, 20 etc Jeudi 10 avril 2008 15:21 Si vous avez besoin de calcul simple sans votre effort que vous pouvez utiliser TA-Lib. Mais si vous voulez que votre calcul soit plus efficace que TA-Lib, vous pouvez créer votre propre indicateur technique. TA-Lib est grande, mais le problème est que cette bibliothèque ont seulement des méthodes statiques. Cela signifie que lorsque vous devez calculer des valeurs de tableau SMA basées sur 500 barres de prix, vous allez envoyer le tableau entier de barres et il retournera tableau des valeurs SMA. Mais si vous recevez une nouvelle valeur 501-st alors vous devriez envoyer à nouveau le tableau entier et TA-Lib calculera et renverra de nouveau SMA tableau des valeurs. Maintenant, imaginez que vous avez besoin d'un tel indicateur sur le prix réel de l'alimentation, et pour chaque changement de prix, vous avez besoin d'une nouvelle valeur indicateur. Si vous avez un indicateur n'est pas un gros problème, mais si vous avez des centaines d'indicateurs de travail, il pourrait être un problème de performance. J'étais dans une telle situation et commencer à développer des indicateurs en temps réel qui sont efficaces et faire des calculs supplémentaires pour la nouvelle barre de prix ou pour la barre des prix modifiés seulement. Unfortunatelly je n'ai jamais eu besoin d'indicateur SMA pour mes systèmes de trading, mais je l'ai pour EMA, WMA, AD, et d'autres. Un tel indicateur AD est publié sur mon blog et vous pouvez voir à partir de là quelle est la structure de base de ma classe d'indicateurs en temps réel. J'espère que vous aurez besoin de petits changements pour mettre en œuvre l'indicateur SMA, parce que c'est l'un des plus simples. La logique est simple. Pour calculer SMA, il vous suffit de n dernières valeurs de prix. Ainsi instance de classe aura collection de prix, qui stockeront garder seulement le dernier n nombre de prix que SMA est défini (dans votre cas 5). Donc, quand vous avez un nouveau bar, vous supprimez le plus ancien et ajoutez un nouveau et créez un calcul. Jeudi 10 avril 2008 16h04 Toutes les réponses Il ya une bibliothèque appelée TA-Lib qui fait tout cela pour vous et c'est open source. Il a environ 50 indicateurs, je pense. Nous l'avons utilisé dans l'environnement de production et il est très efficace et réaliste. Vous pouvez l'utiliser en C, Java, C, etc Si vous avez besoin de calcul simple sans votre effort que vous pouvez utiliser TA-Lib. Mais si vous voulez que votre calcul soit plus efficace que TA-Lib, vous pouvez créer votre propre indicateur technique. TA-Lib est grande, mais le problème est que cette bibliothèque ont seulement des méthodes statiques. Cela signifie que lorsque vous devez calculer des valeurs de tableau SMA basées sur 500 barres de prix, vous allez envoyer le tableau entier de barres et il retournera tableau des valeurs SMA. Mais si vous recevez une nouvelle valeur 501-st alors vous devriez envoyer à nouveau le tableau entier et TA-Lib calculera et renverra de nouveau SMA tableau des valeurs. Maintenant, imaginez que vous avez besoin d'un tel indicateur sur le prix réel de l'alimentation, et pour chaque changement de prix, vous avez besoin d'une nouvelle valeur indicateur. Si vous avez un indicateur n'est pas un gros problème, mais si vous avez des centaines d'indicateurs de travail, il pourrait être un problème de performance. J'étais dans une telle situation et commencer à développer des indicateurs en temps réel qui sont efficaces et faire des calculs supplémentaires pour la nouvelle barre de prix ou pour la barre des prix modifiés seulement. Unfortunatelly je n'ai jamais eu besoin d'indicateur SMA pour mes systèmes de trading, mais je l'ai pour EMA, WMA, AD, et d'autres. Un tel indicateur AD est publié sur mon blog et vous pouvez voir à partir de là quelle est la structure de base de ma classe d'indicateurs en temps réel. J'espère que vous aurez besoin de petits changements pour mettre en œuvre l'indicateur SMA, parce que c'est l'un des plus simples. La logique est simple. Pour calculer SMA, il vous suffit de n dernières valeurs de prix. Ainsi instance de classe aura collection de prix, qui stockeront garder seulement le dernier n nombre de prix que SMA est défini (dans votre cas 5). Donc, quand vous avez un nouveau bar, vous supprimez le plus ancien et ajoutez un nouveau et créez un calcul. Je calculer la moyenne mobile dans la base de données via une procédure stockée ou dans un cube. Avez-vous regardé Analysis Services, il a la possibilité de calculer les moyennes mobiles. Jeudi 10 avril 2008 16h05 Oui. TA-LIB est bon mais peut ne pas convenir pour moi. Lorsque j'ajoute une nouvelle valeur ou une valeur mise à jour pour l'historique des enregistrements, je ferai le calcul dans une fonction distincte uniquement pour cette nouvelle soumission et la stockerai dans la base de données. Je prévois de mettre à jour le devis toutes les heures. J'ai besoin de faire environ 25 à 30 indicateurs techniques pour 2200 stocks. Le temps d'exécution d'un appel TA-Lib sur un tableau de 10 000 éléments prend environ 15 millisecondes (sur un Intel Core Duo 2,13 Ghz). C'est la moyenne de toutes les fonctions. Parmi les plus rapides, SMA prend moins de 2,5 millisecondes. Le plus lent, HTTRENDMODE, prend 450 millisecondes. Avec moins d'éléments, il est plus rapide. SMA prend environ 0,22 millisecondes pour 1000 éléments d'entrée. Le gain de vitesse est presque linéaire (la surcharge de l'appel de fonction est négligeable). Dans le contexte de votre demande, TA-Lib est très peu susceptible d'être votre goulot d'étranglement pour la performance de vitesse. Aussi je ne recommande généralement pas une telle solution nquot quotlast. Lisez ci-dessous pour plus de détails. Tout d'abord, une correction à Boban. s déclaration Toutes les fonctions dans TA-Lib peut également calculer une seule dernière valeur en utilisant un minimum de quotlast éléments nquot. Vous pouvez avoir un tableau de taille 10000, initialiser les données uniquement pour les 500 premiers éléments, ajouter un élément et appeler TA-Lib pour calculer le SMA uniquement pour le nouvel élément. TA-Lib se tournera vers l'arrière pas plus que nécessaire (si SMA de 5, alors TA-Lib va ​​calculer un seul SMA en utilisant les 5 dernières valeurs). Ceci est rendu possible avec le paramètre startIdx et endIdx. Vous pouvez spécifier une plage à calculer ou une valeur unique. Dans ce scénario, vous feriez startIdx endIdx 500 pour calculer l'élément 501st. Pourquoi une telle solution nquot peut-elle être potentiellement dangereuse Quel que soit le choix de la solution Boban. s ou TA-Lib, considérons que l'utilisation d'un petit nombre fini de données passées ne fonctionnera pas bien avec la plupart des fonctions TA. Avec SMA, il est évident que vous avez juste besoin d'élément n pour calculer une moyenne sur l'élément n. Il n'est pas aussi simple avec EMA (et beaucoup d'autres fonctions TA). L'algo dépend souvent de la valeur précédente pour calculer la nouvelle valeur. La fonction est récursive. Cela signifie que toutes les valeurs passées ont une influence sur les valeurs futures. Si vous décidez de quotlimitquot votre algo pour n'utiliser qu'une petite quantité de n valeur passée, vous n'obtiendrez pas le même résultat que quelqu'un qui calcule sur un grand nombre de valeurs passées. La solution est un compromis entre vitesse et précision. J'ai souvent discuté de cela dans le contexte de TA-Lib (je l'appelle la période quotunstable dans la documentation et le forum). Pour simplifier, ma recommandation générale est que si vous ne pouvez faire la différence entre un algo avec une réponse impulsionnelle finie (FIR) à partir d'un algo avec une réponse impulsionnelle infinie (IIR), vous serez plus sûr de calculer sur toutes les données que vous avez disponible. TA-Lib spécifie dans le code lequel de ses fonctions a une période instable (IIR). Modifié par mfortier vendredi 15 août 2008 4:25 AM phrase correcte vendredi 15 août 2008 4:20 AM


No comments:

Post a Comment