見出し画像

Binance全銘柄MACDゴールデンクロス通知BOTを作った

 2021年10月28日 デッドクロスも通知するように修正

 どうも

 愚者の戦略です

 今回は、タイトルにもある通り、Binance全銘柄でMACDがゴールデンクロス、デッドクロスした銘柄一覧をラインに通知するBOTです

 作ったきっかけはあおいさんのツイートです。毎日自分で確認する時間も気力もないので作りました

 ちなみにあおいさんは、BTC建てとおっしゃってますが、本BOTは全組み合わせのMACDゴールデンクロスとデッドクロスです。0以下でゴールデンクロス、もしくは0以上でデッドクロスした銘柄のみ通知されます

 起動すると

画像2

 な感じで通知されます

 ゴールデンクロス(GC)、デッドクロス(DC)した組み合わせは

画像2

 のように通知されます

 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)

チップありがとうございます!超嬉しいです。