2012-12-03 6 views
1

Je cherche à implémenter une moyenne mobile exponentiellement pondérée avec une fenêtre glissante en utilisant des données que je tire d'un grand ensemble de données.moyenne pondérée exponentiellement C++ imbriquée pour des boucles

Le code fonctionne mais les résultats ne sont définitivement pas ce qu'ils devraient être et je n'arrive pas à comprendre pourquoi. Voici mon code et s'il vous plaît me donner de bons détails à ce que je fais exactement mal:

for(unsigned int i = window; i< close_price.size(); i++) 
{ 
    double tmp3; 
    double tmp4; 
    for(int j = 0; j < window; j++) 
    { 
      tmp3 += pow(lambda,j) * pow(close_price[i-j], 2); 
      tmp4 += pow(close_price[i-j], 2); 
      if(j == window-1) 
      { 
       double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3); 
       ewma.push_back(sqrt(temp)); 
       sma.push_back(tmp4/window); 
      } 
      tmp3 = 0; 
      tmp4 = 0; 
    } 
} 
+4

C'est une indentation bancale juste là. – Borgleader

+0

@Borgleader Il y a plus d'un style de retrait et tant que l'on est cohérent, il n'y a vraiment pas de vrai ou de faux ici. Aucune raison pour les arguments religieux sur SO. – Voo

+0

Non, il n'était pas aligné, encore une accolade est mal placée, je n'ai pas réussi à corriger tous comme je viens de le remarquer. :) –

Répondre

2

Fondamentalement, le problème est que TMP3 et TMP4 ne sont pas initialisés, si TMP3 + = bla a un résultat indéfini.

La façon dont je vois votre code maintenant, il devrait ressembler à ceci:

for(size_t i = window; i< close_price.size(); i++) 
{ 
    double tmp3 = 0.0; 
    double tmp4 = 0.0; 
    for(size_t j = 0; j < window; j++) 
    { 
      tmp3 += pow(lambda,j) * pow(close_price[i-j], 2); 
      tmp4 += pow(close_price[i-j], 2); 
    } 
    double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3); 
    ewma.push_back(sqrt(temp)); 
    sma.push_back(tmp4/window); 
} 

Explication: il n'y a pas besoin de l'supplémentaire si dans la boucle, comme la dernière valeur de j sera window-1 de toute façon, tmp3 et tmp4 doivent être initialisés à chaque démarrage de la boucle i. Le type de size() est size_t int non signé, le cas échéant.

+0

Merci, je ne pouvais pas voir ce qui n'allait pas. –

Questions connexes