【Python】oanda api v20のstreamをrequestsを使って取得する

oanda

Pythonで何か作りたいと思い、oandaのAPIを使って機械学習とかできないかな。。というわけで、いろいろ試しているところです。
APIもそこまで複雑ではないため簡単ですが、streamで軽くハマったので一応メモ。

pricingの場合

以下で確認できる通り、だいたいはGETなので、pricingは必要なパラメータを適切なURLに送るだけです。
http://developer.oanda.com/rest-live-v20/pricing-ep/

rest_url = Account.api_url  + "/v3/accounts/" + Account.account_id + "/pricing"
auth_key = Account.auth_key

def get_price(*currencies):
    headers={
        "Content-Type": "application/json",
        "Authorization": auth_key
    }
    instruments_code = ",".join(currencies)
    params = {"instruments": instruments_code}
    prices_json = requests.get(self.rest_url, headers=headers, params=params)
    prices = json.loads(prices_json.text)
    return prices

get_price(*["EUR_USD", "USD_CAD"])

こんな感じでリクエストを投げるとEUR_USD、USD_CADのそれぞれの値が帰ってきます。

streamの場合

streamで同じようにURLだけを変えてしまうと、いつまでたってもレスポンスが返ってきません。当たり前です。streamなので。。
すぐに理由には気づいたのですが、どうすれば随時取れるかなと思って違うパッケージ探してみたりもしたんですが、なんか違う感があってrequestsのマニュアルみてみたらありました。requestsなんでもできるな。。

rest_url = Account.api_url  + "/v3/accounts/" + Account.account_id + "/pricing"
auth_key = Account.auth_key

def streaming(*currencies):
    headers={
        "Authorization": self.auth_key
    }
    instruments_code = ",".join(currencies)
    params = {"instruments": instruments_code}
    prices = requests.get(api_stream_url, headers=headers, params=params, stream=True)
    for line in prices.iter_lines():
        if line:
            print(json.loads(line))

streaming(*["EUR_USD", "USD_CAD"])

streamにTrueを渡してあげるだけでした。
とっても簡単。

コメント