Bitflyerでビットコインを自動積立できるBot作成

Python
スポンサーリンク

こんにちは。Heywaです。

2009年にビットコインが誕生して以来、暗号通貨の価値は10倍以上に跳ね上がりました。仮想通貨の概念は、取引をより安全に、透明に、匿名で行うために導入されました。今日の投資の世界で最大のトレンドであることは間違いありません。

加えて先日、こんな記事を目にしまして、

https://jp.cointelegraph.com/news/bitcoin-below-8k-is-a-buy-zone-says-crypto-hedge-fund-co-founder

まじかよドルコスト平均法最強かよ前々からやっておけばよかったと思う反面、

まだまたビットコインも乱高下するだろうと思い、

定期的に一定金額のビットコインを購入するBotをPythonで作成してみることにしました。

「何番煎じだよ」と言われてしまうかもしれませんが、

まあ自分で考えて作ってみるのが大事ということで、ご容赦ください。

今回はLINENotifyで残高不足などの警告を受け取れるようにチャレンジしてみました。

 

スポンサーリンク

コード

import ccxt
import time
from pprint import pprint
import csv
import configparser
import datetime
import calendar
import pandas as pd
import numpy
import os
import json
import requests
import sys


def ccxtAPIobj(): #CCXT を呼び出す関数
    ccxtAPIobj = ccxt.bitflyer({
 
        #APIキーをご自分のものに差し替えてください
       'apiKey': 'apikey',
       'secret': 'secret',
       
       })
    
    return ccxtAPIobj

def LINENotifysend(message): #LINENotifyで通知を送る関数
    url = "https://notify-api.line.me/api/notify"
    access_token = 'access_token' #発行したAccess Token
    headers = {'Authorization': 'Bearer ' + access_token}

    message = message
    payload = {'message': message}
    r = requests.post(url, headers=headers, params=payload,)


