bitflyerでビットコインの自動売買をしてみた。適当に買って(成行)、同じ値段で売る(指値)。今どきは1100万円を超えているから、0.01BTCでも11万円以上必要なので、だいぶ気楽さが無くなってきたな・・・。
上昇トレンドなら、指値にプラスしておけば良いけど、それならガチホで良い気もするな~。
適当に買って(成行)、同じ値段で売る(指値)だけでも、結構なコード量になってしまった…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import requests import pandas as pd import config import time import json import hmac import hashlib # APIキーとシークレットキーの設定 API_KEY = config.API_KEY API_SECRET = config.API_SECRET BASE_URL = 'https://api.bitflyer.com' # 価格データの取得 def get_current_price(): response = requests.get(f"https://api.bitflyer.com/v1/ticker?product_code=FX_BTC_JPY") data = response.json() return data['ltp'] # 認証ヘッダーの作成 def create_headers(method, path, body=''): timestamp = str(time.time()) text = timestamp + method + path + body signature = hmac.new(API_SECRET.encode(), text.encode(), hashlib.sha256).hexdigest() headers = { 'ACCESS-KEY': API_KEY, 'ACCESS-TIMESTAMP': timestamp, 'ACCESS-SIGN': signature, 'Content-Type': 'application/json' } return headers # 売買注文を送信する関数 def send_order(side, size, order_type, price=None): path = '/v1/me/sendchildorder' body = { 'product_code': 'FX_BTC_JPY', 'child_order_type': order_type, 'side': side, 'size': size, 'price': price, 'minute_to_expire': 10000, 'time_in_force': 'GTC' } # 指値の場合は、価格が必要 if order_type == 'LIMIT' and price is not None: body['price'] = price body = json.dumps(body) headers = create_headers('POST', path, body) response = requests.post(BASE_URL + path, headers=headers, data=body) return response.json() # 注文の詳細を取得する関数 def get_order_status(order_id): params = { 'product_code': 'FX_BTC_JPY', 'child_order_acceptance_id': order_id } path = '/v1/me/getchildorders' query = '?product_code=' + params['product_code'] + '&child_order_acceptance_id=' + str(params['child_order_acceptance_id']) headers = create_headers('GET', path, query) response = requests.get(BASE_URL + path, headers=headers, params=params) return response.json() # 成行で、とりあえず買ってみる response = send_order('BUY', 0.01, 'MARKET') # 注文IDの取得 order_id = response.get('child_order_acceptance_id') print(f"成行買い注文ID {order_id}") time.sleep(2) # 注文完了まで、ちょっと待つ # 注文の状態を確認し、約定するまでループ while True: order_status = get_order_status(order_id) # 注文の状態を表示 if order_status: order = order_status[0] # print(f'Order Status: {order["child_order_state"]}') if order["child_order_state"] == "COMPLETED": print(f"成行買い注文ID {order_id} 成行{order['average_price']}円の注文が約定しました") break else: print("成行買い注文はまだ約定していません") else: print("成行買い注文情報が見つかりません") break time.sleep(1) # 買い注文が約定したら、同じ値段で売ってみる。 sell_price = order['average_price'] # 指値+1000円にすれば売り注文(0.01BTCだから10円の儲け) # sell_price = order['average_price'] + 1000 print(f"sell_price = {sell_price}") response = send_order('SELL', 0.01, 'LIMIT', sell_price) # 注文IDの取得 order_id = response.get('child_order_acceptance_id') print(f"指値売り注文ID {order_id}") time.sleep(2) # 注文完了まで、ちょっと待つ # 注文の状態を確認し、約定するまでループ while True: order_status = get_order_status(order_id) # 注文の状態を表示 if order_status: order = order_status[0] # print(f'Order Status: {order["child_order_state"]}') if order["child_order_state"] == "COMPLETED": print(f"売り注文ID {order_id} 指値{sell_price}円の注文が約定しました") break else: #現在価格を取得 current_price = get_current_price() print(f"Current Price={current_price} 指値{sell_price} 差分{current_price - sell_price}") print("売り注文はまだ約定していません") else: print("売り注文情報が見つかりません") break time.sleep(5) |