CryptoWatchAPIから仮想通貨の価格を取得する

この度、仮想通貨のOHLCデータをCryptoWatchから取ってくるコードをjuliaで書いたのでここに記しておきます。

環境: Julia 1.6.3
DataFrames v1.3.3
HTTP v0.8.19
JSON3 v1.9.4

取引所Bitflyerにおける通貨BTCJPYのOHLCデータは次のURLに対応しています。 https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc

# HTTP通信
using HTTP
# JSON形式のデータを扱う
using JSON3
# データフレーム
using DataFrames
# 日付関係
using Dates

# APIのURL
const url = "https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc"

# ローソク足のデータを格納する構造体
struct Candle
    time::DateTime
    open::Float64
    high::Float64
    low::Float64
    close::Float64
    volume::Float64
    quote_volume::Float64
end

function get_candles()
    # getメソッドでAPIにリクエストを投げる
    res = HTTP.get(url, query=Dict("periods" => "60"))
    # HTTPレスポンスbodyにJSONが返ってくるのでparseする
    body = String(res.body)
    data = JSON3.read(body)
    # dictとしてparseしてくれるのでデータを格納している値を取り出す
    rows = data["result"]["60"] # 配列

    # Candle型の空の配列を用意
    candles = Candle[]
    for row in rows
        # rowはベクトルでtimestamp, open, high, low, close, volume, quote_volumeを要素に持つ
        timestamp, open, high, low, close, volume, quote_volume = row # 展開
        time = Dates.unix2datetime(row[1]) # timestampをDates.DateTime型に変換
        candle = Candle(time, open, high, low, close, volume, quote_volume)
        push!(candles, candle)
    end

    return candles
end

上記のように簡単にローソク足のデータを取得する関数を作成できました。 小ネタとしては、返り値としてのcandlesのopenだけ取ってきたいときは次のようにしてのようにして取得することができます。

candles = fetch_candles()
opens = getfield.(candles, :open)

これが煩わしい場合はDataFrameに変換するのが手っ取り早いです。

# Vector{Candle} => DataFrameに変換する方法
# fieldnames(Type)で構造体のフィールド名をタプルで取得します
# 内包表記を使ってDataFrame(:field1 => val1, :field2 => val2, ...)のように渡しています
df = DataFrame((field => getfield.(candles, field) for field in fieldnames(Candle))...)
df.open # openのベクトル