【问题标题】:Trigger function every new minute w/ websocket data使用 websocket 数据每隔一分钟触发功能
【发布时间】: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


    【解决方案1】:

    Cron怎么样?

    APScheduler - 很棒的 Python 包。享受! https://apscheduler.readthedocs.io/en/3.x/

    【讨论】:

    • 我真的在寻找一种使用数据来检测新一分钟已经开始的解决方案
    • 你是什么意思? 59 或 00 是一个标记。 cron - 按标记运行事件
    【解决方案2】:

    代码肯定需要一些工作,但它可以正常工作并且实现了我想要的。

    import websocket
    import json
    from datetime import datetime
    
    socket = 'wss://stream.binance.com:9443/ws/btcusdt@trade'
    
    qtymkr = []
    pricemkr = []
    qtytkr = []
    pricetkr = []
    
    minute = 0
    unixmin = 0
    sumprodmkr = 0 
    sumprodtkr = 0
    
    def minflag():
        global minute
        global unixmin
        global sumprodmkr
        global sumprodtkr
        if minute == 0:
            minute = unixmin
        elif unixmin == minute:
            break
        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_message(ws, message):
        global minute
        global unixmin
        global sumprodmkr
        global sumprodtkr
        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))
        minflag()
    
    def on_error(ws, error):
        print(error)
        
    def on_close(ws, close_status_code, close_msg):
        print('Socket closed')
            
    ws = websocket.WebSocketApp(socket, on_message=on_message, on_error=on_error, on_close=on_close)
    
    ws.run_forever()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多