pythonの仮想通貨のリアルタイムデータ表示をエクセルに頼む

から続く

表示できるのは分かった。期待が持てる。

実際に取引所Liquidのリアルタイムデータを固定セルへ表示させ続けてみる

Liquid取引所のデータ更新がなさすぎて動いてないみたいだ(・・;)

コードです。セルの指定をコンパクトにしたいが・・・

import xlwings as xw
import requests
import json
import time

wb = xw.Book('') #新規エクセルファイル
sht = wb.sheets['sheet1'] #操作するシート

url = 'https://api.liquid.com/products' #仮想通貨ペア全部取れる
while 1:
    res = requests.get(url).json()
    for pr in res:
        if pr['id']=='5': #BTCJPY
            sht.range('A1').value =pr['currency_pair_code']
            sht.range('B1').value =pr['last_traded_price']
        if pr['id']=='29': #ETHJPY
            sht.range('A2').value =pr['currency_pair_code']
            sht.range('B2').value =pr['last_traded_price']
        if pr['id']=='41': #BCHJPY
            sht.range('A3').value =pr['currency_pair_code']
            sht.range('B3').value =pr['last_traded_price']
        if pr['id']=='83': #XRPJPY
            sht.range('A4').value =pr['currency_pair_code']
            sht.range('B4').value =pr['last_traded_price']
    time.sleep(1)

bitflyerのwebsocketデータを受信し、エクセルに表示してみる

websocket of bitflyer コードです

import websocket
import json
import xlwings as xw
import time

wb = xw.Book('') #新規エクセルファイル
sht = wb.sheets['sheet1'] #操作するシート
CHANNEL = "lightning_executions_BTC_JPY"
def on_message(ws, message):
    message = json.loads(message)
    if message["method"] == "channelMessage":
        last1=message["params"]["message"][0]
        sht.range('A1').value = 'BTC'
        sht.range('A2').value = int(last1["price"])
        sht.range('A3').value = last1["side"]
        sht.range('A4').value = last1["size"]
def on_open(ws):
    ws.send(json.dumps({"method": "subscribe",
                        "params": {"channel": CHANNEL}}))
if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()

フムフム、セルの場所が決まっているなら、関数にして表示させるデータは関数の引数にしてぶん投げれば良いのかな?

セルへの書き込み指定がlist配列でできます

書き込み指定はこの様な式になります。

ソースコード

import websocket
import json
import xlwings as xw

wb = xw.Book('') #新規エクセルファイル
sht = wb.sheets['sheet1'] #操作するシート

CHANNEL = "lightning_executions_BTC_JPY"

def on_message(ws, message):
    message = json.loads(message)
    if message["method"] == "channelMessage":
        last1=message["params"]["message"][0]

        sht.range('A1').value = ['BTC', int(last1["price"]), last1["side"], last1["size"]]
        sht.range('A3').value = [['BTC'], [int(last1["price"])], [last1["side"]], [last1["size"]]]

def on_open(ws):
    ws.send(json.dumps({"method": "subscribe",
                        "params": {"channel": CHANNEL}}))
if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()

pythonからセル位置指定の書き方ご説明

#横にセルを展開するときはリストで良い

sht.range(‘A1’).value = [‘BTC’, int(last1[“price”]), last1[“side”], last1[“size”]]

[

A1 = ‘BTC’, #タイトル文字列

B1 = int(last1[“price”]), #最新価格

C1 = last1[“side”], #売りか買いか

D1 = last1[“size”] #売買サイズ

]

#セルを縦に展開するときは2次元リストを使う

sht.range(‘A3’).value = [[‘BTC’], [int(last1[“price”])], [last1[“side”]], [last1[“size”]]]

[

A3 = [‘BTC’],

A4 = [int(last1[“price”])],

A5 = [last1[“side”]],

A6 = [last1[“size”]]

]

セルへ代入する要素それぞれがlistになっています。

websocketについてはこちら

行の追加的書き込み

次は、固定セルへの聞き込みではなく、一行ずつ下に追加してゆきます。

ソースです

import websocket
import json
import xlwings as xw
import time

wb = xw.Book('') #新規エクセルファイル
sht = wb.sheets['sheet1'] #操作するシート
time.sleep(15)

CHANNEL = "lightning_executions_BTC_JPY"
y = 1 #行を表す変数
def on_message(ws, message):
    global y #関数の中からグローバル変数を使う
    message = json.loads(message)
    if message["method"] == "channelMessage":
        last1=message["params"]["message"][0]
        #xlwingsでエクセルシートへ書き込む
        sht.range(y,1).value = ['BTC', int(last1["price"]), last1["side"], last1["size"]]
        y += 1 #行を1追加

def on_open(ws):
    ws.send(json.dumps({"method": "subscribe",
                        "params": {"channel": CHANNEL}}))
if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()

BFでは画面の更新が少なくてわからないのでbainanceのwebsocketを表示させてみる

早すぎて訳がわからない

# Copyright:   (c) leoco 2021
#-------------------------------------------------------------------------------
import websocket
import json
import xlwings as xw
import time

wb = xw.Book('') #新規エクセルファイル
sht = wb.sheets['sheet1'] #操作するシート

def on_message(ws, message):
    msg = json.loads(message)
    price = float(msg['p'])
    size = float(msg['q'])
    if msg['m']:
        side ='SELL'#*= -1
    else :
        side='BUY'
    sht.range('A1').value = [['BTC'],[price],[side],[size]]

def on_open(ws):
    ws.send(json.dumps({"method": "SUBSCRIBE","params":["btcusdt@aggTrade","btcusdt@depth"],"id": 1}))
if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://stream.binance.com:9443/ws",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()

コメント

amazon 本日のタイムセール Time Sale
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 動画290本28.5時間 \24,000 (毎月月初数日間は 1800円)
楽天モバイル、妻がiphone SE2、息子がiphone11で使ってます。一番安くて通信品質イマイチ
タイトルとURLをコピーしました