早速、oandalから、ohlcを取得するためのコードをPythonで実装していきます。

※ API Tokenの発行がまだ出来ていない方は、こちらを参考にして、発行してください。

import oandapyV20.endpoints.instruments as instruments
import pandas as pd
from oandapyV20 import API


def get_ohlc_from_now_by(access_token: str, trade_mode, count: int, chart_term: str, instrument: str) -> pd.DataFrame:
    params = {
        "alignmentTimezone": "Japan",
        "count": count,
        "granularity": chart_term
    }

    ic = instruments.InstrumentsCandles(instrument=instrument, params=params)
    api = API(access_token=access_token, environment=trade_mode)
    api.request(ic)

    data = []
    for raw in ic.response['candles']:
        data.append([raw['time'], raw['mid']['o'], raw['mid']['l'], raw['mid']['h'], raw['mid']['c'], raw['complete']])

    df = pd.DataFrame(data)
    df.columns = ['time', 'open', 'low', 'high', 'close', 'complete']

    return df


if __name__ == '__main__':
    ohlc = get_ohlc_from_now_by(
        access_token='自分のPersonal Access Token',
        trade_mode='practice',
        count=10,
        chart_term='M15',
        instrument='GBP_JPY'
    )
    print(ohlc)

出力結果は、以下のようになります。

                             time     open      low     high    close  complete
0  2019-11-01T06:15:00.000000000Z  139.940  139.904  139.940  139.939      True
1  2019-11-01T06:30:00.000000000Z  139.936  139.902  139.970  139.970      True
2  2019-11-01T06:45:00.000000000Z  139.974  139.948  139.998  139.998      True
3  2019-11-01T07:00:00.000000000Z  140.000  139.969  140.056  139.983      True
4  2019-11-01T07:15:00.000000000Z  139.981  139.926  139.988  139.936      True
5  2019-11-01T07:30:00.000000000Z  139.933  139.913  140.002  139.913      True
6  2019-11-01T07:45:00.000000000Z  139.911  139.868  140.046  140.027      True
7  2019-11-01T08:00:00.000000000Z  140.024  139.964  140.030  140.021      True
8  2019-11-01T08:15:00.000000000Z  140.024  139.960  140.072  139.962      True
9  2019-11-01T08:30:00.000000000Z  139.960  139.946  140.040  140.004     False

取得データ使用時の注意点

このデータを分析する際に注意が必要な点が1つあります。

最終行の「complete」が False になっていて、「この行のデータは変動する」という意味を表します。 つまり、open以外の数値「low」「high」「close」は、確定した値ではないので、変化しない値として分析に使ってしまうと、意図していない分析結果を導いてしまう可能性があるので、注意してください。


コードの整理

今後、注文や決済のAPIを使用することを見据えて、コードを整えておきます。

import os

import oandapyV20.endpoints.instruments as instruments
import pandas as pd
from oandapyV20 import API


class OandaAPI:
    def __init__(self, trade_mode: str, instrument: str, chart_term: str):
        self.access_token = os.environ['oanda_access_token']
        self.api = API(access_token=self.access_token, environment=trade_mode)
        self.instrument = instrument
        self.chart_term = chart_term

    def get_ohlc_from_now_by(self, count: int) -> pd.DataFrame:
        params = {
            "alignmentTimezone": "Japan",
            "count": count,
            "granularity": self.chart_term
        }

        ic = instruments.InstrumentsCandles(instrument=self.instrument, params=params)
        self.api.request(ic)

        data = []
        for raw in ic.response['candles']:
            data.append(
                [raw['time'], raw['mid']['o'], raw['mid']['l'], raw['mid']['h'], raw['mid']['c'], raw['complete']])

        df = pd.DataFrame(data)
        df.columns = ['time', 'open', 'low', 'high', 'close', 'complete']

        return df


if __name__ == '__main__':
    os.environ['oanda_access_token'] = '自分のPersonal Access Token'

    oanda_api = OandaAPI(
        trade_mode='practice',
        instrument='GBP_JPY',
        chart_term='M15'
    )
    print(oanda_api.get_ohlc_from_now_by(count=10))


MT4スプレッド2