[Python] OANDA REST-API v20の使い方とv1との相違点

OANDA Japanの口座が順次v20の取引環境に移行している最中ですが(OANDAからのお知らせ)、OANDA JapanのREST APIもいよいよv1からv20への移行期限が迫っています。

そこでデモアカウントでREST-API v20を使ってドル円の現在価格取得と過去の価格取得を今回はやってみたいと思います。

同じ内容をv1で出力した結果も併せて載せました。出力フォーマットがv20とv1でかなり異なるのでアプリケーションコードの変更はまあまあ有りそうです。

デモ口座の開設

以下のリンク先からデモ口座を開設します。

https://fxtrade.oanda.com/your_account/fxtrade/register/gate?utm_source=oandaapi&utm_medium=link&utm_campaign=devportaldocs_demo

 

注意点は、現状フォーム入力でCountryを「Japan」にしてしまうとv20用のデモアカウントが作成できないようなので「United States」にしておきます。

Oanda-form-japan

Phoneは日本の国番号を選択して、電話番号の頭一桁を除いた番号を入力しておけばOKです。

oanda-form

アカウントIDとアクセストークンの取得

APIを叩くためのアクセスキーを取得します。アカウントIDとアクセストークンがそれに当たります。

以下のリンクから作成したデモ口座にログインしてください

https://fxtrade.oanda.ca/demo-account/login?app_name=SecureSignIn

OANDA Webを開いて「Manage Funds」というリンクから「v20 Account Number」(アカウントID)を確認できます。

ManageFunds

AccountID

そして「API」というリンクからアクセストークンを取得できます。

API

モジュールのインストール

サードパーティーの「oandapyV20」を使います。

オフィシャルのAPIラッパーより使いやすいです。

$ pip install oandapyV20
Collecting oandapyV20
  Using cached https://files.pythonhosted.org/packages/0d/d5/f69c978f485db3048886c447398e39c6ec18041e689656e6d31697ea4e7f/oandapyV20-0.6.3.tar.gz
Installing collected packages: oandapyV20
  Running setup.py install for oandapyV20 ... done
Successfully installed oandapyV20-0.6.3

現在価格の取得

v20でのドル円現在価格取得のサンプルコードです。

import json
from oandapyV20 import API
from oandapyV20.endpoints.pricing import PricingInfo
from oandapyV20.exceptions import V20Error


account_id = "xxx-xxx-xxxxxxxx-xxx"
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

api = API(access_token=access_token, environment="practice")

params = {"instruments": "USD_JPY"}
pricing_info = PricingInfo(accountID=account_id, params=params)

try:
    api.request(pricing_info)
    response = pricing_info.response
    print(json.dumps(response, indent=4))  # 出力値を見やすく整形

except V20Error as e:
    print("Error: {}".format(e))

 

上記サンプルコード(v20)の出力値です。

{
    "time": "2019-02-17T02:38:01.189006987Z",
    "prices": [
        {
            "type": "PRICE",
            "time": "2019-02-16T01:10:08.009928180Z",
            "bids": [
                {
                    "price": "110.411",
                    "liquidity": 10000000
                }
            ],
            "asks": [
                {
                    "price": "110.501",
                    "liquidity": 10000000
                }
            ],
            "closeoutBid": "110.396",
            "closeoutAsk": "110.516",
            "status": "non-tradeable",
            "tradeable": false,
            "unitsAvailable": {
                "default": {
                    "long": "2500000",
                    "short": "2500000"
                },
                "openOnly": {
                    "long": "2500000",
                    "short": "2500000"
                },
                "reduceFirst": {
                    "long": "2500000",
                    "short": "2500000"
                },
                "reduceOnly": {
                    "long": "0",
                    "short": "0"
                }
            },
            "quoteHomeConversionFactors": {
                "positiveUnits": "0.00904969",
                "negativeUnits": "0.00905707"
            },
            "instrument": "USD_JPY"
        }
    ]
}

 

同じ内容をV1で出力した値です。V1の方がかなりシンプルです。

{
    "prices": [
        {
            "instrument": "USD_JPY",
            "time": "2019-02-15T22:00:00.055412Z",
            "bid": 110.421,
            "ask": 110.491,
            "status": "halted"
        }
    ]
}

 

過去価格の取得

v20のドル円過去3日分の日足価格取得サンプルコードです。

import json
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
from oandapyV20.exceptions import V20Error


access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

api = API(access_token=access_token, environment="practice")

params = {
    "count": 3,  # 足3本取得
    "granularity": "D",  # 日足を取得
    "price": "B",  # Bidを取得
}
instruments_candles = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)

try:
    api.request(instruments_candles)
    response = instruments_candles.response
    print(json.dumps(response, indent=4)) # 出力値を見やすく整形

except V20Error as e:
    print("Error: {}".format(e))

 

上記サンプルコード(v20)の出力値です。

{
    "instrument": "USD_JPY",
    "granularity": "D",
    "candles": [
        {
            "complete": true,
            "volume": 11518,
            "time": "2019-02-12T22:00:00.000000000Z",
            "bid": {
                "o": "110.444",
                "h": "111.049",
                "l": "110.408",
                "c": "110.987"
            }
        },
        {
            "complete": true,
            "volume": 19517,
            "time": "2019-02-13T22:00:00.000000000Z",
            "bid": {
                "o": "110.968",
                "h": "111.124",
                "l": "110.436",
                "c": "110.436"
            }
        },
        {
            "complete": false,
            "volume": 16099,
            "time": "2019-02-14T22:00:00.000000000Z",
            "bid": {
                "o": "110.431",
                "h": "110.638",
                "l": "110.227",
                "c": "110.411"
            }
        }
    ]
}

 

同じ内容をV1で出力した値です。candles以下の階層構造から違うようです。

{
    "instrument": "USD_JPY",
    "granularity": "D",
    "candles": [
        {
            "time": "2019-02-12T22:00:00.000000Z",
            "openBid": 110.444,
            "openAsk": 110.505,
            "highBid": 111.049,
            "highAsk": 111.063,
            "lowBid": 110.408,
            "lowAsk": 110.44,
            "closeBid": 110.987,
            "closeAsk": 111.021,
            "volume": 11518,
            "complete": true
        },
        {
            "time": "2019-02-13T22:00:00.000000Z",
            "openBid": 110.968,
            "openAsk": 111.008,
            "highBid": 111.124,
            "highAsk": 111.138,
            "lowBid": 110.436,
            "lowAsk": 110.465,
            "closeBid": 110.436,
            "closeAsk": 110.536,
            "volume": 19517,
            "complete": true
        },
        {
            "time": "2019-02-14T22:00:00.000000Z",
            "openBid": 110.431,
            "openAsk": 110.467,
            "highBid": 110.638,
            "highAsk": 110.652,
            "lowBid": 110.227,
            "lowAsk": 110.266,
            "closeBid": 110.411,
            "closeAsk": 110.501,
            "volume": 16099,
            "complete": true
        }
    ]
}

 

APIに渡すパラメータ名もv20とv1では異なるのでOANDAのv20マニュアルを確認する必要があります。

sponsor