```exchange.IO()```函数调用交易所对象相关的其它接口,调用成功时返回请求的应答数据,调用失败时返回空值。
string / number / bool / object / array / any (平台支持的任意类型)
exchange.IO(k, ...args)
```k```参数用于设置调用类型,可选值为```"api"```、```"currency"```、```"base"```、```"trade_margin"```、```"trade_normal"```、```"public_base"```、```"mbase"```、```selfTradePreventionMode```、```simulate```、```cross```、```dual```、```unified```等。
k
true
string
扩展参数,根据具体调用场景传参,```arg```参数可以传多个。由于```exchange.IO()```函数的多态机制,不同的参数设置对应不同的功能。```exchange.IO()```函数的参数个数、类型都是不确定的。
arg
true
string / number / bool / object / array / any (平台支持的任意类型)
```javascript
function 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)
}
import 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)
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);
}
使用exchange.IO()
函数的exchange.IO("api", httpMethod, resource, params, raw)
调用形式,需要首先了解该交易所的API接口,查阅相关文档。这样就可以扩展FMZ平台没有添加的功能。提交POST
请求不必担心参数加密、签名、验证等过程。FMZ在底层已经处理,只要填入相应参数即可。
可以参考OKX交易所期货合约的批量下单范例,使用参数raw
传订单参数:
var 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)
}
amount = 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)
void main() {
auto amount = 1.0;
auto price = 10.0;
auto basecurrency = "ltc";
string message = format("symbol=%s&amount=\"%.1f\"&price=\"%.1f\"&side=buy&type=limit", basecurrency, amount, price);
auto id = exchange.IO("api", "POST", "/v1/order/new", message);
}
如果params
参数(即Http请求参数)中键值是字符串,需要用单引号(即符号’)写在参数值左右,把参数值包裹起来。
function main() {
var ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
Log(ret)
}
def main():
ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
Log(ret)
void main() {
auto ret = exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC");
Log(ret);
}
支持传入完整的url参数,这样可以省略切换基地址的操作(调用exchange.SetBase()
函数)。
function main(){
var ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
}
def main():
ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
void main() {
auto ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT");
Log(ret);
}
不使用参数raw
的调用范例:
function main() {
// 例如开始实盘上设置交易所对象目前交易对为BTC_USDT,打印目前交易对行情
Log(exchange.GetTicker())
// 切换交易对为LTC_BTC
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
}
def main():
Log(exchange.GetTicker())
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
void main() {
Log(exchange.GetTicker());
exchange.IO("currency", "LTC_BTC");
Log(exchange.GetTicker());
}
切换当前交易所的交易对,这样就会通过代码切换实盘创建时或者回测时配置的交易对。
function main () {
// exchanges[0]就是实盘创建时,第一个添加的交易所对象
exchanges[0].IO("base", "https://api.huobi.pro")
}
def main():
exchanges[0].IO("base", "https://api.huobi.pro")
void main() {
exchanges[0].IO("base", "https://api.huobi.pro");
}
例如交易所对象封装时默认的基地址为https://api.huobipro.com
,需要切换至https://api.huobi.pro
时,使用以下代码切换:
function main() {
exchange.SetBase("https://api.bitfinex.com")
exchange.IO("mbase", "https://api-pub.bitfinex.com")
}
def main():
exchange.SetBase("https://api.bitfinex.com")
exchange.IO("mbase", "https://api-pub.bitfinex.com")
void main() {
exchange.SetBase("https://api.bitfinex.com");
exchange.IO("mbase", "https://api-pub.bitfinex.com");
}
对于行情接口、交易接口基地址不同的交易所,例如Bitfinex期货有两个地址,一个是行情接口地址,一个是交易接口地址。
- Bitfinex期货切换私有接口基地址使用exchange.SetBase("xxx")
。
- Bitfinex期货切换公共接口基地址使用exchange.IO("mbase", "xxx")
。
一、用于加密货币中心化交易所其它未统一封装的API接口调用,参数k
设置为"api"
:
exchange.IO("api", httpMethod, resource, params, raw)
POST
、GET
等。URL
编码。
**二、用于切换交易对,参数```k```设置为```"currency"```:**
```javascript
exchange.IO("currency", currency)
baseCurrency
与quoteCurrency
,例如:BTC_USDT
。
1、回测系统现已支持切换交易对(仅限数字货币现货交易所对象),回测时需要注意只能切换为相同计价币的交易对,例如当前交易对为ETH_BTC
只能切换为LTC_BTC
,不能切换为LTC_USDT
。
2、对于加密货币期货合约交易所对象切换了交易对,需要再次设置合约代码以确定要交易的是哪个合约。
3、使用{@fun/Account/exchange.SetCurrency exchange.SetCurrency}函数切换交易对的功能与使用exchange.IO("currency", currency)
切换交易对的功能完全相同。三、用于切换加密货币现货交易所对象杠杆账户模式:
k
设置为"trade_margin"
,切换为现货杠杠账户模式。下单、获取账户资产将访问交易所现货杠杆接口。
如果交易所现货杠杆区分全仓、逐仓则使用:exchange.IO("trade_super_margin")
切换为杠杆账户全仓、exchange.IO("trade_margin")
切换为杠杆账户逐仓。k
设置为"trade_normal"
,切换回普通现货账户模式。支持切换杠杆账户模式的现货交易所:
交易所 | 特殊备注 |
---|---|
OKX | 杠杆账户模式的交易对和普通的有所不同,有些交易对可能没有。使用exchange.IO("trade_super_margin") 切换为杠杆账户全仓,exchange.IO("trade_margin") 切换为逐仓。使用trade_normal 切换为普通币币模式。使用exchange.IO("tdMode", "cross") 直接指定杠杆模式。 |
火币 | 杠杆账户模式的交易对和普通的有所不同,有些交易对可能没有。火币杠杆账户有全仓和逐仓之分,使用trade_margin 切换为杠杆账户逐仓,使用trade_super_margin 切换为杠杆账户全仓。使用trade_normal 切换为普通币币模式。 |
币安(Binance) | 杠杆账户模式分为逐仓、全仓,使用trade_margin 切换为逐仓,使用trade_super_margin 切换为全仓,使用trade_normal 切换为普通币币模式。 |
GateIO | 杠杆账户模式分为逐仓、全仓,使用trade_margin 切换为逐仓,使用trade_super_margin 切换为全仓,使用trade_normal 切换为普通币币模式。 |
AscendEx | 使用exchange.IO("trade_margin") 切换为杠杠账户模式,使用exchange.IO("trade_normal") 切换回普通账户模式。 |
WOO | 使用exchange.IO("trade_margin") 切换为杠杆账户模式,使用exchange.IO("trade_normal") 切换回普通账户模式。 |
CoinEx | 使用exchange.IO("trade_margin") 切换为杠杆账户模式,使用exchange.IO("trade_normal") 切换回普通账户模式。 |
Vertex | 使用exchange.IO("trade_margin") 切换为Margin Spot,使用exchange.IO("trade_normal") 切换回普通Spot模式。 |
四、其它切换功能:
在用户指南中可以查看exchange.IO()
函数的其它切换功能。
{@fun/NetSettings/exchange.SetBase exchange.SetBase}, {@fun/Account/exchange.SetCurrency exchange.SetCurrency}, {@var EXCHANGE_OP_IO_CONTROL}