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", ...)生效。