見出し画像

Bybit BTCのRSIとEMA乖離を毎秒出力するBOT

にゃんぱすー✋

RSIと現在価格とEMAの乖離を毎秒出力するプログラム作りました。ちなみに1分足です。なんでRSIとEMA乖離なのかはこちらの記事で説明してるのでよかったら読んでみてください。どのくらい乖離してたら指標として有効なの?とか気になる人もどうぞ。それぐらい自分で見て検証するわ!って人は見なくておkです。


実行環境
・macOS
・Python 3.8.5
・ccxt 1.40.1

説明
このプログラムを説明すると1分足200本分から現在のRSIとEMA乖離を毎秒出力します。デフォルトでは2秒おきに設定しています。これより早くにしてもいいんですけどAPI取得の関係でごく稀にエラー吐いちゃうことがあるのでとりあえず2秒に落ち着きました。
じゃあこのプログラムどういうところで使えるの?ってことなんですがまあスキャルピングじゃないですかね。RSIもある一定の値を下回ったり超えたりすると数分後の方向がある程度わかりますし。特にEMAとの乖離は結構いい指標になるのでいいんじゃないですかね。
ちなみにRSIだけを出力するプログラムは無料部分にコード貼っときますが、RSIとEMA乖離を両方出力するのは有料です。理由ですが、RSIとかはTradingviewとかにもあるけどEMAとの乖離は見たところなかったからですね。割と有利に立ち回れるんじゃないでしょうか。ちなみになんですがこのEMA乖離に似たインジケーターでボリンジャーバンドってのがありますがあれはSMAを使ってますし(SMAとEMAの違いは前の記事を参照してください)、ぱっと見じゃ正直どのくらい乖離してるのかわからないんですよね。ラプラスでもあるまいし。とりあえず出力結果の例を載せときますね。

出力結果

画像1

あと今から少し有益?なこと言うかもしれません。ちなみにこれはこのプログラム書いてて気づいたことなんですが、RSIを求める公式があるんですよ、
A/(A+B)っていう、この公式の関係上このプログラムはボラティリティがないときにRSIの誤差が大きくなるんですよね。そのためこのプラグラムは期間を14じゃなくて18に設定しているんですが。まあここまでの話つまりどういうことかっていうと直感的にわかってる方もいると思いますが、ボラティリティが低いとき(値動きが小さいとき)のRSIはほとんど当てにならないのでロング・ショートの判断の指標として使わない方がいいです。

ではソースコード

import ccxt
import time
import numpy as np
import pandas as pd
import math

# apikeyとsecretkeyを入れてください
by = ccxt.bybit({"apiKey":"","secret":""})
def get_rsi(klines):
   # 最初に過去200本の1分足からrsiを計算する
   close = []
   data = pd.DataFrame()
   close = [float(klines['result'][i]['close']) for i in range(0,200)]
   
   df = pd.DataFrame()
   df = pd.Series(close)
   
   diff = df[:19].diff()
   di = diff[1:19]
   data['up'] = di
   data['down'] = di
   data.loc[data['up'] <= 0, 'up'] = 0
   data.loc[data['down'] > 0, 'down'] = 0
   up = data['up'][:18].sum()/18
   down = abs(data['down'][:18].sum()/18)
   
   k = 18
   for _ in range(len(df)-19):
       d = float(df[k+1])-float(df[k])
       if d > 0:
           up = (up*17+d)/18
       elif d <= 0:
           down = (down*17+abs(d))/18
       else:
           pass
       k += 1
       rsi = up/(down+up)*100
   return rsi
#------------------------ program start ------------------------#
while True:
   klines = by.public_get_kline_list({"symbol":"BTCUSD","interval":"1","from":int(time.time()-60*200)})
   rsi = get_rsi(klines)
   print('rsi:',rsi)
   time.sleep(2)

この下はemaの出力です


import ccxt
import time
import numpy as np
import pandas as pd
import math
# apikeyとsecretkeyを入れてください
by = ccxt.bybit({"apiKey":"","secret":""})
def get_rsi(klines):
   # 最初に過去200本の1分足からrsiを計算する
   close = []
   data = pd.DataFrame()
   close = [float(klines['result'][i]['close']) for i in range(0,200)]
   
   df = pd.DataFrame()
   df = pd.Series(close)
   
   diff = df[:19].diff()
   di = diff[1:19]
   data['up'] = di
   data['down'] = di
   data.loc[data['up'] <= 0, 'up'] = 0
   data.loc[data['down'] > 0, 'down'] = 0
   up = data['up'][:18].sum()/18
   down = abs(data['down'][:18].sum()/18)
   
   k = 18
   for _ in range(len(df)-19):
       d = float(df[k+1])-float(df[k])
       if d > 0:
           up = (up*17+d)/18
       elif d <= 0:
           down = (down*17+abs(d))/18
       else:
           pass
       k += 1
       rsi = up/(down+up)*100
   return rsi
def get_ema(klines):
   # 最初に過去200本の1分足からemaを計算する
   close = []
   close = [float(klines['result'][i]['close']) for i in range(0,199)]
   
   df = pd.DataFrame()
   df = pd.Series(close)
   
   ema7 = float(sum(close[:7])/7)
   a = 0.25
   k = 7
   for _ in range(len(df)-7):
       y = ema7*(1-a)+float(close[k])*a
       ema7 = y
       k += 1
   return ema7
#------------------------ program start ------------------------#
while True:
   klines = by.public_get_kline_list({"symbol":"BTCUSD","interval":"1","from":int(time.time()-60*200)})
   rsi = get_rsi(klines)
   ema7 = get_ema(klines)
   last_price = float(klines['result'][199]['close'])
   d = last_price/ema7
   if d > 1:
       print('rsi:',rsi,' ','乖離率:+',(d-1)*100,'%')
   elif d < 1:
       print('rsi:',rsi,' ','乖離率',(d-1)*100,'%')
   else:
       print('rsi:',rsi,' ','乖離:',0)
   time.sleep(2)

この記事が気に入ったらサポートをしてみませんか?