【发布时间】:2021-10-23 02:46:28
【问题描述】:
使用Binance futures aggregate trades stream (websocket),我试图计算每分钟每边(做市商/接受者)所有交易的总价值。我正在苦苦挣扎的部分是试图找到一种有效的方法来确定一分钟何时结束以及新一分钟何时开始。到目前为止,我的解决方案是将 unix 值转换为日期时间值,仅保留日期时间值的“分钟”部分,将其存储为变量(名为“分钟”),并检查每条新消息的最新信息minute' 值与之前的 'minute' 值进行比较。
当我运行脚本时,“分钟”变量会在新的一分钟开始时更新,但最后 elif 语句下的前面步骤似乎都不起作用。
elif unixmin != minute:
sumprodmkr = sum(x*y for x, y in list(zip(qtymkr, pricemkr)))
sumprodtkr = sum(x*y for x, y in list(zip(qtytkr, pricetkr)))
print (sumprodmkr)
print (sumprodtkr)
qtymkr.clear()
pricemkr.clear()
qtytkr.clear()
pricetkr.clear()
minute = unixmin
我确信有一种更有效的方法可以做到这一点,如果有人能指出我正确的方向,我将不胜感激。
完整脚本如下:
import websocket
import json
from datetime import datetime
socket = 'wss://stream.binance.com:9443/ws/btcusdt@trade'
ws = websocket.WebSocketApp(socket, on_message=on_message, on_error=on_error, on_close=on_close)
qtymkr = []
pricemkr = []
qtytkr = []
pricetkr = []
def on_message(ws, message):
content = json.loads(message)
ismaker = content['m']
price = content['p']
qty = content['q']
unix = content['T']
unix2 = int(content['T'])/1000
unixmin = datetime.utcfromtimestamp(unix2).strftime('%M')
if ismaker == 'True':
qtymkr.append(float(qty))
pricemkr.append(float(price))
else:
qtytkr.append(float(qty))
pricetkr.append(float(price))
global minute
minute = 0
if minute == 0:
minute = unixmin
elif unixmin == minute:
pass
elif unixmin != minute:
sumprodmkr = sum(x*y for x, y in list(zip(qtymkr, pricemkr)))
sumprodtkr = sum(x*y for x, y in list(zip(qtytkr, pricetkr)))
print (sumprodmkr)
print (sumprodtkr)
qtymkr.clear()
pricemkr.clear()
qtytkr.clear()
pricetkr.clear()
minute = unixmin
def on_error(ws, error):
print(error)
def on_close(ws, close_status_code, close_msg):
print('Socket closed')
ws.run_forever()
【问题讨论】:
标签: python multithreading websocket binance