58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#include <vector>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <cmath>
|
|
#include <algorithm>
|
|
|
|
double expavg(const std::vector<double> &values, int start, int n)
|
|
{
|
|
double a = 1 - 2./(n + 1);
|
|
|
|
double nominator = 0., denominator = 0.;
|
|
double b = 1.;
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
nominator += b*values[start - i];
|
|
denominator += b;
|
|
|
|
b *= a;
|
|
}
|
|
|
|
return nominator / denominator;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int low = 12, high = 26, s = 9;
|
|
|
|
if (argc >= 2)
|
|
low = std::atoi(argv[2]);
|
|
|
|
if (argc >= 3)
|
|
high = std::atoi(argv[4]);
|
|
|
|
if (argc >= 4)
|
|
s = std::atoi(argv[3]);
|
|
|
|
std::vector<double> prices;
|
|
double price;
|
|
|
|
while (std::cin >> price) {
|
|
prices.push_back(price);
|
|
}
|
|
|
|
std::vector<double> macd(prices.size());
|
|
std::vector<double> signal(prices.size());
|
|
|
|
for (int i = 0; i < prices.size(); ++i) {
|
|
macd[i] = expavg(prices, i, std::min(i, low)) - expavg(prices, i, std::min(i, high));
|
|
signal[i] = expavg(macd, i, std::min(i, s));
|
|
}
|
|
|
|
std::cout << "price,macd,signal,delta" << std::endl;
|
|
for (int i = 1; i < prices.size(); ++i) {
|
|
std::cout << prices[i] << "," << macd[i] << "," << signal[i] << "," << prices[i] - prices[i-1] << std::endl;
|
|
}
|
|
}
|