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

异步撤单:立即返回请求号,不等待交易所确认;撤单结果以一条应答事件(kind为20,op为cancel)投递给发起请求的线程,可用ctx.poll取出。参数与ctx.cancel相同。

ctx.cancelAsync(ex, symbol, id)
ctx.cancelAsync(ex, symbol, id, options)

示例

异步下单,收到下单应答后发起异步撤单,并等待撤单应答。

javascript
function waitAck(req) { while (true) { var ack = ctx.poll([ctx.STREAM_ORDER_ACK], 10000) if (!ack) { return null } if (ack.kind === 20 && ack.reqId === req) { return ack } } } function main() { var t = exchange.GetTicker("BTC_USDT") if (!t) { return } var req = ctx.orderAsync(exchange, "BTC_USDT", "buy", _N(t.Buy * 0.98, 2), 0.001) if (req instanceof Error) { Log("not sent:", req.message) return } var placed = waitAck(req) if (!placed || !placed.ok) { Log("order failed:", placed ? placed.error : "no ack") return } var creq = ctx.cancelAsync(exchange, "BTC_USDT", placed.id) if (creq instanceof Error) { Log("not sent:", creq.message) return } var canceled = waitAck(creq) Log("cancel", placed.id, canceled ? canceled.status : "no ack", canceled ? canceled.error : "") }
python
def wait_ack(req): while True: ack = ctx.poll([ctx.STREAM_ORDER_ACK], 10000) if ack is None: return None if ack.kind == 20 and ack.reqId == req: return ack def main(): t = exchange.GetTicker("BTC_USDT") if not t: return req = ctx.orderAsync(exchange, "BTC_USDT", "buy", _N(t["Buy"] * 0.98, 2), 0.001) if isinstance(req, CtxError): Log("not sent:", req) return placed = wait_ack(req) if placed is None or not placed.ok: Log("order failed:", placed.error if placed else "no ack") return creq = ctx.cancelAsync(exchange, "BTC_USDT", placed.id) if isinstance(creq, CtxError): Log("not sent:", creq) return canceled = wait_ack(creq) if canceled is None: Log("cancel", placed.id, "no ack") else: Log("cancel", placed.id, canceled.status, canceled.error)
rust
use sdk::ctx::{EventExt, OrderAckView}; fn wait_ack(req: u64) -> Option<OrderAckView> { loop { match ctx::poll(&[ctx::STREAM_ORDER_ACK], Some(10000)) { ctx::Polled::Event(ev) => { if let Some(ack) = ev.order_ack().filter(|a| a.req_id == req) { return Some(ack); } } ctx::Polled::Empty | ctx::Polled::Stopped => return None, _ => {} } } } fn main() { let Ok(t) = exchange.GetTicker("BTC_USDT") else { return }; let px = _N(t.Buy * 0.98, 2); let req = match ctx::order_async(exchange, "BTC_USDT", "buy", px, 0.001, "{}") { Ok(req) => req, Err(e) => { Log!("not sent:", e); return; } }; let Some(placed) = wait_ack(req).filter(|a| a.ok) else { Log!("order failed"); return; }; match ctx::cancel_async(exchange, "BTC_USDT", &placed.id, "{}") { Ok(creq) => match wait_ack(creq) { Some(ack) => Log!("cancel", placed.id, ack.status, ack.error), None => Log!("cancel", placed.id, "no ack"), }, Err(e) => Log!("not sent:", e), } }

返回值

类型描述

number / object

请求号,与应答事件中的reqId一致。若参数有误、交易所不支持via为ws,或在途请求超过256个,则立即返回Error对象,此时不会产生应答事件。

参数

名称类型必填描述

ex

object / number

是

订单所属的账户:交易所对象,或该账户在exchanges数组中的索引,与ctx.order相同。

symbol

string

是

订单的交易品种代码,例如BTC_USDT、BTC_USDT.swap。

id

string

是

要撤销的订单ID,即下单时返回的订单ID或订单回报中的id。

options

object

否

撤单选项{via, timeout},与ctx.cancel相同。

参考

备注

应答事件的字段说明见ctx.orderAsync:撤单成功时status为ok,id为被撤销的订单ID;若订单已先行成交或已处于其他终态而无法撤销,status为failed,error为失败原因。

同时发出的下单、撤单请求不会相互排队,应答按完成顺序到达。撤销异步下单的订单时,应先等待其下单应答、取得订单ID后再撤单。

Python中为ctx.cancelAsync(ex, symbol, id, opts=None),返回请求号或CtxError对象。Rust中为ctx::cancel_async(ex, symbol: &str, id: &str, opts_json: &str) -> Result<u64, String>,无选项时传入"{}",应答事件通过ev.order_ack()读取。