[Python]BTC定期積立BOTの作り方とコード。GCFとCCXTとbitFlyerを利用。

[Python]GCFとCCXTで作るBTC定期積立BOTの作り方とコードプログラミング

どうもバカルダーです。今回はGoogleCloudFunction(グーグルクラウドファンクション)と仮想通貨取引用ライブラリCCXTを使った日本円で金額指定できるBTCの定期積立BOTの設定と作り方とコードを紹介します。

BTC定期積立BOTの全体図

今回のBTC定期積立BOTの全体の構成、仕組みは以下のようになっています。

BTC定期積立BOTの全体図
  1. 設定した頻度でGCPの「Cloud Schedule」から「コードを設置したGCF」にプログラムの実行指示が出る。
  2. 指示を受けた「GCF」がコードに従って「bitFlyer」に注文。
  3. 「bitFlyer」は注文結果を「GCF」に返す。
  4. 受け取った注文結果を「LINE」に通知。

ビットフライヤーのAPIキーを取得

今回はbitFlyerを使っていますので、ビットフライヤーのAPIキーとシークレットキーを取得しておきます。入出金の権限はチェックを外しておいた方が安全です。

ビットフライヤーでAPIキーを取得
bitFlyer(ビットフライヤー)- 暗号資産(仮想通貨)の購入/販売所/取引所
ビットフライヤーは、国内最大級の仮想通貨取引所です。信頼と安心のセキュリティで、ビットコインやリップル(XRP)、モナコイン、イーサリアムなど人気な仮想通貨をわずか100円から購入可能。

今回のコードは積み立てBOTなので成行注文で作成しています。プログラムを実行すると約定するので始めは少額でテストしてみて下さい!

GoogleCloudPlatformへの登録とプロジェクトの作成

「Google Cloud Function(GCF)」は「Google Cloud Platform(GCP)」の中のサービスの1つです。まず、GCPにアクセスしグーグルアカウントでログインして「無料トライアルを開始」に進みます。

クレジットカードの登録が必要ですが、今回のBOTでは無料枠で収まるので課金される事はないはずです。

登録後に「ホーム」⇒「ダッシュボード」から新しいプロジェクトを作成します。プロジェクト名は好きな名前を付けます。

GCPのプロジェクトを作成

Cloud Functionの関数を作成

左上のメニューボタンを押して「Cloud Functions」をクリックします。

ダッシュボードからクラウドファンクションを起動

「+関数を作成」をクリックします。

ダッシュボードから関数の作成

関数名は好きな名前を付け、リージョンは「asia-northeast1」を選択します。トリガータイプは「Cloud pub/sub」、トピックはフォームをクリックして「トピックを作成する」をクリックして好きな名前で作成してください。入力したら「保存」をクリックします。

次は少し下にある「変数、ネットワーク、詳細設定」をクリックして「ランタイム環境変数」を設定します。「api_key」と「api_secret」はビットフライヤーのAPIキーとシークレットキーを入力し、「amount_yen」には購入したい金額(円)を入力します。全て入力したら「次へ」をクリック。

関数の環境変数の設定、

次はコードをコピペします。ランタイムは「Python3.8」を選択します。

Python3.8で関数のコードを書く

「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」、トピックには「関数の作成」で新規作成したトピック名を入力、ペイロードは {} を入力して最後に「作成」を押して完了です。

クラウドスケジュールの設定
毎朝9時の場合の設定

これで「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)
     #追加
        line_notify("order-success:"+str(order_size)+"BTC")
        return order
    except Exception as e:
        print (e)
     #追加
        line_notify("error:"+str(e))
        return str(e)

#requirements.txt
# Function dependencies, for example:
# package>=version
ccxt
requests

初めてだと手順が多くて難しいかもしれないですね。。。問い合わせいただければ初期設定をお手伝いさせていただきます。

コメント