Binance全銘柄MACDゴールデンクロス通知BOTを作った
2021年10月28日 デッドクロスも通知するように修正
どうも
愚者の戦略です
今回は、タイトルにもある通り、Binance全銘柄でMACDがゴールデンクロス、デッドクロスした銘柄一覧をラインに通知するBOTです
作ったきっかけはあおいさんのツイートです。毎日自分で確認する時間も気力もないので作りました
ちなみにあおいさんは、BTC建てとおっしゃってますが、本BOTは全組み合わせのMACDゴールデンクロスとデッドクロスです。0以下でゴールデンクロス、もしくは0以上でデッドクロスした銘柄のみ通知されます
起動すると
な感じで通知されます
ゴールデンクロス(GC)、デッドクロス(DC)した組み合わせは
のように通知されます
MACDの計算に過去26日分のデータが欲しいので、起動しても26日経過しないと通知されません。そこは気長に放置してもらうしかないです。
時間軸ずらしたい方は
# 時間軸設定(単位は時間)
TIME_MARGIN = 24
を変更してください。1にすると1時間足でMACD計算しますが、1時間おきにラインきます(笑)
あと、ラインNotificationの設定が必要です
line_notify_token = 'トークンコピーして貼り付けてください'
ここにトークン貼り付けてくださいね。
一番簡単な動かし方は
①conoha for windows で一番安いプラン契約(リモートデスクトップもオ プションでつける)(24時間動かせるなら自前PCでも可)
②anacondaダウンロード
③anaconda prompt でccxtとtalibインストール
④anacondaについてるIDL(Spyder)に本プログラム貼り付ける
⑤ラインのトークン取得して追記
⑥起動して26日待つ
です
以下、全プログラム(適当なサーバ借りて動かしてください)
うまく動かないとかあればコメント下さい!
import ccxt
import os
import time
import datetime
import talib as ta
import pandas as pd
import requests
from pprint import pprint
binance = ccxt.binance()
# line送信用token,api
line_notify_token = 'トークン貼り付けてください'
line_notify_api = 'https://notify-api.line.me/api/notify'
df = "NaN"
cycle = 0
golden_cross_symbol_list = ["\nBinance_MACD_GC一覧"]
dead_cross_symbol_list = ["\nMACD_DC一覧"]
# 時間軸設定(単位は時間)
TIME_MARGIN = 24
def read_crypt_pricedata():
try:
# CSV読み込み
df = pd.read_csv('Binance_AllCrypt_Price_Data.csv', index_col=0)
except:
print("Binance_AllCrypt_Price_Data.csvが見つかりませんでした")
return df
def get_all_crypt_pricedata():
try:
AllCryptPriceData = binance.fetchTickers()
current_price_df = pd.DataFrame(AllCryptPriceData)
# closeのみ抽出
current_price_df = pd.DataFrame(current_price_df.loc["close"])
# 行列反転
current_price_df = current_price_df.T
except:
print("Binanceから価格情報を取得できませんでした")
return current_price_df
def add_current_price(df, current_price_df):
# 今日の日付で行追加
try:
# 日時取得
d_today = datetime.datetime.now()
df.loc[d_today] = "NaN"
except:
print("日時情報を取得できませんでした")
symbolList = current_price_df.columns
for symbol in symbolList:
if symbol in df.columns:
# csvに該当シンボルがある
df.loc[d_today, symbol] = current_price_df.loc["close", symbol]
else:
# csvに該当シンボルが無い(新規上場)
df[symbol] = "NaN"
df.loc[d_today, symbol] = current_price_df.loc["close", symbol]
return df
def write_crypt_pricedata(df):
try:
# CSV読み込み
df.to_csv("Binance_AllCrypt_Price_Data.csv")
except:
print("Binance_AllCrypt_Price_Data.csvに書き込めませんでした")
def cal_tech_incicator(df):
golden_cross_symbol_list = ["\nBinance_MACD_GC一覧"]
dead_cross_symbol_list = ["\n", "\nMACD_DC一覧"]
golden_cross_count = 0
dead_cross_count = 0
symbolList = current_price_df.columns
for symbol in symbolList:
# macd計算
close = df[symbol]
macd, macdsignal, macdhist = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
try:
if macd.iloc[-1] < 0 and macdsignal.iloc[-1] < 0:
if macdhist.iloc[-2] < 0 and macdhist.iloc[-1] > 0:
print("GC", symbol)
golden_cross_symbol_list.append("\n" + symbol)
golden_cross_count += 1
elif macd.iloc[-1] > 0 and macdsignal.iloc[-1] > 0:
if macdhist.iloc[-2] > 0 and macdhist.iloc[-1] < 0:
print("DC", symbol)
dead_cross_symbol_list.append("\n" + symbol)
dead_cross_count += 1
except:
print("macdの計算に失敗しました")
golden_cross_symbol_list.insert(1, "\nGC数:" + str(golden_cross_count))
dead_cross_symbol_list.insert(2, "\nDC数:" + str(dead_cross_count))
return golden_cross_symbol_list, dead_cross_symbol_list
def send_line(golden_cross_symbol_list, dead_cross_symbol_list, cycle):
try:
if cycle != 1:
message = golden_cross_symbol_list + dead_cross_symbol_list
else:
message = "\n" + \
"Binance_全銘柄MACD_GC_DC通知プログラムを起動しました"
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token} # 発行したトークン
# ライン送信
requests.post(line_notify_api, data=payload, headers=headers)
except:
print("ラインを送信できませんでした")
print("Binance_全銘柄MACCDゴールデンクロス通知プログラムを起動しました")
while True:
cycle += 1
print(cycle, "回目の価格取得です")
if os.path.exists('Binance_AllCrypt_Price_Data.csv'):
df = read_crypt_pricedata()
current_price_df = get_all_crypt_pricedata()
df = add_current_price(df, current_price_df)
golden_cross_symbol_list, dead_cross_symbol_list = cal_tech_incicator(df)
write_crypt_pricedata(df)
send_line(golden_cross_symbol_list, dead_cross_symbol_list, cycle)
else:
# 初回起動時用
df = get_all_crypt_pricedata()
df.drop('close', axis=0)
df.set_axis([datetime.datetime.now()], axis=0, inplace=True)
write_crypt_pricedata(df)
send_line(golden_cross_symbol_list, dead_cross_symbol_list, cycle)
time.sleep(TIME_MARGIN * 3600)
チップありがとうございます!超嬉しいです。