Subscription.book
读取本路深度订阅自身维护的订单簿,仅适用于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 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
n | number | 否 | 每侧返回的档位数。不传时为订阅时指定的档数(订阅时未指定档数则为 |
参考
备注
深度事件(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可以复制,传入其他线程后同样可以读取这本订单簿(但退订仍只能在创建该订阅的线程中进行)。