OANDAのAPIの始め方と使い方とレート比較
目次/もくじ
オアンダのAPIやります。
金融業界、とりわけFX業界ではFIX APIが機関投資家向けに採用されています。リテールトレーダーや一介のシステムトレーダーには縁のない話ですが、その原因はAPIを使うための最低入金額が1000万円~のところが多いからです。(HotForexとかSaxoBankとか)
オアンダのAPIの利用条件と始め方
そんな中、OandaではREST APIによるAPIサービスを提供しています。オアンダのAPI利用の条件は、
- オアンダの口座を持っていること
- 口座に250,000円以上あること
- 取引コースがプロコースであること
で、低いハードルでスタートすることができます。
ちなみに、REST APIそのものが何なのかというと、URLに動詞的な名称を入れずに名詞にとどめて、アクセスするメソッドによって処理を分けるといった概念のAPIです。一般的には、GETとPOSTでAPIを処理しますが、その二つに加えてPUTとDELETEを使って、汎用的な処理をしようぜ、っていう話です。
ただ、OandaのREST APIはREST APIと言っていますが、REST要素はほとんどありません。
APIの申し込みはマイページから可能です。
APIのドキュメントはこちらにあります。
日本語かつ、詳細なドキュメンテーションがあります。
仮想通貨関連のAPIを触ったことがあるなら、APIキーとAPI秘密鍵の二つに見覚えがあるかもしれませんが、OandaのRest APIではアクセストークン一本で認証を行います。
APIを触ってみる
まず、エンドポイントURL(APIにアクセスするためのメインとなるURL)ですが、
サンドボックス用とデモ用とライブ用があります。サンドボックス用は認証手続きが不要と言うメリットがありますが、サーバーがダウンしていて繋がらなかったりと不毛な時間を過ごす可能性があるので、最初からライブ用で接続することをオススメします。
ちなみに、api-fxtrade.oanda.com宛に主要3つのエクイニクスサーバーからpingを測定したところ、LD5:72ms, NY4:3ms, TY3:168msでした。ニューヨークサーバーなら高速ですが、東京サーバーの場合は距離的な遅延があります。
ユーザーの認証はアクセストークンをリクエストヘッダーに入れるだけです。Hash処理などは一切必要ありません。つまり、httpで生のアクセス処理をしてしまうと、アクセストークンそれ自体も生の状態で送信されてしまうので、簡単にハッキングされてしまいます。
本番用のエンドポイントURLはhttpsで指定されているので問題ありませんが、サンドボックス用のエンドポイントはhttpなので十分に注意しましょう。あと、開発段階で不特定多数の人が同時接続しているネットワーク環境で開発するのはご法度です。
ちょっと試してみる程度の場合、昨今のコマンドプロンプト/ターミナルはCURLがデフォルトでインストールされているので便利です。
1 |
curl -H "Authorization: Bearer アクセストークン" https://api-fxtrade.oanda.com/v20/accounts |
現在レートの取得
現在レートの取得は
1 |
curl -H "Authorization: Bearer アクセストークン" https://api-fxtrade.oanda.com/v20/price?instruments=USD_JPY |
APIでは通貨ペア6文字の中心にアンダーバーを入れてください。USDJPYならUSD_JPY、EURUSDならEUR_USDです。
リクエストが成功すると、
1 |
{ "prices" : [ { "instrument" : "EUR_USD", "time" : "2020-04-08T08:26:28.675144Z", "bid" : 1.0853, "ask" : 1.08538 } ] } |
こんなレスポンスが返ってきます。json形式なので連想配列として処理しやすくなっています。
時刻とbidとaskが取得できるので、ここからスプレッドの計算なども可能です。
PHPの場合は、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $headers = array( "HTTP/1.0", "Authorization: Bearer アクセストークン" ); $ch = curl_init("https://api-fxtrade.oanda.com/v20/prices?instruments=EUR_USD"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); echo $result; ?> |
自分のサイトなどに現在のレートを表示させることができます。
そもそもAPIを使う意味
そもそもAPIを使おうとしている人ってAPIの方がMT4/MT5よりも早いから使おうとしている人がほとんどだと思います。特に複雑なオーダーが必要な場合はMT4/MT5/cTrader/jForex/TradeStationの方が有利ですし、わざわざ込み入った注文をAPIでやろうとしている人はそもそもいないんじゃないかと思います。
どちらかと言うと、スピード勝負を極めようとする過程でAPIにたどり着いたのだとすると、レートの取得した段階で目的は完了しています。
かくいう私も、Oandaのレートが他のFX会社のレートよりも早い(正確には”遅い”ことがない)ことを利用して、レイテンシーアービトラージの実験を行おうとしていたことが発端でした。
という訳で、このオアンダのREST APIによって取得したレートとMT4/MT5のレートにどれくらいの乖離があるのかを調べてみます。
オアンダのAPIレートとMT5レートを比較
緑がMT5によるオアンダのレートで、青がAPIによるオアンダのレートです。平常時ではほとんど差はありません。若干、乖離が見られる場面もありますが、オブジェクトの描写による遅延だと考えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//MQL5 //MQL4 input string OandaAPIToken = ""; static double OandaBid,OandaAsk,OandaMedian,OandaSpread; void GetOandaTick() { int WebR; string sendingquery; int timeout = 500; string cookie = NULL,headers; char get[],ReceivedData[]; string SendingHeader = "Authorization: Bearer "+OandaAPIToken; string URL = "https://api-fxtrade.oanda.com/v20/prices?instruments="+StringSubstr(Symbol(),0,3)+"_"+StringSubstr(Symbol(),3,3); StringToCharArray( sendingquery, get ); WebR = WebRequest("GET",URL, SendingHeader, timeout,get,ReceivedData,headers); string ReceivedText = CharArrayToString(ReceivedData,0,-1,CP_UTF8); if(WebR != -1) { OandaBid = StringToDouble(StringSubstr(ReceivedText,StringFind(ReceivedText,"bid",0)+7,7)); OandaAsk = StringToDouble(StringSubstr(ReceivedText,StringFind(ReceivedText,"ask",0)+7,7)); OandaMedian = (OandaBid+OandaAsk)/2; OandaSpread = (OandaAsk-OandaBid)/_Point; } } |
希望としては、APIの方が数ms~数百msくらい先行していてくれていたらうれしかったのですが、なかなかそうもいかないですね。
ただし、オアンダのMT4レートと比較するよりはAPIの方が早いと思います。(アクセス頻度にもよりますが)
ビットコイン関連のAPIだと高速リクエストを禁止している取引所が多く、ひどいところでは2秒おきごとでないと拒否されてしまうようなところもありますが、OandaのAPIでは高速アクセスしても上限/制限に引っ掛かることはありません。
Mt4/MT5でAPI接続するには、エンドポイントURLを許可しておく必要があります。
新規オーダーを出す
一応、最低限オーダーの注文をやっておきます。
オーダーはさすがにPOSTで、通貨ペア、ロット、売買の方向、注文種別、有効期限、価格が必須項目です。ここら辺はMQL4/MQL5で言うところのOrderSend関数に近い感覚だと思います。
異なる点と言えば、スリッページがないこと、トレードコメントがないことで、その代わりに下限価格と上限価格の設定項目が任意であります。
また、トレーリングストップの指定項目もありますが、この手のシステムはバグの温床なので、よくよく検証してからトレーリングストップは使った方が良いと思います。
1 2 3 4 |
$ curl -H "Authorization: Bearer アクセストークン" -X POST -d "instrument=EUR_USD&units=0.1&side=sell&type=market" "http://api-fxtrade.oanda.com/v20/accounts/口座番号/orders" |
オアンダにはマイページのログインIDと、アカウント毎のアカウントIDと、MT4/MT5のログインIDがあり、それぞれすべてバラバラですが、ここで指定する口座番号はアカウントIDです。
ポジション情報を取得する
約定したポジションの情報の取得はGETメソッドです。アカウント内のポジション情報がすべてレスポンスデータで返ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "positions" : [ { "instrument" : "EUR_USD", "units" : 4741, "side" : "buy", "avgPrice" : 1.3626 }, { "instrument" : "USD_CAD", "units" : 30, "side" : "sell", "avgPrice" : 1.11563 }, { "instrument" : "USD_JPY", "units" : 88, "side" : "buy", "avgPrice" : 102.455 } ] } |
ポジションを決済する
ポジションの決済はDELETEメソッドを使います。
決済の際にポジションIDを指定するわけではないので、指定した通貨ペアのポジションが全決済されます。これはネッティングタイプのMT5の処理に非常に類似しています。
1 2 3 4 5 6 7 8 9 10 |
{ "ids" : [ 12345, 12346, 12347 ], // ポジションのクローズにより作成されたトランザクションのIDとクローズされたチケットのIDのリスト "instrument" : "EUR_USD", "totalUnits": 1234, "price" : 1.2345 } |
- PREV
- FXを始める人がスタートするまでに必要なこと
- NEXT
- 一発逆転EA(MT4)無料EAダウンロード
関連記事
-
[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)
良いEAができた場合、身内で配布したい場合があります。しかし、知らない間に自分のEAが出回っていた場
-
[MQL4]MT4でマルチタスク/マルチスレッド処理
MT4/MT5は基本的にC言語ベースなのでマルチスレッドはできません。 しかし、複数のチャート上で
-
(MQL4)WEBサイトの情報を取得するやり方[EA]WebRequest
MT4のチャート上にWEBサイトの情報を参照する方法について紹介します。 背景
-
プログラマ向け自動売買開発アイディア
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比
-
MT4EAを実際にデコンパイルしてみて、対策を考える
逆コンパイルとは 逆コンパイルというのは実行ファイルからソースコードファイルを復元することで、デコ
コメント
画像のようにオアンダAPIの気配値をチャートに表示させるEAを作っていただけるとありがたいです
コードを公開してもらっていますが、表示させる方法が素人にはなかなかに難しい。。