【python/bitFlyer】目指せ仮想通貨自動売買システム開発!Private API その2 新規注文、注文履歴確認 sendchildorder・getchildorders

python
スポンサーリンク

このシリーズではbitFlyer Lightning APIを使用することで、常に情報収集/テクニカル分析し、 ここだと思えるタイミングで自動売買を行えるシステム開発を目指します。

今回はPrivate APIから新規注文注文履歴の確認をしてみたいと思います。

-- 実行環境 --
Windows 10 64ビット版(1903)、python 3.7.4

-免責事項-
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねます。当サイトの情報を利用する場合には、自己責任でご利用下さい。

API制限
HTTP API は、以下のとおり呼出回数を制限いたします。
Private API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。同一 IP アドレスからの API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。

0.1 以下の数量の注文は、すべての板の合計で 1 分間で 100 回を上限とします。上限に達するとその後 1 時間は 1 分間で 10 回まで注文を制限します。システムに負荷をかける目的で注文を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。

bitFlyer API API Documentation より抜粋
スポンサーリンク

新規注文(購入)

現物のマーケットで新規注文を出すサンプルを紹介します。Private API の認証については前回を参照してください。下記サンプルではビットコイン指値 ¥800,0000.001 BTC 買い注文するプログラムになっています。

本サンプルを実行すると正式に注文が行われます。価格が折り合うと購入してしまうので実行する際はその時の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を使って移動平均を求めてみたいと思います。

コメント

タイトルとURLをコピーしました