FX API(OANDA v20)を使ってPythonで様々な注文をしてみる(注文編)
こんにちは、新米データサイエンティスト(@algon_fx)です。ゴールデンウィーク真っ只中ですが、相変わらず為替レートのデータをこねくり回しています。いくつかそれっぽい予測モデルも出来たのですが、まぁ、まだ実戦で使えるほどでは無いですね。(実戦で使える日が来るのか)
さて、今日はFX APIシリーズとして、Pythonを使ってONADA API v20のオーダー(注文)周りの操作をまとめていきたいと思います。非常に簡単に操作が可能で、かつ必要な機能は全て実装されている印象です。
【人気記事】
OANDA API v20の注文機能の概要
OANDAのAPIですが、注文機能は十分すぎるほど実装されています。API経由で行えるオーダーの種類ですが、当然ながら成行注文から指値注文、さらには逆指値やイフタッチ注文、利益/損失確定の注文もあります。
公式ドキュメントが英語ですので、ひとまず、頻繁に使われそうなオブジェクトの一部をまとめます。全てのオブジェクトの情報は、公式ドキュメント(英語)にまとまっています。
order.type
英語の部分がAPIの“order” > “type”に渡すクラスとなっています。最後の「FIXED_PRICE」が何を指しているのか分かりませんでした。公式ドキュメントも読んだのですが、どこにも注文の詳細がなかったです…。(後日調べなくてはですね)
- MARKET(成行注文)
- LIMIT(指値注文)
- STOP(逆指値注文)
- MARKET_IF_TOUCHED(イフタッチ注文)
- TAKE_PROFIT(利益確定注文)
- STOP_LOSS(損失確定注文)
- TRAILING_STOP_LOSS(トレーリングストップロス)
- FIXED_PRICE(??)
order.OrderState
各オーダーにはOrderStateとしてオーダーのステータスがつきます。こちらは全部で4種類あり、随時、API経由(またはトレード管理画面)で確認が可能です。
- PENDING(ペンディング – 保留中、実行待ち)
- FILLED(注文済み)
- TRIGGERED(発注条件が満たした状態)
- CANCELLED(キャンセル)
order.TimeInForce
TimeInForceを使うことで各オーダーに対して時間的な発注条件を指定することも可能です。今回の練習では試しませんでしたが、これは便利そうな機能ですね。- GTC(Good unTil Cancelled – キャンセルされるまで有効)
- GTD(Good unTil Date – 指定した日付まで有効)
- GFD(Good For Day – 同日のNY時間5PMまで有効)
- FOK(Filled Or Killed – 注文を即時実行または削除)
- IOC(Immediately filled or Cancelled – 即時実行またはキャンセル)
最後の2つのFOKとIOCですが、いまいち違いがパッとしませんので、これは実際に使ってみて、どのような動作になるのか検証が必要ですね。API経由で不要なオーダーを出して損をすることもあり得るので、このように条件指定をしておくのは大事かと。
API経由で成行注文をしてみる
では、実際にOADNA API v20に接続してPythonを使って成行注文を出してみましょう。米国OANDAの口座(デモでもOK)が必要です。詳しくはこちらのページをご参照ください。(→ OANDA v20 口座開設編)
まずは必要なライブラリーをインポートしましょう。Pythonを使うので、oandapyV20経由でAPIと繋ぎます。 oandapyV20 ですが、pipで簡単にインストールが可能ですので、まだインストされていない方は、事前にインストールが必要です。
1 2 3 4 5 6 |
# ライブラリーのインポート import pandas as pd import oandapyV20 import oandapyV20.endpoints.orders as orders |
次に、OANDAの口座IDとAPIアクセストークンを設定します。下のはダミーですので、各自のIDとトークンに変更して実行しましょう。
1 2 3 4 5 |
# OANDA API アクセストークンと口座ID accountID = "XXX-XXX-XXXXXXX-XXX" access_token = "abc123abc123abc123abc123abc123abc123-abc123abc123abc123abc123abc123abc123" |
では、OANDA API v20へ接続しましょう。
1 2 3 4 |
# APIへ接続 api = oandapyV20.API(access_token=access_token) |
これで、準備が整いました。次はいよいよ注文をAPIへ投げてみましょう。とりあえず、ドル円を成行注文で1万通貨買ってみましょう。
data として、注文の詳細を指定してあげます。 instrument に注文を入れたい通貨ペアを指定、 units は注文のサイズです。今回は1万通貨の買いなので「+10000」としてます。売りの場合は「-10000」と記載です。先述しましたが注文種別も指定してあげる必要があります。今回は成行ですので type にMARKETと入れてます。
1 2 3 4 5 6 7 8 9 10 |
data = { "order": { "instrument": "USD_JPY", "units": "+10000", "type": "MARKET", "positionFill": "DEFAULT" } } |
では、APIにこちらの内容でリスクエストを投げてみましょう。
1 2 3 4 5 |
# API経由で成行注文を実行 r = orders.OrderCreate(accountID, data=data) api.request(r) |
しっかり注文が入っていますね。注文リクエストをAPIへ投げると、このように取引詳細の情報が吐き出されます。では、実際にOANDAの管理画面で注文が入っているか、念のため確認してみましょう。
大丈夫そうですね。注文実行後にAPIから戻ってきた内容を見ていただくとわかりますが、各注文にはIDが付与されます。今回出したのは lastTransactionID として43と戻ってきていますので、管理画面のチケットIDが同様の値となっています。
ただひとつ注意点が。この lastTransactionID ですが、取引IDとなっており、この注文のIDではありません。注文ID(オーダーの個別識別ID)はIDの部分ですので、前の注文でいうと42です。ややこしい。
注文した直後に速攻損していますね笑。では、次は指値注文の練習をしてみましょう。
API経由で指値注文をしてみる
次は指値注文もやってみましょう。やり方は同様ですが、APIへ投げるリクエストの type を指値のLIMITへ変更して、指値のプライスも同様に設定をしてあげる必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
# ドル円が109.650で1万通貨売りの指値注文をAPI経由でやってみる data = { "order": { "price" : "109.650", "instrument": "USD_JPY", "units": "-10000", "type": "LIMIT", "positionFill": "DEFAULT" } } |
では、APIにリクエストを送ってあげましょう。
1 2 3 4 5 |
# APIへリクエストを送る r = orders.OrderCreate(accountID, data=data) api.request(r) |
これで指値が入りました。赤矢印部分に注目すると、ちゃんと「LIMIT(指値)」となっていますね。こちらの注文ですが、チャートで確認して見ましょう。
少しわかりづらいですが、指値をAPIへ投げたのが左側の赤丸部分です。指値として109.650で1万通貨売りを出したのですが、その直後に109.650へレートが上がり注文が実行されました。(右側の青色部分)
適当にやった注文ですが、大成功ですね笑。
ペンディング中の注文のキャンセル
次は指値注文を指したけど、やっぱキャンセルしたいっていうパターンをやってみましょう。同様の流れで、まずはすぐに実行されなさそうなレートで指し値注文を出します。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 指値注文 data = { "order": { "price" : "112.650", "instrument": "USD_JPY", "units": "-10000", "type": "LIMIT", "positionFill": "DEFAULT" } } |
ドル円で112.650を1万通貨売りで指し値注文を作りました。こちらですが、管理画面上では「注文中」つまりまだ取引されていない「PENDING」のオーダーとして入っています。
次にAPI経由でこの「PENDING」の注文を確認してみましょう。
1 2 3 4 5 |
# 全てのペンディング注文を取得する r = orders.OrdersPending(accountID) api.request(r) |
注文ID46として、ステータスがPENDINGとなっているオーダーがしっかり戻ってきます。では、こちらの注文をキャンセルしてみましょう。特定のオーダーのキャンセルの場合は、Order IDを使ってAPIへリクエストを送ります。上記の注文ですがIDが46ですので、こちらをキャンセルしましょう。
1 2 3 4 5 |
# 注文をキャンセル r = orders.OrderCancel(accountID=accountID, orderID=46) api.request(r) |
ちゃんと、オーダーID(チケットID)47がキャンセルに変更されていますね。
まとめと次の課題
さて、今回はFX APIシリーズとして、OANDA API v20経由でPythonで簡単な注文の操作をしてみました。成行注文や指値注文、さらにオーダーのキャンセルも行ってみました。
今回は手動でコードを書いて注文をAPIに投げましたが、次の課題としては、テクニカル指標などを計算した上で、所定の条件で(例えばゴールデンクロス)オーダーを投げるような流れもやってみたいと思います。
以上です!ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません