システムトレードを行う場合、
取引所システムとのインターフェースを
実装することは必須となります。
多くの仮想通貨取引所では
APIが用意されており、
個人投資家でもシステムトレードに
取り組みやすい環境が整っています。
ドキュメントも用意されており、
これを見ながら誰でも作成できるようになっています。
とは言え、いきなりプログラム初心者が
APIとの接続を実装できるかというと
難しいものがあります。
今回はbitFlyerのAPIと接続するための
サンプルプログラムです。
bitFlyer APIのドキュメントは以下をご参照ください。
実際に私がビットコインの自動売買で
使用しているものです。
Contents
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)
これは、証拠金残高を取得する場合です。