こんにちは、はやたす(@hayatasuuu )です。
第15回目の本記事では、自動売買の結果をLINEに通知できるようにしていきます。
前回の記事 : #14 Python×ビットコイン自動売買 | 条件分岐を追加して売買ロジックを完成させよう!
売買結果はTraderViewで確認できますが、できればリアルタイムで通知がくると嬉しいですよね。
そこで今回は、みんなスマホに入れているであろうLINEに、売買結果を通知する方法を紹介していきます。
今回紹介する内容は、自動売買に限らず役に立つ知識になっています。このタイミングで習得してしまいましょう!
自動売買の結果をLINEに通知しよう!
自動売買の結果をLINEに通知するには、以下の3ステップが必要になります。
- STEP① : アクセストークンの発行
- STEP② : 通知用プログラムの作成
- STEP③ : 自動売買プログラムへの反映
順番に見ていきましょう!
STEP① : アクセストークンの発行
LINE通知をおこなうためには、LINE Notifyというサービスを使います。
公式ページ : LINE Notify
ここで発行されるアクセストークンを使うことで、自分のLINEアカウントに通知を送信できます。
というわけで、まずはLINE Notifyにアクセスしましょう。
右上の「ログイン」をクリックして、自分のLINEアカウントにログインします。
ログインが完了すると、自分のアカウント名になるはずです。もう一度クリックして「マイページ」に移りましょう。
マイページのトップ画面は、以下のようになっているはずです。
少し下にスクロールすると、以下のような画面になるので「トークンを発行する」をクリックしましょう。
クリックすると新しいポップアップが出てきます。
トークン名は「bitcoin auto trade」にして、トークルームは「1:1でLINE Notifyから通知を受け取る」を選びましょう。
最後に「発行する」をクリックすると、LINE Notifyを使うためのアクセストークンを発行できます。
このトークンをコピーすれば準備完了です!
STEP② : 通知用プログラムの作成
次にVSCodeを開きましょう。新しいフォルダを作成して、その中にファイルを作成していきます。
まずはutils
という名前で、フォルダを作成しましょう。
フォルダを作成できたら、notify.py
というファイルを作成します。
あとは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に以下のような通知が来るはずです。
しっかりテスト送信を確認できますね!
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})
上記のコードを実行して、届いた通知が以下になります。
メッセージに辞書を渡すと、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
を実行してみましょう。
そうすると以下のような通知が届きます。
通知内容も見やすいし、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日動かすための準備をしていきます。
セットアップが少し難しいですが、ぜひ最後まで頑張っていきましょう!