Trade
exchange.Buy
exchange.Buy()函数用于下买单。Buy()函数是交易所对象exchange的成员函数。Buy()函数操作交易所对象exchange所绑定的交易所账户。exchange对象的成员函数(方法)的用途仅与exchange相关,本文档后续不再赘述。
exchange.Buy(price, amount)
exchange.Buy(price, amount, ...args)示例
-
exchange.Buy()返回的订单编号,可用于查询订单信息和取消订单。javascriptfunction main() { var id = exchange.Buy(100, 1); Log("id:", id); }pythondef main(): id = exchange.Buy(100, 1) Log("id:", id)rustfn main() { let id = exchange.Buy(100, 1).unwrap(); Log!("id:", id); }c++void main() { auto id = exchange.Buy(100, 1); Log("id:", id); } -
加密货币期货合约下单时必须注意交易方向是否设置正确,如果交易方向与交易函数不匹配将会报错:
```log
direction is sell, invalid order type Buy
direction is buy, invalid order type Sell
direction is closebuy, invalid order type Buy
direction is closesell, invalid order type Sell
```
javascript// 以下为错误调用 function main() { exchange.SetContractType("quarter") // 设置做空方向 exchange.SetDirection("sell") // 下买单,会报错,做空只能卖出 var id = exchange.Buy(50, 1) // 设置做多方向 exchange.SetDirection("buy") // 下卖单,会报错,做多只能买入 var id2 = exchange.Sell(60, 1) // 设置平多方向 exchange.SetDirection("closebuy") // 下买单,会报错,平多只能卖出 var id3 = exchange.Buy(-1, 1) // 设置平空方向 exchange.SetDirection("closesell") // 下卖单,会报错,平空只能买入 var id4 = exchange.Sell(-1, 1) }python# 以下为错误调用 def main(): exchange.SetContractType("quarter") exchange.SetDirection("sell") id = exchange.Buy(50, 1) exchange.SetDirection("buy") id2 = exchange.Sell(60, 1) exchange.SetDirection("closebuy") id3 = exchange.Buy(-1, 1) exchange.SetDirection("closesell") id4 = exchange.Sell(-1, 1)rust// 以下为错误调用 fn main() { let _ = exchange.SetContractType("quarter"); // 设置做空方向 let _ = exchange.SetDirection("sell"); // 下买单,会报错,做空只能卖出 let id = exchange.Buy(50, 1); // 设置做多方向 let _ = exchange.SetDirection("buy"); // 下卖单,会报错,做多只能买入 let id2 = exchange.Sell(60, 1); // 设置平多方向 let _ = exchange.SetDirection("closebuy"); // 下买单,会报错,平多只能卖出 let id3 = exchange.Buy(-1, 1); // 设置平空方向 let _ = exchange.SetDirection("closesell"); // 下卖单,会报错,平空只能买入 let id4 = exchange.Sell(-1, 1); }c++// 以下为错误调用 void main() { exchange.SetContractType("quarter"); exchange.SetDirection("sell"); auto id = exchange.Buy(50, 1); exchange.SetDirection("buy"); auto id2 = exchange.Sell(60, 1); exchange.SetDirection("closebuy"); auto id3 = exchange.Buy(-1, 1); exchange.SetDirection("closesell"); auto id4 = exchange.Sell(-1, 1); } -
现货市价单。
javascript// 例如交易对:ETH_BTC ,市价单买入 function main() { // 下市价单买入,买入0.1个BTC(计价币)金额的ETH币 exchange.Buy(-1, 0.1) }pythondef main(): exchange.Buy(-1, 0.1)rust// 例如交易对:ETH_BTC ,市价单买入 fn main() { // 下市价单买入,买入0.1个BTC(计价币)金额的ETH币 let _ = exchange.Buy(-1, 0.1); }c++void main() { exchange.Buy(-1, 0.1); }
返回值
| 类型 | 描述 |
string / 空值 | 下单成功返回订单Id,下单失败返回空值。FMZ平台的订单 |
参数
| 名称 | 类型 | 必填 | 描述 |
price | number | 是 |
|
amount | number | 是 |
|
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于将附带信息输出到该条下单日志中, |
参考
exchange.Sell exchange.SetContractType exchange.SetDirection exchange.IO(API限流控制,Buy函数受CreateOrder限流设置影响)
备注
期货合约下单时必须注意交易方向是否设置正确,如果交易方向与交易函数不匹配将会报错。加密货币期货合约交易所的下单量如无特殊说明,则以合约张数为单位。
参数price设置为-1时用于下市价单,此功能需要交易所的下单接口支持市价单。以市价单方式对加密货币现货下买单时,下单量参数amount为以计价币计价的金额数量。以市价单方式对加密货币期货合约下单时,下单量参数amount的单位为合约张数。实盘时,有少数加密货币交易所不支持市价单接口。个别现货交易所市价单买单的下单量为交易币数量,具体请查看「用户指南」中的交易所特殊说明。
如使用较旧版本的托管者,exchange.Buy()函数返回的订单Id可能与当前文档中描述的返回值订单Id有所差别。
需要注意,以下三家交易所的下单接口较为特殊。对于现货市价单的买单,其下单量为币数,而非金额。
-
AscendEx -
BitMEX -
Bitfinex
exchange.Sell
exchange.Sell()函数用于下达卖单。
exchange.Sell(price, amount)
exchange.Sell(price, amount, ...args)示例
-
exchange.Sell()返回的订单编号,可用于查询订单信息和取消订单。javascriptfunction main(){ var id = exchange.Sell(100, 1) Log("id:", id) }pythondef main(): id = exchange.Sell(100, 1) Log("id:", id)rustfn main() { let id = exchange.Sell(100, 1).unwrap(); Log!("id:", id); }c++void main() { auto id = exchange.Sell(100, 1); Log("id:", id); } -
加密货币期货合约下单时必须注意交易方向是否设置正确,如果交易方向与交易函数不匹配将会报错:
logdirection is sell, invalid order type Buy direction is buy, invalid order type Sell direction is closebuy, invalid order type Buy direction is closesell, invalid order type Selljavascript// 以下为错误调用 function main() { exchange.SetContractType("quarter") // 设置做空方向 exchange.SetDirection("sell") // 下买单,会报错,做空只能卖出 var id = exchange.Buy(50, 1) // 设置做多方向 exchange.SetDirection("buy") // 下卖单,会报错,做多只能买入 var id2 = exchange.Sell(60, 1) // 设置平多方向 exchange.SetDirection("closebuy") // 下买单,会报错,平多只能卖出 var id3 = exchange.Buy(-1, 1) // 设置平空方向 exchange.SetDirection("closesell") // 下卖单,会报错,平空只能买入 var id4 = exchange.Sell(-1, 1) }python# 以下为错误调用 def main(): exchange.SetContractType("quarter") exchange.SetDirection("sell") id = exchange.Buy(50, 1) exchange.SetDirection("buy") id2 = exchange.Sell(60, 1) exchange.SetDirection("closebuy") id3 = exchange.Buy(-1, 1) exchange.SetDirection("closesell") id4 = exchange.Sell(-1, 1)rust// 以下为错误调用 fn main() { let _ = exchange.SetContractType("quarter"); // 设置做空方向 let _ = exchange.SetDirection("sell"); // 下买单,会报错,做空只能卖出 let id = exchange.Buy(50, 1); // 设置做多方向 let _ = exchange.SetDirection("buy"); // 下卖单,会报错,做多只能买入 let id2 = exchange.Sell(60, 1); // 设置平多方向 let _ = exchange.SetDirection("closebuy"); // 下买单,会报错,平多只能卖出 let id3 = exchange.Buy(-1, 1); // 设置平空方向 let _ = exchange.SetDirection("closesell"); // 下卖单,会报错,平空只能买入 let id4 = exchange.Sell(-1, 1); }c++// 以下为错误调用 void main() { exchange.SetContractType("quarter"); exchange.SetDirection("sell"); auto id = exchange.Buy(50, 1); exchange.SetDirection("buy"); auto id2 = exchange.Sell(60, 1); exchange.SetDirection("closebuy"); auto id3 = exchange.Buy(-1, 1); exchange.SetDirection("closesell"); auto id4 = exchange.Sell(-1, 1); } -
现货市价单。
javascript// 例如交易对:ETH_BTC,市价单卖出 function main() { // 注意:下市价单卖出,卖出0.2个ETH exchange.Sell(-1, 0.2) }pythondef main(): exchange.Sell(-1, 0.2)rust// 例如交易对:ETH_BTC,市价单卖出 fn main() { // 注意:下市价单卖出,卖出0.2个ETH let _ = exchange.Sell(-1, 0.2); }c++void main() { exchange.Sell(-1, 0.2); }
返回值
| 类型 | 描述 |
string / 空值 | 下单成功时返回订单Id,下单失败时返回空值。FMZ平台的订单 |
参数
| 名称 | 类型 | 必填 | 描述 |
price | number | 是 |
|
amount | number | 是 |
|
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于向这条下单日志中输出附带信息, |
参考
exchange.Buy exchange.SetContractType exchange.SetDirection exchange.IO(API限流控制,Sell函数受CreateOrder限流设置影响)
备注
期货合约下单时必须注意交易方向是否设置正确,如果交易方向与交易函数不匹配将会报错。加密货币期货合约交易所的下单量如无特殊说明则以合约张数为单位。
参数price设置为-1时用于下达市价单,需要交易所的下单接口支持市价单。以市价单方式交易加密货币现货时,下卖单时,下单量参数amount以交易币为单位。以市价单方式交易加密货币期货合约时,下单量参数amount以合约张数为单位。实盘时,有少数加密货币交易所不支持市价单接口。
如使用较旧版本的托管者,exchange.Sell()函数返回的订单Id可能与当前文档中描述的返回值订单Id有所差别。
exchange.CreateOrder
exchange.CreateOrder()函数用于下单。
exchange.CreateOrder(symbol, side, price, amount)
exchange.CreateOrder(symbol, side, price, amount, ...args)示例
-
现货交易所对象与期货交易所对象均通过调用
exchange.CreateOrder()函数进行下单。javascriptfunction main() { var id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01) // 现货交易所对象下单,交易BTC_USDT币币交易对 // var id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01) // 期货交易所对象下单,交易BTC的U本位永续合约 Log("Order Id:", id) }pythondef main(): id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01) # 现货交易所对象下单,交易BTC_USDT币币交易对 # id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01) # 期货交易所对象下单,交易BTC的U本位永续合约 Log("Order Id:", id)rustfn main() { let id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01); // 现货交易所对象下单,交易BTC_USDT币币交易对 // let id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01); // 期货交易所对象下单,交易BTC的U本位永续合约 Log!("Order Id:", id); }c++void main() { auto id = exchange.CreateOrder("BTC_USDT", "buy", 60000, 0.01); // 现货交易所对象下单,交易BTC_USDT币币交易对 // auto id = exchange.CreateOrder("BTC_USDT.swap", "buy", 60000, 0.01); // 期货交易所对象下单,交易BTC的U本位永续合约 Log("Order Id:", id); } -
通过附加参数(option)下单,用于传递交易所的特定参数。
javascriptfunction main() { // 使用JSON格式传递option参数 var option = { "type": "TRAILING_STOP_MARKET", "activationPrice": "2300", "callbackRate": "0.1" } var sideWithOption = "buy;" + JSON.stringify(option) var id = exchange.CreateOrder("SOL_USDT.swap", sideWithOption, -1, 1) Log("Order Id:", id) Sleep(2000) Log(exchange.GetOrder(id)) }pythonimport json def main(): # 使用JSON格式传递option参数 option = { "type": "TRAILING_STOP_MARKET", "activationPrice": "2300", "callbackRate": "0.1" } sideWithOption = "buy;" + json.dumps(option) id = exchange.CreateOrder("SOL_USDT.swap", sideWithOption, -1, 1) Log("Order Id:", id) Sleep(2000) Log(exchange.GetOrder(id))rustfn main() { // 使用JSON格式传递option参数(Rust不支持JSON.stringify,直接使用原始字符串构造JSON文本) let option = r#"{"type": "TRAILING_STOP_MARKET", "activationPrice": "2300", "callbackRate": "0.1"}"#; let sideWithOption = format!("buy;{}", option); let id = exchange.CreateOrder("SOL_USDT.swap", &sideWithOption, -1, 1).unwrap(); Log!("Order Id:", id); Sleep(2000); Log!(exchange.GetOrder(&id)); }c++void main() { // 使用JSON格式传递option参数 json option = R"({ "type": "TRAILING_STOP_MARKET", "activationPrice": "2300", "callbackRate": "0.1" })"_json; string sideWithOption = "buy;" + option.dump(); auto id = exchange.CreateOrder("SOL_USDT.swap", sideWithOption, -1, 1); Log("Order Id:", id); Sleep(2000); Log(exchange.GetOrder(id)); }
返回值
| 类型 | 描述 |
string / 空值 | 下单成功时返回订单Id,下单失败时返回空值。FMZ平台的订单 调用 |
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 是 | 参数 当调用 当调用 当调用 |
side | string | 是 | 参数 对于现货交易所对象, 对于期货交易所对象, 支持附加参数(option):可以通过 例如: 附加参数用于传递交易所特定的参数(如订单类型、生效规则等),具体支持的参数取决于交易所API。 |
price | number | 是 | 参数 |
amount | number | 是 | 参数 |
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于将附带信息输出到本次下单日志中, |
参考
备注
支持通过side参数传递附加参数(option),用于指定交易所特定的参数。附加参数需与side参数合并传入,格式为"side;{JSON对象}"(推荐)或"side;key=value&key=value"(URL编码格式)。例如:"buy;{\"type\":\"TRAILING_STOP_MARKET\"}"。
不同交易所支持的option参数各不相同,具体支持的参数以交易所API文档为准。常见参数包括:订单类型(type)、生效规则(timeInForce)、触发价格(activationPrice)、回调比率(callbackRate)等。
使用option参数时,仍需提供price和amount参数。若某些参数已通过option传递,则这些基础参数可能会被option中的对应参数覆盖,具体行为取决于交易所API的实现。
exchange.CancelOrder
exchange.CancelOrder()函数用于取消订单。FMZ平台的订单Order结构中,属性Id由交易所品种代码和交易所原始订单Id组成,两者之间以英文逗号分隔。例如,OKX交易所现货交易对ETH_USDT的订单,其属性Id的格式为:ETH-USDT,1547130415509278720。
调用exchange.CancelOrder()函数撤销订单时,传入的参数orderId与订单Order结构的Id属性一致。
exchange.CancelOrder(orderId)
exchange.CancelOrder(orderId, ...args)示例
-
撤销订单。
javascriptfunction main(){ var id = exchange.Sell(99999, 1) exchange.CancelOrder(id) }pythondef main(): id = exchange.Sell(99999, 1) exchange.CancelOrder(id)rustfn main() { let id = exchange.Sell(99999, 1).unwrap(); let _ = exchange.CancelOrder(&id); }c++void main() { auto id = exchange.Sell(99999, 1); exchange.CancelOrder(id); } -
FMZ的API函数中,能够产生日志输出的函数(例如
Log()、exchange.Buy()、exchange.CancelOrder()等)都可以在必要参数之后附带一些输出参数。例如:
exchange.CancelOrder(orders[i].Id, orders[i]),即在取消Id为orders[i].Id的订单时,附带输出该订单的信息,也就是orders[i]这个Order结构。javascriptfunction main() { if (exchange.GetName().includes("Futures_")) { Log("Set contract to: perpetual swap, set direction to: open long.") exchange.SetContractType("swap") exchange.SetDirection("buy") } var ticker = exchange.GetTicker() exchange.Buy(ticker.Last * 0.5, 0.1) var orders = exchange.GetOrders() for (var i = 0 ; i < orders.length ; i++) { exchange.CancelOrder(orders[i].Id, "Canceled order:", orders[i]) Sleep(500) } }pythondef main(): if exchange.GetName().find("Futures_") != -1: Log("Set contract to: perpetual swap, set direction to: open long.") exchange.SetContractType("swap") exchange.SetDirection("buy") ticker = exchange.GetTicker() exchange.Buy(ticker["Last"] * 0.5, 0.1) orders = exchange.GetOrders() for i in range(len(orders)): exchange.CancelOrder(orders[i]["Id"], "Canceled order:", orders[i]) Sleep(500)rustfn main() { if exchange.GetName().contains("Futures_") { Log!("Set contract to: perpetual swap, set direction to: open long."); let _ = exchange.SetContractType("swap"); let _ = exchange.SetDirection("buy"); } let ticker = exchange.GetTicker(None).unwrap(); let _ = exchange.Buy(ticker.Last * 0.5, 0.1); let orders = exchange.GetOrders(None).unwrap(); for i in 0..orders.len() { // Rust不支持在CancelOrder的必要参数后附带输出参数,撤单后单独调用Log!宏输出附带信息 let _ = exchange.CancelOrder(&orders[i].Id); Log!("Canceled order:", orders[i]); Sleep(500); } }c++void main() { if (exchange.GetName().find("Futures_") != std::string::npos) { Log("Set contract to: perpetual swap, set direction to: open long."); exchange.SetContractType("swap"); exchange.SetDirection("buy"); } auto ticker = exchange.GetTicker(); exchange.Buy(ticker.Last * 0.5, 0.1); auto orders = exchange.GetOrders(); for (int i = 0 ; i < orders.size() ; i++) { exchange.CancelOrder(orders[i].Id, "Canceled order:", orders[i]); Sleep(500); } }
返回值
| 类型 | 描述 |
bool |
|
参数
| 名称 | 类型 | 必填 | 描述 |
orderId | string | 是 | 参数 |
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于将附带信息输出到本条撤单日志中; |
参考
备注
如果使用较旧版本的托管者,exchange.CancelOrder()函数的参数orderId可能与当前文档中描述的orderId有所差别。
exchange.GetOrder
exchange.GetOrder()函数用于获取订单信息。
exchange.GetOrder(orderId)示例
javascript
function main(){
var id = exchange.Sell(1000, 1)
// 参数id为订单号码,需填入你想要查询的订单的号码
var order = exchange.GetOrder(id)
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type)
}
python
def main():
id = exchange.Sell(1000, 1)
order = exchange.GetOrder(id)
Log("Id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:",
order["DealAmount"], "Status:", order["Status"], "Type:", order["Type"])
rust
fn main() {
let id = exchange.Sell(1000, 1).unwrap();
// 参数id为订单号码,需填入你想要查询的订单的号码
let order = exchange.GetOrder(&id).unwrap();
Log!("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}
c++
void main() {
auto id = exchange.Sell(1000, 1);
auto order = exchange.GetOrder(id);
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}返回值
| 类型 | 描述 |
| 根据订单号查询订单详情,查询成功时返回 |
参数
| 名称 | 类型 | 必填 | 描述 |
orderId | string | 是 |
调用 |
参考
备注
部分交易所不支持exchange.GetOrder()函数。返回值Order结构中的AvgPrice属性为成交均价,部分交易所不支持该字段,若不支持则将其设置为0。
如果使用较旧版本的托管者,exchange.GetOrder()函数的参数orderId可能与当前文档中描述的orderId存在差异。
不支持exchange.GetOrder()函数的交易所:
| 函数名 | 不支持的现货交易所 | 不支持的期货交易所 |
|---|---|---|
| GetOrder | Zaif / Coincheck / Bitstamp | -- |
exchange.GetOrders
exchange.GetOrders()函数用于获取当前未完成的订单。
exchange.GetOrders()
exchange.GetOrders(symbol)示例
-
使用现货交易所对象,针对多个不同的交易对,以当前价格的一半作为下单价格挂出买单,随后查询未成交订单的信息。
javascript/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ function main() { var arrSymbol = ["ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"] for (var symbol of arrSymbol) { var t = exchange.GetTicker(symbol) exchange.CreateOrder(symbol, "buy", t.Last / 2, 0.01) } var spotOrders = exchange.GetOrders() var tbls = [] for (var orders of [spotOrders]) { var tbl = {type: "table", title: "test GetOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []} for (var order of orders) { tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType]) } tbls.push(tbl) } LogStatus("`" + JSON.stringify(tbls) + "`") // 打印输出一次信息后返回,防止后续回测时订单成交,影响数据观察 return }python'''backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] ''' import json def main(): arrSymbol = ["ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"] for symbol in arrSymbol: t = exchange.GetTicker(symbol) exchange.CreateOrder(symbol, "buy", t["Last"] / 2, 0.01) spotOrders = exchange.GetOrders() tbls = [] for orders in [spotOrders]: tbl = {"type": "table", "title": "test GetOrders", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": []} for order in orders: tbl["rows"].append([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType]) tbls.append(tbl) LogStatus("`" + json.dumps(tbls) + "`") returnrust/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ fn main() { let arrSymbol = ["ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"]; for symbol in arrSymbol { let t = exchange.GetTicker(symbol).unwrap(); let _ = exchange.CreateOrder(symbol, "buy", t.Last / 2.0, 0.01); } let spotOrders = exchange.GetOrders(None).unwrap(); // Rust不支持JSON.stringify,使用format!拼接表格的JSON文本 let mut tbls = Vec::new(); for orders in [&spotOrders] { let mut rows = Vec::new(); for order in orders { rows.push(format!(r#"["{}", "{}", {}, {}, {}, {}, {}, {}, {}, "{}"]"#, order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType)); } let tbl = format!(r#"{{"type": "table", "title": "test GetOrders", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": [{}]}}"#, rows.join(",")); tbls.push(tbl); } LogStatus!(format!("`[{}]`", tbls.join(","))); // 打印输出一次信息后返回,防止后续回测时订单成交,影响数据观察 return; }c++/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ void main() { auto arrSymbol = {"ETH_USDT", "BTC_USDT", "LTC_USDT", "SOL_USDT"}; for (const auto& symbol : arrSymbol) { auto t = exchange.GetTicker(symbol); exchange.CreateOrder(symbol, "buy", t.Last / 2, 0.01); } auto spotOrders = exchange.GetOrders(); json tbls = R"([])"_json; std::vector<std::vector<Order>> arr = {spotOrders}; for (const auto& orders : arr) { json tbl = R"({ "type": "table", "title": "test GetOrders", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": [] })"_json; for (const auto& order : orders) { json arrJson = R"([])"_json; arrJson.push_back("Symbol"); arrJson.push_back("Id"); arrJson.push_back(order.Price); arrJson.push_back(order.Amount); arrJson.push_back(order.DealAmount); arrJson.push_back(order.AvgPrice); arrJson.push_back(order.Status); arrJson.push_back(order.Type); arrJson.push_back(order.Offset); arrJson.push_back(order.ContractType); tbl["rows"].push_back(arrJson); } tbls.push_back(tbl); } LogStatus(_D(), "\n", "`" + tbls.dump() + "`"); return; } -
使用期货交易所对象,对多个不同交易对、不同合约代码的品种进行下单。下单价格远离盘口对手价,使订单保持未成交状态,并按多种方式查询订单。
javascript/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ function main() { var arrSymbol = ["BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"] for (var symbol of arrSymbol) { var t = exchange.GetTicker(symbol) exchange.CreateOrder(symbol, "buy", t.Last / 2, 1) exchange.CreateOrder(symbol, "sell", t.Last * 2, 1) } var defaultOrders = exchange.GetOrders() var swapOrders = exchange.GetOrders("USDT.swap") var futuresOrders = exchange.GetOrders("USDT.futures") var btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap") var tbls = [] var arr = [defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders] var tblDesc = ["defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"] for (var index in arr) { var orders = arr[index] var tbl = {type: "table", title: tblDesc[index], cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []} for (var order of orders) { tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType]) } tbls.push(tbl) } LogStatus("`" + JSON.stringify(tbls) + "`") // 打印输出一次信息后立即返回,防止后续回测过程中订单成交而影响数据观察 return }python'''backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] ''' import json def main(): arrSymbol = ["BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"] for symbol in arrSymbol: t = exchange.GetTicker(symbol) exchange.CreateOrder(symbol, "buy", t["Last"] / 2, 1) exchange.CreateOrder(symbol, "sell", t["Last"] * 2, 1) defaultOrders = exchange.GetOrders() swapOrders = exchange.GetOrders("USDT.swap") futuresOrders = exchange.GetOrders("USDT.futures") btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap") tbls = [] arr = [defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders] tblDesc = ["defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"] for index in range(len(arr)): orders = arr[index] tbl = {"type": "table", "title": tblDesc[index], "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": []} for order in orders: tbl["rows"].append([order["Symbol"], order["Id"], order["Price"], order["Amount"], order["DealAmount"], order["AvgPrice"], order["Status"], order["Type"], order["Offset"], order["ContractType"]]) tbls.append(tbl) LogStatus("`" + json.dumps(tbls) + "`") returnrust/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ fn main() { let arrSymbol = ["BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"]; for symbol in arrSymbol { let t = exchange.GetTicker(symbol).unwrap(); let _ = exchange.CreateOrder(symbol, "buy", t.Last / 2.0, 1); let _ = exchange.CreateOrder(symbol, "sell", t.Last * 2.0, 1); } let defaultOrders = exchange.GetOrders(None).unwrap(); let swapOrders = exchange.GetOrders("USDT.swap").unwrap(); let futuresOrders = exchange.GetOrders("USDT.futures").unwrap(); let btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap").unwrap(); // Rust 不支持 JSON.stringify,此处使用 format! 拼接表格的 JSON 文本 let mut tbls = Vec::new(); let arr = [&defaultOrders, &swapOrders, &futuresOrders, &btcUsdtSwapOrders]; let tblDesc = ["defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"]; for index in 0..arr.len() { let orders = arr[index]; let mut rows = Vec::new(); for order in orders { rows.push(format!(r#"["{}", "{}", {}, {}, {}, {}, {}, {}, {}, "{}"]"#, order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType)); } let tbl = format!(r#"{{"type": "table", "title": "{}", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": [{}]}}"#, tblDesc[index], rows.join(",")); tbls.push(tbl); } LogStatus!(format!("`[{}]`", tbls.join(","))); // 打印输出一次信息后立即返回,防止后续回测过程中订单成交而影响数据观察 return; }c++/*backtest start: 2024-05-21 00:00:00 end: 2024-09-05 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ void main() { auto arrSymbol = {"BTC_USDT.swap", "BTC_USDT.quarter", "ETH_USDT.swap", "ETH_USDT.quarter"}; for (const auto& symbol : arrSymbol) { auto t = exchange.GetTicker(symbol); exchange.CreateOrder(symbol, "buy", t.Last / 2, 1); exchange.CreateOrder(symbol, "sell", t.Last * 2, 1); } auto defaultOrders = exchange.GetOrders(); auto swapOrders = exchange.GetOrders("USDT.swap"); auto futuresOrders = exchange.GetOrders("USDT.futures"); auto btcUsdtSwapOrders = exchange.GetOrders("BTC_USDT.swap"); json tbls = R"([])"_json; std::vector<std::vector<Order>> arr = {defaultOrders, swapOrders, futuresOrders, btcUsdtSwapOrders}; std::string tblDesc[] = {"defaultOrders", "swapOrders", "futuresOrders", "btcUsdtSwapOrders"}; for (int index = 0; index < arr.size(); index++) { auto orders = arr[index]; json tbl = R"({ "type": "table", "cols": ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], "rows": [] })"_json; tbl["title"] = tblDesc[index]; for (const auto& order : orders) { json arrJson = R"([])"_json; arrJson.push_back(order.Symbol); arrJson.push_back(to_string(order.Id)); // Order 订单结构中的 Id 属性类型为 TId,此处使用 FMZ 平台内置的 C++ 函数 to_string 进行编码 arrJson.push_back(order.Price); arrJson.push_back(order.Amount); arrJson.push_back(order.DealAmount); arrJson.push_back(order.AvgPrice); arrJson.push_back(order.Status); arrJson.push_back(order.Type); arrJson.push_back(order.Offset); arrJson.push_back(order.ContractType); tbl["rows"].push_back(arrJson); } tbls.push_back(tbl); } LogStatus(_D(), "\n", "`" + tbls.dump() + "`"); return; } -
调用
exchange.GetOrders()函数时,可传入Symbol参数以指定请求特定交易对或合约代码的订单数据。javascriptfunction main() { var orders = exchange.GetOrders("BTC_USDT") // 现货品种示例 // var orders = exchange.GetOrders("BTC_USDT.swap") // 期货品种示例 Log("orders:", orders) }pythondef main(): orders = exchange.GetOrders("BTC_USDT") # 现货品种示例 # orders = exchange.GetOrders("BTC_USDT.swap") # 期货品种示例 Log("orders:", orders)rustfn main() { let orders = exchange.GetOrders("BTC_USDT"); // 现货品种示例 // let orders = exchange.GetOrders("BTC_USDT.swap"); // 期货品种示例 Log!("orders:", orders); }c++void main() { auto orders = exchange.GetOrders("BTC_USDT"); // 现货品种示例 // auto orders = exchange.GetOrders("BTC_USDT.swap"); // 期货品种示例 Log("orders:", orders); }
返回值
| 类型 | 描述 |
|
|
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 | 参数 对于现货交易所对象,若不传入 对于期货交易所对象,若不传入 |
参考
备注
在GetOrders函数中,symbol参数的使用场景归纳如下:
| 交易所对象分类 | symbol参数 | 查询范围 | 备注 |
|---|---|---|---|
| 现货 | 不传symbol参数 | 查询所有现货交易对 | 适用于所有调用场景;若交易所接口不支持,则报错返回空值,以下不再赘述 |
| 现货 | 指定交易品种,symbol参数为:"BTC_USDT" | 查询指定的BTC_USDT交易对 | 对于现货交易所对象,参数symbol的格式为:"BTC_USDT" |
| 期货 | 不传symbol参数 | 查询当前交易对、合约代码维度范围内的所有交易品种 | 假如当前交易对为BTC_USDT,合约代码为swap,即查询所有USDT本位永续合约。等价于调用GetOrders("USDT.swap") |
| 期货 | 指定交易品种,symbol参数为:"BTC_USDT.swap" | 查询指定的BTC的USDT本位永续合约 | 对于期货交易所对象,参数symbol的格式为:FMZ平台定义的交易对与合约代码的组合,以字符"."间隔。 |
| 期货 | 指定交易品种范围,symbol参数为:"USDT.swap" | 查询所有USDT本位永续合约 | - |
| 支持期权的期货交易所 | 不传symbol参数 | 查询当前交易对维度范围内的所有期权合约 | 假如当前交易对为BTC_USDT,且合约设置为期权合约,例如币安期权合约:BTC-240108-40000-C |
| 支持期权的期货交易所 | 指定具体交易品种 | 查询指定的期权合约 | 例如对于币安期货交易所,symbol参数为:BTC_USDT.BTC-240108-40000-C |
| 支持期权的期货交易所 | 指定交易品种范围,symbol参数为:"USDT.option" | 查询所有USDT本位期权合约 | - |
在GetOrders函数中,期货交易所对象的查询维度范围归纳如下:
| symbol参数 | 请求范围定义 | 备注 |
|---|---|---|
| USDT.swap | USDT本位永续合约范围。 | 对于交易所API接口不支持的维度,调用时会报错返回空值。 |
| USDT.futures | USDT本位交割合约范围。 | - |
| USD.swap | 币本位永续合约范围。 | - |
| USD.futures | 币本位交割合约范围。 | - |
| USDT.option | USDT本位期权合约范围。 | - |
| USD.option | 币本位期权合约范围。 | - |
| USDT.futures_combo | 差价组合合约范围。 | Futures_Deribit交易所 |
| USD.futures_ff | 混合保证金交割合约范围。 | Futures_Kraken交易所 |
| USD.swap_pf | 混合保证金永续合约范围。 | Futures_Kraken交易所 |
当交易所对象exchange所代表的账户在查询范围内或指定的交易品种上没有挂单(即处于未成交状态的活动订单)时,调用该函数将返回空数组,即:[]。
以下交易所查询当前未完成订单的接口必须传入品种参数。使用这些交易所调用GetOrders函数时,若未传入symbol参数,则仅请求当前品种的未完成订单,而非所有品种的未完成订单(因为交易所接口不支持)。
Zaif、MEXC、LBank、Korbit、Coinw、BitMart、Bithumb、BitFlyer、BigONE。
不支持exchange.GetOrders()函数的交易所:
| 函数名 | 不支持的现货交易所 | 不支持的期货交易所 |
|---|---|---|
| GetOrders | -- | Futures_Bibox |
exchange.GetHistoryOrders
exchange.GetHistoryOrders()函数用于获取当前交易对、合约的历史订单,并支持指定具体的交易品种。
exchange.GetHistoryOrders()
exchange.GetHistoryOrders(symbol)
exchange.GetHistoryOrders(symbol, since)
exchange.GetHistoryOrders(symbol, since, limit)
exchange.GetHistoryOrders(since)
exchange.GetHistoryOrders(since, limit)示例
javascript
function main() {
var historyOrders = exchange.GetHistoryOrders()
Log(historyOrders)
}
python
def main():
historyOrders = exchange.GetHistoryOrders()
Log(historyOrders)
rust
fn main() {
let historyOrders = exchange.GetHistoryOrders(None, None, None);
Log!(historyOrders);
}
c++
void main() {
auto historyOrders = exchange.GetHistoryOrders();
Log(historyOrders);
}返回值
| 类型 | 描述 |
|
|
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 |
如果查询的是期权合约的订单数据,参数 |
since | number | 否 |
|
limit | number | 否 |
|
参考
备注
-
未指定
symbol、since、limit参数时,默认查询当前交易对、合约的历史订单,即查询距当前时间最近的一定范围内的历史订单,具体查询范围取决于交易所接口的单次查询范围。 -
指定
symbol参数时,查询所设置交易品种的历史订单。 -
指定
since参数时,以since时间戳为起始时间,向当前时间方向查询。 -
指定
limit参数时,查询到足够条数后返回。 -
该函数仅支持提供历史订单查询接口的交易所。
不支持exchange.GetHistoryOrders()函数的交易所:
| 函数名 | 不支持的现货交易所 | 不支持的期货交易所 |
|---|---|---|
| GetHistoryOrders | Zaif / Upbit / Coincheck / Bitstamp / Bithumb / BitFlyer / BigONE | Futures_Bibox / Futures_ApolloX |
exchange.CreateConditionOrder
exchange.CreateConditionOrder()函数用于创建条件单。条件单是一种在满足特定触发条件时自动执行的订单类型。
exchange.CreateConditionOrder(symbol, side, amount, condition)
exchange.CreateConditionOrder(symbol, side, amount, condition, ...args)示例
-
创建止盈单(TP):当价格上涨至目标价位时自动卖出。
javascriptfunction main() { // 创建止盈单:当BTC_USDT价格上涨至65000时,以65000的价格卖出0.01个BTC var condition = { ConditionType: ORDER_CONDITION_TYPE_TP, // 止盈单 TpTriggerPrice: 65000, // 触发价格 TpOrderPrice: 65000 // 执行价格,也可设置为-1表示市价单 } var id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("TP order Id:", id) }pythondef main(): # 创建止盈单:当BTC_USDT价格上涨至65000时,以65000的价格卖出0.01个BTC condition = { "ConditionType": ORDER_CONDITION_TYPE_TP, # 止盈单 "TpTriggerPrice": 65000, # 触发价格 "TpOrderPrice": 65000 # 执行价格,也可设置为-1表示市价单 } id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("TP order Id:", id)rustfn main() { // 创建止盈单:当BTC_USDT价格上涨至65000时,以65000的价格卖出0.01个BTC let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, // 止盈单 TpTriggerPrice: 65000.0, // 触发价格 TpOrderPrice: 65000.0, // 执行价格,也可设置为-1表示市价单 ..Default::default() }; let id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition); Log!("TP order Id:", id); }c++void main() { // 创建止盈单:当BTC_USDT价格上涨至65000时,以65000的价格卖出0.01个BTC OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 65000, .TpOrderPrice = 65000}; auto id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition); Log("TP order Id:", id); } -
创建止损单(SL):当价格下跌至止损触发价位时,自动以设定方式卖出。
javascriptfunction main() { // 创建止损单:当BTC_USDT价格下跌至58000时,以市价卖出0.01个BTC var condition = { ConditionType: ORDER_CONDITION_TYPE_SL, // 止损单 SlTriggerPrice: 58000, // 触发价格 SlOrderPrice: -1 // -1表示市价单 } var id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("SL order Id:", id) }pythondef main(): # 创建止损单:当BTC_USDT价格下跌至58000时,以市价卖出0.01个BTC condition = { "ConditionType": ORDER_CONDITION_TYPE_SL, # 止损单 "SlTriggerPrice": 58000, # 触发价格 "SlOrderPrice": -1 # -1表示市价单 } id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("SL order Id:", id)rustfn main() { // 创建止损单:当BTC_USDT价格下跌至58000时,以市价卖出0.01个BTC let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_SL, // 止损单 SlTriggerPrice: 58000.0, // 触发价格 SlOrderPrice: -1.0, // -1表示市价单 ..Default::default() }; let id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition); Log!("SL order Id:", id); }c++void main() { // 创建止损单:当BTC_USDT价格下跌至58000时,以市价卖出0.01个BTC OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_SL, .SlTriggerPrice = 58000, .SlOrderPrice = -1}; auto id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition); Log("SL order Id:", id); } -
创建 OCO 订单:同时设置止盈和止损,任意一个触发后,另一个将自动取消。
javascriptfunction main() { // 创建 OCO 订单:止盈价 65000,止损价 58000 var condition = { ConditionType: ORDER_CONDITION_TYPE_OCO, // OCO 订单 TpTriggerPrice: 65000, // 止盈触发价格 TpOrderPrice: 65000, // 止盈执行价格 SlTriggerPrice: 58000, // 止损触发价格 SlOrderPrice: 58000 // 止损执行价格 } var id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("OCO order Id:", id) }pythondef main(): # 创建 OCO 订单:止盈价 65000,止损价 58000 condition = { "ConditionType": ORDER_CONDITION_TYPE_OCO, # OCO 订单 "TpTriggerPrice": 65000, # 止盈触发价格 "TpOrderPrice": 65000, # 止盈执行价格 "SlTriggerPrice": 58000, # 止损触发价格 "SlOrderPrice": 58000 # 止损执行价格 } id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Log("OCO order Id:", id)rustfn main() { // 创建 OCO 订单:止盈价 65000,止损价 58000 let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_OCO, // OCO 订单 TpTriggerPrice: 65000.0, // 止盈触发价格 TpOrderPrice: 65000.0, // 止盈执行价格 SlTriggerPrice: 58000.0, // 止损触发价格 SlOrderPrice: 58000.0 // 止损执行价格 }; let id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition); Log!("OCO order Id:", id); }c++void main() { // 创建 OCO 订单:止盈价 65000,止损价 58000 OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_OCO, .TpTriggerPrice = 65000, .TpOrderPrice = 65000, .SlTriggerPrice = 58000, .SlOrderPrice = 58000}; auto id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition); Log("OCO order Id:", id); } -
使用附加参数(option)创建条件单,用于传递交易所特定的参数。
javascriptfunction main() { // 以 JSON 格式传递 option 参数 var option = { "type": "TRAILING_STOP_MARKET", "activatePrice": "300", "callbackRate": "0.1" } var sideWithOption = "buy;" + JSON.stringify(option) var condition = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77, TpOrderPrice: 71 } var id = exchange.CreateConditionOrder("SOL_USDT.swap", sideWithOption, 1, condition) Log("Condition Order Id:", id) Sleep(2000) Log(exchange.GetConditionOrder(id)) }pythonimport json def main(): # 以 JSON 格式传递 option 参数 option = { "type": "TRAILING_STOP_MARKET", "activatePrice": "300", "callbackRate": "0.1" } sideWithOption = "buy;" + json.dumps(option) condition = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 77, "TpOrderPrice": 71 } id = exchange.CreateConditionOrder("SOL_USDT.swap", sideWithOption, 1, condition) Log("Condition Order Id:", id) Sleep(2000) Log(exchange.GetConditionOrder(id))rustfn main() { // 以 JSON 格式传递 option 参数(Rust 无 JSON 序列化功能,此处直接使用原始字符串构造) let option = r#"{"type": "TRAILING_STOP_MARKET", "activatePrice": "300", "callbackRate": "0.1"}"#; let sideWithOption = format!("buy;{}", option); let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77.0, TpOrderPrice: 71.0, ..Default::default() }; let id = exchange.CreateConditionOrder("SOL_USDT.swap", &sideWithOption, 1, &condition).unwrap(); Log!("Condition Order Id:", id); Sleep(2000); Log!(exchange.GetConditionOrder(&id)); }c++void main() { // 以 JSON 格式传递 option 参数 json option = R"({ "type": "TRAILING_STOP_MARKET", "activatePrice": "300", "callbackRate": "0.1" })"_json; string sideWithOption = "buy;" + option.dump(); OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 77, .TpOrderPrice = 71}; auto id = exchange.CreateConditionOrder("SOL_USDT.swap", sideWithOption, 1, condition); Log("Condition Order Id:", id); Sleep(2000); Log(exchange.GetConditionOrder(id)); }
返回值
| 类型 | 描述 |
string / 空值 | 创建条件单成功时返回条件单Id,创建失败时返回空值。条件单Id的格式与普通订单Id类似,由交易所品种代码和交易所原始条件单Id组成,两者之间以英文逗号分隔。 |
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 是 | 参数 当调用 当调用 当调用 |
side | string | 是 | 参数 对于现货交易所对象, 对于期货交易所对象, 支持附加参数(option):可以通过 例如: 附加参数用于传递交易所特定的参数(如订单类型、生效规则等),具体支持的参数取决于交易所API。 |
amount | number | 是 | 参数 |
condition | object | 是 | 参数
|
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于将附带信息输出到该条条件单的日志中, |
参考
Condition exchange.CancelConditionOrder exchange.GetConditionOrder exchange.GetConditionOrders exchange.ModifyConditionOrder
备注
条件单功能的支持情况取决于具体交易所,部分交易所可能不支持条件单功能。
条件单在触发前不会占用账户资金,仅在触发后才会实际下单并占用资金。
不同交易所对条件单的支持程度及具体参数可能有所差异,使用前请查阅对应交易所的 API 文档。
支持通过side参数传递附加参数(option),用于传递交易所特定的参数。附加参数需与side参数合并传入,格式为"side;{JSON对象}"(推荐)或"side;key=value&key=value"(URL 编码格式)。例如:"buy;{\"type\":\"TRAILING_STOP_MARKET\"}"。
不同交易所支持的 option 参数各不相同,具体支持的参数取决于交易所 API 文档。常见参数包括:订单类型(type)、生效规则(timeInForce)、触发价格(activatePrice)、回调比率(callbackRate)等。
使用 option 参数时,仍需提供amount和condition参数。如果交易所 API 中的某些参数已通过 option 传递,这些基础参数可能会被 option 中的对应参数覆盖,具体行为取决于交易所 API 的实现。
exchange.ModifyOrder
exchange.ModifyOrder()函数用于修改现有的普通订单,可修改订单的价格和数量。该函数支持通过附加参数修改订单的其它属性(具体取决于交易所 API 的支持情况)。
exchange.ModifyOrder(orderId, side, price, amount)示例
-
修改普通订单的价格和数量。
javascriptfunction main() { // 创建一个限价买单 var id = exchange.CreateOrder("SOL_USDT.swap", "buy", 88, 1) Log("Original Order ID:", id) Sleep(2000) // 查询原始订单信息 var order = exchange.GetOrder(id) Log("Original Order Info:", order) Sleep(1000) // 修改订单的价格和数量 var newId = exchange.ModifyOrder(id, "buy", 77, 2) Log("Modified Order ID:", newId) Sleep(2000) // 查询修改后的订单信息 var newOrder = exchange.GetOrder(newId) Log("Modified Order Info:", newOrder) // 取消订单 exchange.CancelOrder(newId) }pythondef main(): # 创建一个限价买单 id = exchange.CreateOrder("SOL_USDT.swap", "buy", 88, 1) Log("Original Order ID:", id) Sleep(2000) # 查询原始订单信息 order = exchange.GetOrder(id) Log("Original Order Info:", order) Sleep(1000) # 修改订单的价格和数量 newId = exchange.ModifyOrder(id, "buy", 77, 2) Log("Modified Order ID:", newId) Sleep(2000) # 查询修改后的订单信息 newOrder = exchange.GetOrder(newId) Log("Modified Order Info:", newOrder) # 取消订单 exchange.CancelOrder(newId)rustfn main() { // 创建一个限价买单 let id = exchange.CreateOrder("SOL_USDT.swap", "buy", 88, 1).unwrap(); Log!("Original Order ID:", id); Sleep(2000); // 查询原始订单信息 let order = exchange.GetOrder(&id).unwrap(); Log!("Original Order Info:", order); Sleep(1000); // 修改订单的价格和数量 let newId = exchange.ModifyOrder(&id, "buy", 77, 2).unwrap(); Log!("Modified Order ID:", newId); Sleep(2000); // 查询修改后的订单信息 let newOrder = exchange.GetOrder(&newId).unwrap(); Log!("Modified Order Info:", newOrder); // 取消订单 let _ = exchange.CancelOrder(&newId); }c++void main() { // 创建一个限价买单 auto id = exchange.CreateOrder("SOL_USDT.swap", "buy", 88, 1); Log("Original Order ID:", id); Sleep(2000); // 查询原始订单信息 auto order = exchange.GetOrder(id); Log("Original Order Info:", order); Sleep(1000); // 修改订单的价格和数量 auto newId = exchange.ModifyOrder(id, "buy", 77, 2); Log("Modified Order ID:", newId); Sleep(2000); // 查询修改后的订单信息 auto newOrder = exchange.GetOrder(newId); Log("Modified Order Info:", newOrder); // 取消订单 exchange.CancelOrder(newId); } -
使用附加参数(option)修改订单的价格匹配模式。
javascriptfunction main() { // 创建一个限价买单 var id = exchange.CreateOrder("SOL_USDT.swap", "buy", 77, 1) Log("Original Order ID:", id) Sleep(2000) // 修改订单,并将价格匹配模式设置为 QUEUE_20 // 通过 side 参数传递附加参数(JSON 格式) var option = {"priceMatch": "QUEUE_20"} var sideWithOption = "buy;" + JSON.stringify(option) var newId = exchange.ModifyOrder(id, sideWithOption, -1, 2) Log("Modified Order ID:", newId) Sleep(2000) // 查询修改后的订单信息 var newOrder = exchange.GetOrder(newId) Log("Modified Order Info:", newOrder) // 撤销订单 exchange.CancelOrder(newId) }pythonimport json def main(): # 创建一个限价买单 id = exchange.CreateOrder("SOL_USDT.swap", "buy", 77, 1) Log("Original Order ID:", id) Sleep(2000) # 修改订单,并将价格匹配模式设置为 QUEUE_20 # 通过 side 参数传递附加参数(JSON 格式) option = {"priceMatch": "QUEUE_20"} sideWithOption = "buy;" + json.dumps(option) newId = exchange.ModifyOrder(id, sideWithOption, -1, 2) Log("Modified Order ID:", newId) Sleep(2000) # 查询修改后的订单信息 newOrder = exchange.GetOrder(newId) Log("Modified Order Info:", newOrder) # 撤销订单 exchange.CancelOrder(newId)rustfn main() { // 创建一个限价买单 let id = exchange.CreateOrder("SOL_USDT.swap", "buy", 77, 1).unwrap(); Log!("Original Order ID:", id); Sleep(2000); // 修改订单,并将价格匹配模式设置为 QUEUE_20 // 通过 side 参数传递附加参数(JSON 格式);Rust 不支持 JSON.stringify,因此直接使用原始字符串构造 JSON 文本 let option = r#"{"priceMatch": "QUEUE_20"}"#; let sideWithOption = format!("buy;{}", option); let newId = exchange.ModifyOrder(&id, &sideWithOption, -1, 2).unwrap(); Log!("Modified Order ID:", newId); Sleep(2000); // 查询修改后的订单信息 let newOrder = exchange.GetOrder(&newId).unwrap(); Log!("Modified Order Info:", newOrder); // 撤销订单 let _ = exchange.CancelOrder(&newId); }c++void main() { // 创建一个限价买单 auto id = exchange.CreateOrder("SOL_USDT.swap", "buy", 77, 1); Log("Original Order ID:", id); Sleep(2000); // 修改订单,并将价格匹配模式设置为 QUEUE_20 // 通过 side 参数传递附加参数(JSON 格式) json option = R"({"priceMatch": "QUEUE_20"})"_json; string sideWithOption = "buy;" + option.dump(); auto newId = exchange.ModifyOrder(id, sideWithOption, -1, 2); Log("Modified Order ID:", newId); Sleep(2000); // 查询修改后的订单信息 auto newOrder = exchange.GetOrder(newId); Log("Modified Order Info:", newOrder); // 撤销订单 exchange.CancelOrder(newId); }
返回值
| 类型 | 描述 |
string / 空值 | 修改订单成功时返回订单 ID,修改失败时返回空值。返回的订单 ID 可能与原订单 ID 相同,也可能不同,这取决于交易所 API 的实现方式。某些交易所在修改订单后会返回新的订单 ID,而有些交易所则保持订单 ID 不变。 |
参数
| 名称 | 类型 | 必填 | 描述 |
orderId | string | 是 | 参数 |
side | string | 是 | 参数 对于现货交易所对象, 对于期货交易所对象, 支持附加参数(option):可通过 例如: 附加参数用于修改订单的其它属性(如价格匹配模式等),具体支持的参数取决于交易所 API。 |
price | number | 是 | 参数 |
amount | number | 是 | 参数 |
参考
备注
exchange.ModifyOrder()函数返回的订单 ID 因交易所 API 的实现不同而可能有不同的行为。有些交易所 API 返回的订单 ID 会更新,有些则保持不变。建议使用返回的新订单 ID 进行后续操作。
exchange.ModifyOrder()函数不会依据交易所接口规则校验参数的有效性,而是将参数直接提交给交易所 API。传入无效参数时(如价格或数量为 -1),参数可能会被交易所忽略,订单将保持原有属性不变。
支持通过side参数传递附加参数(option),用于修改订单的其它属性。附加参数需与side参数合并后传入,格式为"side;{JSON对象}"(推荐)或"side;key=value"(URL 编码格式)。例如,修改价格匹配模式:"buy;{\"priceMatch\":\"QUEUE_20\"}"。
对于普通订单的市价单修改,需具体查看交易所 API 是否支持。有些交易所不支持对市价单进行修改操作。
修改订单时,订单的其它属性(如订单类型、持仓模式、账户模式、杠杆、订单生效规则等)通常会保留原订单的设置。如需修改这些属性,可通过附加参数(option)传入,前提是交易所 API 支持。
个别交易所 API 在未接收到价格参数时(price 为 -1 或 null),可能会将订单转为市价单。对于现货市价买单,需要注意其下单量单位可能是金额而非币数。
修改订单功能的支持情况取决于具体交易所,部分交易所可能不支持修改订单功能,或仅支持修改部分参数。使用前请查阅对应交易所的 API 文档。
exchange.ModifyConditionOrder
exchange.ModifyConditionOrder()函数用于修改现有的条件单,可修改条件单的下单量、触发条件和执行价格。支持通过附加参数修改条件单的其它属性(具体取决于交易所API的支持情况)。
exchange.ModifyConditionOrder(orderId, side, amount, condition)示例
-
修改条件单的数量和触发条件。
javascriptfunction main() { // 创建一个止盈条件单 var condition = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77, TpOrderPrice: 76 } var id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition) Log("Original Condition Order ID:", id) Sleep(2000) // 查询原始条件单信息 var order = exchange.GetConditionOrder(id) Log("Original Condition Order Info:", order) Sleep(1000) // 修改条件单的数量和触发条件 var newCondition = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 75, TpOrderPrice: 71 } var newId = exchange.ModifyConditionOrder(id, "buy", 2, newCondition) Log("Modified Condition Order ID:", newId) Sleep(2000) // 查询修改后的条件单信息 var newOrder = exchange.GetConditionOrder(newId) Log("Modified Condition Order Info:", newOrder) // 取消条件单 exchange.CancelConditionOrder(newId) }pythondef main(): # 创建一个止盈条件单 condition = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 77, "TpOrderPrice": 76 } id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition) Log("Original Condition Order ID:", id) Sleep(2000) # 查询原始条件单信息 order = exchange.GetConditionOrder(id) Log("Original Condition Order Info:", order) Sleep(1000) # 修改条件单的数量和触发条件 newCondition = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 75, "TpOrderPrice": 71 } newId = exchange.ModifyConditionOrder(id, "buy", 2, newCondition) Log("Modified Condition Order ID:", newId) Sleep(2000) # 查询修改后的条件单信息 newOrder = exchange.GetConditionOrder(newId) Log("Modified Condition Order Info:", newOrder) # 取消条件单 exchange.CancelConditionOrder(newId)rustfn main() { // 创建一个止盈条件单 let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77.0, TpOrderPrice: 76.0, ..Default::default() }; let id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, &condition).unwrap(); Log!("Original Condition Order ID:", id); Sleep(2000); // 查询原始条件单信息 let order = exchange.GetConditionOrder(&id); Log!("Original Condition Order Info:", order); Sleep(1000); // 修改条件单的数量和触发条件 let newCondition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 75.0, TpOrderPrice: 71.0, ..Default::default() }; let newId = exchange.ModifyConditionOrder(&id, "buy", 2, &newCondition).unwrap(); Log!("Modified Condition Order ID:", newId); Sleep(2000); // 查询修改后的条件单信息 let newOrder = exchange.GetConditionOrder(&newId); Log!("Modified Condition Order Info:", newOrder); // 取消条件单 let _ = exchange.CancelConditionOrder(&newId); }c++void main() { // 创建一个止盈条件单 OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 77, .TpOrderPrice = 76}; auto id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition); Log("Original Condition Order ID:", id); Sleep(2000); // 查询原始条件单信息 auto order = exchange.GetConditionOrder(id); Log("Original Condition Order Info:", order); Sleep(1000); // 修改条件单的数量和触发条件 OrderCondition newCondition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 75, .TpOrderPrice = 71}; auto newId = exchange.ModifyConditionOrder(id, "buy", 2, newCondition); Log("Modified Condition Order ID:", newId); Sleep(2000); // 查询修改后的条件单信息 auto newOrder = exchange.GetConditionOrder(newId); Log("Modified Condition Order Info:", newOrder); // 取消条件单 exchange.CancelConditionOrder(newId); } -
使用附加参数(option)修改条件单的触发价格类型。
javascriptfunction main() { // 创建一个止盈条件单 var condition = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77, TpOrderPrice: 76 } var id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition) Log("Original Condition Order ID:", id) Sleep(2000) // 修改条件单,并将触发价格类型设置为指数价格(index) // 通过 side 参数传递附加参数(JSON 格式) var option = {"newTpTriggerPxType": "index"} var sideWithOption = "buy;" + JSON.stringify(option) var newCondition = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 75, TpOrderPrice: 71 } var newId = exchange.ModifyConditionOrder(id, sideWithOption, 2, newCondition) Log("Modified Condition Order ID:", newId) Sleep(2000) // 查询修改后的条件单信息 var newOrder = exchange.GetConditionOrder(newId) Log("Modified Condition Order Info:", newOrder) // 取消条件单 exchange.CancelConditionOrder(newId) }pythonimport json def main(): # 创建一个止盈条件单 condition = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 77, "TpOrderPrice": 76 } id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition) Log("Original Condition Order ID:", id) Sleep(2000) # 修改条件单,并将触发价格类型设置为指数价格(index) # 通过 side 参数传递附加参数(JSON 格式) option = {"newTpTriggerPxType": "index"} sideWithOption = "buy;" + json.dumps(option) newCondition = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 75, "TpOrderPrice": 71 } newId = exchange.ModifyConditionOrder(id, sideWithOption, 2, newCondition) Log("Modified Condition Order ID:", newId) Sleep(2000) # 查询修改后的条件单信息 newOrder = exchange.GetConditionOrder(newId) Log("Modified Condition Order Info:", newOrder) # 取消条件单 exchange.CancelConditionOrder(newId)rustfn main() { // 创建一个止盈条件单 let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 77.0, TpOrderPrice: 76.0, ..Default::default() }; let id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, &condition).unwrap(); Log!("Original Condition Order ID:", id); Sleep(2000); // 修改条件单,并将触发价格类型设置为指数价格(index) // 通过 side 参数传递附加参数(JSON 格式;Rust 无 JSON 序列化,故直接使用原始字符串构造) let sideWithOption = r#"buy;{"newTpTriggerPxType": "index"}"#; let newCondition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 75.0, TpOrderPrice: 71.0, ..Default::default() }; let newId = exchange.ModifyConditionOrder(&id, sideWithOption, 2, &newCondition).unwrap(); Log!("Modified Condition Order ID:", newId); Sleep(2000); // 查询修改后的条件单信息 let newOrder = exchange.GetConditionOrder(&newId); Log!("Modified Condition Order Info:", newOrder); // 取消条件单 let _ = exchange.CancelConditionOrder(&newId); }c++void main() { // 创建一个止盈条件单 OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 77, .TpOrderPrice = 76}; auto id = exchange.CreateConditionOrder("SOL_USDT.swap", "buy", 1, condition); Log("Original Condition Order ID:", id); Sleep(2000); // 修改条件单,并将触发价格类型设置为指数价格(index) // 通过 side 参数传递附加参数(JSON 格式) json option = R"({"newTpTriggerPxType": "index"})"_json; string sideWithOption = "buy;" + option.dump(); OrderCondition newCondition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 75, .TpOrderPrice = 71}; auto newId = exchange.ModifyConditionOrder(id, sideWithOption, 2, newCondition); Log("Modified Condition Order ID:", newId); Sleep(2000); // 查询修改后的条件单信息 auto newOrder = exchange.GetConditionOrder(newId); Log("Modified Condition Order Info:", newOrder); // 取消条件单 exchange.CancelConditionOrder(newId); }
返回值
| 类型 | 描述 |
string / 空值 | 修改条件单成功时返回条件单ID,修改失败时返回空值。返回的条件单ID可能与原条件单ID相同,也可能不同,这取决于交易所API的具体实现方式。某些交易所在修改条件单后会返回新的条件单ID,而有些交易所则保持条件单ID不变。 |
参数
| 名称 | 类型 | 必填 | 描述 |
orderId | string | 是 | 参数 |
side | string | 是 | 参数 支持附加参数(option):可以通过 |
amount | number | 是 | 参数 |
condition | object | 是 | 参数
|
参考
Condition exchange.CreateConditionOrder exchange.CancelConditionOrder exchange.GetConditionOrder exchange.GetConditionOrders
备注
exchange.ModifyConditionOrder()函数返回的条件单ID因交易所API实现的不同而可能表现出不同行为。有些交易所API返回的条件单ID会更新,有些则保持不变。建议使用返回的新条件单ID进行后续操作。
exchange.ModifyConditionOrder()函数不会依据交易所接口规则校验参数的有效性,而是将参数直接提交给交易所API。传入无效参数时(如数量为-1),该参数可能会被交易所忽略,条件单保持原有属性不变。
支持通过side参数传递附加参数(option),用于修改条件单的其它属性。附加参数需要与side参数合并传入,格式为"side;{JSON对象}"(推荐)或"side;key=value"(URL编码格式)。例如修改触发价格类型:"buy;{\"newTpTriggerPxType\":\"index\"}"。
对于条件单的市价单修改,需要具体查看交易所API是否支持。将condition参数中的TpOrderPrice或SlOrderPrice设置为-1表示市价单。
修改条件单时,条件单的其它属性(如条件类型、持仓模式、账户模式、杠杆等)通常会保留原条件单的设置。如需修改这些属性,可以通过附加参数(option)传入,前提是交易所API支持。
可以通过附加参数修改触发价格类型,例如将触发价格类型从最新价(last)修改为指数价格(index)或标记价格(mark)。具体的参数名称和支持情况取决于交易所API文档。
修改条件单功能的支持情况取决于具体交易所,部分交易所可能不支持修改条件单功能,或仅支持修改部分参数。使用前请查阅对应交易所的API文档。
exchange.CancelConditionOrder
exchange.CancelConditionOrder()函数用于取消条件单。条件单Id的格式与普通订单Id类似,由交易所品种代码和交易所原始条件单Id组成,两者以英文逗号分隔。
调用exchange.CancelConditionOrder()函数撤销条件单时,传入的conditionOrderId参数与条件单结构的Id属性一致。
exchange.CancelConditionOrder(conditionOrderId)
exchange.CancelConditionOrder(conditionOrderId, ...args)示例
-
撤销条件单。
javascriptfunction main(){ // 创建止损条件单 var condition = { ConditionType: ORDER_CONDITION_TYPE_SL, SlTriggerPrice: 58000, SlOrderPrice: -1 // 市价单 } var id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Sleep(1000) exchange.CancelConditionOrder(id) }pythondef main(): # 创建止损条件单 condition = { "ConditionType": ORDER_CONDITION_TYPE_SL, "SlTriggerPrice": 58000, "SlOrderPrice": -1 # 市价单 } id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition) Sleep(1000) exchange.CancelConditionOrder(id)rustfn main() { // 创建止损条件单 let condition = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_SL, SlTriggerPrice: 58000.0, SlOrderPrice: -1.0, // 市价单 ..Default::default() }; let id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition).unwrap(); Sleep(1000); let _ = exchange.CancelConditionOrder(&id); }c++void main() { // 创建止损条件单 OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_SL, .SlTriggerPrice = 58000, .SlOrderPrice = -1}; auto id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition); Sleep(1000); exchange.CancelConditionOrder(id); } -
批量取消条件单,并附带输出条件单信息。
javascriptfunction main() { // 创建几个条件单 var condition1 = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 65000, TpOrderPrice: 65000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1) var condition2 = { ConditionType: ORDER_CONDITION_TYPE_SL, SlTriggerPrice: 58000, SlOrderPrice: 58000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition2) Sleep(1000) var orders = exchange.GetConditionOrders() for (var i = 0 ; i < orders.length ; i++) { exchange.CancelConditionOrder(orders[i].Id, "Canceled condition order:", orders[i]) Sleep(500) } }pythondef main(): # 创建几个条件单 condition1 = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 65000, "TpOrderPrice": 65000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1) condition2 = { "ConditionType": ORDER_CONDITION_TYPE_SL, "SlTriggerPrice": 58000, "SlOrderPrice": 58000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition2) Sleep(1000) orders = exchange.GetConditionOrders() for i in range(len(orders)): exchange.CancelConditionOrder(orders[i]["Id"], "Canceled condition order:", orders[i]) Sleep(500)rustfn main() { // 创建几个条件单 let condition1 = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 65000.0, TpOrderPrice: 65000.0, ..Default::default() }; let _ = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition1); let condition2 = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_SL, SlTriggerPrice: 58000.0, SlOrderPrice: 58000.0, ..Default::default() }; let _ = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition2); Sleep(1000); let orders = exchange.GetConditionOrders(None).unwrap(); for i in 0..orders.len() { // Rust中CancelConditionOrder不支持扩展参数,附带信息用Log输出 let _ = exchange.CancelConditionOrder(&orders[i].Id); Log!("Canceled condition order:", orders[i]); Sleep(500); } }c++void main() { // 创建几个条件单 OrderCondition condition1 = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 65000, .TpOrderPrice = 65000}; exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1); OrderCondition condition2 = {.ConditionType = ORDER_CONDITION_TYPE_SL, .SlTriggerPrice = 58000, .SlOrderPrice = 58000}; exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition2); Sleep(1000); auto orders = exchange.GetConditionOrders(); for (int i = 0 ; i < orders.size() ; i++) { exchange.CancelConditionOrder(orders[i].Id, "Canceled condition order:", orders[i]); Sleep(500); } }
返回值
| 类型 | 描述 |
bool |
|
参数
| 名称 | 类型 | 必填 | 描述 |
conditionOrderId | string | 是 |
|
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于向该条撤销条件单的日志中输出附带信息, |
参考
exchange.CreateConditionOrder exchange.GetConditionOrder exchange.GetConditionOrders exchange.ModifyConditionOrder
备注
exchange.CancelConditionOrder()函数的返回值仅代表撤销请求发送成功或失败。如需判断交易所是否已取消该条件单,可以调用exchange.GetConditionOrders()函数进行确认。
只有未触发的条件单可以被取消;已经触发并转为普通订单的条件单无法通过此函数取消。
exchange.GetConditionOrder
exchange.GetConditionOrder()函数用于获取指定条件单的信息。
exchange.GetConditionOrder(conditionOrderId)示例
javascript
function main(){
// 创建止盈条件单
var condition = {
ConditionType: ORDER_CONDITION_TYPE_TP,
TpTriggerPrice: 65000,
TpOrderPrice: 65000
}
var id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition)
Sleep(1000)
// 参数id为条件单号码,需填入你想要查询的条件单的号码
var order = exchange.GetConditionOrder(id)
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount,
"Status:", order.Status, "Type:", order.Type, "Condition:", order.Condition)
}
python
def main():
# 创建止盈条件单
condition = {
"ConditionType": ORDER_CONDITION_TYPE_TP,
"TpTriggerPrice": 65000,
"TpOrderPrice": 65000
}
id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition)
Sleep(1000)
order = exchange.GetConditionOrder(id)
Log("Id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"],
"Status:", order["Status"], "Type:", order["Type"], "Condition:", order["Condition"])
rust
fn main() {
// 创建止盈条件单
let condition = OrderCondition {
ConditionType: ORDER_CONDITION_TYPE_TP,
TpTriggerPrice: 65000.0,
TpOrderPrice: 65000.0,
..Default::default()
};
let id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition).unwrap();
Sleep(1000);
// 参数id为条件单号码,需填入你想要查询的条件单的号码
let order = exchange.GetConditionOrder(&id).unwrap();
Log!("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount,
"Status:", order.Status, "Type:", order.Type, "Condition:", order.Condition);
}
c++
void main() {
// 创建止盈条件单
OrderCondition condition = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 65000, .TpOrderPrice = 65000};
auto id = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition);
Sleep(1000);
auto order = exchange.GetConditionOrder(id);
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount,
"Status:", order.Status, "Type:", order.Type);
}返回值
| 类型 | 描述 |
| 根据条件单号查询条件单详情,查询成功时返回 返回的Order结构中包含 |
参数
| 名称 | 类型 | 必填 | 描述 |
conditionOrderId | string | 是 |
调用 |
参考
备注
部分交易所不支持exchange.GetConditionOrder()函数。
返回的条件单结构包含触发条件、触发价格、订单状态等信息。
条件单状态包括:未触发、已触发、已取消等,具体的状态值由交易所而定。
exchange.GetConditionOrders
exchange.GetConditionOrders()函数用于获取未完成的条件单(尚未触发或尚未取消的条件单)。
exchange.GetConditionOrders()
exchange.GetConditionOrders(symbol)示例
-
使用现货交易所对象创建多个条件单,然后查询未完成的条件单信息。
javascriptfunction main() { // 创建多个条件单 var condition1 = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 65000, TpOrderPrice: 65000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1) var condition2 = { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 3200, TpOrderPrice: 3200 } exchange.CreateConditionOrder("ETH_USDT", "sell", 0.1, condition2) Sleep(1000) // 查询所有未完成条件单 var orders = exchange.GetConditionOrders() Log("Pending condition orders count:", orders.length) for (var i = 0; i < orders.length; i++) { Log("Condition order", i+1, ":", orders[i]) } }pythondef main(): # 创建多个条件单 condition1 = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 65000, "TpOrderPrice": 65000 } exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1) condition2 = { "ConditionType": ORDER_CONDITION_TYPE_TP, "TpTriggerPrice": 3200, "TpOrderPrice": 3200 } exchange.CreateConditionOrder("ETH_USDT", "sell", 0.1, condition2) Sleep(1000) # 查询所有未完成条件单 orders = exchange.GetConditionOrders() Log("Pending condition orders count:", len(orders)) for i in range(len(orders)): Log("Condition order", i+1, ":", orders[i])rustfn main() { // 创建多个条件单 let condition1 = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 65000.0, TpOrderPrice: 65000.0, ..Default::default() }; let _ = exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, &condition1); let condition2 = OrderCondition { ConditionType: ORDER_CONDITION_TYPE_TP, TpTriggerPrice: 3200.0, TpOrderPrice: 3200.0, ..Default::default() }; let _ = exchange.CreateConditionOrder("ETH_USDT", "sell", 0.1, &condition2); Sleep(1000); // 查询所有未完成条件单 let orders = exchange.GetConditionOrders(None).unwrap(); Log!("Pending condition orders count:", orders.len()); for i in 0..orders.len() { Log!("Condition order", i + 1, ":", orders[i]); } }c++void main() { // 创建多个条件单 OrderCondition condition1 = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 65000, .TpOrderPrice = 65000}; exchange.CreateConditionOrder("BTC_USDT", "sell", 0.01, condition1); OrderCondition condition2 = {.ConditionType = ORDER_CONDITION_TYPE_TP, .TpTriggerPrice = 3200, .TpOrderPrice = 3200}; exchange.CreateConditionOrder("ETH_USDT", "sell", 0.1, condition2); Sleep(1000); // 查询所有未完成条件单 auto orders = exchange.GetConditionOrders(); Log("Pending condition orders count:", orders.size()); for (int i = 0; i < orders.size(); i++) { Log("Condition order", i+1, ":", orders[i]); } } -
查询指定交易对的未成交条件单。
javascriptfunction main() { // 查询 BTC_USDT 交易对的未成交条件单 var orders = exchange.GetConditionOrders("BTC_USDT") Log("BTC_USDT pending condition orders:", orders) }pythondef main(): # 查询 BTC_USDT 交易对的未成交条件单 orders = exchange.GetConditionOrders("BTC_USDT") Log("BTC_USDT pending condition orders:", orders)rustfn main() { // 查询 BTC_USDT 交易对的未成交条件单 let orders = exchange.GetConditionOrders("BTC_USDT"); Log!("BTC_USDT pending condition orders:", orders); }c++void main() { // 查询 BTC_USDT 交易对的未成交条件单 auto orders = exchange.GetConditionOrders("BTC_USDT"); Log("BTC_USDT pending condition orders:", orders); }
返回值
| 类型 | 描述 |
|
返回的Order结构中包含 |
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 | 参数 对于现货交易所对象,未传入 对于期货交易所对象,未传入 |
参考
备注
在GetConditionOrders函数中,symbol参数的使用场景归纳如下:
| 交易所对象分类 | symbol参数 | 查询范围 | 备注 |
|---|---|---|---|
| 现货 | 不传symbol参数 | 查询所有现货交易对 | 适用于所有调用场景;若交易所接口不支持则报错并返回空值,以下不再赘述 |
| 现货 | 指定交易品种,symbol参数为:"BTC_USDT" | 查询指定的BTC_USDT交易对 | 对于现货交易所对象,参数symbol的格式为:"BTC_USDT" |
| 期货 | 不传symbol参数 | 查询当前交易对、合约代码维度范围内的所有交易品种 | 假如当前交易对为BTC_USDT,合约代码为swap,即查询所有USDT本位永续合约。等价于调用GetConditionOrders("USDT.swap") |
| 期货 | 指定交易品种,symbol参数为:"BTC_USDT.swap" | 查询指定的BTC的USDT本位永续合约 | 对于期货交易所对象,参数symbol的格式为:FMZ平台定义的交易对与合约代码组合,两者以字符"."间隔。 |
| 期货 | 指定交易品种范围,symbol参数为:"USDT.swap" | 查询所有USDT本位永续合约 | - |
| 支持期权的期货交易所 | 不传symbol参数 | 查询当前交易对维度范围内的所有期权合约 | 假如当前交易对为BTC_USDT,且合约设置为期权合约,例如币安期权合约:BTC-240108-40000-C |
| 支持期权的期货交易所 | 指定具体交易品种 | 查询指定的期权合约 | 例如对于币安期货交易所,symbol参数为:BTC_USDT.BTC-240108-40000-C |
| 支持期权的期货交易所 | 指定交易品种范围,symbol参数为:"USDT.option" | 查询所有USDT本位期权合约 | - |
在GetConditionOrders函数中,期货交易所对象的查询维度范围归纳如下:
| symbol参数 | 请求范围定义 | 备注 |
|---|---|---|
| USDT.swap | USDT本位永续合约范围。 | 对于交易所API接口不支持的维度,调用时会报错并返回空值。 |
| USDT.futures | USDT本位交割合约范围。 | - |
| USD.swap | 币本位永续合约范围。 | - |
| USD.futures | 币本位交割合约范围。 | - |
| USDT.option | USDT本位期权合约范围。 | - |
| USD.option | 币本位期权合约范围。 | - |
| USDT.futures_combo | 差价组合合约范围。 | Futures_Deribit交易所 |
| USD.futures_ff | 混合保证金交割合约范围。 | Futures_Kraken交易所 |
| USD.swap_pf | 混合保证金永续合约范围。 | Futures_Kraken交易所 |
当交易所对象exchange所代表的账户在查询范围内或指定的交易品种上没有未完成条件单时,调用该函数将返回空数组,即:[]。
条件单功能的支持情况取决于具体交易所,部分交易所可能不支持条件单功能。
exchange.GetHistoryConditionOrders
exchange.GetHistoryConditionOrders()函数用于获取当前交易对、合约的历史条件单(包括已触发、已取消、已过期的条件单),并支持指定具体的交易品种。
exchange.GetHistoryConditionOrders()
exchange.GetHistoryConditionOrders(symbol)
exchange.GetHistoryConditionOrders(symbol, since)
exchange.GetHistoryConditionOrders(symbol, since, limit)
exchange.GetHistoryConditionOrders(since)
exchange.GetHistoryConditionOrders(since, limit)示例
-
查询历史条件单,返回的结果按时间升序排列。
javascriptfunction main() { var historyConditionOrders = exchange.GetHistoryConditionOrders() Log("Historical condition orders count:", historyConditionOrders.length) // 遍历并显示,订单按 Time 属性升序排列 for (var i = 0; i < historyConditionOrders.length; i++) { Log("Order", i+1, "Created at:", historyConditionOrders[i].Time, "ID:", historyConditionOrders[i].Id, "Status:", historyConditionOrders[i].Status) } }pythondef main(): historyConditionOrders = exchange.GetHistoryConditionOrders() Log("Historical condition orders count:", len(historyConditionOrders)) # 遍历并显示,订单按 Time 属性升序排列 for i in range(len(historyConditionOrders)): Log("Order", i+1, "Created at:", historyConditionOrders[i]["Time"], "ID:", historyConditionOrders[i]["Id"], "Status:", historyConditionOrders[i]["Status"])rustfn main() { let historyConditionOrders = exchange.GetHistoryConditionOrders(None, None, None).unwrap(); Log!("Historical condition orders count:", historyConditionOrders.len()); // 遍历并显示,订单按 Time 属性升序排列 for i in 0..historyConditionOrders.len() { Log!("Order", i + 1, "Created at:", historyConditionOrders[i].Time, "ID:", historyConditionOrders[i].Id, "Status:", historyConditionOrders[i].Status); } }c++void main() { auto historyConditionOrders = exchange.GetHistoryConditionOrders(); Log("Historical condition orders count:", historyConditionOrders.size()); // 遍历并显示,订单按 Time 属性升序排列 for (int i = 0; i < historyConditionOrders.size(); i++) { Log("Order", i+1, "Created at:", historyConditionOrders[i].Time, "ID:", historyConditionOrders[i].Id, "Status:", historyConditionOrders[i].Status); } } -
查询指定交易对的历史条件单,并限制返回的数量。
javascriptfunction main() { // 查询BTC_USDT交易对最近的10条历史条件单 var historyConditionOrders = exchange.GetHistoryConditionOrders("BTC_USDT", 0, 10) Log("BTC_USDT historical condition orders:", historyConditionOrders) }pythondef main(): # 查询BTC_USDT交易对最近的10条历史条件单 historyConditionOrders = exchange.GetHistoryConditionOrders("BTC_USDT", 0, 10) Log("BTC_USDT historical condition orders:", historyConditionOrders)rustfn main() { // 查询BTC_USDT交易对最近的10条历史条件单 let historyConditionOrders = exchange.GetHistoryConditionOrders("BTC_USDT", 0, 10); Log!("BTC_USDT historical condition orders:", historyConditionOrders); }c++void main() { // 查询BTC_USDT交易对最近的10条历史条件单 auto historyConditionOrders = exchange.GetHistoryConditionOrders("BTC_USDT", 0, 10); Log("BTC_USDT historical condition orders:", historyConditionOrders); } -
按时间范围查询历史条件单。
javascriptfunction main() { // 查询从指定时间戳开始的历史条件单 var startTime = new Date("2024-01-01").getTime() var historyConditionOrders = exchange.GetHistoryConditionOrders(startTime, 50) Log("Historical condition orders since:", historyConditionOrders) }pythondef main(): # 查询从指定时间戳开始的历史条件单 import time startTime = int(time.mktime(time.strptime("2024-01-01", "%Y-%m-%d")) * 1000) historyConditionOrders = exchange.GetHistoryConditionOrders(startTime, 50) Log("Historical condition orders since:", historyConditionOrders)rustfn main() { // 查询从指定时间戳开始的历史条件单 let startTime: i64 = 1704067200000; // 2024-01-01的时间戳 // Rust中symbol参数传None表示当前交易对 let historyConditionOrders = exchange.GetHistoryConditionOrders(None, startTime, 50); Log!("Historical condition orders since:", historyConditionOrders); }c++void main() { // 查询从指定时间戳开始的历史条件单 auto startTime = 1704067200000; // 2024-01-01的时间戳 // C++ 中 symbol 参数不可省略,传 "" 表示当前交易对 auto historyConditionOrders = exchange.GetHistoryConditionOrders("", startTime, 50); Log("Historical condition orders since:", historyConditionOrders); }
返回值
| 类型 | 描述 |
|
返回的Order结构中包含 |
参数
| 名称 | 类型 | 必填 | 描述 |
symbol | string | 否 |
如果查询的是期权合约的条件单数据,则将 |
since | number | 否 |
|
limit | number | 否 |
|
参考
备注
-
不指定
symbol、since、limit参数时,默认查询当前交易对、合约的历史条件单,即查询距离当前时间最近的一定范围内的历史条件单,查询范围取决于交易所接口的单次查询范围。 -
指定
symbol参数时,查询所设置交易品种的历史条件单。 -
指定
since参数时,以since时间戳为起始时间,向当前时间方向查询。 -
指定
limit参数时,在查询到足够条数后返回。 -
该函数仅支持提供历史条件单查询接口的交易所。
历史条件单包括:已触发(转为普通订单)、已取消、已过期等状态的条件单。
返回的历史条件单数组按订单创建时间(Time属性)升序排列,即时间最早的订单位于数组前面,时间最晚的订单位于数组后面。
对条件单功能的支持情况取决于具体的交易所,部分交易所可能不支持条件单功能或历史条件单查询功能。
exchange.SetPrecision
exchange.SetPrecision()函数用于设置exchange交易所对象的价格与下单量的精度,设置后系统会自动忽略数据中超出精度的多余部分。
exchange.SetPrecision(pricePrecision, amountPrecision)示例
javascript
function main(){
// 设置价格小数位精度为2位,下单量小数位精度为3位
exchange.SetPrecision(2, 3)
}
python
def main():
exchange.SetPrecision(2, 3)
rust
fn main() {
// 设置价格小数位精度为2位,下单量小数位精度为3位
exchange.SetPrecision(2, 3);
}
c++
void main() {
exchange.SetPrecision(2, 3);
}参数
| 名称 | 类型 | 必填 | 描述 |
pricePrecision | number | 是 |
|
amountPrecision | number | 是 |
|
参考
备注
回测系统不支持该函数,回测系统的数值精度由系统自动处理。
exchange.SetRate
设置交易所对象当前的汇率。
exchange.SetRate(rate)示例
javascript
function main(){
Log(exchange.GetTicker())
// 设置汇率转换
exchange.SetRate(7)
Log(exchange.GetTicker())
// 设置为 1,不转换
exchange.SetRate(1)
}
python
def main():
Log(exchange.GetTicker())
exchange.SetRate(7)
Log(exchange.GetTicker())
exchange.SetRate(1)
rust
fn main() {
Log!(exchange.GetTicker(None));
// 设置汇率转换
exchange.SetRate(7);
Log!(exchange.GetTicker(None));
// 设置为 1,不转换
exchange.SetRate(1);
}
c++
void main() {
Log(exchange.GetTicker());
exchange.SetRate(7);
Log(exchange.GetTicker());
exchange.SetRate(1);
}参数
| 名称 | 类型 | 必填 | 描述 |
rate | number | 是 |
|
参考
备注
如果使用 exchange.SetRate() 函数设置了汇率值(例如设置为 7),那么当前 exchange 交易所对象所代表交易所的行情、深度、下单价格等所有价格信息,都会被乘以所设置的汇率 7 进行转换。
例如,exchange 是以美元为计价货币的交易所。执行 exchange.SetRate(7) 之后,实盘中的所有价格都会被乘以 7,转换为接近 CNY 计价的价格。
exchange.IO
exchange.IO()函数用于调用交易所对象相关的其它接口。
exchange.IO(k, ...args)示例
-
使用
"api"模式调用 OKX 期货批量下单接口,并通过raw参数传递 JSON 格式的订单数据:javascriptfunction main() { var arrOrders = [ {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}, {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"} ] // 调用 exchange.IO 直接访问交易所批量下单接口 var ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", JSON.stringify(arrOrders)) Log(ret) }pythonimport json def main(): arrOrders = [ {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}, {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"} ] ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", json.dumps(arrOrders)) Log(ret)rustfn main() { // Rust无JSON序列化,直接用原始字符串构造订单数组 let arrOrders = r#"[ {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}, {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"} ]"#; // 调用 exchange.IO 直接访问交易所批量下单接口,多参数以元组传入 let ret = exchange.IO(("api", "POST", "/api/v5/trade/batch-orders", "", arrOrders)); Log!(ret); }c++void main() { json arrOrders = R"([ {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}, {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"} ])"_json; auto ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", arrOrders.dump()); Log(ret); } -
params参数中的键值为字符串类型时,需要使用单引号将参数值包裹起来:javascriptvar amount = 1 var price = 10 var basecurrency = "ltc" function main () { // 注意 amount.toString() 和 price.toString() 左边右边都有一个 ' 字符 var message = "symbol=" + basecurrency + "&amount='" + amount.toString() + "'&price='" + price.toString() + "'&side=buy" + "&type=limit" var id = exchange.IO("api", "POST", "/v1/order/new", message) }pythonamount = 1 price = 10 basecurrency = "ltc" def main(): message = "symbol=" + basecurrency + "&amount='" + str(amount) + "'&price='" + str(price) + "'&side=buy" + "&type=limit" id = exchange.IO("api", "POST", "/v1/order/new", message)rustfn main() { let amount = 1; let price = 10; let basecurrency = "ltc"; // 注意 amount 和 price 参数值的左边右边都有一个 ' 字符 let message = format!("symbol={}&amount='{}'&price='{}'&side=buy&type=limit", basecurrency, amount, price); let id = exchange.IO(("api", "POST", "/v1/order/new", message)); }c++void main() { auto amount = 1.0; auto price = 10.0; auto basecurrency = "ltc"; string message = str_format("symbol=%s&amount=\"%.1f\"&price=\"%.1f\"&side=buy&type=limit", basecurrency, amount, price); auto id = exchange.IO("api", "POST", "/v1/order/new", message); } -
resource参数支持传入完整的URL:javascriptfunction main() { var ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC") Log(ret) }pythondef main(): ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC") Log(ret)rustfn main() { let ret = exchange.IO(("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")); Log!(ret); }c++void main() { auto ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC"); Log(ret); } -
不使用
raw参数的GET请求:javascriptfunction main(){ var ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT") Log(ret) }pythondef main(): ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT") Log(ret)rustfn main() { let ret = exchange.IO(("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")); Log!(ret); }c++void main() { auto ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT"); Log(ret); } -
运行时切换交易对:
javascriptfunction main() { // 例如,实盘启动时交易所对象当前的交易对为BTC_USDT,打印当前交易对的行情 Log(exchange.GetTicker()) // 将交易对切换为LTC_BTC exchange.IO("currency", "LTC_BTC") Log(exchange.GetTicker()) }pythondef main(): Log(exchange.GetTicker()) exchange.IO("currency", "LTC_BTC") Log(exchange.GetTicker())rustfn main() { // 例如,实盘启动时交易所对象当前的交易对为BTC_USDT,打印当前交易对的行情 Log!(exchange.GetTicker(None)); // 将交易对切换为LTC_BTC let _ = exchange.IO(("currency", "LTC_BTC")); Log!(exchange.GetTicker(None)); }c++void main() { Log(exchange.GetTicker()); exchange.IO("currency", "LTC_BTC"); Log(exchange.GetTicker()); } -
切换交易所接口基地址:
javascriptfunction main () { // exchanges[0]即实盘创建时添加的第一个交易所对象 exchanges[0].IO("base", "https://api.huobi.pro") }pythondef main(): exchanges[0].IO("base", "https://api.huobi.pro")rustfn main() { // exchanges[0]即实盘创建时添加的第一个交易所对象 let _ = exchanges[0].IO(("base", "https://api.huobi.pro")); }c++void main() { exchanges[0].IO("base", "https://api.huobi.pro"); } -
通过
"mbase"切换行情接口基地址(以Bitfinex为例):javascriptfunction main() { exchange.SetBase("https://api.bitfinex.com") exchange.IO("mbase", "https://api-pub.bitfinex.com") }pythondef main(): exchange.SetBase("https://api.bitfinex.com") exchange.IO("mbase", "https://api-pub.bitfinex.com")rustfn main() { exchange.SetBase("https://api.bitfinex.com"); let _ = exchange.IO(("mbase", "https://api-pub.bitfinex.com")); }c++void main() { exchange.SetBase("https://api.bitfinex.com"); exchange.IO("mbase", "https://api-pub.bitfinex.com"); } -
切换模拟盘/实盘环境(以OKX期货为例):
javascriptfunction main() { exchange.IO("simulate", true) // Switch to demo trading environment // ... trading logic ... exchange.IO("simulate", false) // Switch back to live trading environment }pythondef main(): exchange.IO("simulate", True) # ... trading logic ... exchange.IO("simulate", False)rustfn main() { let _ = exchange.IO(("simulate", true)); // Switch to demo trading environment // ... trading logic ... let _ = exchange.IO(("simulate", false)); // Switch back to live trading environment }c++void main() { exchange.IO("simulate", true); // ... trading logic ... exchange.IO("simulate", false); } -
切换合约保证金模式与持仓模式(以币安期货为例):
javascriptfunction main() { exchange.IO("dual", true) // Switch to hedge mode (dual position) exchange.IO("dual", false) // Switch to one-way mode exchange.SetContractType("swap") exchange.IO("cross", true) // Switch to cross margin exchange.IO("cross", false) // Switch to isolated margin }pythondef main(): exchange.IO("dual", True) exchange.IO("dual", False) exchange.SetContractType("swap") exchange.IO("cross", True) exchange.IO("cross", False)rustfn main() { let _ = exchange.IO(("dual", true)); // Switch to hedge mode (dual position) let _ = exchange.IO(("dual", false)); // Switch to one-way mode let _ = exchange.SetContractType("swap"); let _ = exchange.IO(("cross", true)); // Switch to cross margin let _ = exchange.IO(("cross", false)); // Switch to isolated margin }c++void main() { exchange.IO("dual", true); exchange.IO("dual", false); exchange.SetContractType("swap"); exchange.IO("cross", true); exchange.IO("cross", false); } -
切换统一账户模式(以币安期货为例):
javascriptfunction main() { exchange.IO("unified", true) // Switch to unified account mode exchange.IO("unified", false) // Switch to normal mode }pythondef main(): exchange.IO("unified", True) exchange.IO("unified", False)rustfn main() { let _ = exchange.IO(("unified", true)); // Switch to unified account mode let _ = exchange.IO(("unified", false)); // Switch to normal mode }c++void main() { exchange.IO("unified", true); exchange.IO("unified", false); } -
设置自成交预防模式(以币安为例):
javascriptfunction main() { // "NONE" means disable STP mode, other parameters: "EXPIRE_TAKER", "EXPIRE_MAKER", "EXPIRE_BOTH" exchange.IO("selfTradePreventionMode", "NONE") }pythondef main(): exchange.IO("selfTradePreventionMode", "NONE")rustfn main() { // "NONE" means disable STP mode, other parameters: "EXPIRE_TAKER", "EXPIRE_MAKER", "EXPIRE_BOTH" let _ = exchange.IO(("selfTradePreventionMode", "NONE")); }c++void main() { exchange.IO("selfTradePreventionMode", "NONE"); } -
Futures_edgeX计算订单Hash并签名:
javascriptfunction main() { var strJson = `{ "assetIdSynthetic": "0x4554482d3900000000000000000000", "assetIdCollateral": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "assetIdFee": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "isBuyingSynthetic": true, "amountSynthetic": 10000000, "amountCollateral": 13020000, "amountFee": 6250, "nonce": 676432751, "accountID": 601416704693633632, "expirationTimestamp": 484831 }` var signature = exchange.IO("calcOrderHashAndSign", strJson) Log(signature) }pythonimport json def main(): params = { "assetIdSynthetic": "0x4554482d3900000000000000000000", "assetIdCollateral": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "assetIdFee": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "isBuyingSynthetic": True, "amountSynthetic": 10000000, "amountCollateral": 13020000, "amountFee": 6250, "nonce": 676432751, "accountID": 601416704693633632, "expirationTimestamp": 484831 } signature = exchange.IO("calcOrderHashAndSign", json.dumps(params)) Log(signature)rustfn main() { let strJson = r#"{ "assetIdSynthetic": "0x4554482d3900000000000000000000", "assetIdCollateral": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "assetIdFee": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "isBuyingSynthetic": true, "amountSynthetic": 10000000, "amountCollateral": 13020000, "amountFee": 6250, "nonce": 676432751, "accountID": 601416704693633632, "expirationTimestamp": 484831 }"#; let signature = exchange.IO(("calcOrderHashAndSign", strJson)); Log!(signature); }c++void main() { json params = R"({ "assetIdSynthetic": "0x4554482d3900000000000000000000", "assetIdCollateral": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "assetIdFee": "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5", "isBuyingSynthetic": true, "amountSynthetic": 10000000, "amountCollateral": 13020000, "amountFee": 6250, "nonce": 676432751, "accountID": 601416704693633632, "expirationTimestamp": 484831 })"_json; auto signature = exchange.IO("calcOrderHashAndSign", params.dump()); Log(signature); } -
rate模式限流 - 限制GetTicker每秒最多调用10次,超出限制时返回null:
javascriptfunction main() { exchange.IO("rate", "GetTicker", 10, "1s") for (var i = 0; i < 20; i++) { var ticker = exchange.GetTicker("BTC_USDT") if (ticker) { Log("Ticker:", ticker.Last) } else { Log("Rate limit exceeded") } } }pythondef main(): exchange.IO("rate", "GetTicker", 10, "1s") for i in range(20): ticker = exchange.GetTicker("BTC_USDT") if ticker: Log("Ticker:", ticker["Last"]) else: Log("Rate limit exceeded")rustfn main() { let _ = exchange.IO(("rate", "GetTicker", 10, "1s")); for _i in 0..20 { // 超出限制时GetTicker返回Err match exchange.GetTicker("BTC_USDT") { Ok(ticker) => Log!("Ticker:", ticker.Last), Err(_) => Log!("Rate limit exceeded"), } } }c++// C++暂不支持 -
rate模式限流 - 使用
"delay"参数,超出限制时自动等待而非返回null:javascriptfunction main() { exchange.IO("rate", "GetTicker", 10, "1s", "delay") for (var i = 0; i < 20; i++) { var ticker = exchange.GetTicker("BTC_USDT") Log("Call", i+1, "Ticker:", ticker.Last) } }pythondef main(): exchange.IO("rate", "GetTicker", 10, "1s", "delay") for i in range(20): ticker = exchange.GetTicker("BTC_USDT") Log("Call", i+1, "Ticker:", ticker["Last"])rustfn main() { let _ = exchange.IO(("rate", "GetTicker", 10, "1s", "delay")); for i in 0..20 { let ticker = exchange.GetTicker("BTC_USDT").unwrap(); Log!("Call", i + 1, "Ticker:", ticker.Last); } }c++// C++暂不支持 -
多个函数共享限流额度:
javascriptfunction main() { // GetTicker 和 GetDepth 共享限流额度,合计每秒最多调用 10 次 exchange.IO("rate", "GetTicker,GetDepth", 10, "1s") for (var i = 0; i < 20; i++) { if (i % 2 == 0) { Log("Ticker:", exchange.GetTicker("BTC_USDT")) } else { Log("Depth:", exchange.GetDepth("BTC_USDT")) } } }pythondef main(): exchange.IO("rate", "GetTicker,GetDepth", 10, "1s") for i in range(20): if i % 2 == 0: Log("Ticker:", exchange.GetTicker("BTC_USDT")) else: Log("Depth:", exchange.GetDepth("BTC_USDT"))rustfn main() { // GetTicker 和 GetDepth 共享限流额度,合计每秒最多调用 10 次 let _ = exchange.IO(("rate", "GetTicker,GetDepth", 10, "1s")); for i in 0..20 { if i % 2 == 0 { Log!("Ticker:", exchange.GetTicker("BTC_USDT")); } else { Log!("Depth:", exchange.GetDepth("BTC_USDT")); } } }c++// C++暂不支持 -
使用通配符统一限制所有 API 的调用频率:
javascriptfunction main() { exchange.IO("rate", "*", 100, "1m") for (var i = 0; i < 10; i++) { exchange.GetTicker("BTC_USDT") exchange.GetDepth("BTC_USDT") exchange.GetAccount() Log("Round", i+1, "completed") Sleep(1000) } }pythondef main(): exchange.IO("rate", "*", 100, "1m") for i in range(10): exchange.GetTicker("BTC_USDT") exchange.GetDepth("BTC_USDT") exchange.GetAccount() Log("Round", i+1, "completed") Sleep(1000)rustfn main() { let _ = exchange.IO(("rate", "*", 100, "1m")); for i in 0..10 { let _ = exchange.GetTicker("BTC_USDT"); let _ = exchange.GetDepth("BTC_USDT"); let _ = exchange.GetAccount(); Log!("Round", i + 1, "completed"); Sleep(1000); } }c++// C++暂不支持 -
quota 模式 - 严格按时间窗口对齐限流:
javascriptfunction main() { exchange.IO("quota", "GetTicker", 3, "1s") for (var i = 0; i < 10; i++) { var ticker = exchange.GetTicker("BTC_USDT") if (ticker) { Log(_D(), "Ticker:", ticker.Last) } else { Log(_D(), "Quota exceeded, waiting for next window") } Sleep(100) } }pythondef main(): exchange.IO("quota", "GetTicker", 3, "1s") for i in range(10): ticker = exchange.GetTicker("BTC_USDT") if ticker: Log(_D(), "Ticker:", ticker["Last"]) else: Log(_D(), "Quota exceeded, waiting for next window") Sleep(100)rustfn main() { let _ = exchange.IO(("quota", "GetTicker", 3, "1s")); for _i in 0..10 { match exchange.GetTicker("BTC_USDT") { Ok(ticker) => Log!(_D(None), "Ticker:", ticker.Last), Err(_) => Log!(_D(None), "Quota exceeded, waiting for next window"), } Sleep(100); } }c++// C++暂不支持 -
quota 模式 - 日内配额,每天于指定时间重置:
javascriptfunction main() { exchange.IO("quota", "GetTicker", 1000, "@0815") var count = 0 while (true) { var ticker = exchange.GetTicker("BTC_USDT") if (ticker) { count++ Log("Call count:", count, "Ticker:", ticker.Last) } else { Log("Daily quota exceeded, waiting for reset at 08:15") Sleep(60000) // Wait 1 minute } Sleep(1000) } }pythondef main(): exchange.IO("quota", "GetTicker", 1000, "@0815") count = 0 while True: ticker = exchange.GetTicker("BTC_USDT") if ticker: count += 1 Log("Call count:", count, "Ticker:", ticker["Last"]) else: Log("Daily quota exceeded, waiting for reset at 08:15") Sleep(60000) # Wait 1 minute Sleep(1000)rustfn main() { let _ = exchange.IO(("quota", "GetTicker", 1000, "@0815")); let mut count = 0; loop { match exchange.GetTicker("BTC_USDT") { Ok(ticker) => { count += 1; Log!("Call count:", count, "Ticker:", ticker.Last); } Err(_) => { Log!("Daily quota exceeded, waiting for reset at 08:15"); Sleep(60000); // Wait 1 minute } } Sleep(1000); } }c++// C++暂不支持 -
组合使用多个限流规则:
javascriptfunction main() { exchange.IO("rate", "GetTicker", 10, "1s") // GetTicker 每秒 10 次 exchange.IO("rate", "GetDepth", 5, "1s") // GetDepth 每秒 5 次 exchange.IO("rate", "CreateOrder", 2, "1s") // CreateOrder 每秒 2 次 exchange.IO("quota", "*", 1000, "@0000") // 所有 API 每天 00:00 重置,上限 1000 次 Log("Rate limits configured successfully") for (var i = 0; i < 5; i++) { exchange.GetTicker("BTC_USDT") exchange.GetDepth("BTC_USDT") Sleep(200) } }pythondef main(): exchange.IO("rate", "GetTicker", 10, "1s") # GetTicker 每秒 10 次 exchange.IO("rate", "GetDepth", 5, "1s") # GetDepth 每秒 5 次 exchange.IO("rate", "CreateOrder", 2, "1s") # CreateOrder 每秒 2 次 exchange.IO("quota", "*", 1000, "@0000") # 所有 API 每天 00:00 重置,上限 1000 次 Log("Rate limits configured successfully") for i in range(5): exchange.GetTicker("BTC_USDT") exchange.GetDepth("BTC_USDT") Sleep(200)rustfn main() { let _ = exchange.IO(("rate", "GetTicker", 10, "1s")); // GetTicker 每秒 10 次 let _ = exchange.IO(("rate", "GetDepth", 5, "1s")); // GetDepth 每秒 5 次 let _ = exchange.IO(("rate", "CreateOrder", 2, "1s")); // CreateOrder 每秒 2 次 let _ = exchange.IO(("quota", "*", 1000, "@0000")); // 所有 API 每天 00:00 重置,上限 1000 次 Log!("Rate limits configured successfully"); for _i in 0..5 { let _ = exchange.GetTicker("BTC_USDT"); let _ = exchange.GetDepth("BTC_USDT"); Sleep(200); } }c++// C++ 暂不支持
返回值
| 类型 | 描述 |
string / number / bool / object / array / any |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 调用类型标识符,不同的取值对应不同的功能,具体请参见下方各章节的说明。 |
arg | string / number / bool / object / array / any | 是 | 扩展参数,根据 |
参考
备注
一、直接调用交易所API("api"模式)
javascript
exchange.IO("api", httpMethod, resource, params, raw)
用于调用交易所未封装的原生API接口。FMZ会自动处理签名验证,您只需填写请求参数即可。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| httpMethod | string | 是 | GET、POST等 |
| resource | string | 是 | 请求路径或完整URL |
| params | string | 否 | URL编码格式的请求参数 |
| raw | string | 否 | 原始请求体(JSON等) |
调用失败时返回空值,且该模式仅支持实盘。
二、运行时切换交易对("currency"模式)
javascript
exchange.IO("currency", "ETH_USDT")
用于在运行时动态切换交易对,交易对格式为大写字母加下划线分隔。此指令等同于exchange.SetCurrency。
回测模式下仅支持现货,且只能切换至相同计价币种的交易对。期货切换交易对后,需再次调用
exchange.SetContractType()。
三、切换基地址("base" / "mbase"模式)
"base":切换交易接口的基地址,等同于exchange.SetBase()。"mbase":切换行情接口的基地址,适用于行情与交易采用不同域名的交易所。
四、通用交易模式指令
以下指令在多个交易所中通用,各交易所的具体支持情况请参见第五节的说明。
| 指令 | 参数 | 功能 |
|---|---|---|
simulate | bool | 模拟盘(true)/实盘(false) |
cross | bool | 全仓(true)/逐仓(false) |
dual | bool | 双向持仓(true)/单向持仓(false) |
unified | bool | 统一账户(true)/普通账户(false) |
trade_margin | 无 | 切换至逐仓杠杆模式 |
trade_super_margin | 无 | 切换至全仓杠杆模式 |
trade_normal | 无 | 切换回普通现货模式 |
selfTradePreventionMode | string | 自成交预防(STP)模式 |
五、各交易所IO指令
所有交易所均支持"api"和"currency"指令,下方仅列出各交易所的特有指令。
现货交易所
Binance(币安)
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至逐仓杠杆模式 |
trade_super_margin | 无 | 切换至全仓杠杆模式 |
trade_normal | 无 | 切换回普通现货模式 |
unified | bool | 统一账户模式 |
selfTradePreventionMode | string | 自成交防护,可选:EXPIRE_TAKER/EXPIRE_MAKER/EXPIRE_BOTH/NONE |
OKX(欧易)
| 指令 | 参数 | 说明 |
|---|---|---|
simulate | bool | 模拟盘/实盘切换 |
trade_margin | 无 | 逐仓杠杆(tdMode=isolated) |
trade_super_margin | 无 | 全仓杠杆(tdMode=cross) |
trade_normal | 无 | 切换回普通现货模式 |
tdMode | string | 直接设置交易模式,组合保证金模式下须使用全仓 |
Huobi(火币)
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至逐仓杠杆模式 |
trade_super_margin | 无 | 切换至全仓杠杆模式 |
trade_normal | 无 | 切换回普通现货模式 |
Bybit
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至杠杆模式 |
trade_normal | 无 | 切换回普通现货模式 |
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至逐仓杠杆模式 |
trade_super_margin | 无 | 切换至全仓杠杆模式 |
trade_normal | 无 | 切换回普通现货模式 |
unified | bool | 统一账户模式 |
Bitget
| 指令 | 参数 | 说明 |
|---|---|---|
simulate | bool | 模拟盘/实盘切换 |
CoinEx
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至杠杆模式 |
trade_normal | 无 | 切换回普通模式 |
WOO
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至杠杆模式 |
trade_normal | 无 | 切换回普通模式 |
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至杠杆模式 |
trade_normal | 无 | 切换回普通模式 |
AscendEx
| 指令 | 参数 | 说明 |
|---|---|---|
trade_margin | 无 | 切换至杠杆模式 |
trade_normal | 无 | 切换回普通模式 |
Gemini
| 指令 | 参数 | 说明 |
|---|---|---|
subAccount | string | 设置子账户名称 |
Poloniex
| 指令 | 参数 | 说明 |
|---|---|---|
accountId | string | 设置账户ID |
Bitfinex
| 指令 | 参数 | 说明 |
|---|---|---|
version | 无 | 获取当前API版本号 |
Backpack
| 指令 | 参数 | 说明 |
|---|---|---|
selfTradePreventionMode | string | 自成交防护,可选:Allow/RejectTaker/RejectMaker/RejectBoth/Ban |
Hyperliquid(现货)
| 指令 | 参数 | 说明 |
|---|---|---|
source | "a"/"b" | 切换API数据源 |
vaultAddress | string | 设置金库地址,传入空字符串则禁用 |
walletAddress | string | 设置钱包地址 |
expiresAfter | number | 订单过期时间(毫秒),设为0则禁用 |
合约交易所
Futures_Binance(币安合约)
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
unified | bool | 统一账户(切换后使用papi.binance.com) |
selfTradePreventionMode | string | 自成交防护,可选:EXPIRE_TAKER/EXPIRE_MAKER/EXPIRE_BOTH/NONE |
extend_key | string | 设置API响应扩展字段(以逗号分隔) |
Futures_OKX(欧易合约)
| 指令 | 参数 | 说明 |
|---|---|---|
simulate | bool | 模拟盘/实盘切换 |
cross | bool | 全仓/逐仓,默认全仓 |
dual | bool | 双向(long_short_mode)/单向(net_mode)持仓 |
Futures_HuobiDM(火币合约)
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓,默认逐仓。仅XXX_USDT永续合约(swap)支持 |
dual | bool | 双向(dual_side)/单向(single_side)持仓 |
unified | bool | 统一账户模式 |
signHost | string | 设置API签名Host地址,传入空字符串则禁用 |
Futures_Bybit
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
Futures_KuCoin
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_GateIO
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
unified | bool | 统一账户模式 |
Futures_Bitget
| 指令 | 参数 | 说明 |
|---|---|---|
simulate | bool | 模拟盘/实盘切换 |
cross | bool | 全仓(crossed)/逐仓(isolated) |
dual | bool | 双向(hedge_mode)/单向(one_way_mode)持仓 |
Futures_MEXC
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_BitMEX
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_CoinEx
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_WOO
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
Futures_Kraken
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓(仅multi-collateral账户支持) |
Futures_Aevo
| 指令 | 参数 | 说明 |
|---|---|---|
signingKey | string | 设置签名密钥,返回公钥。需从交易所API Key页面获取,请注意其存在时效性 |
Futures_Hyperliquid
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
source | "a"/"b" | 切换API数据源 |
vaultAddress | string | 设置金库地址,传入空字符串则禁用 |
walletAddress | string | 设置钱包地址 |
expiresAfter | number | 订单过期时间(毫秒),设为0则禁用 |
Futures_Deepcoin
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
merge | bool | 合并持仓(true)/拆分持仓(false) |
Futures_DigiFinex
| 指令 | 参数 | 说明 |
|---|---|---|
simulate | bool | 模拟盘/实盘切换 |
cross | bool | 全仓/逐仓 |
Futures_ApolloX
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_Aster
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
Futures_CoinW
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_BitMart
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
Futures_Backpack
| 指令 | 参数 | 说明 |
|---|---|---|
selfTradePreventionMode | string | 自成交防护,可选:Allow/RejectTaker/RejectMaker/RejectBoth/Ban |
Futures_Lighter
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
expiry | number | 订单过期时间戳(毫秒),默认29天,最小4分钟 |
Futures_Crypto.com
| 指令 | 参数 | 说明 |
|---|---|---|
accountId | string | 设置交易账户ID |
Futures_Bitfinex
| 指令 | 参数 | 说明 |
|---|---|---|
mbase | string | 设置行情API基础地址 |
Futures_edgeX
| 指令 | 参数 | 说明 |
|---|---|---|
calcOrderHashAndSign | string(JSON) | 计算订单哈希并签名,返回签名字符串 |
Futures_Bibox
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓,默认全仓 |
Futures_Pionex
| 指令 | 参数 | 说明 |
|---|---|---|
cross | bool | 全仓/逐仓 |
dual | bool | 双向/单向持仓 |
Futures_Phemex
| 指令 | 参数 | 说明 |
|---|---|---|
dual | bool | 双向/单向持仓。全仓/逐仓需在交易所网页端设置 |
Futures_WooFi
仅支持通用指令
"api"和"currency",无特有指令。
六、特殊平台IO指令
Polymarket(预测市场)
| 指令 | 参数 | 说明 |
|---|---|---|
nonce | [number] | 获取或设置订单的 nonce 值。不传参数时返回当前 nonce,传入数值时设置新的 nonce |
proxyWalletAddress | 无 | 获取代理钱包地址 |
redeem | symbol, [wait] | 赎回已结算头寸(通过 Relayer 免 Gas)。wait 默认为 true,等待交易确认;wait 为 false 时立即返回{"transactionID": "..."} |
merge | symbol, [amount], [wait] | 将 YES+NO 代币合并赎回为 USDC(通过 Relayer 免 Gas)。amount 为 0 或不传时,自动取两个 outcome 中较小的持仓量。wait 默认为 true,等待交易确认 |
l2_credentials | 无 | 获取 L2 认证信息,返回{"apiKey":"","secret":"","passphrase":""},用于 WebSocket 连接等场景 |
batchOrders | array | 批量下单,参数为订单对象数组,每个对象包含symbol、side、price、amount字段,以及可选的option字段 |
Web3(区块链)
| 指令 | 参数 | 说明 |
|---|---|---|
abi | 合约地址, ABI字符串 | 注册合约 ABI |
address | [私钥] | 获取钱包地址 |
encode / pack | 类型, 数据... | ABI 编码数据 |
encodePacked | 类型, 数据... | ABI 紧密编码数据 |
hash | 参数1-4 | 计算哈希值 |
decode / unpack | 类型, 数据... | ABI 解码数据 |
key | string | 切换操作所使用的私钥 |
IB(盈透证券)
| 指令 | 参数 | 说明 |
|---|---|---|
status | 无 | 获取连接状态 |
time | 无 | 获取 IB 服务器时间 |
reqId | 无 | 强制获取新的请求 ID |
orderId | 无 | 获取下一个可用的订单 ID |
ignore | string(数组) | 忽略指定的错误码 |
scan | string(JSON) | 执行市场扫描器 |
wait | [number] | 等待行情事件,可设置超时秒数 |
debug | bool | 调试模式 |
marketDataType | number | 行情数据类型(1 实时 / 2 冻结 / 3 延迟 / 4 延迟冻结) |
Futu(富途证券)
| 指令 | 参数 | 说明 |
|---|---|---|
refresh | bool | 缓存刷新,禁用缓存后频率限制为每 30 秒最多 10 次 |
accounts | 无 | 获取所有账户列表 |
status | 无 | 获取连接状态 |
lock | 无 | 锁定交易 |
unlock | 无 | 解锁交易 |
wait | 无 | 等待行情事件 |
七、API限流控制("rate" / "quota"模式)
javascript
exchange.IO("rate", functionNames, maxCalls, period, [behavior])
exchange.IO("quota", functionNames, maxCalls, period, [behavior])
- rate:平滑限流,不严格对齐时间窗口。
- quota:额度限流,严格对齐时间窗口。
| 参数 | 类型 | 说明 |
|---|---|---|
| functionNames | string | 函数名,多个之间以逗号分隔,*表示全部 |
| maxCalls | number | 单个时间周期内的最大调用次数 |
| period | string | 时间周期("1s"/"1m"/"1h")或重置时间点("@0815") |
| behavior | string | 可选,"delay"表示超限时等待,默认返回 null |
Buy/Sell的限流遵循CreateOrder的设置;Go遵循实际并发函数的设置;IO/api仅对exchange.IO("api", ...)生效。
exchange.Log
exchange.Log()函数用于在日志栏区域输出下单、撤单日志。该函数被调用时不会实际下单,仅用于输出并记录交易日志。
exchange.Log(orderType, price, amount)
exchange.Log(orderType, price, amount, ...args)示例
使用exchange.Log(orderType, price, amount)可以进行实盘跟单测试、模拟下单,也可以辅助记录下单信息。
最常见的使用场景为:通过exchange.IO函数访问交易所的创建条件订单接口,但调用exchange.IO()函数并不会在实盘日志中输出交易日志信息。
此时即可使用exchange.Log()函数补充输出日志,以便记录下单信息,撤单操作亦是如此。
javascript
var id = 123
function main() {
// 下单类型买入,价格999,数量 0.1
exchange.Log(LOG_TYPE_BUY, 999, 0.1)
// 取消订单
exchange.Log(LOG_TYPE_CANCEL, id)
}
python
id = 123
def main():
exchange.Log(LOG_TYPE_BUY, 999, 0.1)
exchange.Log(LOG_TYPE_CANCEL, id)
rust
fn main() {
let id = 123;
// 下单类型买入,价格999,数量 0.1
exchange.Log(LOG_TYPE_BUY, 999, 0.1);
// 取消订单,orderType为LOG_TYPE_CANCEL时price参数为撤单的订单Id(Rust中amount参数必传,可传0)
exchange.Log(LOG_TYPE_CANCEL, id, 0);
}
c++
void main() {
auto id = 123;
exchange.Log(LOG_TYPE_BUY, 999, 0.1);
exchange.Log(LOG_TYPE_CANCEL, id);
}参数
| 名称 | 类型 | 必填 | 描述 |
orderType | number | 是 |
|
price | number | 是 |
|
amount | number | 是 |
|
arg | string / number / bool / object / array / any (平台支持的任意类型) | 否 | 扩展参数,用于向该条日志中输出附带信息, |
参考
备注
当orderType参数为LOG_TYPE_CANCEL时,price参数表示撤单的订单Id,用于在直接调用exchange.IO()函数撤单时打印撤单日志。
exchange.Encode
exchange.Encode()函数用于执行签名与加密计算。
exchange.Encode(algo, inputFormat, outputFormat, data)
exchange.Encode(algo, inputFormat, outputFormat, data, keyFormat, key)示例
BitMEX仓位变化推送(wss协议)示例:
javascript
function main() {
var APIKEY = "your Access Key(Bitmex API ID)"
var expires = parseInt(Date.now() / 1000) + 10
var signature = exchange.Encode("sha256", "string", "hex", "GET/realtime" + expires, "hex", "{{secretkey}}")
var client = Dial("wss://www.bitmex.com/realtime", 60)
var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
var pos = 0
client.write(auth)
client.write('{"op": "subscribe", "args": "position"}')
while (true) {
var bitmexData = JSON.parse(client.read())
if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
pos = parseInt(bitmexData.data[0].currentQty)
}
}
}
python
import time
def main():
APIKEY = "your Access Key(Bitmex API ID)"
expires = int(time.time() + 10)
signature = exchange.Encode("sha256", "string", "hex", "GET/realtime" + expires, "hex", "{{secretkey}}")
client = Dial("wss://www.bitmex.com/realtime", 60)
auth = json.dumps({"args": [APIKEY, expires, signature], "op": "authKeyExpires"})
pos = 0
client.write(auth)
client.write('{"op": "subscribe", "args": "position"}')
while True:
bitmexData = json.loads(client.read())
if "table" in bitmexData and bitmexData["table"] == "position" and len(bitmexData["data"]) != 0 and pos != bitmexData["data"][0]["currentQty"]:
Log("position change", pos, bitmexData["data"][0]["currentQty"], "@")
pos = bitmexData["data"][0]["currentQty"]
c++
void main() {
auto APIKEY = "your Access Key(Bitmex API ID)";
auto expires = Unix() + 10;
auto signature = exchange.Encode("sha256", "string", "hex", str_format("GET/realtime%d", expires), "hex", "{{secretkey}}");
auto client = Dial("wss://www.bitmex.com/realtime", 60);
json auth = R"({"args": [], "op": "authKeyExpires"})"_json;
auth["args"].push_back(APIKEY);
auth["args"].push_back(expires);
auth["args"].push_back(signature);
auto pos = 0;
client.write(auth.dump());
client.write("{\"op\": \"subscribe\", \"args\": \"position\"}");
while(true) {
auto bitmexData = json::parse(client.read());
if(bitmexData["table"] == "position" && bitmexData["data"][0].find("currentQty") != bitmexData["data"][0].end() && pos != bitmexData["data"][0]["currentQty"]) {
Log("Test");
Log("position change", pos, bitmexData["data"][0]["currentQty"], "@");
pos = bitmexData["data"][0]["currentQty"];
}
}
}返回值
| 类型 | 描述 |
string |
|
参数
| 名称 | 类型 | 必填 | 描述 |
algo | string | 是 | 参数 参数 |
inputFormat | string | 是 | 用于指定 |
outputFormat | string | 是 | 用于指定输出的数据格式。 |
data | string | 是 | 参数 |
keyFormat | string | 否 | 用于指定 |
key | string | 否 |
|
参考
备注
仅实盘支持调用exchange.Encode()函数。"{{accesskey}}"、"{{secretkey}}"的引用方式仅在调用exchange.Encode()函数时有效。
exchange.Go
多线程异步支持函数,可将所有受支持函数的操作转换为异步并发执行。
exchange.Go(method)
exchange.Go(method, ...args)示例
-
exchange.Go()函数的使用范例。判断undefined时需使用typeof(xx) === "undefined",因为null == undefined在 JavaScript 中是成立的。javascriptfunction main(){ // 以下四种操作为并发多线程异步执行,不会耗时,会立即返回 var a = exchange.Go("GetTicker") var b = exchange.Go("GetDepth") var c = exchange.Go("Buy", 1000, 0.1) var d = exchange.Go("GetRecords", PERIOD_H1) // 调用 wait 方法等待异步获取 ticker 的结果 var ticker = a.wait() // 返回深度数据,如果获取失败也有可能返回 null var depth = b.wait() // 返回订单号,限定 1 秒超时,超时返回 undefined,若上次 wait 超时,此对象可继续调用 wait 等待 var orderId = c.wait(1000) if(typeof(orderId) == "undefined") { // 超时,重新获取 orderId = c.wait() } var records = d.wait() }pythondef main(): a = exchange.Go("GetTicker") b = exchange.Go("GetDepth") c = exchange.Go("Buy", 1000, 0.1) d = exchange.Go("GetRecords", PERIOD_H1) ticker, ok = a.wait() depth, ok = b.wait() orderId, ok = c.wait(1000) if ok == False: orderId, ok = c.wait() records, ok = d.wait()rustfn main() { // Rust 中 exchange.Go 为类型化写法:使用 Go:: 方法 token 指定并发函数,无参数传 (),有参数传元组 // 以下四种操作为并发多线程异步执行,不会耗时,会立即返回 let a = exchange.Go(Go::GetTicker, ()); let b = exchange.Go(Go::GetDepth, ()); // Rust 中没有 Buy 的 token,等价于 CreateOrder,第一个参数 "" 表示当前交易对 let c = exchange.Go(Go::CreateOrder, ("", "buy", 1000, 0.1)); let d = exchange.Go(Go::GetRecords, (PERIOD_H1,)); // 调用 wait 方法等待异步获取 ticker 的结果,wait(0) 会阻塞直到并发线程运行完毕(对应 JS 的无参 wait()) let ticker = a.wait(0); // 返回深度数据,如果获取失败也有可能返回 Err let depth = b.wait(0); // 返回订单号,限定 1 秒超时,超时返回 Err,若上次 wait 超时,此对象可继续调用 wait 等待 // 注意:Err 也可能是下单本身失败(与超时无法区分),此时再次 wait 会返回 Err 并记录出错信息 let mut orderId = c.wait(1000); if orderId.is_err() { // 超时,重新获取 orderId = c.wait(0); } let records = d.wait(0); }c++void main() { auto a = exchange.Go("GetTicker"); auto b = exchange.Go("GetDepth"); auto c = exchange.Go("Buy", 1000, 0.1); auto d = exchange.Go("GetRecords", PERIOD_H1); Ticker ticker; Depth depth; Records records; TId orderId; a.wait(ticker); b.wait(depth); if(!c.wait(orderId, 300)) { c.wait(orderId); } d.wait(records); } -
对已释放的并发对象调用其
wait()方法会报错:javascriptfunction main() { var d = exchange.Go("GetRecords", PERIOD_H1) // 等待 K 线数据返回结果 var records = d.wait() // 此处对已经 wait 过且已结束的异步操作再次调用 wait,将返回 null,并记录错误信息 var ret = d.wait() }pythondef main(): d = exchange.Go("GetRecords", PERIOD_H1) records, ok = d.wait() ret, ok = d.wait()rustfn main() { // Rust 中 exchange.Go 采用类型化写法:通过 Go:: 方法 token 指定并发函数 let d = exchange.Go(Go::GetRecords, (PERIOD_H1,)); // 等待 K 线数据返回结果,wait(0) 会阻塞直到运行完毕(对应 JS 的无参 wait()) let records = d.wait(0); // 此处对已经 wait 过且已结束的异步操作再次调用 wait,将返回 Err,并记录错误信息 let ret = d.wait(0); }c++void main() { auto d = exchange.Go("GetRecords", PERIOD_H1); Records records; d.wait(records); Records ret; d.wait(ret); } -
并发获取多个交易所行情:
javascriptfunction main() { while(true) { var beginTS = new Date().getTime() var arrRoutine = [] var arrTicker = [] var arrName = [] for(var i = 0; i < exchanges.length; i++) { arrRoutine.push(exchanges[i].Go("GetTicker")) arrName.push(exchanges[i].GetName()) } for(var i = 0; i < arrRoutine.length; i++) { arrTicker.push(arrRoutine[i].wait()) } var endTS = new Date().getTime() var tbl = { type: "table", title: "行情", cols: ["索引", "名称", "最新成交价"], rows: [] } for(var i = 0; i < arrTicker.length; i++) { tbl.rows.push([i, arrName[i], arrTicker[i].Last]) } LogStatus(_D(), "Total time for concurrent ticker retrieval:", endTS - beginTS, "ms", "\n", "`" + JSON.stringify(tbl) + "`") Sleep(500) } }pythonimport time import json def main(): while True: beginTS = time.time() arrRoutine = [] arrTicker = [] arrName = [] for i in range(len(exchanges)): arrRoutine.append(exchanges[i].Go("GetTicker")) arrName.append(exchanges[i].GetName()) for i in range(len(exchanges)): ticker, ok = arrRoutine[i].wait() arrTicker.append(ticker) endTS = time.time() tbl = { "type": "table", "title": "行情", "cols": ["索引", "名称", "最新成交价"], "rows": [] } for i in range(len(arrTicker)): tbl["rows"].append([i, arrName[i], arrTicker[i]["Last"]]) LogStatus(_D(), "Total time for concurrent ticker retrieval:", endTS - beginTS, "seconds", "\n", "`" + json.dumps(tbl) + "`") Sleep(500)rustfn main() { loop { let beginTS = UnixNano() / 1000000; let mut arrRoutine = Vec::new(); let mut arrTicker = Vec::new(); let mut arrName = Vec::new(); for e in exchanges.iter() { // Rust中exchange.Go为类型化写法,token为Go::GetTicker arrRoutine.push(e.Go(Go::GetTicker, ())); arrName.push(e.GetName()); } // 失败时记None占位,保持与arrName按索引对齐 for r in arrRoutine.iter() { arrTicker.push(r.wait(0).ok()); } let endTS = UnixNano() / 1000000; // Rust无JSON序列化,用format!拼接表格的JSON文本 let mut rows = String::new(); for i in 0..arrTicker.len() { if let Some(ticker) = &arrTicker[i] { if !rows.is_empty() { rows.push(','); } rows += &format!(r#"[{}, "{}", {}]"#, i, arrName[i], ticker.Last); } } let tbl = format!(r#"{{"type": "table", "title": "行情", "cols": ["索引", "名称", "最新成交价"], "rows": [{}]}}"#, rows); LogStatus!(_D(None), "Total time for concurrent ticker retrieval:", endTS - beginTS, "ms", "\n", format!("`{}`", tbl)); Sleep(500); } }c++void main() { while(true) { int length = exchanges.size(); auto beginTS = UnixNano() / 1000000; vector<Ticker> arrTicker(length); vector<string> arrName(length); // 注意,添加几个交易所对象,这里要执行几次exchanges[n].Go 函数,这个例子是需要添加四个交易所对象,具体可以修改 auto r0 = exchanges[0].Go("GetTicker"); auto r1 = exchanges[1].Go("GetTicker"); auto r2 = exchanges[2].Go("GetTicker"); auto r3 = exchanges[3].Go("GetTicker"); vector<GoObj*> arrRoutine = {&r0, &r1, &r2, &r3}; for(int i = 0; i < length; i++) { arrName[i] = exchanges[i].GetName(); } for(int i = 0; i < length; i++) { Ticker ticker; arrRoutine[i]->wait(ticker); arrTicker[i] = ticker; } auto endTS = UnixNano() / 1000000; json tbl = R"({ "type": "table", "title": "行情", "cols": ["索引", "名称", "最新成交价"], "rows": [] })"_json; for(int i = 0; i < length; i++) { json arr = R"(["", "", ""])"_json; arr[0] = str_format("%d", i); arr[1] = arrName[i]; arr[2] = str_format("%f", arrTicker[i].Last); tbl["rows"].push_back(arr); } LogStatus(_D(), "Total time for concurrent ticker retrieval:", str_format("%d", endTS - beginTS), "ms", "\n", "`" + tbl.dump() + "`"); Sleep(500); } } -
并发调用
exchange.IO("api", ...)函数:javascriptfunction main() { /* 测试OKX期货下单接口 POST /api/v5/trade/order */ var beginTS = new Date().getTime() var param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"} var ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param)) var ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param)) var ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param)) var id1 = ret1.wait() var id2 = ret2.wait() var id3 = ret3.wait() var endTS = new Date().getTime() Log("id1:", id1) Log("id2:", id2) Log("id3:", id3) Log("Concurrent order time:", endTS - beginTS, "ms") }pythonimport time import json def main(): beginTS = time.time() param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"} ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param)) ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param)) ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param)) id1, ok1 = ret1.wait() id2, ok2 = ret2.wait() id3, ok3 = ret3.wait() endTS = time.time() Log("id1:", id1) Log("id2:", id2) Log("id3:", id3) Log("Concurrent order time:", endTS - beginTS, "seconds")rustfn main() { /* 测试OKX期货下单接口 POST /api/v5/trade/order */ let beginTS = UnixNano() / 1000000; // Rust不支持JSON序列化,直接使用原始字符串构造参数 let param = r#"{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}"#; // 在Rust中,exchange.Go采用类型化写法,token为Go::IO,参数以元组形式传入 let ret1 = exchange.Go(Go::IO, ("api", "POST", "/api/v5/trade/order", "", param)); let ret2 = exchange.Go(Go::IO, ("api", "POST", "/api/v5/trade/order", "", param)); let ret3 = exchange.Go(Go::IO, ("api", "POST", "/api/v5/trade/order", "", param)); let id1 = ret1.wait(0); let id2 = ret2.wait(0); let id3 = ret3.wait(0); let endTS = UnixNano() / 1000000; Log!("id1:", id1); Log!("id2:", id2); Log!("id3:", id3); Log!("Concurrent order time:", endTS - beginTS, "ms"); }c++void main() { auto beginTS = UnixNano() / 1000000; json param = R"({"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"})"_json; auto ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump()); auto ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump()); auto ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump()); json id1 = R"({})"_json; json id2 = R"({})"_json; json id3 = R"({})"_json; ret1.wait(id1); ret2.wait(id2); ret3.wait(id3); auto endTS = UnixNano() / 1000000; Log("id1:", id1); Log("id2:", id2); Log("id3:", id3); Log("Concurrent order time:", endTS - beginTS, "ms"); } -
自动释放机制的测试
javascriptfunction main() { var counter = 0 var arr = [] // 用于测试持续引用并发对象的相关变量 var symbols = ["BTC_USDT", "ETH_USDT", "SOL_USDT", "LTC_USDT", "EOS_USDT"] while (true) { var arrRoutine = [] for (var symbol of symbols) { var r = exchange.Go("GetTicker", symbol) arrRoutine.push(r) // 记录并发对象,用于调用 r.wait() 函数获取结果,每轮循环都会清空 // arr.push(r) // 若使用这句代码,运行时会持续引用并发对象,导致其无法自动释放;当并发数超过 2000 时,会报错:```InternalError: too many routine wait, max is 2000```。 counter++ } // 遍历 arrRoutine 并调用 r.wait() 获取结果 LogStatus(_D(), "routine number:", counter) Sleep(50) } }rustfn main() { let mut counter = 0; let mut arr: Vec<TypedRoutine<Go::GetTicker>> = Vec::new(); // 用于测试持续引用并发对象的相关变量 let symbols = ["BTC_USDT", "ETH_USDT", "SOL_USDT", "LTC_USDT", "EOS_USDT"]; loop { let mut arrRoutine = Vec::new(); for symbol in symbols { // Rust 中 exchange.Go 为类型化写法,token 为 Go::GetTicker let r = exchange.Go(Go::GetTicker, (symbol,)); arrRoutine.push(r); // 记录并发对象,用于调用 r.wait(0) 函数获取结果,每轮循环都会清空 // arr.push(r); // 若使用这句代码,运行时会持续引用并发对象,导致其无法自动释放;当并发数超过 2000 时,会报错:InternalError: too many routine wait, max is 2000。 counter += 1; } // 遍历 arrRoutine 并调用 r.wait(0) 获取结果 LogStatus!(_D(None), "routine number:", counter); Sleep(50); } }
返回值
| 类型 | 描述 |
object |
|
参数
| 名称 | 类型 | 必填 | 描述 |
method | string | 是 |
|
arg | string / number / bool / object / array / function / any (平台支持的任意类型) | 否 | 并发执行函数的参数,参数 |
参考
Mail_Go HttpQuery_Go EventLoop exchange.IO(API 限流控制)
备注
该函数仅在实盘运行时创建多线程执行任务,回测不支持多线程并发执行任务(回测中可用,但仍为顺序执行)。
exchange.Go()函数返回对象后,可通过该对象调用其wait()函数获取线程返回的数据。当并发的多线程任务执行完毕且相关变量不再被引用时,系统底层会自动处理资源回收。
wait()方法支持超时参数:
1、不设置超时参数,即wait(),或将超时参数设置为0,即wait(0)。此时wait()函数会阻塞等待,直到并发线程运行完毕,并返回并发线程的执行结果。
2、将超时参数设置为-1,即wait(-1)。此时wait()函数会立即返回,不同编程语言的返回值有所不同,具体可参考本小节的调用示例。
3、设置具体的超时参数,即wait(300),此时wait()函数最多等待300毫秒后返回。
虽然系统底层具有自动回收机制,但如果持续引用相关变量,并发线程将不会被释放。当并发线程数量超过2000个时会报错:"too many routine wait, max is 2000"。
支持的函数:GetTicker,GetDepth,GetTrades,GetRecords,GetAccount,GetOrders,GetOrder,CancelOrder,Buy,Sell,GetPositions,IO等。这些函数并发调用时均基于当前exchange交易所对象执行。
Python语言与JavaScript语言的区别在于,Python语言中并发对象的wait()函数返回两个值,第一个为异步API调用返回的结果,第二个表示异步调用是否完成。
python
def main():
d = exchange.Go("GetRecords", PERIOD_D1)
# ok是一定返回True的, 除非策略被停止
ret, ok = d.wait()
# 如果等待超时, 或者wait了一个已经结束的实例,ok返回False
ret, ok = d.wait(100)