Oanda APIの見方を解説
この記事の用語について
特段の断りの無い限り、以下の用途で使います。
- "API": Web API、REST API
- "FX": 外国為替証拠金取引(USD/JPY等)
はじめに
仮想通貨の取引所は、だいたいAPIのサービス提供がされています。国内の大手取引所を見ても、GMO、CoinCheck、BitFlyerいずれも無料でAPIが利用できます。
一方、FX(での自動売買は、昔からMetaTraderと呼ばれるツールが利用されているためか、APIの提供をしている取引所は少ないように感じます。
Oandaは、APIを提供している数少ないFX業者の1つかと思います。APIを利用するためには、月間50万ドル分の取引を行い、"GOLD会員"のステータスを保つ必要があることと、スプレッドがドル円で0.8銭と他業者と比較して高い点は注意が必要です。
昨今の仮想通貨ブームで、私のようにAPIにはじめて触れた方も多いと思います。 FXでも自動取引をしてみたい。でも、MetaTraderを覚えるのは大変、、、そういう方にとって貴重な業者です。
Oanda APIについて
「Oanda APIはドキュメントが充実している」、と専ら評判は良いようですが、、、とにかく読み方を覚えるのに難儀しました。慣れると確かに充実しているかもしれません。ただ、例示も基本はcurlコマンドのみで、プログラミング言語の例示はなく、APIに馴染みのない人には結構厳しい目です。
厳密にはJS,python,JavaのサンプルコードはGithubにあるのですが、エンドポイントごとのシンプルなサンプルではなく、かなり本格的に作りこまれたものになっています。初心者が読み解くのは難しいです。
それ以前に、ドキュメントのサイトを見つけるのも苦労します。サービスを停止しているバージョンのドキュメントも普通に検索上位に出てきますし、OandaのHP内で検索してもなかなかヒットせずムカつきます。「使わせるつもりあるのか?」と思ってしまうほどです。
Oanda API V20が現在有効なバージョンです。ページはこちらです。
oandapyV20について
pythonで、上記のOanda APIを実行する時のパッケージです。ググると、これを利用されている方がほとんどで、素のAPIから自分で実装している方は少ないようです。
この記事ではOanda APIのドキュメントの読み方を解説するので、このパッケージは利用しません。
ただ、利用者がそれなりにいれば情報の入手もしやすいので、一応リンクも貼っておきます。
Oanda API V20について
原文(英語)ドキュメントで見ていきます。
右上で言語を日本語に出来ますが、REST APIが「残りのAPI」と訳されたり、Position(建玉)が「位置」と訳されたり、逆に読みにくいです。よっぽど英語が苦手な人で無い限り、原文のが理解できると思います。
画面左側のペイン(?)は3つのセクションに分かれています。
- 案内系(タイトル無いので、、、開発ガイドや認証方法等)
- Endpoints
- Definitions
案内系
前提となる情報が乗っています。認証方法、デモ口座やライブ口座(本番)ごとのURLや、APIトークンの発行方法、1秒あたりの制限など重要な情報も記載されているため、「Introduction」と「Development Guide」は始める前に読んでおく必要があります。
1.序章
口座の開設やAPIトークンの取得方法の案内です。ちなみに、トークン取得時に「APIを使った自動取引ツールの作成は、難しく大変で骨の折れる作業です。よろしいですか?」のように覚悟を問われるのでで心しておいてください。
2.開発ガイド
API URLs
Rest APIのURLが読み取れます。ここでは本番を前提にします。本番・デモはURLだけでなく、口座も別扱いになります。APIトークンや口座IDも別になるので、 使いたいほうを選んでください。
Streaming APIは使ったことないので今回は解説しません。
Request and Response Details
HTTPのリクエストもレスポンスも、断りの無い限りContent-Type:application/json
を指定してしろ、と書いてありますね。
Rate Limiting
REST APIは1秒あたり120/秒の制限がありますよ~~とのこと。
Connection Limiting
1秒あたり新しいコネクションは2つまでに制限して下さい、とのこと。正直あまり意識してたことはありません。HTTPのリクエストを実行する際、よほど古いバージョンの言語・パッケージを使っていない限り無視して良いでしょう。ConnectionヘッダにKeep-Aliveが設定されていれば問題ないようですが、HTTP1.1移行はのデフォルト設定のようです。
Authentication(認証)
「AuthorizationヘッダにトークンをBearerとして設定してください」と認証方法が記載されています。
トークン(APIのキー)はソースにベタ打ちするより、ファイルから読み取るか環境変数に設定しておくと良いでしょう。ここでは以下のJSON形式でファイルから読み取ることにします。
key.json
{
"id":"my-account-id",
"key":"my-api-key"
}
認証用ヘッダを取得する処理を関数化します。Request and Response DetailsでContent-Typeの指定もあったので、併せて対応します。
import json
# api keyを取得
def load_key(file_path):
with open(file_path,"r") as f:
return json.load(f)
# headerを返す
def default_header(api_key):
return {
"Content-Type": "application/json",
# Bearerの後に半角スペースが必要です
"Authorization": "Bearer " + api_key
}
conf = load_key("your_json_file_path.json")
header = default_header(conf["key"])
その他
注文はOrderエンドポイント、価格の取得はPricesエンドポイントを使え、と中途半端な解説があります。
Endpoints
ここが本丸。各APIのエンドポイントの大分類となります。
- Account: 口座情報
- Instrument: 通貨関連
- Order: 注文関連
- Trade: 取引関連
- Position: 建玉関連
- Transaction: 処理関連
- Pricing: 価格関連
通貨の価格を取る例を見てみます。
Pricingをクリックすると、さらに細分化された情報が出てきます。
リクエストについて
上から2つ目が価格を取得するエンドポイントです。 GETと帯に記載されている通り、HTTPのメソッドはGETです。
クリックすると、詳細が展開されます。まずはRequestのところを見ていきます。
注目すべきは"Located In"列です。'Name'列をどこに指定すべきかが記載されています。
- header
- path
- query
headerはHTTPのヘッダです。大抵どのエンドポイントにもAuthorizationをヘッダに入れるように指定されています。
pathはurlのディレクトリ部分に埋め込みます。今回では /v3/accounts/{accountID}/pricingの、{accountID}部分ですね。口座のIDが入ります。
queryはクエリパラメータとして指定します。 instruments(通貨ペア)をqueryとして指定されていますので、例えばUSD_JPYであれば
/v3/accounts/xxx-xxx-xxx/pricing?instruments=USD_JPY
といった感じで指定します。複数ある場合は'&'で繋げます。キー(Name列)と値(Type列)をクエリパラメータとしてフォーマットするだけですが、大体の言語もしくはパッケージで標準搭載されているのでそれを使うのが良いでしょう。
pythonでrequestsを使って実行してみます。
requestsではparamsパラメータにdictを渡すと勝手にクエリパラメータにしてくれるので便利。
import json
import requests
# 本番 URL
LIVE_URL = "https://api-fxtrade.oanda.com"
# api keyを取得
def load_key(file_path):
with open(file_path, "r") as f:
return json.load(f)
# headerを返す
def default_header(api_key):
return {
"Content-Type": "application/json",
# Bearerの後に半角スペースが必要です
"Authorization": "Bearer " + api_key
}
def get_usd_jpy(conf):
acc_id = conf["id"] # 口座ID
url = LIVE_URL + f"/v3/accounts/{acc_id}/pricing" # エンドポイント
header = default_header(conf["key"]) # 認証ヘッダ
params = {"instruments": "USD_JPY"} # クエリパラメータ
# GETリクエスト実行
# requestsではparamsにクエリパラメータのキーと値をdictで指定すると勝手に?key=val&key2=val2..の形にしてくれます。
res = requests.get(url, headers=header, params=params)
# レスポンスは特段指定がない限り、全てapplication/json
print(res.json())
conf = load_key("your_json_file_path.json")
get_usd_jpy(conf)
リクエストに関しての注意点ですが、description列に[required]と記載されている項目は必須となります。
また、Deprecatedと記載されているものは非推奨の機能となります。使わないほうが良いでしょう。もっとも、API自体2018年から更新が無いようなので、あまり気にしてもしょうがないかもしれません。
Type列には指定すべき値が記載されています。パッと見わかりにくいですが、リンクをクリックするとDefinitionに遷移し、詳細の確認が出来ます。 Definitionについてはレスポンスのところで確認します。
レスポンスについて
次にレスポンスを見ていきます。Requestの下にあります。
クリックすると詳細が展開されます。
例えば、pricesはclientPriceの配列型なのが確認できます。clientPriceの詳細は、さらにクリックすると 該当するDefinitionに遷移します。
いっぱい項目があります。この中で分からない型があれば、同じようにクリックすると該当するDefinitionに飛びます。
これを繰り返していけばだいたいどういう項目かイメージが掴めてきます。
Definitions
上記の通り、基本的にはendpointのrequestもしくはresponseの項目から遷移して確認するのがメインで、直接確認する機会はあまりないと思います。なので割愛します。
最後に
画面の説明がメインになってしまいました。次はbotとかを作成するのによく使いそうな、現在価格の取得、ロウソク足の取得、注文の出し方、保有ポジションの取得等、例示を中心に簡潔な記事を載せたいと思います。