技术问询:如何聚合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
相关产品推荐
相关产品推荐

