Exponential Moving Average C#/C/C++
Exponential Moving Average C#/C/C++
ChatGPT: [指數移動平均(Exponential Moving Average,EMA)是一種用於技術分析的指標,通常用於預測股票價格或其他時間序列數據的趨勢。在C#/C/C++中,你可以使用以下的程式碼來計算指數移動平均]
C Code
#include <stdio.h> // 計算指數移動平均 float calculateEMA(float newData, float previousEMA, float smoothingFactor) { return (newData * smoothingFactor) + (previousEMA * (1 - smoothingFactor)); } int main() { float data[] = {10.0, 12.0, 15.0, 18.0, 20.0}; // 輸入數據 int numDataPoints = sizeof(data) / sizeof(data[0]); float smoothingFactor = 0.2; // 平滑因子,可以根據需要調整 float ema = data[0]; // 初始化EMA for (int i = 1; i < numDataPoints; i++) { ema = calculateEMA(data[i], ema, smoothingFactor); printf("EMA(%d) = %f\n", i, ema); } return 0; }
C#
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 指數移動平均的計算參數 int period = 10; // 期間 double smoothingFactor = 2.0 / (period + 1); // 假設有一個數據數組 double[] data = new double[] { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 }; // 計算指數移動平均 List<double> emaValues = new List<double>(); double ema = data.Take(period).Average(); // 初始EMA值等於前幾個數據的簡單平均 emaValues.Add(ema); for (int i = period; i < data.Length; i++) { ema = (data[i] - ema) * smoothingFactor + ema; emaValues.Add(ema); } // 輸出計算結果 Console.WriteLine("指數移動平均值:"); foreach (var value in emaValues) { Console.WriteLine(value); } } }
C++
#include <iostream> #include <vector> // 計算指數移動平均的函數 std::vector<double> calculateEMA(const std::vector<double>& data, int period) { std::vector<double> ema; if (data.size() < period) { // 如果數據點數不足以計算EMA,返回空向量 return ema; } double multiplier = 2.0 / (period + 1); // EMA的平滑因子 // 計算初始EMA值,使用最初的period數據的簡單平均 double sum = 0; for (int i = 0; i < period; ++i) { sum += data[i]; } ema.push_back(sum / period); // 逐步計算後續的EMA值 for (int i = period; i < data.size(); ++i) { double currentEMA = (data[i] - ema.back()) * multiplier + ema.back(); ema.push_back(currentEMA); } return ema; } int main() { std::vector<double> data = {10.0, 12.0, 14.0, 16.0, 18.0, 20.0}; int period = 3; std::vector<double> ema = calculateEMA(data, period); // 輸出計算出的EMA值 std::cout << "指數移動平均 (EMA): "; for (double value : ema) { std::cout << value << " "; } std::cout << std::endl; return 0; }