Python×ビットコイン自動売買

#15 Python×ビットコイン自動売買 | 自動売買の結果をLINEに通知しよう!

notify-trade-results-by-line

こんにちは、はやたす(@hayatasuuu )です。

今回の講義では、ビットコインの売買結果を、LINEに通知するプログラムを作成したいと思います。

前回の記事はこちら

buy-and-sell-bitcoin-automatically
#14 Python×ビットコイン自動売買 | 条件分岐を追加して売買ロジックを完成させよう!こんにちは、はやたす(@hayatasuuu )です。 今回の講義では、途中まで作成していた自動売買ロジックを、完成させていきたい...

自動売買の結果は、TraderViewで確認できます。
でも可能ならリアルタイムで売買結果が分かると嬉しいですよね。

そこで今回は、みんなスマホに入っているであろうLINEに、売買結果を通知する方法を紹介していきます。

今回紹介する内容は、自動売買に限らず役に立つ知識になっています。
ぜひこのタイミングで習得してしまいましょう!

自動売買の結果をLINEに通知しよう!

自動売買の結果をLINEに通知するには、色々と準備する必要があります。

具体的には、以下の3ステップです。

  • STEP① : アクセストークンの発行
  • STEP② : 通知用プログラムの作成
  • STEP③ : 自動売買プログラムへの反映

順番に見ていきましょう!

STEP① : アクセストークンの発行

そもそもLINE通知を使うためには、LINE Notifyというサービスを使います。
»公式ページ : LINE Notify

ここで発行されるアクセストークンを使うことで、自分のLINEアカウントに通知を送信できます。

というわけなので、まずはLINE Notifyにアクセスしましょう。

notify-trade-results-by-line1

その後、右上の「ログイン」をクリックして、自分のLINEアカウントにログインします。

ログインが完了すると、自分のアカウント名になるはずです。
もう一度クリックして、「マイページ」に移りましょう。

notify-trade-results-by-line2

マイページのトップ画面は、以下のようになっているかと思います。
初期状態なので、連携中のサービスはないはずです。

notify-trade-results-by-line3

もう少し下にスクロールすると、以下のような画面になります。
「トークンを発行する」をクリックしましょう。

notify-trade-results-by-line4

クリックすると新しいポップアップが出てきます。
トークン名は「bitcoin auto trade」にして、トークルームは「1:1でLINE Notifyから通知を受け取る」を選びましょう。

notify-trade-results-by-line5

それぞれ入力と選択ができたら、「発行する」をクリックします。

そうすると、LINE Notifyを使うためのアクセストークンを発行できました。

notify-trade-results-by-line6

このトークンをコピーすれば準備完了です!

STEP② : 通知用プログラムの作成

次にVSCodeを開きましょう。
今回は新しいフォルダを作成して、その中にファイルを作成していきます。

まずはutilsという名前で、フォルダを作成しましょう。

notify-trade-results-by-line7

フォルダを作成できたら、notify.pyというファイルを作成します。

notify-trade-results-by-line8

ここまで準備したら、コードを書いていきましょう。

詳しくはLINE Notify API Documentを見ると分かりますが、LINEに通知を送るには、以下のようなコードを作成します。

import requests


def send_message_to_line(message):
    access_token = '自分のアクセストークンをペースト'
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    data = {'message': message}
    requests.post(url='https://notify-api.line.me/api/notify',
                  headers=headers,
                  data=data)

 

あとは、この関数に送信したいメッセージを渡すことで、LINEに通知を送信できます。

試しに使ってみたいと思うので、以下のようにコードを書き換えます。
その後python utils/notify.pyでプログラムを実行してみましょう。

import requests


def send_message_to_line(message):
    access_token = '自分のアクセストークンをペースト'
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    data = {'message': message}
    requests.post(url='https://notify-api.line.me/api/notify',
                  headers=headers,
                  data=data)


if __name__ == '__main__':
    send_message_to_line('テスト')

 

そうすると、LINEに以下のような通知が来るはずです。

notify-trade-results-by-line9

しっかり通知を確認できますね!

STEP③ : 自動売買プログラムへの反映

あとは、元から作成してあった自動売買プログラムに反映するだけです。

ただ、ここで少しだけ問題点があります。

いま作成しているプログラムでは、変数rに取得結果を格納して、それをprint()で出力していました。
その結果を見ると分かりますが、変数rは辞書型になっています。

先ほど作成したsend_message_to_line()では、「テスト」という文字列を入れていましたが、辞書を渡すとどうなるのでしょうか。

ここでは適当に{'last': 100, 'ask': 99, 'volume': 1000}を渡して、notify.pyを実行してみたいと思います。

コード全体を確認する

import requests

def send_message_to_line(message):
    access_token = '自分のアクセストークンをペースト'
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    data = {'message': message}
    requests.post(url='https://notify-api.line.me/api/notify',
                  headers=headers,
                  data=data)


