exchange.IO



```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)
  • httpMethod :该参数为字符串类型,填入请求类型POSTGET等。
  • resource :该参数为字符串类型,填入请求路径;支持使用完整的请求路径,详见参考例子。
  • params :该参数为字符串类型,填入请求参数,使用URL编码。
  • raw :该参数为原始字符串参数,可以不传。

**二、用于切换交易对,参数```k```设置为```"currency"```:**

```javascript
exchange.IO("currency", currency)
  • currency:该参数为字符串类型,格式统一为大写,使用下划线分隔baseCurrencyquoteCurrency,例如: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}