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;
}