输入/搜索内容
内置函数
Global
Log
Market
Trade
Account
Futures
Exchange
IO
Network
Storage
Threads
exchange.Go
EventLoop
ctx.subscribe
ctx.poll
Subscription
Subscription.book
Subscription.positions
Subscription.balances
Subscription.unsubscribe
threading
Thread
ThreadLock
ThreadEvent
ThreadCondition
ThreadDict
Server
TA
Talib
OS
结构体
内置变量与常量
通用约定
交易所

读取本路深度订阅自身维护的订单簿,仅适用于channel为depth的订阅。

book()
book(n)

示例

订阅20档订单簿,每次更新时读取买一价、卖一价及前5档的挂单总量。

javascript
function main() { var sub = ctx.subscribe(exchange, {channel: "depth", depth: 20}) while (true) { var ev = ctx.poll(sub, 1000) if (!ev || ev.kind !== 3) { continue } var book = sub.book(5) // 也可以写ev.book(5) if (book.bids.length === 0 || book.asks.length === 0) { continue // 还没有收到完整的订单簿 } var bidQty = 0 var askQty = 0 book.bids.forEach(function(level) { bidQty += level[1] }) book.asks.forEach(function(level) { askQty += level[1] }) Log("bid1:", book.bids[0][0], "ask1:", book.asks[0][0]) Log("top 5 bidQty:", bidQty, "askQty:", askQty) } }
python
def main(): sub = ctx.subscribe(exchange, {"channel": "depth", "depth": 20}) while True: ev = ctx.poll(sub, 1000) if ev is None or ev.kind != 3: continue book = sub.book(5) # 也可以写ev.book(5) if not book["bids"] or not book["asks"]: continue # 还没有收到完整的订单簿 bid_qty = sum(level[1] for level in book["bids"]) ask_qty = sum(level[1] for level in book["asks"]) Log("bid1:", book["bids"][0][0], "ask1:", book["asks"][0][0]) Log("top 5 bidQty:", bid_qty, "askQty:", ask_qty)
rust
fn main() { let sub = ctx::subscribe(exchange, ctx::SubOpts::depth(20)).unwrap(); loop { match ctx::poll(&[sub.id()], Some(1000)) { ctx::Polled::Event(_) => { let book = match sub.book(5) { Ok(b) => b, Err(e) => panic!("book failed: {e}"), }; if book.bids.is_empty() || book.asks.is_empty() { continue; } let bid_qty: f64 = book.bids.iter().map(|l| l.1).sum(); let ask_qty: f64 = book.asks.iter().map(|l| l.1).sum(); Log!("bid1:", book.bids[0].0, "ask1:", book.asks[0].0); Log!("top 5 bidQty:", bid_qty, "askQty:", ask_qty); } ctx::Polled::Stopped => break, _ => {} } } }

返回值

类型描述

object

{bids: [[价格, 数量], ...], asks: [[价格, 数量], ...]}。bids按价格从高到低排列,asks按价格从低到高排列,价格和数量均为实数。尚未收到完整订单簿时,两侧均为空数组。

参数

名称类型必填描述

n

number

否

每侧返回的档位数。不传时为订阅时指定的档数(订阅时未指定档数则为5)。

参考

备注

深度事件(kind为3)仅表示订单簿已更新,不携带档位数据。订单簿在托管者内随交易所推送持续更新,与策略读取事件的快慢无关,任何时候读取到的都是最新的完整订单簿。深度事件的ev.book(n)读取的是同一本订单簿。

每路深度订阅各自维护一本订单簿:同一品种depth分别为5和20的两路订阅互不影响,各自读取对应档数的订单簿。

对非深度订阅或已退订的订阅对象调用时,将抛出异常。

Python中为sub.book(n=None),返回{"bids": [[价格, 数量], ...], "asks": [...]}字典(也可以写作b.bids),深度事件同样提供ev.book(n)。Rust中为sub.book(n: usize) -> Result<ctx::Book, String>,ctx::Book的bids、asks为Vec<(f64, f64)>(价格、数量);深度事件在引入sdk::ctx::EventExt后也可以使用ev.book(n)。ctx::Sub可以复制,传入其他线程后同样可以读取这本订单簿(但退订仍只能在创建该订阅的线程中进行)。