FX API(OANDA v20)を使ってPythonで様々な注文をしてみる(注文編)

2018年6月27日

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

こんにちは、新米データサイエンティスト(@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で簡単にインストールが可能ですので、まだインストされていない方は、事前にインストールが必要です。

次に、OANDAの口座IDとAPIアクセストークンを設定します。下のはダミーですので、各自のIDとトークンに変更して実行しましょう。

では、OANDA API v20へ接続しましょう。

これで、準備が整いました。次はいよいよ注文をAPIへ投げてみましょう。とりあえず、ドル円を成行注文で1万通貨買ってみましょう。

 data として、注文の詳細を指定してあげます。 instrument に注文を入れたい通貨ペアを指定、 units は注文のサイズです。今回は1万通貨の買いなので「+10000」としてます。売りの場合は「-10000」と記載です。

先述しましたが注文種別も指定してあげる必要があります。今回は成行ですので type MARKETと入れてます。

では、APIにこちらの内容でリスクエストを投げてみましょう。

しっかり注文が入っていますね。注文リクエストをAPIへ投げると、このように取引詳細の情報が吐き出されます。では、実際にOANDAの管理画面で注文が入っているか、念のため確認してみましょう。

大丈夫そうですね。注文実行後にAPIから戻ってきた内容を見ていただくとわかりますが、各注文にはIDが付与されます。今回出したのは lastTransactionID として43と戻ってきていますので、管理画面のチケットIDが同様の値となっています。

ただひとつ注意点が。この lastTransactionID ですが、取引IDとなっており、この注文のIDではありません。注文ID(オーダーの個別識別ID)はIDの部分ですので、前の注文でいうと42です。ややこしい。

注文した直後に速攻損していますね笑。では、次は指値注文の練習をしてみましょう。

API経由で指値注文をしてみる

次は指値注文もやってみましょう。やり方は同様ですが、APIへ投げるリクエストの type を指値のLIMITへ変更して、指値のプライスも同様に設定をしてあげる必要があります。

では、APIにリクエストを送ってあげましょう。

これで指値が入りました。赤矢印部分に注目すると、ちゃんと「LIMIT(指値)」となっていますね。こちらの注文ですが、チャートで確認して見ましょう。

少しわかりづらいですが、指値をAPIへ投げたのが左側の赤丸部分です。指値として109.650で1万通貨売りを出したのですが、その直後に109.650へレートが上がり注文が実行されました。(右側の青色部分)

適当にやった注文ですが、大成功ですね笑。

ペンディング中の注文のキャンセル

次は指値注文を指したけど、やっぱキャンセルしたいっていうパターンをやってみましょう。同様の流れで、まずはすぐに実行されなさそうなレートで指し値注文を出します。

ドル円で112.650を1万通貨売りで指し値注文を作りました。こちらですが、管理画面上では「注文中」つまりまだ取引されていない「PENDING」のオーダーとして入っています。

次にAPI経由でこの「PENDING」の注文を確認してみましょう。

注文ID46として、ステータスがPENDINGとなっているオーダーがしっかり戻ってきます。では、こちらの注文をキャンセルしてみましょう。特定のオーダーのキャンセルの場合は、Order IDを使ってAPIへリクエストを送ります。上記の注文ですがIDが46ですので、こちらをキャンセルしましょう。

ちゃんと、オーダーID(チケットID)47がキャンセルに変更されていますね。

まとめと次の課題

さて、今回はFX APIシリーズとして、OANDA API v20経由でPythonで簡単な注文の操作をしてみました。成行注文や指値注文、さらにオーダーのキャンセルも行ってみました。

今回は手動でコードを書いて注文をAPIに投げましたが、次の課題としては、テクニカル指標などを計算した上で、所定の条件で(例えばゴールデンクロス)オーダーを投げるような流れもやってみたいと思います。

以上です!ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

 

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

2018年6月27日FX API

Posted by algon