ctx.cancelAsync
异步撤单:立即返回请求号,不等待交易所确认;撤单结果以一条应答事件(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 | 请求号,与应答事件中的 |
参数
| 名称 | 类型 | 必填 | 描述 |
ex | object / number | 是 | 订单所属的账户:交易所对象,或该账户在 |
symbol | string | 是 | 订单的交易品种代码,例如 |
id | string | 是 | 要撤销的订单ID,即下单时返回的订单ID或订单回报中的 |
options | object | 否 | 撤单选项 |
参考
备注
应答事件的字段说明见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()读取。