前提
接続までの箇所は、接続ページとほぼ同じですが、リアルタイムデータの取得には以下をインポートする必要があります。
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:日時

コメント