You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何聚合OrderBook档位并调整价格间隔至0.50

调整Bybit ETHUSDT订单簿档位间隔至0.5并合并档位

核心逻辑说明

  • 原tick间隔为0.05,目标间隔0.5,意味着每10个连续的原始档位需要合并为1个新档位
  • 合并规则:
    • 价格:将原始档位价格向下取整到最近的0.5倍数(例如1800.25→1800.0,1800.6→1800.5)
    • 数量:同一价格区间内所有档位的挂单数量累加
  • 注意:Bybit WebSocket推送的是增量更新数据,所以必须先维护一份完整的本地订单簿快照,再基于增量更新本地数据,最后对本地订单簿执行合并操作

修改后的完整代码

from time import sleep
from pybit import usdt_perpetual

# 初始化本地订单簿,存储最新的买盘和卖盘原始数据
local_orderbook = {
    "b": {},  # 买盘:key为原始价格字符串,value为挂单数量
    "a": {}   # 卖盘:key为原始价格字符串,value为挂单数量
}
TARGET_TICK = 0.5  # 目标档位间隔
ORIGINAL_TICK = 0.05  # 平台原始tick间隔

def round_price(price):
    """将价格向下取整到最近的TARGET_TICK倍数"""
    price_float = float(price)
    return round(price_float - (price_float % TARGET_TICK), 1)

def merge_orderbook(side_data):
    """合并指定方向(买/卖)的订单簿档位"""
    merged = {}
    for price_str, qty in side_data.items():
        rounded_price = round_price(price_str)
        qty_float = float(qty)
        
        if rounded_price not in merged:
            merged[rounded_price] = 0.0
        merged[rounded_price] += qty_float
        
        # 若累加后数量为0,移除该档位(对应增量更新中的撤单)
        if merged[rounded_price] <= 0:
            del merged[rounded_price]
    
    # 按订单簿规则排序:买盘降序,卖盘升序
    is_bid = "b" in side_data
    sorted_merged = dict(sorted(merged.items(), reverse=is_bid))
    return sorted_merged

def handle_message(msg):
    global local_orderbook
    data = msg.get("data", [])
    if not data:
        return
    
    for item in data:
        action = item.get("action")
        bids = item.get("b", [])
        asks = item.get("a", [])
        
        if action == "snapshot":
            # 快照数据直接覆盖本地订单簿
            local_orderbook["b"] = {price: qty for price, qty, _ in bids}
            local_orderbook["a"] = {price: qty for price, qty, _ in asks}
        elif action == "update":
            # 增量更新:更新或删除本地档位
            for price, qty, _ in bids:
                if float(qty) > 0:
                    local_orderbook["b"][price] = qty
                else:
                    local_orderbook["b"].pop(price, None)
            for price, qty, _ in asks:
                if float(qty) > 0:
                    local_orderbook["a"][price] = qty
                else:
                    local_orderbook["a"].pop(price, None)
    
    # 合并档位并输出结果
    merged_bids = merge_orderbook(local_orderbook["b"])
    merged_asks = merge_orderbook(local_orderbook["a"])
    print("合并后买盘(0.5间隔):", merged_bids)
    print("合并后卖盘(0.5间隔):", merged_asks)

ws_linear = usdt_perpetual.WebSocket(
    test=False,
    ping_interval=30,
    ping_timeout=10,
    domain="bybit"
)

ws_linear.orderbook_25_stream(
    handle_message, "ETHUSDT"
)

while True:
    sleep(1)

关键代码说明

  • 本地订单簿维护:用local_orderbook字典实时同步Bybit的订单簿状态,确保增量更新能准确反映最新挂单情况
  • 价格取整函数:round_price保证所有原始档位被映射到目标间隔的基准价格上,实现档位归并
  • 合并函数:merge_orderbook完成数量累加、无效档位清理和排序,输出符合交易习惯的合并后订单簿
  • 消息处理:区分快照和增量更新,快照用于初始化本地数据,增量用于实时更新,避免数据不同步

内容的提问来源于stack exchange,提问作者xabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:54:23