こんにちは!ソフトウェア開発の仕事をしながら趣味でFXを楽しんでる、たっきん(Twitter)です!
FXをやり始めて約1年になるのですが、ふと思うことがあるわけなんですよ。
それは、「平日に仕事やってたらFXする時間なくね?」ってことです!
なので基本的に僕のFXのトレードスタイルは中長期狙いのスイングトレードとなっているのですが、正直なところデイトレードやスキャルピングもやりたいってのが本音です。
しかし、仕事をしながらではデイトレードやスキャルピングは到底不可能だ・・・w
そもそもチャートすら見る時間もないのでチャートリーディングすらまともにできないwww
せめて僕の代わりにチャートリーディングを代行してくれて、絶好の売買タイミングを知らせてくれるようなものがあればなぁ~と思って少し調べてみると思わぬ朗報が!
FX会社によってはトレード関連のAPIを公開しているところがあって、このAPIを使って為替レートを取得したり、売買したりすることができるみたいなんです。
要は自分の組んだプログラムにチャートリーディングや自動売買を行わせることができるということです。
なのでそのプログラムを24時間常時稼働させておけば、僕に代わって24時間休まずチャートリーディングや売買を行ってくれるってことなんですよね?
APIを公開している会社はそんなに多くないみたいなんですが、OANDA社が公開しているAPIが比較的使いやすいみたいなので少し調べてみました。
OANDA API とは?
OANDA APIとは、FX取引の大手オンラインブローカーであるOANDA社が提供しているAPIとなります。
公式ホームページによると、このAPIを使うことで以下のことができるみたいです。
<相場情報関連>
ー「OANDA社API 公式マニュアル」より抜粋
・90種類以上の通貨ペアのリアルタイム為替レートの取得
・24時間為替相場の状況をリアルタイムに監視
・過去10年以上前の過去レートの取得
<トレーディング関連>
・OANDA社トレーディングAPIを利用した注文の発注
・アカウント情報、残高、注文、約定などの情報の取得
これだけの機能が備わっていれば、チャートリーディングや売買の自動化プログラムを作ることができそうですね!
物は試しって言いますし、このAPIを使ってみてその使用感をこのブログを通して発信していこうと思っています。
OANDA APIを使うには?
OANDAで口座または、デモ口座を開設し、アクセストークンを取得することでAPIが使用可能になります。
いきなり口座を開設するのはちょっと・・・って考えてる人はお試しでデモ口座を開設してみるのがよいでしょう。
僕もまずはデモ口座から初めてみようと思います。
また、OANDA APIについて色々調べていると、古いバージョンのv1と、新しいバージョンのv20があることがわかりました。
普通に考えたら新しいバージョンのv20を使うところなのですが、2018年12月現在ではOANDA JAPANが提供するデモ口座ではバージョンv20が使用不可らしい。
ただし、本国のサイトからデモ口座を開設すればバージョンv20が使用可能になります。
旧バージョンv1を使うメリットは正直ないと思われますので、もしデモ口座を開設しようと考えてましたら本国のサイトから開設しましょう!
2020年2月現在、OANDA JAPANの口座でもバージョンのv20が 使用可能となってます。
以下の記事で OANDA JAPAN のデモ口座開設手順を載せていますので、海外本家ではなくOANDA JAPANが運営するデモ口座を使用したい方は参考にしてみてください。
ただし、使い勝手としては海外本家もJAPAN版も大差はないです。
OANDA デモ口座を開設する
まずは本国の公式サイトにアクセスする。
公式:https://www.oanda.com/
デモ口座の場合は「OPEN A DEMO ACCOUNT」をクリック。
アカウント情報の入力画面になるので任意に入力していく。
注意するのはCountryとPhoneの入力。
Countryを日本にすると、OANDA JAPANのページに飛ばされ、バージョンv20で口座が開設できなくなってしまう。
なのでここは以下のように入力する。
- Country:United States
- Phone:①日本選択
②頭の0を除いた携帯番号
入力が終わったら最後に「Sigh Up」をクリックする。
Sign Upが完了すると以下のような画面が表示される。
ここで「LAUNCH OANDA WEB」をクリック。
すると以下のようなデモ口座画面が表示されます。
これでデモ口座の開設は完了です。
アカウントナンバーとアクセストークンの確認
OANDAのAPIを使うには、アカウントナンバーとアクセストークンが必要となります。
まずはアカウントナンバーを確認しましょう。
アカウントナンバーの確認
アカウント画面より、「Manage Funds」をクリックする。
すると以下のような画面が表示される。
v20 Account Numberの ところに表示されているのがアカウントナンバーになるので控えておきましょう!
アクセストークンの確認
アクセストークンを確認していきましょう!
アカウント画面より、「API」をクリックする。
すると以下のような画面が開くので「Generate」をクリックし、アクセストークンを生成する。
無事生成されると以下の箇所にアクセストークンが表示されるので控えておく。
為替レートを取得するプログラムを書いてみる
さっそくお試しレベルで為替レート値を取得するプログラムをPython書いてみる。
ちょっと調べてみたところ、先駆者の方がOANDA API v20を扱いやすくしたPythonのラッパークラスを作成されていたため、惜しげもなく使わせてもらうことにした。
先駆者の方には感謝しかない。
このラッパークラスはpipでインストールが可能です。
$ pip install oandapyV20
ちなみに、ソースコードはこちらで閲覧できます。
リアルタイムで為替レート値を取得する。
まずはリアルタイム為替レートを取得するコードをお試しレベルで書いてみました。
作成したPythonファイルは以下の3つです。
- pricing_stream.py ⇒ リアルタイム為替レート取得
- oanda_common.py ⇒ 共通モジュール
- your_account.py ⇒ 自身の口座情報
●pricing_stream.py
# ==============================================================================
# brief OANDA Pricing Stream
# リアルタイムで為替レート値を取得する。
#
# author たっきん
#
# 事前準備 :
# oandapyV20のインストール (pip install oandapyV20)
# ==============================================================================
import json
from oandapyV20 import API
from oandapyV20.endpoints.pricing import PricingStream
from oandapyV20.exceptions import V20Error
from fx import oanda_common as oc
from fx import your_account as ya
api = API(access_token=ya.access_token, environment=oc.OANDA_ENV.PRACTICE)
params = {"instruments": "USD_JPY"}
ps = PricingStream(ya.account_number, params)
try:
for rsp in api.request(ps):
print("■リストの取得")
print(json.dumps(rsp, indent=2))
print("■bidsのみ抽出:")
if "bids" in rsp.keys():
print(rsp["bids"][0]["price"])
except V20Error as e:
print("Error: {}".format(e))
●oanda_common.py
# ==============================================================================
# brief python OANDA 共通モジュール
#
# author たっきん
# ==============================================================================
class OANDA_ENV(object):
""" OANDA_ENV - OANDA環境の定義クラス。"""
PRACTICE = "practice" # デモ口座
LIVE = "live" # 本講座
class OANDA_GRN(object):
""" OANDA_GRN - ローソク足の時間足定義クラス。"""
S5 = "S5" # 5 seconds
S10 = "S10" # 10 seconds
S15 = "S15" # 15 seconds
S30 = "S30" # 30 seconds
M1 = "M1" # 1 minute
M2 = "M2" # 2 minutes
M3 = "M3" # 3 minutes
M4 = "M4" # 4 minutes
M5 = "M5" # 5 minutes
M10 = "M10" # 10 minutes
M15 = "M15" # 15 minutes
M30 = "M30" # 30 minutes
H1 = "H1" # 1 hour
H2 = "H2" # 2 hours
H3 = "H3" # 3 hours
H4 = "H4" # 4 hours
H6 = "H6" # 6 hours
H8 = "H8" # 8 hours
H12 = "H12" # 12 hours
D = "D" # 1 Day
W = "W" # 1 Week
M = "M" # 1 Month
●your_account.py
※本ファイルに自身で取得した「アカウントナンバー」と「アクセストークン」を記述してください。
# ==============================================================================
# brief OANDA口座情報
#
# author たっきん
# ==============================================================================
# 注意 : 自身で取得した「口座番号」と「アクセス・トークン」に置き換えてください。
account_number = "***-***-*******-***"
access_token = "********************************"
pricing_stream.pyを実行すると以下のような結果となります。
<実行結果>
■リストの取得
{
"type": "PRICE",
"time": "2018-12-08T00:57:05.924973626Z",
"bids": [
{
"price": "112.654",
"liquidity": 10000000
}
],
"asks": [
{
"price": "112.754",
"liquidity": 10000000
}
],
"closeoutBid": "112.639",
"closeoutAsk": "112.769",
"status": "non-tradeable",
"tradeable": false,
"instrument": "USD_JPY"
}
■bidsのみ抽出:
112.654
とりあえずは為替レート値の取得ができたみたいですね。
指定された日時のローソク足情報を取得する。
次は指定された過去日時のローソク足情報(高値、安値、始値、終値)を取得するコードを書いてみました。
例として2015年9月15日の1時間ローソク足情報を24コ取得します。
●instruments_candles.py
# ==============================================================================
# brief OANDA Instruments Candles
# 指定された日時のローソク足情報を取得する。
#
# author たっきん
#
# 事前準備 :
# oandapyV20のインストール (pip install oandapyV20)
# ==============================================================================
import datetime
import json
from oandapyV20 import API
from fx import oanda_common as oc
from fx import your_account as ya
import oandapyV20.endpoints.instruments as instruments
import pandas as pd
api = API(access_token=ya.access_token, environment=oc.OANDA_ENV.PRACTICE)
fmt = '%Y-%m-%dT%H:%M:00.000000Z'
# 2015年9月15日のローソク足情報を取得
_from = datetime.datetime(year=2015, month=9, day=15,
hour=12, minute=0, second=0).strftime(fmt)
params = {
"alignmentTimezone": "Japan",
'from': _from,
"count": 24, # 取得数24
"granularity": oc.OANDA_GRN.H1 # 1時間足
}
# APIへ過去データをリクエスト
ic = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)
api.request(ic)
# リストへ入れ替える
data = []
for raw in ic.response['candles']:
data.append([raw['time'], raw['volume'], raw['mid']['o'],
raw['mid']['h'], raw['mid']['l'], raw['mid']['c']])
# リストからデータフレームへ変換
df = pd.DataFrame(data)
df.columns = ['time', 'volume', 'open', 'high', 'low', 'close']
df = df.set_index('time')
# date型を整形する
df.index = pd.to_datetime(df.index)
print(df.tail(25))
# レスポンス生データ表示
# print(json.dumps(ic.response, indent=2))
「oanda_common.py」と「your_account.py」と同じ階層で実行してください。
実行結果は以下のようになります。
<実行結果>
volume open high low close
time
2015-09-15 12:00:00 2189 119.624 119.848 119.568 119.832
2015-09-15 13:00:00 2072 119.833 119.990 119.773 119.882
2015-09-15 14:00:00 1894 119.884 120.181 119.852 120.151
2015-09-15 15:00:00 1651 120.154 120.330 120.144 120.306
2015-09-15 16:00:00 1259 120.306 120.444 120.304 120.362
2015-09-15 17:00:00 823 120.362 120.493 120.335 120.459
2015-09-15 18:00:00 759 120.459 120.484 120.392 120.462
2015-09-15 19:00:00 482 120.462 120.471 120.403 120.404
2015-09-15 20:00:00 551 120.401 120.443 120.388 120.422
2015-09-15 21:00:00 1590 120.434 120.458 120.384 120.416
2015-09-15 22:00:00 1010 120.415 120.434 120.355 120.364
2015-09-15 23:00:00 451 120.368 120.470 120.362 120.424
2015-09-16 00:00:00 1395 120.420 120.432 120.254 120.374
2015-09-16 01:00:00 1253 120.370 120.410 120.238 120.311
2015-09-16 02:00:00 914 120.315 120.334 120.224 120.232
2015-09-16 03:00:00 883 120.229 120.245 120.156 120.210
2015-09-16 04:00:00 726 120.206 120.260 120.182 120.200
2015-09-16 05:00:00 1258 120.200 120.218 120.109 120.120
2015-09-16 06:00:00 1255 120.120 120.381 120.120 120.306
2015-09-16 07:00:00 1706 120.306 120.426 120.240 120.252
2015-09-16 08:00:00 1352 120.250 120.394 120.250 120.344
2015-09-16 09:00:00 1548 120.347 120.482 120.316 120.376
2015-09-16 10:00:00 1023 120.372 120.584 120.352 120.552
2015-09-16 11:00:00 860 120.550 120.620 120.522 120.592
まとめ
OANDA社が提供しているAPIを使うことによって、プログラム上で手軽にリアルタイム為替レートや過去のローソク足情報を取得することができました。
今回はお試しということで簡素なソースコードしか書きませんでしたが、プログラム次第ではリアルタイムでのチャートリーディングや全自動売買とかできそうな感じですね(^^)
次は取得したローソク足情報を使ってチャート図とか作成してみたいと思ってます。
また何かわかったらブログ更新していきます。
コメント