C# LINQで移動平均線を作成する

LINQを使って、移動平均の計算方法を紹介します。

データは、下記の為替データを使って計算します。

 

スポンサーリンク

 


/// <summary>
/// 為替データを使って移動平均を計算します
/// </summary>
/// <param name="dt">為替チャートデータ</param>
/// <param name="s">移動平均の開始位置</param>
/// <param name="e">移動平均の終了位置</param>
/// <returns>移動平均</returns>
public DataTable MovingAverage(DataTable dt,int s,int e)
{
    int sMA = s;
    int eMA = e;
    // 移動平均を格納するカラム
    dt.Columns.Add("MA", typeof(double));

    for (int i = 0; i < dt.Rows.Count; i++)
    {
                // 移動平均の計算範囲を制御
                if (i >= eMA - 1)
                {
                    // 平均値の計算する対象範囲
                    var query = from DataRow myRow in dt.Rows
                                where int.Parse(myRow["ID"].ToString()) >= sMA && int.Parse(myRow["ID"].ToString()) <= eMA
                                select myRow;

                    // 移動平均の計算結果
                    double avg = query.AsEnumerable()
                        .Average(row => double.Parse(row.Field<string>("Close").ToString()));

                    // 移動平均の結果をDataTableに格納
                    dt.Rows[i]["MA"] = Math.Round(avg, 3);

                    sMA++;
                    eMA++;

                }
    }
    return dt;
}

 

移動平均の計算の流れ

青⇒赤⇒緑の流れで1行ずつ動かしながら平均値を算出していきます。

矢印の長さは、19行目のLINQにあるwhere句に該当します。

移動平均の計算方法

 

スポンサーリンク

SNSでもご購読できます。

コメントを残す