BFFXとBF現物の価格乖離を計算してグラフにリアルタイムに描画します.久々にSFDが発動しそうなので上げておきますね.これ使ってSFDで1億万円稼いだ人はビットコイン寄付でもしてくれたら嬉しいです笑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
import threading import numpy as np import matplotlib.pyplot as plt from collections import deque import logging import json import websocket import sys class SFDCalculator: def __init__(self): self.tick = deque(maxlen=1000) self.btc_tick_price = deque(maxlen=1000) self.fxbtc_tick_price = deque(maxlen=1000) self.disparity = deque(maxlen=1000) self.logger = self.set_log_config() def set_log_config(self): logger = logging.getLogger('CalculatorLog') logger.setLevel(10) return logger def store_bitflyer_disparity(self): """ bitflyerの価格乖離を貯める. :return: """ # messageをうけとったとき def on_message(ws, message): message = json.loads(message) if message['params']['channel'] == 'lightning_ticker_FX_BTC_JPY': self.tick.append(message['params']['message']) self.fxbtc_tick_price.append(message['params']['message']['ltp']) elif message['params']['channel'] == 'lightning_ticker_BTC_JPY': self.btc_tick_price.append(message['params']['message']['ltp']) if len(self.btc_tick_price) > 0 and len(self.fxbtc_tick_price) > 0: self.disparity.append((self.fxbtc_tick_price[-1]-self.btc_tick_price[-1])/self.btc_tick_price[-1] * 100) # エラーが起こったとき def on_error(ws, error): self.logger.debug(error) # websocketを閉じた時.wsを再起動. def on_close(ws): try: self.logger.info('disconnected "Bitflyer" streaming server. Restarting websocket.') websocket.enableTrace(True) ws = websocket.WebSocketApp('wss://ws.lightstream.bitflyer.com/json-rpc', on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close) ws.run_forever() except KeyboardInterrupt: sys.exit() # websocketを開いた時 def on_open(ws): ws.send(json.dumps({"method": "subscribe", "params": {"channel": "lightning_ticker_FX_BTC_JPY"}})) ws.send(json.dumps({"method": "subscribe", "params": {"channel": "lightning_ticker_BTC_JPY"}})) self.logger.info('connected streaming server') websocket.enableTrace(True) ws = websocket.WebSocketApp('wss://ws.lightstream.bitflyer.com/json-rpc', on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close) # websocketを起動する。Ctrl+Cで終了するようにする。 try: ws.run_forever() except KeyboardInterrupt: sys.exit() if __name__ == '__main__': calculator = SFDCalculator() calculate_thread = threading.Thread(target=calculator.store_bitflyer_disparity) calculate_thread.start() fig, ax = plt.subplots(1,1) lines, = ax.plot(calculator.disparity, c="blue") plt.axhline(y=10) plt.grid(which='major',color='black',linestyle='-') plt.title("Price disparity between BTC and BTC-FX") plt.xlabel("index") plt.ylabel("Price disparity(%)") while len(calculator.disparity) == 0: continue while True: FIXED_LIST = np.array((calculator.disparity)) ax.set_ylim((FIXED_LIST.min() - 0.1, FIXED_LIST.max() + 0.1)) ax.set_xlim(0,len(FIXED_LIST)) lines.set_data(range(len(FIXED_LIST)), FIXED_LIST) plt.pause(0.01) |