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を渡してあげるだけでした。
とっても簡単。
コメント