lisz-works

プログラミングと興味を貴方に

Python3でOANDAのFXトレードで遊んでみるでした!

【スポンサーリンク】

Python

こんにちわlisです!

OANDAというFXの取引所が、Pythonで操作できることを知りました。

オラわくわくすっぞ!ってなったので、遊んでみることにしました。

今回は、基本的な注文のやり方についてです!

アカウントを取得する

アカウントはOANDA JAPANのページから作れます。

今回はデモ口座を作って試していきます。

新規口座開設ボタン……を押しても何やら説明が出るだけだったので、「ログインボタン」を押します。

ログインボタンを押す

「講座をご選択ください:」のところを「デモ口座」に変えます。

デモ口座

上部に開設ボタンが出てきました。

「デモ口座開設」を選択。

デモ口座開設

必要項目やチェックを一通り入力します。

入力項目をすべて入力

入力を終えたら「デモ口座ID (fxTradePracticeID)を発行する」を押します。

入力したメールにアドレスに、ログイン情報が送られます。

これでアカウント作成できました!

アカウントIDを取得する

さっそく作成したアカウントでログインします。

ログインする

アカウント画面に来ます。

「口座情報」という欄に「Account ID」があります。

アカウントID

これをメモです!

どこかにコピペするなり、必要なときにコピーしにきましょう。

APIアクセストークンを取得する

アカウント画面の右下の方にある、API欄。

ここの「APIアクセス管理」を押します。

「発行するボタン」を押してアクセストークンを発行してもらいます。

発行するボタン

出てきました!

アクセストークン

コレをコピーです!

アクセストークンは、このタイミングしか見れないので注意してください!

トークンが分からなくなったりなど、諸般の事情で再取得したい場合は、「再発行」することとなります。

import

今回必要なモジュールです。

from oandapyV20 import API
import oandapyV20.endpoints.orders as orders
import oandapyV20.endpoints.positions as positions
from oandapyV20.exceptions import V20Error

必要情報を定義

今回はテストなので、アカウント情報やアクセストークンを直書きしています。

account_id = 'XXX-XXX-XXXXXXXX-XXX'
access_token = '英数字の羅列'
api = API(access_token=access_token, environment='practice')

リクエスト処理

APIにリクエストする処理です。

def request(api: API, request_data: dict) -> dict:
    # APIリクエスト
    try:
        result = api.request(request_data)
        return result
    except V20Error as exception:
        print('[ERROR] {}'.format(exception))
    return None

apiはグローバル的な感じで宣言しちゃってるので引数でなくてもいい気がしますが、一応引数にしています。

成行で注文

成行で注文します。

def order_market(account_id: str, units: int) -> dict:
    # 成行
    data = {
        "order": {
            "type": "MARKET",
            "positionFill": "DEFAULT",
            "instrument": "EUR_USD",
            "units": units
        }
    }
    r = orders.OrderCreate(account_id, data=data)
    result = request(api, r)
    return result

指定された数(units)だけ注文するだけです。

今回はサンプルなので、EUR_USDで固定しています。

利確

利確はロング/ショートの利確するポジション数を指定して、その数分売るだけみたいです。

なので「このとき注文したコレを利確~」みたいな考え方はしなくていいみたいです。

def order_close(account_id, short_units: int = 0, long_units: int = 0) -> dict
    data = {}
    if bool(short_units):
        data['shortUnits'] = str(short_units)
    if bool(long_units):
        data['longUnits'] = str(long_units)
    if len(data) <= 0:
        return
    r = positions.PositionClose(accountID=account_id,
                                instrument='EUR_USD',
                                data=data)
    result = request(api, r)
    return result

order_close(account_id)

汎用的にするために、ショート/ロングの数を両方指定するようにしました。

指定なしの場合、何もしません。

成行がEUR_USD固定なので、こちらもEUR_USD固定にしてあります。

結果の表示

結果は辞書型(JSON)で来るので、表示するときは

import json
print(json.dumps(result, indent=2))

のようにすると、キレイに整形された状態で見ることができます。

json.dumps()便利!

参考

コチラを参考にしました。ありがとうございました!

www.algo-fx-blog.com

takilog.com

あとがき

Python3でOANDAのFXトレードで遊んでみるでした!

昔少しだけFXを試したことがあって、そのときMT4というのを試そうとしたのですが……

そのときは学習コストに気力が追いつかずやめてしまいました。

今回はPythonだしあの時よりも頑張れそうな気がします(笑)

また何か試したら記事にしていこうと思いますー!