输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入
通用协议
Web3

用于接入平台还未封装的交易所(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()tickersymbol
exchange.GetDepth()depthsymbol, limit
exchange.GetTrades()tradessymbol
exchange.GetRecords()recordssymbol, limit(默认200), period(分钟)
exchange.GetAccount()accounts(网关报错时改用assets)无
exchange.GetAssets()assets无
exchange.CreateOrder() / exchange.Buy() / exchange.Sell()tradesymbol, type, price, amount
exchange.GetOrders()orderssymbol(不传品种时为当前交易对)
exchange.GetHistoryOrders()historyorderssymbol, since, limit
exchange.GetOrder()orderid, symbol
exchange.CancelOrder()cancelid, symbol

名称与配置

exchange.GetName():Exchange(自定义接入);别名:自定义交易所、Custom Exchange。

配置项必填说明
服务地址是协议插件程序(网关)的完整地址,只支持http://、https://,请求直接POST到这个地址。
Access Key是原样放进请求体的access_key。
Secret Key是原样放进请求体的secret_key。

交易对与合约代码

交易对示例:BTC_USDT

交易对按BTC_USDT书写,发给网关时转为小写(btc_usdt)。

专属IO指令
指令参数说明返回值
apihttpMethod, name[, params]调用网关的自定义方法__api_<name>,请求头Http-Method为httpMethod;params为对象,或"a=1&b=2"形式的字符串(值按整数、浮点数、JSON、字符串的顺序识别类型)。网关的整个应答(不只是data)。
iocode, ...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秒。