Python+Oanda RestAPIで自動売買プログラムの作成

FX

実際にPythonでOANDA JapanのRestAPIを呼び出してみます。Oanda JapanのRestAPIのラッパーがインストールされていることが前提です。まだの方は、以下の記事を参考にpipコマンドでインストールを行ってください。

Python+APIで自動売買プログラムを作ってみよう!!
我が家では、Oanda JapanのRESTAPI(V20)を利用して作成した自動売買プログラムを動かしています。現在JAVAで作成したものを稼働しているのですが、今回勉強も兼ねてPythonに書き換えてみたいと思います。 ここではま...

前提条件

Oanda JapanのRestAPIを使用するためには、パーソナルアクセストークンが必要です。まだ取得されていない方は、OANDA Japanのサイトにログインし、自分専用のトークンを発行してください。

APIに接続する

Oanda JapanのRESTAPIに接続します。

import oandapyV20

api =oandapyV20.API(access_token=_access_token, environment=”practice”)

「_access_token」には、事前にOanda Japanのサイトで取得したトークンの値を設定する必要があります。
また、上の例では、environment=”practice”となっていますが、これはデモ環境に接続するときは”practice”を本番環境に接続するときは、”live”と入力してください。
戻り値として、アクセスに必要な情報が戻ってきますので、受け取っておきます。各種APIの呼び出し時に必要になります。上の例では「api」という変数で受け取っています。この「api」という変数は、各APIの呼び出しで「api.request(r)」使用しますので、大切に保持しておきましょう。

現在の価格を取得する

現在の価格を取得してみます。
# 価格関連のメソッドを使用するために必要
import oandapyV20.endpoints.pricing as pricing
# 取得したい価格の通貨ペアを指定
params = {
“instruments”: “AUD_JPY”
}
r = pricing.PricingInfo(accountID=_accountID, params=params)
rv = api.request(r)
print(json.dumps(self.rv, indent=2))
# Ask価格を取得
print(rv[“prices”][0][“asks”][0][“price”])
# Bid価格を取得
print(rv[“prices”][0][“bids”][0][“price”])

「api」には、1で取得したapiの接続情報を設定します。「_accountID」には、接続したい口座のAccount IDを指定します。Oandaでは複数口座開設できますので、自分が接続した口座のIDを選択しましょう。rvに価格情報が返却されますので、そこから現在のAskおよびBidが取得できます。

rvは連想配列になっていますので、まずは全て戻り値をprintしてみて、それを確認後に自分が取得したい値をとるのが近道です。

アカウント情報を取得する

自分のアカウント情報を取得します。口座の残高やポジジョン情報等アカウントに関する情報を取得することができます。

# アカウント関連のメソッドを使用するためにインポートしておきます
import oandapyV20.endpoints.accounts as accounts
r = accounts.AccountDetails(_accountID)
rv = api.request(r)
print(json.dumps(rv, indent=2))

「_accountID」には、接続したい口座のAccount IDを指定します。返却された情報から、自分がほしいアカウントの情報を取得できます。ここでは、直接アカウント指定で詳細情報を取得しましたが、アカウント一覧を取得するメソッドもあります。詳細は、公式サイトのAPI説明を読んでみてください。

注文を出す

実際に、注文を発注します。

import oandapyV20.endpoints.orders as orders
data = {
  ”order”: {
    ”timeInForce”: “GTC”,
    ”instrument”: “AUD_JPY”,
    ”units”: unit,
    ”price”: price,
    ”type”: “LIMIT”,  ①
    ”positionFill”: “DEFAULT”,
    ”takeProfitOnFill”:{ ②
      ”price”: 80
    },
    ”tradeClientExtensions”:{ ③
                  “comment”: “Comment Add1”,
      ”id”:”test1”
    }
  }
}
r = orders.OrderCreate(_accountID, data=data)
rv = api.request(r)
print(json.dumps(rv, indent=2))

①には、指値(LIMIT)、逆指値(STOP)、成行き(MARKET)等が指定できます。「MARKET_IF_TOUCHED」なんていうのもありました。条件に一致したら、成行き注文ですかね。自分が使用したい注文の種類を選択してください。

②では、リミットオーダーを追加しています。不要であれば、指定の必要はありません。

③「tradeClientExtensions」ですが、OandaのAPIでは、注文が約定するとトレード中の注文として、別のIDが振られます。そのため、約定した時点で注文時のIDとトレード中のIDが紐付かなくなってしまいます。それを紐付けるため、注文時この「tradeClientExtensions」に独自のIDやCommentを追加しておくことで、約定後も注文データとの紐づけを行うことが可能です。

約定済みの注文の情報を取得する

現在オープン(約定済み)している注文の情報を取得します。

import oandapyV20.endpoints.trades as trades
r = trades.OpenTrades(_accountID)
rv = api.request(r)
print(json.dumps(rv, indent=2))

「_accountID」には、接続したい口座のAccount IDを指定します。戻り値のrvには、注文時に設定した「tradeClientExtensions」が含まれます。注文情報との紐づけを行いたい場合は、その値と比較します。

待機中の注文情報を取得する

現在注文したが、まだ未約定の待機中の注文一覧を取得します。

import oandapyV20.endpoints.orders as orders

r = orders.OrdersPending(accountID=_accountID)
rv = api.request(r)
print(json.dumps(rv, indent=2))

上のオープン済みの注文をあわせると発注した注文の一覧が得られます。

トレーリングストップを追加する

既に開いている注文にトレーリングストップを追加します。

import oandapyV20.endpoints.orders as orders

data = {
“order”: {
“type”: “TRAILING_STOP_LOSS”,
“tradeID”: tradeid,
“timeInForce”: “GTC”,
“distance”: 0.5
}
}
r = orders.OrderCreate(self._accountID, data=data)
rv = api.request(r)

「tradeID」には、注文済みのtradeidを指定します。「distance」には、トレール幅をpipsで指定します。トレーリングストップの注文は、注文前に現在の情報を取得して利益がいくらになったら、トレールを追加等いろいろな使い方が考えられますね。

まとめ

よく使うものだけ記載しました。他にもいろいろなメソッドが用意されています。以下のサイトには、JSONの例も詳細に提示されています。私もこのサイトのjsonをみていろいろ作成しました。英語ですが、jsonが読めれば何となく分かるはずです。本格的にFXの売買プログラムを作成したい方は、以下のサイトを参照してみてください。

The oandapyV20 REST-V20 API wrapper documentation — OANDA REST V20 API Wrapper 0.6.3 documentation

では、簡単ですがOANDA JapanのRESTAPIの使い方でした。くれぐれも自作プログラムはテストをしっかり行ってから、本稼働しましょう!!全て自己責任です。

1ドルから始められるFX!最低取引1通貨単位!
OANDA Japan

コメント

タイトルとURLをコピーしました