Exponential Moving Average C#/C/C++

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

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *