Advertisement
joker546645

Moving Average Convergence / Divergence

Feb 28th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<iostream>
  2. #include<array>
  3. #include<fstream>
  4. #include<vector>
  5. #include<iomanip>
  6.  
  7. template<class T>
  8. void mult(T&);
  9. double macd(const std::array<double, 26>&, const std::vector<double>&, const std::array<double, 12>&, int);
  10. double signal(const std::array<double, 974>&, const std::array<double, 9>&, int);
  11.  
  12. int main()
  13. {
  14.     std::vector<double> data;
  15.     data.reserve(1000);
  16.  
  17.     std::fstream file;
  18.  
  19.     file.open("dane.txt", std::ios::in);
  20.     double tmp;
  21.     while (file >> tmp)
  22.         data.emplace_back(tmp);
  23.     file.close();
  24.  
  25.     std::array<double, 26> backward26;
  26.     std::array<double, 12> backward12;
  27.     std::array<double, 9> backward9;
  28.     std::array<double, 965> signalArray;
  29.     std::array<double, 974> macdArray;
  30.  
  31.     mult(backward26); mult(backward12); mult(backward9);
  32.  
  33.     for (int i = 0; i < macdArray.max_size(); i++)
  34.         macdArray[i] = macd(backward26, data, backward12, i+27);
  35.  
  36.     for (int i = 0; i < signalArray.max_size(); i++)
  37.         signalArray[i] = signal(macdArray, backward9, i + 10);
  38.  
  39.     std::fstream macdFile, signalFile;
  40.     macdFile.open("macd.txt", std::ios::out);
  41.     signalFile.open("signal.txt", std::ios::out);
  42.    
  43.     for (int i = 0; i < signalArray.max_size(); i++) {
  44.         macdFile << std::fixed << std::setprecision(5) << macdArray[i + 9] << std::endl;
  45.         signalFile << std::fixed << std::setprecision(5) << signalArray[i] << std::endl;
  46.     }
  47.    
  48.    
  49.     macdFile.close();
  50.     signalFile.close();
  51.  
  52.     return 0;
  53. }
  54.  
  55. template<class T>
  56. void mult(T& array) {
  57.     double alfa = 1.0 - (2.0 / (array.max_size() - 1));
  58.     array.fill(alfa);
  59.     for (int i = 1; i < array.max_size(); i++)
  60.         array.at(i) = array.at(i - 1) * array.front();
  61. }
  62.  
  63. double macd(const std::array<double,26>& backward26, const std::vector<double>& data, const std::array<double,12>& backward12, int place) {
  64.     place -= 2;
  65.     double ema12 = data[place + 1], ema26 = data[place + 1];
  66.  
  67.     double tmp = 1;
  68.     for (int i = 0; i < 26; i++)
  69.         ema26 += (data[place - i] * backward26[i]);
  70.     for (int i = 0; i < 26; i++)
  71.         tmp += backward26[i];
  72.     ema26 /= tmp;
  73.  
  74.     tmp = 1;
  75.     for (int i = 0; i < 12; i++)
  76.         ema12 += (data[place - i] * backward12[i]);
  77.     for (int i = 0; i < 12; i++)
  78.         tmp += backward12[i];
  79.     ema12 /= tmp;
  80.  
  81.     return (ema12 - ema26);
  82. }
  83.  
  84. double signal(const std::array<double, 974>& macdArray, const std::array<double, 9>& backward9, int place) {
  85.     place -= 2;
  86.     double sig = macdArray[place + 1];
  87.  
  88.     double tmp = 1;
  89.     for (int i = 0; i < 9; i++)
  90.         sig += (macdArray[place - i] * backward9[i]);
  91.     for (int i = 0; i < 9; i++)
  92.         tmp += backward9[i];
  93.     sig /= tmp;
  94.     return sig;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement