通用协议
用于接入平台还未封装的交易所(exchange.GetName()为Exchange):标准函数不直接访问任何交易所,而是把请求转发给用户自建的协议插件程序(网关),由它对接交易所的REST、FIX等接口。协议插件程序的写法参看REST协议参考文档与FIX协议参考项目。
每次调用都是向配置的服务地址发送一次HTTP POST,请求体为JSON:{"access_key", "secret_key", "nonce", "method", "params"}(nonce为纳秒时间戳),请求头Http-Method为POST(exchange.IO("api", ...)时为调用方指定的方法),Content-Type为application/x-www-form-urlencoded。应答顶层有error键即为失败(null、空字符串也算失败,错误信息为gateway returned an error without a message),业务数据在data中。
| 函数 | 网关方法 | params |
|---|---|---|
| exchange.GetTicker() | ticker | symbol |
| exchange.GetDepth() | depth | symbol, limit |
| exchange.GetTrades() | trades | symbol |
| exchange.GetRecords() | records | symbol, limit(默认200), period(分钟) |
| exchange.GetAccount() | accounts(网关报错时改用assets) | 无 |
| exchange.GetAssets() | assets | 无 |
| exchange.CreateOrder() / exchange.Buy() / exchange.Sell() | trade | symbol, type, price, amount |
| exchange.GetOrders() | orders | symbol(不传品种时为当前交易对) |
| exchange.GetHistoryOrders() | historyorders | symbol, since, limit |
| exchange.GetOrder() | order | id, symbol |
| exchange.CancelOrder() | cancel | id, symbol |
名称与配置
exchange.GetName():Exchange(自定义接入);别名:自定义交易所、Custom Exchange。
| 配置项 | 必填 | 说明 |
|---|---|---|
| 服务地址 | 是 | 协议插件程序(网关)的完整地址,只支持http://、https://,请求直接POST到这个地址。 |
| Access Key | 是 | 原样放进请求体的access_key。 |
| Secret Key | 是 | 原样放进请求体的secret_key。 |
交易对与合约代码
交易对示例:BTC_USDT
交易对按BTC_USDT书写,发给网关时转为小写(btc_usdt)。
专属IO指令
| 指令 | 参数 | 说明 | 返回值 |
|---|---|---|---|
api | httpMethod, name[, params] | 调用网关的自定义方法__api_<name>,请求头Http-Method为httpMethod;params为对象,或"a=1&b=2"形式的字符串(值按整数、浮点数、JSON、字符串的顺序识别类型)。 | 网关的整个应答(不只是data)。 |
io | code, ...args | 把数字指令code和参数转发给网关的io方法(params为{code, args});也可以直接写exchange.IO(code, ...args)。code为4时不转发,第一个参数作为本地的IO指令执行。 | 网关应答的data。 |
通用指令base、currency见exchange.IO。
常用用法
调用网关的自定义方法(__api_<name>)
javascript
function main() {
// 网关收到method为__api_getAccountInfo、请求头Http-Method为GET的请求,
// params为{"accountType": "spot", "limit": 10}(数字串按数字发送)
var r = exchange.IO("api", "GET", "getAccountInfo", "accountType=spot&limit=10")
Log(r) // 网关的整个应答,如{"data": {...}}
// params也可以是对象,嵌套的对象、数组原样转发
var ret = exchange.IO("api", "POST", "batchOrders", {orders: [{symbol: "BTC_USDT", amount: 1}]})
Log(ret.data)
}
把数字指令转发给网关的io方法
javascript
function main() {
// 网关收到method为io、params为{"code": 2, "args": ["foo", 1]}的请求,返回应答的data
var d1 = exchange.IO("io", 2, "foo", 1)
var d2 = exchange.IO(2, "foo", 1) // 与上一行等价
Log(d1, d2)
// code为4时不转发,第一个参数作为本地IO指令执行:这里查询网关的服务地址
Log(exchange.IO(4, "base"))
}
函数支持差异
不支持(调用时报错并返回空值):exchange.GetTickers、exchange.GetMarkets、exchange.ModifyOrder、exchange.CreateConditionOrder、exchange.ModifyConditionOrder、exchange.CancelConditionOrder、exchange.GetConditionOrder、exchange.GetConditionOrders、exchange.GetHistoryConditionOrders。
以回退方式支持:
exchange.GetRecords:网关的records只接受1分钟、3分钟、5分钟、15分钟、30分钟、1小时、1天周期,其它周期由托管者合成;不支持指定起始时间。
注意事项
- 下单(网关方法
trade):type为buy、sell,平仓单为closebuy、closesell,也可以在下单附加参数中用direction直接指定;市价单price为"-1";其余附加参数原样并入params。不支持只做Maker(postOnly)和GTC以外的有效期。 exchange.GetAccount()先调用网关的accounts方法,网关应答错误(例如不支持该方法)时改调assets方法,因此只实现assets的网关也可以使用;exchange.GetAssets()只调用assets方法。两个方法的应答data都是[{currency, free, frozen}]。- 订单号就是网关
trade应答data.id的原值:正整数返回数字,其余返回字符串,可以含逗号(如BTC-USDT,123456),平台不拼接也不拆分。exchange.GetOrder、exchange.CancelOrder把订单号原样作为id发给网关,symbol为当前交易对(查、撤其它交易对的订单前先exchange.SetCurrency)。下单应答必须带data.id,exchange.GetOrder()应答的data.id必须与请求的订单号一致。 exchange.GetOrders不传品种时查询当前交易对(网关的orders必须带symbol)。订单结构的Symbol为请求的交易对(如BTC_USDT),网关应答里的symbol保留在Info中。- 订单状态先读
state字段,认不出时再读status字段(不分大小写):open、pending、pre-submitted、submitting、submitted、partial、partial-filled为未完成;filled、closed、finished为已完成;canceled、cancelled、partial-canceled为已取消。都认不出(包括数字状态码)时,exchange.GetOrders()按未完成、exchange.GetHistoryOrders()按已完成、exchange.GetOrder()按未知状态处理。 - 应答字段可以缺省:价格、数量、时间等数值缺失时为0,数字可以写成字符串(可带千分位逗号),时间可以是整数、浮点数或数字字符串;方向
type为buy、bid时是买,其余都是卖。data的类型必须正确(行情、单个订单是对象,成交、K线、余额、订单列表是数组,深度档位为[价格, 数量]数组),否则报错。 - 请求默认超时30秒;标准函数的请求超时可用
exchange.SetTimeout修改,exchange.IO()转发的请求固定为30秒。