どうもバカルダーです。今回はGoogleCloudFunction(グーグルクラウドファンクション)と仮想通貨取引用ライブラリCCXTを使った日本円で金額指定できるBTCの定期積立BOTの設定と作り方とコードを紹介します。
BTC定期積立BOTの全体図
今回のBTC定期積立BOTの全体の構成、仕組みは以下のようになっています。
- 設定した頻度でGCPの「Cloud Schedule」から「コードを設置したGCF」にプログラムの実行指示が出る。
- 指示を受けた「GCF」がコードに従って「bitFlyer」に注文。
- 「bitFlyer」は注文結果を「GCF」に返す。
- 受け取った注文結果を「LINE」に通知。
ビットフライヤーのAPIキーを取得
今回はbitFlyerを使っていますので、ビットフライヤーのAPIキーとシークレットキーを取得しておきます。入出金の権限はチェックを外しておいた方が安全です。
今回のコードは積み立てBOTなので成行注文で作成しています。プログラムを実行すると約定するので始めは少額でテストしてみて下さい!
GoogleCloudPlatformへの登録とプロジェクトの作成
「Google Cloud Function(GCF)」は「Google Cloud Platform(GCP)」の中のサービスの1つです。まず、GCPにアクセスしグーグルアカウントでログインして「無料トライアルを開始」に進みます。
クレジットカードの登録が必要ですが、今回のBOTでは無料枠で収まるので課金される事はないはずです。
登録後に「ホーム」⇒「ダッシュボード」から新しいプロジェクトを作成します。プロジェクト名は好きな名前を付けます。
Cloud Functionの関数を作成
左上のメニューボタンを押して「Cloud Functions」をクリックします。
「+関数を作成」をクリックします。
関数名は好きな名前を付け、リージョンは「asia-northeast1」を選択します。トリガータイプは「Cloud pub/sub」、トピックはフォームをクリックして「トピックを作成する」をクリックして好きな名前で作成してください。入力したら「保存」をクリックします。
次は少し下にある「変数、ネットワーク、詳細設定」をクリックして「ランタイム環境変数」を設定します。「api_key」と「api_secret」はビットフライヤーのAPIキーとシークレットキーを入力し、「amount_yen」には購入したい金額(円)を入力します。全て入力したら「次へ」をクリック。
次はコードをコピペします。ランタイムは「Python3.8」「Python3.7」を選択します。エントリーポイントに「hello_pubsub」と入力します。
「main.py」はデフォルトのコードを全部消して以下のコードをコピペします。
import ccxt
import os
def hello_pubsub(event, context):
bitflyer = ccxt.bitflyer()
#APIキーとシークレット
bitflyer.apiKey = os.environ.get("api_key", None)
bitflyer.secret = os.environ.get("api_secret", None)
#購入量(円)
amount_buy=int(os.environ.get("amount_yen", None))
i=0
amount_ok="ng"
price_list=[]
size_list=[]
nokori_yen=amount_buy
orderbook = bitflyer.fetch_order_book ('BTC/JPY')
while amount_ok=="ng":
best_ask_price=float(orderbook['asks'][i][0])
price_list.append(best_ask_price)
best_ask_size=float(orderbook['asks'][i][1])
size_list.append(best_ask_size)
ask_sum=price_list[i]*size_list[i]
if ask_sum < nokori_yen:
nokori_yen=nokori_yen-ask_sum
print("残り:"+str(nokori_yen))
i=i+1
else:
print(price_list)
print(price_list[-1])
print(size_list)
print(size_list[:-1])
first_size=sum(size_list[:-1])
nokori_size=nokori_yen/float(price_list[-1])
order_size=round(first_size+nokori_size,8)
print(order_size)
amount_ok="ok"
try:
order = bitflyer.create_order(symbol = 'BTC/JPY',
type = 'market',
side = 'buy',
amount = order_size,
params = {"product_code": "BTC_JPY"}
)
print(order)
return order
except Exception as e:
print (e)
return str(e)
「requirements.txt」は以下のコードをコピペします。
# Function dependencies, for example:
# package>=version
ccxt
コピペしたら「デプロイ」をクリックします。
Cloud Schedulerを設定
次は、定期実行のための「Cloud Scheduler」を設定します。左上メニューから「Cloud Scheduler」をクリックし、「ジョブを作成」をクリックします。
ジョブの名前は好きな名前を付け、頻度は毎朝9時に実行したい場合は「0 9 * * *」、1時間おきの場合は「0 */1 * * *」と入力します。(頻度の詳細)
タイムゾーンは文字化けしてしまっているようですが(JST)を選択、ターゲットは「Pub/Sub」、トピックには「関数の作成」で新規作成したトピック名を入力、ペイロードは {} を入力して最後に「作成」を押して完了です。
これで「Cloud Schedulerで設定した頻度」で「成行でBTCを買うプログラム」が実行されます。
注文成功時、失敗時にLine通知を送る
今のままだと、注文が成功したかどうかビットフライヤーにログインしないと分かりません。結果をLine通知できるようにしたい場合はもう少し追加設定が必要です。
Lineトークンを取得
「Line Notify」にLineアカウントでログインしてLineトークンを取得してきます。トークン名は好きな名前を設定し、通知を送信するトークルームは「1:1で通知を受け取る」を選択します。
「発行する」をクリックするとトークンが発行されるので保存しておきます。
関数の環境変数にLineトークンを設定
関数のランタイム環境変数に「line_api」を追加してトークンを設定します。
「main.py」と「requirements.txt」を編集
main.pyとrequirements.txtも編集します。
#main.py
import ccxt
import os
#追加ここから
import requests
def line_notify(notification_message):
line_notify_token = str(os.environ.get("line_api", None))
line_notify_api = 'https://notify-api.line.me/api/notify'
headers = {'Authorization': f'Bearer {line_notify_token}'}
data = {'message': notification_message}
requests.post(line_notify_api, headers = headers, data = data)
#追加ここまで
def hello_pubsub(event, context):
bitflyer = ccxt.bitflyer()
#APIキーとシークレット
bitflyer.apiKey = os.environ.get("api_key", None)
bitflyer.secret = os.environ.get("api_secret", None)
#購入量(円)
amount_buy=int(os.environ.get("amount_yen", None))
i=0
amount_ok="ng"
price_list=[]
size_list=[]
nokori_yen=amount_buy
orderbook = bitflyer.fetch_order_book ('BTC/JPY')
while amount_ok=="ng":
best_ask_price=float(orderbook['asks'][i][0])
price_list.append(best_ask_price)
best_ask_size=float(orderbook['asks'][i][1])
size_list.append(best_ask_size)
ask_sum=price_list[i]*size_list[i]
if ask_sum < nokori_yen:
nokori_yen=nokori_yen-ask_sum
print("残り:"+str(nokori_yen))
i=i+1
else:
print(price_list)
print(price_list[-1])
print(size_list)
print(size_list[:-1])
first_size=sum(size_list[:-1])
nokori_size=nokori_yen/float(price_list[-1])
order_size=round(first_size+nokori_size,8)
print(order_size)
amount_ok="ok"
try:
order = bitflyer.create_order(symbol = 'BTC/JPY',
type = 'market',
side = 'buy',
amount = order_size,
params = {"product_code": "BTC_JPY"}
)
print(order)
#1行追加
line_notify("order-success:"+str(order_size)+"BTC")
return order
except Exception as e:
print (e)
#1行追加
line_notify("error:"+str(e))
return str(e)
#requirements.txt
# Function dependencies, for example:
# package>=version
ccxt
requests
初めてだと手順が多くて難しいかもしれないですね。。。問い合わせいただければ初期設定をお手伝いさせていただきます。
コメント
LINEはなぜかデプロイで失敗してしまいましたが、無事成り行き注文できました!「bitflyer」の部分を他の取引所に変更するだけで好きなところでできました。
手数料払わずに積立投資できるのはありがたいです!!
私もLINE通知コード追加でデプロイ失敗になってしまいましたが、こんなサービスがあるんだと勉強になりました。ありがとうございました。