OANDA API リアルタイムデータの取得

スポンサーリンク
スポンサーリンク

前提

接続までの箇所は、接続ページとほぼ同じですが、リアルタイムデータの取得には以下をインポートする必要があります。

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_timeasksbidsなどを使って投資判断をするという感じでしょうかね。

現在価格と流動性などを取得

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:日時

コメント

タイトルとURLをコピーしました