このシリーズではbitFlyer Lightning APIを使用することで、常に情報収集/テクニカル分析し、 ここだと思えるタイミングで自動売買を行えるシステム開発を目指します。
今回はPrivate APIから新規注文と注文履歴の確認をしてみたいと思います。
-- 実行環境 --
Windows 10 64ビット版(1903)、python 3.7.4
API制限
bitFlyer API API Documentation より抜粋
HTTP API は、以下のとおり呼出回数を制限いたします。
Private API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。同一 IP アドレスからの API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。
0.1 以下の数量の注文は、すべての板の合計で 1 分間で 100 回を上限とします。上限に達するとその後 1 時間は 1 分間で 10 回まで注文を制限します。システムに負荷をかける目的で注文を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。
新規注文(購入)
現物のマーケットで新規注文を出すサンプルを紹介します。Private API の認証については前回を参照してください。下記サンプルではビットコインを指値 ¥800,000 で0.001 BTC 買い注文するプログラムになっています。
import requests
import json
import time
import hmac
import hashlib
# ********************************
# Private API用
# ********************************
class PrivateApi:
def __init__( self, api_key, api_secret, api_endpoint):
self.api_key = api_key
self.api_secret = api_secret
self.api_endpoint = api_endpoint
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 fnc_buy_btc( api_key, api_secret, product_code, child_order_type, side, price, size, minute_to_expire, time_in_force):
body = {
"product_code" : product_code,
"child_order_type" : child_order_type,
"side" : side,
"price" : price,
"size" : size,
"minute_to_expire" : minute_to_expire,
"time_in_force" : time_in_force
}
# 実施
api = PrivateApi( format( api_key), format( api_secret), 'https://api.bitflyer.jp')
result = api.post_api_call('/v1/me/sendchildorder',body).json()
return result
# ********************************
# メイン処理
# ********************************
def main ():
# API キー
api_key = "***(API Key)***"
api_secret = "***(API Secret)***"
# パラメーター
product_code = "BTC_JPY"
child_order_type = "LIMIT"
side = "BUY"
price = 800000
size = 0.001
minute_to_expire = 43200
time_in_force = "GTC"
# 資産情報取得
result = fnc_buy_btc( api_key, api_secret, product_code, child_order_type, side, price, size, minute_to_expire, time_in_force)
print ( "新規注文(結果):", result)
if __name__ == '__main__':
main()
パラメーターの詳細については公式のドキュメントを参照してください。
実行結果
サンプルプログラム実行結果とbitFlyerのWeb画面で確認した注文履歴の画面です。問題なく注文できていることが確認できました。



注文できましたね! サンプルでは購入ですが、売却するときはどうすればいいんですか?

売却も購入と全く同じだよ。パラメーターの side を SELL に変更すれば売り注文になるよ。
注文履歴の取得
注文履歴を取得します。下記サンプルではパラメーター「child_order_state」を「ACTIVE」に指定することで、注文中のリストを取得しています。
import requests
import json
import time
import hmac
import hashlib
# ********************************
# Private API用
# ********************************
class PrivateApi:
def __init__( self, api_key, api_secret, api_endpoint):
self.api_key = api_key
self.api_secret = api_secret
self.api_endpoint = api_endpoint
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 fnc_get_orders( api_key, api_secret, product_code, child_order_state):
url_param = '?product_code='+str(product_code)+'&child_order_state='+child_order_state
api = PrivateApi( format( api_key), format( api_secret), 'https://api.bitflyer.jp')
result = api.get_api_call('/v1/me/getchildorders'+url_param).json()
return result
# ********************************
# メイン処理
# ********************************
def main ():
# API キー
api_key = "***(API Key)***"
api_secret = "***(API Secret)***"
# 注文履歴取得パラメータ
product_code = "BTC_JPY"
child_order_state = "ACTIVE"
# 注文履歴参照
result = fnc_get_orders( api_key, api_secret, product_code, child_order_state)
if result != []:
print( result)
else:
print( "なし")
if __name__ == '__main__':
main()
実行結果
先ほどのサンプルで出した注文1件の情報が取得できました。


注文履歴はどんなときに使うんですか?

メインは出した注文の成約状況確認かな。成行注文とかであれば即売買成立するけど指値の場合は想定した金額まで届かないとか普通にあるので、状況を確認して注文キャンセル→新たな指値で注文出しなおすとかね。

なるほど、実際に動かすと色々なケースがあるんでしょうね。難しそうです。

確かに難しいけど、自身の分析や経験をロジックに組み込めるのが自作する最大のメリットだからね。分かってくると本当に楽しいよ(笑)
まとめ
今回は bitFlyer Lightning API を用いて、現物マーケットで指値での新規買い注文と注文状況の確認について実施してみました。次回は収集したTickerを使って移動平均を求めてみたいと思います。
コメント