AWSでBTCの積立プログラムを動かす

## はじめに

こんにちは。Kaiyuと申します。
仮想通貨bot初心者ですが、今回知人に勧められて記事を書きました。高頻度取引ではなくBTCの積み立てを行なっており、初心者の方にもおすすめできる内容になっていると思います。

## 手順
1. 取引所のAPIキーを設定する（今回はGMOコインを使用）
1. Pythonでプログラムを書く
1. AWSで自動実行の設定をする

## 1.取引所のAPIキーを設定する
GMOコインのAPIのページに行き、APIキーを発行します。色々なことを考慮するとその他の項目もあったほうが良いと思いますが、今回のコードでは注文のみ扱います。
![スクリーンショット 2021-12-11 11.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206282/66112189-61cb-e67a-f35e-c36b4603c51c.png)


## 2.Pythonのプログラム
apiKeyとsecretKeyの箇所には、先ほど発行した自身のキーを入れます。

```python3:tsumitate.py
# 現物の成行で注文する（最低0.0001BTCから）
# 月の予算を元に、1日の購入量を決める

import requests
import json
import hmac
import hashlib
import time
import math
import calendar
from decimal import Decimal, ROUND_DOWN
import datetime

dt_now = datetime.datetime.now()

# 自分のキーを入れる
apiKey = ''
secretKey = ''

def  order():
    #　レート取得
    endPoint = 'https://api.coin.z.com/public'
    path = '/v1/ticker?symbol=BTC'
    
    res = requests.get(endPoint + path)
    for i in res.json()["data"]:
        rate = int(i["last"])
    
    # 一ヶ月の予算を入れる
    monthly_budget = 
    # その月の日数で割る
    daily_budget = int(math.floor(monthly_budget / calendar.monthrange(dt_now.year, dt_now.month)[1]))
     
    # 一日あたりの注文数量
    # 最低注文数量の0.0001単位で丸める。
    amount = daily_budget / rate
    order_amount = Decimal(str(amount)).quantize(Decimal('0.0001'), rounding=ROUND_DOWN)

    # 注文
    timestamp = '{0}000'.format(int(time.mktime(dt_now.timetuple())))
    method    = 'POST'
    endPoint  = 'https://api.coin.z.com/private'
    path      = '/v1/order'
    reqBody = {
        "symbol": "BTC",
        "side": "BUY",
        "executionType": "MARKET",
        "size": float(order_amount)
    }

    text = timestamp + method + path + json.dumps(reqBody)
    sign = hmac.new(bytes(secretKey.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()

    headers = {
        "API-KEY": apiKey,
        "API-TIMESTAMP": timestamp,
        "API-SIGN": sign
    }

    res = requests.post(endPoint + path, headers=headers, data=json.dumps(reqBody))
    print (json.dumps(res.json(), indent=2))

order()
```

## 3.AWSで自動実行の設定をする
まずLambdaのページに行き、functionを作成します。
![スクリーンショット 2021-12-11 11.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206282/8b0afc7d-6c7b-b141-2b77-cb3e60b83f6a.png)

ライブラリがない状態なので、必要なライブラリをコードと同じフォルダに入れてzipファイルにし、右上のUpload Formからアップロードします。
![スクリーンショット 2021-12-11 11.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206282/e434b088-a86f-df2a-2d6d-cf75879b1338.png)

最後に、Add triggerからEventBridge（CloudWatch Events）を追加します。

![スクリーンショット 2021-12-11 11.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206282/40f19b5e-989e-ba2c-2cb2-7cadd86c3d77.png)

設定の際の注意点としては、時刻がUTCになっているので、日本時間で設定したい時刻の9時間前にしてあります。この場合、毎日0時0分に実行されます。
（プログラム側で指定する方法もあるようですが、今回はそこまで重要ではないため省略します）
![スクリーンショット 2021-12-11 13.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206282/3d3052a0-9539-5d02-8264-ecedf605f3fa.png)

Lambdaについては、詳しくは以下の記事をご覧ください。
https://aws.amazon.com/jp/getting-started/hands-on/run-serverless-code/

## 最後に

指値での注文やエラー対策などまだまだ基本的なところができていないですが、今後改善していきたいと思います。

実際にコードを書いて動かすことで、どういった要素が必要なのか学びになりました。今後は発展させて積立以外のプログラムも作ってみたいです。

bot取引というととても難しく手が出せない印象がありましたが、簡易的なプログラムであれば作ることができました。もちろん高頻度取引などで利益を出すのは大変だと思いますが、まず少しでもやってみるのが大事だと感じます。積立であれば、BTCを長期保有したい方にも向いていると思います。

この機会に皆さんも始めてみてはいかがでしょうか？

最後まで読んでいただきありがとうございました。