LoginSignup
1
0

More than 5 years have passed since last update.

Go言語で単純移動平均を返すAPIサーバー

Posted at

必要なもの

  • Go環境をセットアップ。IDEにIntellijのGoLandを使いました。
  • PostgreSQL
  • Kabu+の株価一覧表のcsvをDBに投入する https://kabu.plus/

結果

先にどういったデータを取得できるか示します。

下記のエンドポイントにアクセスして
http://localhost:8000/sma?code=1333&date=2018-08-07

このような結果が得られます。

[
    {
        "code": 1333,
        "price": 3820,
        "sma": 4084.2,
        "tstamp": "2018-08-07T00:00:00Z"
    }
]

1333マルハニチロの8/7における終値が3820。その日の25日移動平均は4084.2です。

ソースコード

ポイント

  • Go言語は初めて触れたのですが、URLルータとディスパッチャのライブラリであるGorillaが理解しやすくかつ書きやすいです。サンプルコード読んでたら、多くのTutorial/Get Started系の記事で使われていました。
    http://www.gorillatoolkit.org/

  • Postgres側でmoving_averageという関数を用意します。引数は順に銘柄コード、日付、移動平均日数です。今回は25日で固定にしました。/sma?length=5などとクエリパラメターに加えてもよかったと思います。

  • 下記のコードはテーブルから行を取得し、それをJSONに変換するパートです。 1. db.QueryでPostgresの関数の実行結果を取得。 2. columnsがcode, price, sma, tstampと4つあるので for i, column := range columnsの部分でループを回す。 3. objectはmap、それをarray of mapのobjectsに追加するイメージです。

func query(code string, dt string) ([]byte, error) {
    var objects []map[string]interface{}

    rows, _ := db.Query("select * from moving_average($1,$2, 25)", code, dt)

    for rows.Next() {
        columns, err := rows.ColumnTypes()
        if err != nil {
            return nil, err
        }

        values := make([]interface{}, len(columns))
        object := map[string]interface{}{}
        for i, column := range columns {
            object[column.Name()] = reflect.New(column.ScanType()).Interface()
            values[i] = object[column.Name()]
        }

        err = rows.Scan(values...)
        if err != nil {
            return nil, err
        }

        objects = append(objects, object)
    }

    return json.MarshalIndent(objects, "", "\t")
}

同じことFlaskでもDjangoでもできると言われればそれまでなんですが、Go言語を触ってみるにはいい機会でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0