if __name__ == '__main__':
    send_message_to_line({'last': 100, 'ask': 99, 'volume': 1000})

届いた通知が以下になります。

send_message_to_line10

Pythonの辞書を渡すと、Keyに該当する値だけが返ってきました。
これだけでは、本当に通知で確認したい内容が分かりません。

また、send_message_to_line()内で使っているmessageを文字列に変換しても良いですが、通知される内容は非常に見辛いです。

そこで、以下のように体裁を整える関数pprint()を準備して、通知を見やすくしていきましょう。

import requests


def pprint(message):
    if isinstance(message, dict):
        s = ''
        for k, v in message.items():
            s += f'{k}:{v}\n'
        message = s
    return '\n'+message


def send_message_to_line(message):
    access_token = '自分のアクセストークンをペースト'
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    data = {'message': pprint(message)}
    requests.post(url='https://notify-api.line.me/api/notify',
                  headers=headers,
                  data=data)

 

これで見やすい形になるはずです。
コードを保存して、notify.pyを実行してみましょう。

そうすると、以下のような通知が届くはずです。

notify-trade-results-by-line11

これでsend_message_to_line()の編集は大丈夫かと思います。
あとはこの関数をインポートして、適宜使っていきましょう。

main.pyは以下のように編集します。

import configparser
import time

import pandas as pd

from coincheck import Coincheck
from utils.notify import send_message_to_line # 追加

"""
中略
"""

df = pd.DataFrame()
send_message_to_line('Start Auto Trading...') # 追加
while True:
    time.sleep(interval)
    positions = coincheck.position

    if not positions.get('jpy'):
        send_message_to_line('My account balance is zero.') # 追加
        raise

    """
    中略
    """

    if 'btc' in positions.keys():
        if df['+2σ'].iloc[-1] < df['price'].iloc[-1] \
                and coincheck.ask_rate < df['price'].iloc[-1]:
            params = {
                'pair': 'btc_jpy',
                'order_type': 'market_sell',
                'amount': positions['btc']
            }
            r = coincheck.order(params)
            send_message_to_line(r) # 追加
    else:
        if df['price'].iloc[-1] < df['-2σ'].iloc[-1]:
            market_buy_amount = coincheck.rate({'order_type': 'buy',
                                                'pair': 'btc_jpy',
                                                'amount': AMOUNT})
            params = {
                'pair': 'btc_jpy',
                'order_type': 'market_buy',
                'market_buy_amount': market_buy_amount['price']
            }

            r = coincheck.order(params)
            send_message_to_line(r) # 追加

 

このように、ログ代わりとして必要箇所をLINEに通知するよう設定しました。

またcoinchech.pyも少し編集を加えましょう。
具体的には_request()で例外処理を追加します。

import hmac
import hashlib
import json
import time

import requests

from utils.notify import send_message_to_line # 追加


class Coincheck(object):
    def _request(self, endpoint, params=None, method='GET'):
        """
        中略
        """

        # 以下に例外処理を追加
        try:
            if method == 'GET':
                r = requests.get(endpoint, headers=headers, params=params)
            else:
                r = requests.post(endpoint, headers=headers, data=body)
        except Exception as e:
            send_message_to_line(e)
            raise

        return r.json()

 

これでcoinchech.pyの編集も完了しました。
LINEに売買結果やエラー箇所を知らせてくれる、便利なプログラムになりましたね!

補足 : アクセストークンの管理

今回、LINE Notifyで発行したアクセストークンを、ソースコードに直書きしていました。
でも本来的には、設定ファイルにアクセストークンを書いておき、それを読み込むのがベストです。

つまりCoincheckのAPI Keyと同じ管理方法ですね。

このあたりは、今まで学習したことを活かせば自分でコードを書けるはずです。
ぜひチャレンジしてみてください!

まとめ : 自動売買の結果をLINEに通知しよう!

というわけで、自動売買の結果をLINEに通知するプログラムを作成しました。
LINEに通知を入れておくと、自動売買を運用するにしても安心ですね!

次回は、いよいよこれまで作成したプログラムを、24時間365日動かすための準備をしていきます。

少し難しい部分もありますが、ぜひ最後まで頑張っていきましょう!

第16回目の記事はこちら

setup-windows-vps
#16 Python×ビットコイン自動売買 | WindowsVPSを使って24時間365日動かす準備をしよう!こんにちは、はやたす(@hayatasuuu )です。 今回の講義では、プログラムを動かし続けるために必要なWindowsVPSの...

トップページはこちら

python-bitcoin-auto-trade
Python×ビットコイン自動売買 | 初心者でも理解できる入門講義『Pythonを使ったビットコインの自動売買って、どうやって実装するんだろう...。分かりやすく書かれている入門記事はないかな〜。』このような悩みを解決する記事になっています。Pythonを使ったビットコインの自動売買を学んでみたい人は必見です。...