if __name__ == '__main__':
    #変数定義
    ##通貨ペア
    pair = "BTC/JPY"
    product_code = "BTC_JPY"
    ##積立金額
    AccumulationJPY = 1000
    ##口座情報
    myaccount = {}
    #Ticker情報
    price = {}

    print('処理開始')
    #時間計測
    start = time.time()

    #口座情報を取得
    # bitflyerのAPIを実行
    balance = ccxtAPIobj().fetch_balance()
    pprint(balance)
    #JPY保有量格納
    # JPY総額
    myaccount['JPYtotal'] = round(balance['JPY']['total'], 0)
    print("# JPY総額:" + str(myaccount['JPYtotal']))
    # JPY拘束中(必要証拠金)
    myaccount['JPYused'] = round(balance['JPY']['used'], 0)
    print("# JPY拘束中:" + str(myaccount['JPYused']))
    # JPY使用可能
    myaccount['JPYfree'] = round(balance['JPY']['free'], 4)
    print("# JPY使用可能:" + str(myaccount['JPYfree']))
    #BTC保有量格納
    # BTC総額
    myaccount['BTCtotal'] = round(balance['BTC']['total'], 4)
    print("# BTC総額:" + str(myaccount['BTCtotal']))
    # BTC拘束中(必要証拠金)
    myaccount['BTCused'] = round(balance['BTC']['used'], 4)
    print("# BTC拘束中:" + str(myaccount['BTCused']))
    # BTC使用可能
    myaccount['BTCfree'] = round(balance['BTC']['free'], 4)
    print("# BTC使用可能:" + str(myaccount['BTCfree']))


    #利用可能金額が積立金額を下回っていた場合にはメッセージを表示して終了する
    if myaccount['JPYtotal'] < AccumulationJPY:
        # print("入金金額が積立金額を下回っているので処理を中止しました。入金してください")
        # print("# JPY総額:" + str(myaccount['JPYtotal']))
        # print("# 積立金額:" + str(AccumulationJPY))
        message = "【Bitflyer積立】入金金額が積立金額を下回っているので処理を中止しました。入金してください" + "\n"
        message = message + "# JPY総額:" + str(myaccount['JPYtotal']) + "\n"
        message = message + "# 積立金額:" + str(AccumulationJPY) + "\n"
        print(message)
        LINENotifysend(message)
        sys.exit()       


    #現在価格を取得
    ##Tickerの取得
    print("#Tickerの取得")
    ticker = ccxtAPIobj().fetch_ticker(pair, params = { "product_code" : product_code })
    #pprint(ticker)
    #Json から要素へアクセス
    price['Bid'] = ticker['bid']
    price['Ask'] = ticker['ask']
    price['last'] = ticker['last']
    print("Bid=「売る」。Ask=「買う」")
    print("Bid")
    print(price['Bid'])
    print("Ask")
    print(price['Ask'])
    print("last")
    print(price['last'])
    ################

    #設定された積立金額で購入可能な量を算出
    buy_lot = AccumulationJPY / price['Bid']
    #積立金額で購入不可の場合はメッセージを表示して終了する
    ##【参考】bitflyerの最小購入数量
    ##https://bitflyer.com/ja-jp/faq/4-5
    ##Lightning 現物(BTC/JPY)における最小発注数量は 0.001 BTC
    ##購入可否判定
    ###成り行き注文なので、少し余裕をもたせて0.0011BTCで判定する
    if buy_lot < 0.0011:
        ##メッセージ表示
        # print("積立金額で最低購入枚数を購入できないので処理を中止しました。積立金額を修正してください")
        # print("# BTC価格:" + str(price['Bid']))
        # print("# 積立金額:" + str(AccumulationJPY))
        message = "【Bitflyer積立】積立金額で最低購入枚数を購入できないので処理を中止しました。積立金額を修正してください" + "\n"
        message = message + "# BTC価格:" + str(price['Bid']) + "\n"
        message = message + "# 積立金額:" + str(AccumulationJPY) + "\n"
        print(message)
        LINENotifysend(message)
        sys.exit()
    
    #購入可能な場合、成り行き買い注文を入れる
    print("#成行き買い")
    buy_lot = round(buy_lot, 3)
    buymarket = ccxtAPIobj().createMarketBuyOrder (pair , buy_lot,{ "product_code" : product_code })
    pprint(buymarket)

    #注文した数量、価格のメッセージを表示する
    ##注文後の数量、金額については計算した値を表示する
    print("積立注文が完了しました")
    myaccount['JPYdiff'] = myaccount['JPYtotal'] - AccumulationJPY
    myaccount['BTCtotal2'] = myaccount['BTCtotal'] + buy_lot
    print("# JPY残額:" + str(myaccount['JPYdiff']))
    print("# BTC総額:" + str(myaccount['BTCtotal2']))
    message = "【Bitflyer積立】注文が完了しました" + "\n"
    message = message + "# JPY残額:" + str(myaccount['JPYdiff'])+ "\n"
    message = message + "# BTC総額:" + str(myaccount['BTCtotal2']) + "\n"

    print("処理終了")
    elapsed_time = time.time() - start
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

 

必要なもの

・Pythonが動く環境。僕はPython 3.7.3で動作確認しています

・BitFlyerのAPIキー

・LINENotifyのアクセストークン

 

使い方

必要なライブラリを入れていただいた上で、

以下を変えていただければ動くと思います。

①23、24行目にbitflyerのAPIキーとシークレットキーを入れる

②32行目にLINENotifyのアクセストークンを入れる

③48行目に一回の積立金額を入れる

一度動かすと一回購入しますので、気をつけてください。

cronやタスクスケジューラで、一日一回や一ヶ月に一回など決まった時間に自動起動させることを想定して作成しています。

後記

のちほど、イーサリアムなどのほかの通貨の積立も作ってみようと思います。

また、過去20日間の安値を更新した次の日にだけ積み立てるなども作ってみようかと思っています。うまく行ったらまた記事を書きたいと思います。

最後に、プログラミングは楽しいですし、覚えておいて損はないです。

まだやったことがない人で興味を持たれた方は、手を出してみていただければ幸いです。

このようなスクールもあって門戸はかなり広いと思いますし、

堀江貴文さんの動画をみて、至れり尽くせりの時代にプログラミングを学ばないのは損だなと感じています。それくらい誰でも学べる時代になって来ていて、チャンスだと思っています。少しでも興味を持っていただければ幸いです。

コメント

  1. […] 前回ビットコインの自動積立をするスクリプトを作成し、うまく動いているので、今度はイーサを積立するスクリプトにチャレンジしてみました。 […]

タイトルとURLをコピーしました