【改名】ストックドッグ

金融系の会社で働くSEが株やPython、その他諸々について書いています。システムトレードもやってるよ!

取引コードを書こう

ここからシステムトレードをするために必要最低限のコードを揃えていきます。

その前に、まずどんなシステムトレードを作ろうとしているかをおさらいしましょう。

最終的に出来上がるシステムイメージ

ビットコインを10分に1回、1時間に合計6回の買いを行い、1時間に1回保有しているビットコインを全部売る

という単純明快はシステムトレードを作成します。

例えば...

21:00 5000円分のビットコイン買い
21:10 5000円分のビットコイン買い
21:20 5000円分のビットコイン買い
21:30 5000円分のビットコイン買い
21:40 5000円分のビットコイン買い
21:50 5000円分のビットコイン買い
21:59 30000円分のビットコイン売り

この後これがずっと続く...


たったこれだけです。


必要な関数は以下です。

  • レスポンスをjson形式で保存する関数
  • jsonファイルを読み込む関数

システムトレードの流れ

1 ビットコインを売買取引を行う関数を使って、5000円分のビットコインを買う関数

2 これが10分ごとに繰り返される

3 保有している建玉を取得する関数を使う、これによっていくらビットコインを買っているかがわかる

4 レスポンスをjson形式で保存する関数を使って、保有している建玉jsonファイルに保存する

5 jsonファイルを読み込む関数を使って、保有している建玉を把握

6 保有している建玉分を、ビットコインを売買取引を行う関数を使って売りに出す


流れはこんな感じです!

なぜ、この関数が必要なのかな?って思った時にこの流れを見ながらここで使うからか、と納得してほしです。

以下がコードになります

※体力の限界を迎え、また今度ここは詳しく解説します
※ただ、ここまで詳しめに解説してきたので、ここからはコードを読みながら自力でもできるはず!

細かくコメントを入れているので、読みながら、動かしながら理解しましょう。

本来は、クラス化したところではありますが、可読性が落ちるので関数ごとにしています。

2回書いている部分もありますが、読みやすいでしょ?笑

import requests
import json
import time
import hmac
import hashlib


#取引を行うAPI
def trade_api(product_code, child_order_type, side, size):

	#API keyとAPI secret
	api_key = "***************************"
	api_secret = b"***************************"	

	#エンドポイントURL
	endpoint = "https://api.bitflyer.jp"

	#認証情報の作成
	method = "POST"
	path = "/v1/me/sendchildorder"
	timestamp = str(time.time())
	
	#パラメータ情報
	payload = {
		"product_code": product_code,
		"child_order_type" : child_order_type,
		"side" : side,
		"size" : size
	}

	text = timestamp + method + path + str(json.dumps(payload))
	sign = hmac.new(api_secret, text.encode('utf-8'), hashlib.sha256).hexdigest()


	#ヘッダーの情報
	headers = {
		"ACCESS-KEY": api_key,
		"ACCESS-TIMESTAMP": timestamp,
		"ACCESS-SIGN": sign,
		"Content-Type": "application/json"
	}



	# print("JSON形式 : ", json.dumps(payload))

	response = requests.post(endpoint + path, data=json.dumps(payload), headers=headers)
	# print(endpoint + path)
	# print(response)
	
	response = response.text
	print(response)

	return response

def position_api():

	#API keyとAPI secret
	api_key = "***************************"
	api_secret = b"***************************"	

	#エンドポイントURL
	endpoint = "https://api.bitflyer.jp"


	#認証情報の作成
	method = "GET"
	timestamp = str(time.time())
	path = "/v1/me/getpositions" + "?" + "product_code=FX_BTC_JPY"

	text = timestamp + method + path

	sign = hmac.new(api_secret, text.encode('utf-8'), hashlib.sha256).hexdigest()
	# print("sign : ", sign)

	#ヘッダーの情報
	headers = {
		"ACCESS-KEY": api_key,
		"ACCESS-TIMESTAMP": timestamp,
		"ACCESS-SIGN": sign,
		"Content-Type": "application/json"
	}


	response = requests.get(endpoint + path, headers=headers)
	response = response.text
	# print(response)

	#jsonファイルを保存します
	saveFile("/v1/me/getpositions", response)

	return response

#JSON形式でファイルを保存する関数
def saveFile(path, response):
	path = path.replace("/v1/me/", "")
	f = open(path + ".json", "w")
	f.write(response)
	f.close()


#JSONファイルを読み込む関数
def readJson(file_name):
	json_file = open(file_name + ".json", "r")
	json_file = json.load(json_file)

	return json_file


#取引を行う
def buy():

	#パラメータに付与する情報をリスト形式に
	product_code = ["BTC_JPY", "ETH_BTC", "FX_BTC_JPY"]
	child_order_type = ["LIMIT", "MARKET"]
	side = ["BUY", "SELL"]
	
	#注文数量
	one_trade_btc = 0.01

	trade_api(product_code[2], child_order_type[1], side[0], one_trade_btc)


#決済を行う
def settlement():

	#建玉を取得
	position_api()

	#建玉のjsonを読み込む
	position_btc = readJson("getpositions")
	print(position_btc)

	# 決済
	i = 1
	while True:
		try:
			print(position_btc[i]["size"])
			# trade.send_order_api(position_btc[i]["product_code"], "MARKET", "SELL", position_btc[i]["size"])
		except IndexError:
			break
		i += 1


if __name__ == '__main__':
	print("コメントアウトを消して、試しに使ってみよう")
	# position_api()
	# buy()
	# settlement()

次回予告

次回はこのプログラムを定期実行させてます。

いよいよシステムトレーダーっぽくなってきました。

システムトレードやろうよ 〜目次〜

www.stockdog.work