前提
接続までの箇所は、接続ページとほぼ同じですが、リアルタイムデータの取得には以下をインポートする必要があります。
from oandapyV20.endpoints.pricing import PricingStream
仕様
取得するためには以下の設定が必要です。
- 通貨ペア:
"USD_JPY,EUR_USD"
などと複数個指定が可能です。 - タイムゾーン:”UTC”など
制限
リアルタイムデータの取得は、毎秒15リクエストまでとなっていますので注意しましょう。
開発ガイド | OANDA API
取得
基本
基本的に無限ループとなります。
# APIのPythonラッパーをインポート from oandapyV20 import API from oandapyV20.endpoints.pricing import PricingStream from time import sleep import json import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIへ接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 取得情報 currencies = "USD_JPY" time_zone = "UTC" # ----------------------------------------------------------------------- # パラメーター設定 params = {"instruments": currencies} # 接続 req = PricingStream(accountID, params) for rsp in api.request(req): print(json.dumps(rsp, indent=2)) sleep(0.1) # { # "type": "PRICE", # "time": "2020-05-19T03:58:38.994897472Z", # "bids": [ # { # "price": "107.360", # "liquidity": 250000 # } # ], # "asks": [ # { # "price": "107.364", # "liquidity": 250000 # } # ], # "closeoutBid": "107.355", # "closeoutAsk": "107.370", # "status": "tradeable", # "tradeable": true, # "instrument": "USD_JPY" # }
取得した情報をPandas(データフレーム)に変換
あまり実践では使わないかもしれませんが。。。
# APIのPythonラッパーをインポート from oandapyV20 import API from oandapyV20.endpoints.pricing import PricingStream import pandas as pd from time import sleep import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIへ接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 取得情報 currencies = "USD_JPY" # "USD_JPY,EUR_USD" time_zone = "UTC" columns = ['DateTime', 'asks', 'bids'] # ----------------------------------------------------------------------- # パラメーター設定 params = {"instruments": currencies} # 接続 req = PricingStream(accountID, params) for rsp in api.request(req): asks = None if "asks" in rsp.keys(): asks = float(rsp["asks"][0]["price"]) bids = None if "bids" in rsp.keys(): bids = float(rsp["bids"][0]["price"]) df = pd.DataFrame([[rsp["time"],asks, bids]], columns = columns) print(df) sleep(0.1) # DateTime asks bids # 0 2020-05-19T04:15:06.576144318Z 107.4 107.396 # DateTime asks bids # 0 2020-05-19T04:15:15.288485176Z None None # DateTime asks bids # 0 2020-05-19T04:15:20.288719183Z None None # DateTime asks bids # 0 2020-05-19T04:15:23.338782991Z 107.398 107.394 # DateTime asks bids # 0 2020-05-19T04:15:23.470696118Z 107.398 107.394
実践を意識した取得
あまり美しくないですが、こんな感じです。
# APIのPythonラッパーをインポート from oandapyV20 import API from oandapyV20.endpoints.pricing import PricingStream import pandas as pd from time import sleep import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIへ接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 取得情報 currencies = "USD_JPY" # "USD_JPY,EUR_USD" time_zone = "UTC" time_zone_t = "+00:00" columns = ['DateTime', 'asks', 'bids'] # ----------------------------------------------------------------------- # パラメーター設定 params = {"instruments": currencies} # 接続 req = PricingStream(accountID, params) try: for rsp in api.request(req): if rsp["type"] != "HEARTBEAT": now_time = datetime.strptime(rsp["time"][:19] + time_zone_t, '%Y-%m-%dT%H:%M:%S%z') asks = None if "asks" in rsp.keys(): asks = float(rsp["asks"][0]["price"]) bids = None if "bids" in rsp.keys(): bids = float(rsp["bids"][0]["price"]) df = pd.DataFrame([[now_time,asks, bids]], columns = columns) print(df) sleep(0.1) except V20Error as e: print("Error: {}".format(e))
ポイント
- tryで例外処理を追加した。
- OANDAはHEARTBEATに対応しているそうで、それに対応した。(HEARTBEATは何もないよという意味
df
のところは意味がないです。あとはnow_time
やasks
、bids
などを使って投資判断をするという感じでしょうかね。
現在価格と流動性などを取得
pricing.PricingInfo
で現在価格や流動性などの情報を取得することができます。
import oandapyV20.endpoints.pricing as pricing params ={ "instruments": "USD_JPY" } res = pricing.PricingInfo(accountID=accountID, params=params) api.request(res) pprint.pprint(res.response) # {'prices': [{'asks': [{'liquidity': 250000, 'price': '104.626'}], # 'bids': [{'liquidity': 250000, 'price': '104.607'}], # 'closeoutAsk': '104.634', # 'closeoutBid': '104.599', # 'instrument': 'USD_JPY', # 'quoteHomeConversionFactors': {'negativeUnits': '1.00000000', # 'positiveUnits': '1.00000000'}, # 'status': 'tradeable', # 'time': '2020-10-29T21:50:21.079896402Z', # 'tradeable': True, # 'type': 'PRICE', # 'unitsAvailable': {'default': {'long': '250000', # 'short': '250000'}, # 'openOnly': {'long': '250000', # 'short': '250000'}, # 'reduceFirst': {'long': '250000', # 'short': '250000'}, # 'reduceOnly': {'long': '0', 'short': '0'}}}], # 'time': '2020-10-29T21:50:21.745742237Z'} print(res.response["prices"][0]["bids"][0]["price"]) # 104.607
取得できる情報
*以下の情報はデモ環境で取得した値となります。
{'prices': [{'asks': [{'liquidity': 250000, 'price': '104.626'}], 'bids': [{'liquidity': 250000, 'price': '104.607'}], 'closeoutAsk': '104.634', 'closeoutBid': '104.599', 'instrument': 'USD_JPY', 'quoteHomeConversionFactors': {'negativeUnits': '1.00000000', 'positiveUnits': '1.00000000'}, 'status': 'tradeable', 'time': '2020-10-29T21:50:21.079896402Z', 'tradeable': True, 'type': 'PRICE', 'unitsAvailable': {'default': {'long': '250000', 'short': '250000'}, 'openOnly': {'long': '250000', 'short': '250000'}, 'reduceFirst': {'long': '250000', 'short': '250000'}, 'reduceOnly': {'long': '0', 'short': '0'}}}], 'time': '2020-10-29T21:50:21.745742237Z'}
- prices
- instrument:通貨
- asks, bids
- liquidity:流動性
- price:現在価格
- closeoutAsk, closeoutBid:クローズ価格*現在価格ではありません。
- quoteHomeConversionFactors:アカウントの自国通貨に変換するための係数
- negativeUnits
- positiveUnits
- status:ステータス(tradeableは取引可能)
- time:日時
- type:タイプ
- unitsAvailable:以下の発注方式において利用可能な数量*恐らくこの数量を超えた注文は不可
- default
- openOnly
- reduceFirst
- reduceOnly
- time:日時
コメント