#include #include #include #include #include #include double expavg(const std::vector &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 prices; double price; while (std::cin >> price) { prices.push_back(price); } std::vector macd(prices.size()); std::vector 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; } }