Saturday, 7 January 2017

Moving Moyenne Filtre C + +

Dans mon application de négociation, j'ai des tiques vivantes des cours des actions. J'ai besoin de maintenir SMA. Supposons que je veux SMA de 20 bougies, où la durée de chaque bougie est de 10 secondes. Cela signifie que toutes les 10 secondes, j'ai checkpoint où: Je ferme la bougie actuelle et stocker le prix moyen pour les 10 dernières secondes. La moyenne est (max - min) 2 Je commence une nouvelle bougie et stocker le dernier prix. Je nettoie la bougie obsolète. Je met à jour le dernier prix de la bougie formant le courant et recalcule SMA. Donc sur n'importe quelle coche je dois recalculer SMA. Dans la plupart des cas seulement le prix de la dernière bougie est changé (cause nous utilisant le dernier prix). Une fois par 10 secondes, j'ai besoin d'un peu plus de travail supplémentaire - je dois oublier la moyenne de la chandelle obsolète, et stocker la moyenne de la bougie juste créé. Pouvez-vous suggérer la façon de mettre en œuvre ce avec la latence la plus faible Faible latence est l'exigence principale. A demandé Apr 28 14 at 10:21 Je ne sais pas si c'est l'approche que vous cherchez, mais voici le pseudocode pour SMAs très rapide. Moyenne mobile simple: Je suppose que vos données viennent sous la forme d'un flux et stockées en mémoire continue (au moins avec des adresses mappables en continu) De cette façon avec deux additions et une multiplication (avec 12000), vous pouvez générer des moyennes mobiles subséquentes pour Les nouvelles tiques. Moyenne mobile exponentielle: C'est une alternative décente, comme mentionné ci-dessus: Ici, ce n'est pas vraiment une moyenne mobile de N jours. C'est juste une moyenne mobile pondérée avec 87 weightage aux N derniers jours, donc presque N-jours est plus comme lui. Note sur les optimisations du compilateur: Notez que l'activation des options SSE ou AVX si disponibles permet d'accélérer massivement ces algorithmes car plusieurs calculs peuvent être effectués en un seul cycle CPU. Est-il possible d'implémenter une moyenne mobile en C sans la nécessité de 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 ne pas besoin d'un tampon serait agréable. 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. Ensuite, j'ajoute 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épondu 16 nov 16 à 23:03 initialiser total 0, count0 (chaque fois que vous voyez une nouvelle valeur Puis une entrée (scanf), un add totalValeur, un incrément (comptage), une moyenne de division (totalcount) Ce serait une moyenne mobile 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 Bon si toutes les entrées étaient positives pour rendre le calcul moyen répondu Feb 3 15 à 4:06 Cela va effectivement calculer la moyenne totale et PAS la moyenne mobile. 3 15 at 13:53 Votre réponse 2017 Stack Exchange, Inc


No comments:

Post a Comment