記事一覧に戻る

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」は始める前に読んでおく必要があります。

introduction

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のエンドポイントの大分類となります。

endpoints

  • Account:   口座情報
  • Instrument: 通貨関連
  • Order: 注文関連
  • Trade: 取引関連
  • Position: 建玉関連
  • Transaction: 処理関連
  • Pricing: 価格関連

通貨の価格を取る例を見てみます。
Pricingをクリックすると、さらに細分化された情報が出てきます。

リクエストについて

Pricing

上から2つ目が価格を取得するエンドポイントです。 GETと帯に記載されている通り、HTTPのメソッドはGETです。

クリックすると、詳細が展開されます。まずはRequestのところを見ていきます。

Pricing-detail

注目すべきは"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の下にあります。

Pricing-detail-response

クリックすると詳細が展開されます。

Pricing-detail-response2

例えば、pricesはclientPriceの配列型なのが確認できます。clientPriceの詳細は、さらにクリックすると 該当するDefinitionに遷移します。

Pricing-detail-definition

いっぱい項目があります。この中で分からない型があれば、同じようにクリックすると該当するDefinitionに飛びます。

これを繰り返していけばだいたいどういう項目かイメージが掴めてきます。

Definitions

上記の通り、基本的にはendpointのrequestもしくはresponseの項目から遷移して確認するのがメインで、直接確認する機会はあまりないと思います。なので割愛します。

最後に

画面の説明がメインになってしまいました。次はbotとかを作成するのによく使いそうな、現在価格の取得、ロウソク足の取得、注文の出し方、保有ポジションの取得等、例示を中心に簡潔な記事を載せたいと思います。

記事一覧に戻る