システムトレードを行う場合、
取引所システムとのインターフェースを
実装することは必須となります。
多くの仮想通貨取引所では
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)
これは、証拠金残高を取得する場合です。



