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

  • URLをコピーしました!

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

第15回目の本記事では、自動売買の結果をLINEに通知できるようにしていきます。

前回の記事 : #14 Python×ビットコイン自動売買 | 条件分岐を追加して売買ロジックを完成させよう!

売買結果は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

あとはnotify.pyにLINE通知用のコードを書いていきましょう。

詳しくは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③ : 自動売買プログラムへの反映

最後に作成済みの自動売買プログラムに、LINE通知のロジックを反映しましょう。

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

いま作成しているプログラムでは、変数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

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

そこで、辞書型のままメッセージを渡すのはなく、辞書の中身を文字型にしてからLINEに通知したいと思います。

send_message_to_line()内で文字列に変換しても良いのですが、通知内容を見やすくするために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 Python×ビットコイン自動売買 | WindowsVPSを使って24時間365日動かす準備をしよう! こんにちは、はやたす(@hayatasuuu )です。 第16回目の本記事では、WindowsVPSを使って24時間365日プログラムを動かす準備をしていきます。 前回の記事 : #15 Python×ビ...
SNSに投稿して読み返す
  • URLをコピーしました!
  • URLをコピーしました!
目次