OANDA REST-V1 APIで為替の情報を取得する

お久しぶりです。前回の記事ではPythonで為替の情報をリアルタイムで取得できるAPIであるOANDA REST-V20 APIの紹介をしました。前回の記事を書いた後、改めて旧ver.のAPIであるOANDA REST-V1 APIのサンプルコードのページを見ると多少使いやすくなってるっぽかったので紹介しようと思います。

OANDA REST-V1 APIの紹介

OANDA公式でサンプルコードの配布を行っています:github

参考サイト:OANDA APIをつかって Pythonで 為替レートを取得してみた

V1 APIのいいところ(V20 APIと比べて)

  • OANDA JAPANで開設した口座のアカウント情報で使うことができるため導入が簡単(対してV20 APIは今のところ日本は未対応、前回の記事では無理矢理使う方法を紹介)
  • 日本語の情報や実際に使ってみた例が多い

まずはじめに

  1. OANDA JAPANのデモ口座に登録(OANDA JAPAN
  2. ログインしてID(i.e.0123456)とaccess token(めちゃくちゃ長い)を手に入れる

APIを使うにはOANDA JAPANの口座に登録する必要があります。口座には2種類あり、実際にトレードができる本番口座と練習用のデモ口座があります。APIを使うだけならデモ口座のアカウントでもできるので今回はデモ口座を使います。

aasdaarreara

 

申請画面はこんな感じです

dasodji

アカウントIDは赤丸のところの数字です

fdapdjojaまた、「APIアクセスの管理」からaccess tokenを取得できます

jvfisdojvosdvj

サンプルコード

OANDA JAPAN公式のサンプルコードを紹介します。

github : py-api-streaming

このサンプルコードを使うとリアルタイムでtickを取得することができます。各自で設定するパラメータはaccount_idとaccess_tokenとinstruments(通貨ペア、USD_JPYなど)です。

"""
Demonstrates streaming feature in OANDA open api
To execute, run the following command:
python streaming.py [options]
To show heartbeat, replace [options] by -b or --displayHeartBeat
"""

import requests
import json

from optparse import OptionParser

def connect_to_stream():

    """
    Environment                 Description 
    fxTrade (Live)              The live (real money) environment 
    fxTrade Practice (Demo)     The demo (simulated money) environment 
    """
    domainDict = { 'live' : 'stream-fxtrade.oanda.com',
               'demo' : 'stream-fxpractice.oanda.com' }

    # Replace the following variables with your personal values 
    environment = "demo" # Replace this 'live' if you wish to connect to the live environment 
    domain = domainDict[environment] 
    access_token = 'REPLACE THIS WITH YOUR ACCESS TOKEN'
    account_id = 'REPLACE THIS WITH YOUR ACCOUNT ID, ie  2252344'
    instruments = 'REPLACE THIS WITH THE INSTRUMENTS YOU WOULD LIKE TO SUBSCRIBE TO.  ie "EUR_USD,USD_JPY,...' 

    try:
        s = requests.Session()
        url = "https://" + domain + "/v1/prices"
        headers = {'Authorization' : 'Bearer ' + access_token,
                   # 'X-Accept-Datetime-Format' : 'unix'
                  }
        params = {'instruments' : instruments, 'accountId' : account_id}
        req = requests.Request('GET', url, headers = headers, params = params)
        pre = req.prepare()
        resp = s.send(pre, stream = True, verify = True)
        return resp
    except Exception as e:
        s.close()
        print("Caught exception when connecting to stream\n" + str(e)) 

def demo(displayHeartbeat):
    response = connect_to_stream()
    if response.status_code != 200:
        print(response.text)
        return
    for line in response.iter_lines(1):
        if line:
            try:
                line = line.decode('utf-8')
                msg = json.loads(line)
            except Exception as e:
                print("Caught exception when converting message into json\n" + str(e))
                return

            if "instrument" in msg or "tick" in msg or displayHeartbeat:
                print(line)

def main():
    usage = "usage: %prog [options]"
    parser = OptionParser(usage)
    parser.add_option("-b", "--displayHeartBeat", dest = "verbose", action = "store_true", 
                        help = "Display HeartBeat in streaming data")
    displayHeartbeat = False

    (options, args) = parser.parse_args()
    if len(args) > 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        displayHeartbeat = True
    demo(displayHeartbeat)


if __name__ == "__main__":
    main()

 

このサンプルコードはひたすらtickを出力するだけですが、次に少しアレンジをしてみようと思います。

 

欲しい情報だけを取り出す

前回と同様に欲しい情報だけを取り出してみようと思います。

"""
Demonstrates streaming feature in OANDA open api
To execute, run the following command:
python streaming.py [options]
To show heartbeat, replace [options] by -b or --displayHeartBeat
"""

import requests
import json

from optparse import OptionParser

def connect_to_stream():

    """
    Environment                 Description 
    fxTrade (Live)              The live (real money) environment 
    fxTrade Practice (Demo)     The demo (simulated money) environment 
    """
    domainDict = { 'live' : 'stream-fxtrade.oanda.com',
               'demo' : 'stream-fxpractice.oanda.com' }

    # Replace the following variables with your personal values 
    environment = "demo" # Replace this 'live' if you wish to connect to the live environment 
    domain = domainDict[environment] 
    access_token = 'REPLACE THIS WITH YOUR ACCESS TOKEN'
    account_id = 'REPLACE THIS WITH YOUR ACCOUNT ID, ie  2252344'
    instruments = 'REPLACE THIS WITH THE INSTRUMENTS YOU WOULD LIKE TO SUBSCRIBE TO.  ie "EUR_USD,USD_JPY,...' 

    try:
        s = requests.Session()
        url = "https://" + domain + "/v1/prices"
        headers = {'Authorization' : 'Bearer ' + access_token,
                   # 'X-Accept-Datetime-Format' : 'unix'
                  }
        params = {'instruments' : instruments, 'accountId' : account_id}
        req = requests.Request('GET', url, headers = headers, params = params)
        pre = req.prepare()
        resp = s.send(pre, stream = True, verify = True)
        return resp
    except Exception as e:
        s.close()
        print("Caught exception when connecting to stream\n" + str(e)) 

def demo(displayHeartbeat):
    response = connect_to_stream()
    if response.status_code != 200:
        print(response.text)
        return
    for line in response.iter_lines(1):
        if line:
            try:
                line = line.decode('utf-8')
                msg = json.loads(line)
                if "heartbeat" in msg:
                  continue
            except Exception as e:
                print("Caught exception when converting message into json\n" + str(e))
                return

            print(msg["tick"]["bid"])
            print(msg["tick"]["time"])

def main():
    usage = "usage: %prog [options]"
    parser = OptionParser(usage)
    parser.add_option("-b", "--displayHeartBeat", dest = "verbose", action = "store_true", 
                        help = "Display HeartBeat in streaming data")
    displayHeartbeat = False

    (options, args) = parser.parse_args()
    if len(args) > 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        displayHeartbeat = True
    demo(displayHeartbeat)


if __name__ == "__main__":
    main()

 

為替の情報がmsgという名前のディクショナリで返ってくるので、取得したい値のキー(今回は”bid”と”time”)を使うことで取り出します。(このデータをlistやpandasのデータフレームにappendして時系列データの作成も可能です)

個人的にはV1 APIはV20 APIのようにラッパーを介さないので、コードが長くなるもののラッパーを介すことによる未知のバグや変えられない仕様などが少ないのではないかと感じています。

まとめと次回予告

V1 APIを使ったローソク足をリアルタイムで出力するプログラムの紹介ができればいいな…(デバッグ中)。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top