botは難しいと思っていませんか?
「サーバーを借りるの?」とか「Git使うの?」とか「非同期API使うの?」とか。
全部不要です。
24時間稼働できるPCさえあればOKです。
では、簡単な仮想通貨の定期購入botを一緒に作ってみましょう。
定期購入botの例として、コインチェックのAPIを実際に使用したbotを作ってみます。
あと、定期購入なら取引所の積立機能でいいと思う方もいらっしゃるかもしれませんが、botだと手数料分はお得になる可能性があります。あと購入タイミングを自分の希望する時間にできるなど自由度も上がります。
作成するbotのアルゴリズム
まずは、作成するbotをフローチャートで説明します。
定期購入botのアルゴリズムはこうしました。
- 無限ループの中で2分おきに起床し、処理を実行する。
- 時刻が1時間ピッタリのときに注文処理をする。(1時間ごとに新規注文をする。)
- 購入価格はLTP(Last Traded Price)から決める。
超簡単なbotの作り方
先にbotに必要な関数の作り方を説明し、メイン処理は最後に説明します。
コインチェックのAPI仕様書はこちらをご覧ください。
新規注文する関数
コインチェックのAPIを使って、仮想通貨の購入・売却の新規注文をする関数order_new()のコードです。
# 新規注文 def order_new(apiKey, secretKey, symbol, order_type, price, size): endPoint = 'https://coincheck.com' path = '/api/exchange/orders' url = endPoint + path parameters = { 'order_type': order_type, 'pair': symbol, 'rate': price, 'amount': size, } timestamp = '{0}000'.format(int(time.mktime(datetime.now().timetuple()))) text = timestamp + endPoint + path + json.dumps(parameters) sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest() headers = { "ACCESS-KEY": apiKey, "ACCESS-NONCE": timestamp, "ACCESS-SIGNATURE": sign, "Content-Type": 'application/json', } response = requests.post(url, headers=headers, data=json.dumps(parameters)) res = response.json() print(json.dumps(res, indent=4)) return
変数のapiKeyとsecretKeyはご自身のものに置き換えてください。
LTPを取得する関数
注文価格を決めるためにLTPを使うので、LTP取得関数get_ticker()のコードです。
# Ticker情報の取得 def get_ticker(symbol): endPoint = 'https://coincheck.com' path = '/api/ticker' url = endPoint + path parameters = { 'pair': symbol, } response = requests.get(url, params=parameters) res = response.json() return res
一定間隔で起床させる関数
処理はある一定間隔で行います。
そのため、一定間隔で起床させる必要があります。
次のN分まで待つ関数wait_for_next_n_minute()のコードです。
# 次のN分まで待つ関数 def wait_for_next_n_minute(interval): # 現在時刻の取得。 now = datetime.now() # 現在時刻を指定した間隔に切り捨てる。 min_floor = math.floor(now.minute / interval) * interval # 指定した間隔で切り捨てた時刻。 just = now.replace(minute=min_floor, second=0, microsecond=0) # 指定した間隔の次の時刻。 next_just = just + timedelta(minutes=interval) # 次の時刻までの残り時間。 remain = next_just - now # 待ち時間を秒換算する。 wait_sec = remain.seconds + remain.microseconds/1000/1000 print('waiting: {:.2f}sec'.format(wait_sec)) # 次の時刻まで待つ。 time.sleep(wait_sec) # 指定した間隔の次の時刻になったので、時刻を返す。 return next_just
メイン処理(無限ループ処理)
必要な部品(関数)が揃ったので、それを使って定期購入するコードを書きます。
while文で無限ループをさせ、2分起きに起床させ、時刻がジャスト1時間のときのみ新規注文を行います。
これで1時間に1回定期購入するコードの完成です。
while True: # プログラムの起床間隔 # 定期購入判断処理をする間隔 interval_minute = 2 # 指定した間隔の次の時刻まで待つ。 # 関数を抜けたら、その時刻になっている。 just = wait_for_next_n_minute(interval_minute) print('now:', just) # 定期購入する時間かチェックする。 # 1時間ごとに定期購入する場合の例。 if just.minute != 0: # 1時間ごとに購入するので、分がゼロでない場合は何もしない。 print('skip:', just) continue # 購入対象の仮想通貨。 # 今回はビットコインとする。 symbol = 'btc_jpy' # LTPを取得する。 res = get_ticker(symbol) ltp = res['last'] print('LTP:', ltp) # 注文価格。 # お試しなので、LTPより低い価格で注文する。 price = ltp - 500000 # 購入か、売却か。 order_type = 'buy' # 注文数量。 size = 0.001 # 新規注文する。 order_new(apiKey, secretKey, symbol, order_type, price, size)
注文数量の制約はコインチェックのFAQをご覧ください。
https://faq.coincheck.com/s/article/40218?language=ja
bot実行結果
bot実行時のログ出力結果と、コインチェックの注文履歴を確認してみます。
botのログ出力
10:57くらいにプログラムを実行し、最初は10:58くらいまで寝ています。
10:58に起床しますが、時刻が1時間ジャストのところではないので、また寝ます。
11:00に起床すると、時刻が1時間ジャストなので、購入処理が実行されています。
その後は2分おきに起床して、時刻を確認して寝ています。
waiting: 56.61sec now: 2024-10-13 10:58:00 skip: 2024-10-13 10:58:00 waiting: 120.00sec now: 2024-10-13 11:00:00 LTP: 9386774.0 { "success": true, "id": nnnnnnnnnn, "amount": "0.001", "rate": "8886774.0", "order_type": "buy", "pair": "btc_jpy", "created_at": "2024-10-13T02:00:00.000Z", "market_buy_amount": null, "time_in_force": "good_til_cancelled", "stop_loss_rate": null } waiting: 119.79sec now: 2024-10-13 11:02:00 skip: 2024-10-13 11:02:00 waiting: 120.00sec now: 2024-10-13 11:04:00 skip: 2024-10-13 11:04:00
Coincheckの注文履歴
プログラムを3時間くらい放置しておいたので、1時間ごとに3回の新規注文がされています。
まとめ
定期購入botはパソコンさえあれば作成可能なことをご紹介できたと思います。
電気代はかかりますが、Pythonのダウンロードは無料なので、結構お得にbot制作を体験できます。
1日に1回購入するbotみたいなアレンジもできますので、ぜひbotを作ってみてください。