bitFlyer APIから注文する方法~プログラム例

システムトレードを行う場合、
取引所システムとのインターフェースを
実装することは必須となります。

多くの仮想通貨取引所では
APIが用意されており、
個人投資家でもシステムトレードに
取り組みやすい環境が整っています。

ドキュメントも用意されており、
これを見ながら誰でも作成できるようになっています。

とは言え、いきなりプログラム初心者が
APIとの接続を実装できるかというと
難しいものがあります。

今回はbitFlyerのAPIと接続するための
サンプルプログラムです。

bitFlyer APIのドキュメントは以下をご参照ください。

実際に私がビットコインの自動売買で
使用しているものです。

bitFlyer APIサンプルプログラム

実装したのは、Python 3.6です。

bitFlyer APIソースコード

ではさっそくサンプルプログラムです。

import json
import requests
import time
import hmac
import hashlib
import util
import configparser
import os

class bitflyerApi:
    def __init__(self):
        config = configparser.ConfigParser()
        config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini")
        self.api_key = config.get('api', 'key')
        self.api_secret = config.get('api', 'secret')
        self.api_endpoint = 'https://api.bitflyer.jp'

    def get_api_call(self,path):
        method = 'GET'
        timestamp = str(time.time())
        text = timestamp + method + path
        sign = hmac.new(bytes(self.api_secret.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()
        request_data=requests.get(
            self.api_endpoint+path
            ,headers = {
                'ACCESS-KEY': self.api_key,
                'ACCESS-TIMESTAMP': timestamp,
                'ACCESS-SIGN': sign,
                'Content-Type': 'application/json'
            })
        return request_data

    def post_api_call(self,path,body):
        body = json.dumps(body)
        method = 'POST'
        timestamp = str(time.time())
        text = timestamp + method + path + body
        sign = hmac.new(bytes(self.api_secret.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()
        request_data=requests.post(
            self.api_endpoint+path
            ,data= body
            ,headers = {
                'ACCESS-KEY': self.api_key,
                'ACCESS-TIMESTAMP': timestamp,
                'ACCESS-SIGN': sign,
                'Content-Type': 'application/json'
            })
        return request_data

    def get_ticker(self,product_code):
        api = bitflyerApi()
        path = '/v1/getticker?product_code=' + product_code
        result = api.get_api_call(path).json()
        return result
        
    def get_board(self):
        api = bitflyerApi()
        result = api.pubnub_call('lightning_board_snapshot_BTC_JPY')
        bids = util.util.dict_to_pd(result['bids'],'bf',False)
        asks = util.util.dict_to_pd(result['asks'],'bf',True)
        return bids,asks

    def get_boards(self, product_code):
        path = '/v1/board?product_code=' + product_code
        api = bitflyerApi()
        result = api.get_api_call(path).json()
        bids = util.util.dict_to_pd(result['bids'],'bf',False)
        asks = util.util.dict_to_pd(result['asks'],'bf',True)
        return bids,asks

    def get_executions(self, product_code, child_id = ''):
        path = '/v1/me/getexecutions?product_code=' + product_code
        if child_id != None and child_id != '':
            path = path + '&child_order_acceptance_id=' + child_id
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def get_positions(self, product_code):
        path = '/v1/me/getpositions?product_code=' + product_code
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def get_balance(self):
        api = bitflyerApi()
        result = api.get_api_call('/v1/me/getbalance').json()
        data = {}
        for row in result:
            if (row['currency_code'] == 'JPY'):
                data['jpy_amount'] = round(float(row['amount']), 2)
                data['jpy_available'] = round(float(row['available']), 2)
            elif (row['currency_code'] == 'BTC'):
                data['btc_amount'] = round(float(row['amount']), 8)
                data['btc_available'] = round(float(row['available']), 8)
        return data

    def get_porders(self, product_code,state='ACTIVE'):
        path = '/v1/me/getparentorders?parent_order_state='+state+'&product_code='+product_code
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def get_corders(self, product_code, pid='',state='ACTIVE'):
        path = '/v1/me/getchildorders?child_order_state='+state+'&product_code=' + product_code
        if pid != '':
            path = path + '&parent_order_id=' + pid
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def get_allcorders(self, product_code, pid='',caid=''):
        path = '/v1/me/getchildorders?product_code=' + product_code
        if pid != '':
            path = path + '&parent_order_id=' + pid
        if caid != '':
            path = path + '&child_order_acceptance_id=' + caid
        #print(path)
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def order(self,data):
        api = bitflyerApi()
        result = api.post_api_call('/v1/me/sendchildorder',data).json()
        return result

    def porder(self,data):
        api = bitflyerApi()
        result = api.post_api_call('/v1/me/sendparentorder',data).json()
        return result

    def get_collateral(self):
        path = '/v1/me/getcollateral'
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def get_collateralhistory(self):
        path = '/v1/me/getcollateralhistory'
        api = bitflyerApi()
        results = api.get_api_call(path).json()
        return results

    def cancelallorders(self,data):
        result = self.post_api_call('/v1/me/cancelallchildorders',data)
        return result

使用方法

以下のソースをbitflyerApi.pyというファイル名で保存します。

config.iniファイルの作成

同じディレクトリにconfig.iniを作成して、
以下のように記載します。

[api]
key = APIキー
secret = APIシークレットキー

APIを呼び出すプログラム例

呼び出すプログラム側で以下のように実装します。

import bitflyerApi

api = bitflyerApi.bitflyerApi()
collateral = api.get_collateral()
print("証拠金残高",collateral)

これは、証拠金残高を取得する場合です。