edgeX
永续合约DEX(V2接口),合约以USDC计价。私有接口使用edgeX Perps V2的API Key、API Secret、API Passphrase做HMAC认证,下单另用交易签名私钥(SDK Signer)做EIP-712签名;配置交易所对象前需要在edgeX创建这两套凭据并记下账户ID。旧V1方式的配置(只有AccountID和StarkEx私钥Secret Key)不能再用,私有接口会报缺少V2凭据,需要在edgeX新建V2 API凭据后把五项都填上。
名称与配置
exchange.GetName():Futures_EdgeX(期货);别名:EdgeX。
| 配置项 | 必填 | 说明 |
|---|---|---|
| AccountID | 是 | edgeX账户ID(数字)。 |
| API Key | 是 | edgeX Perps V2的API Key,与API Secret、API Passphrase一起用于私有接口的HMAC认证。 |
| API Secret | 是 | edgeX Perps V2的API Secret(HMAC密钥)。 |
| API Passphrase | 是 | edgeX Perps V2的API Passphrase。 |
| Trading Private Key | 是 | edgeX Perps V2 SDK Signer的私钥(十六进制),用于订单的EIP-712签名;IO指令calcOrderHashAndSign也用它做Stark签名。 |
交易对与合约代码
交易对示例:BTC_USDC、ETH_USDC
edgeX的永续合约都以USDC计价,交易对写作BTC_USDC等,完整代码形如BTC_USDC.swap;写成BTC_USDT、BTC_USD会报错symbol not found: BTCUSDT(或BTCUSD)。exchange.SetCurrency()保留设置时的大小写(exchange.GetCurrency()原样返回),查找合约时不区分大小写;订单、持仓等由交易所返回的数据中品种代码为大写,exchange.GetTicker()返回的Symbol沿用传入或当前设置的写法,建议统一用大写。
| 合约代码 | 说明 |
|---|---|
swap | USDC永续合约(唯一的合约类型)。 |
edgeX只有永续合约,swap以外的合约代码会报错。
专属IO指令
| 指令 | 参数 | 说明 | 返回值 |
|---|---|---|---|
calcOrderHashAndSign | json | 旧版(StarkEx)限价单签名,仅供旧策略继续调用:计算LIMIT_ORDER_WITH_FEES的Pedersen哈希,并用配置的TradingPrivateKey做Stark ECDSA签名。(详见表下) | 128个字符的小写十六进制字符串(r、s各64个字符,不带0x)。 |
api | method, path[, params[, raw[, sign]]] | 直接调用edgeX接口。(详见表下) | 应答中的data;应答code不是SUCCESS时报错。 |
表中长说明的其余部分:
calcOrderHashAndSign:参数是含10个键的JSON字符串或对象,见注意事项。edgeX V2下单使用EIP-712签名,不接受这个签名,本交易所对象下单也不用它。api:默认用API Key、API Secret、API Passphrase做HMAC签名(需要填写这三项V2凭据);sign传false(也可以直接作为第4个参数)时不签名,只能用于GET。GET的参数编入查询串,其它方法以JSON请求体发送。raw不是请求体而是参数表(JSON对象、JSON字符串或a=1&b=2),非空时整体替换params。不会替调用方对订单做EIP-712签名。
通用指令base、currency见exchange.IO。
常用用法
用api调用公开接口与签名的账户接口
javascript
function main() {
// 公开接口:第4个参数传false,不签名(只能用于GET);返回应答中的data
var meta = exchange.IO("api", "GET", "/api/v2/public/meta/getMetaData", {}, false)
var c = null
for (var i = 0; i < meta.contractList.length; i++) {
if (meta.contractList[i].contractName == "BTCUSDC") {
c = meta.contractList[i]
}
}
var p = {contractId: c.contractId}
var t = exchange.IO("api", "GET", "/api/v2/public/quote/getTicker", p, false)
Log(c.contractName, "合约ID:", c.contractId, "最新价:", t[0].lastPrice)
// 账户接口默认HMAC签名;accountId可以从GetAccount()的Info中取
var accountId = exchange.GetAccount().Info.account.id
var params = {accountId: accountId, size: "50"}
var orders = exchange.IO("api", "GET", "/api/v2/private/order/getActiveOrderPage", params)
Log("挂单数:", orders.dataList.length)
}
为旧策略计算旧版(StarkEx)限价单签名
javascript
function main() {
// 恰好10个键;超出JavaScript整数精度的accountID写成十进制字符串
var sig = exchange.IO("calcOrderHashAndSign", JSON.stringify({
assetIdSynthetic: "0x4554482d3900000000000000000000",
assetIdCollateral: "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5",
assetIdFee: "0x2ce625e94458d39dd0bf3b45a843544dd4a14b8169045a3a3d15aa564b936c5",
isBuyingSynthetic: true,
amountSynthetic: 10000000,
amountCollateral: 13020000,
amountFee: 6250,
nonce: 676432751,
accountID: "601416704693633632",
expirationTimestamp: 484831
}))
// 128个十六进制字符:前64个是r,后64个是s
Log("r:", sig.slice(0, 64), "s:", sig.slice(64))
}
函数支持差异
不支持(调用时报错并返回空值):exchange.GetTickers、exchange.GetTrades、exchange.ModifyOrder、exchange.ModifyConditionOrder、exchange.SetMarginLevel。
以回退方式支持:
exchange.GetRecords:原生周期为1分钟、5分钟、15分钟、30分钟、1小时、2小时、4小时、6小时、8小时、12小时、1天、1周、1月;其它60秒整数倍的周期由托管者用原生K线合成,其余周期(如秒级)不可用(交易所没有成交接口)。
保证金、账户与模拟盘
保证金模式:edgeX为全仓保证金,持仓的MarginLevel为交易所返回的当前杠杆。不支持exchange.SetMarginLevel(),杠杆需要在edgeX上自行设置。
持仓模式:单向(净)持仓。
账户:账户、持仓、订单都按配置的「AccountID」查询。exchange.GetAssets()按币种列出抵押资产,exchange.GetAccount()取当前交易对计价币(USDC)那一行。
注意事项
| 函数 | Futures_EdgeX的行为 |
|---|---|
| exchange.GetTicker() | 行情接口不含买一、卖一,每次调用另取一次盘口填写(共两次请求),盘口请求失败时整个调用失败。Time为盘口应答的服务器时间(exchange.GetDepth()的Time同此),不是行情接口的endTime(24小时统计窗口的结束时间,按15分钟刻度更新),endTime仍可在Info中读取 |
| exchange.GetTickers() | 不支持:edgeX没有一次返回全部合约行情的接口(行情接口不传合约ID时返回空列表),调用时报错并返回空值。需要多个合约的行情请逐个调用exchange.GetTicker(symbol)(如exchange.GetTicker("BTC_USDC.swap")) |
| exchange.GetFundings() | 传入品种(如BTC_USDC.swap)返回该合约一条;不传参数时查询当前计价币的全部可交易永续(如USDC.swap,也可直接传这类范围)。edgeX没有批量资金费率接口,范围查询每个合约发一次请求,一百多个合约耗时十几秒,频繁调用请传具体品种。Rate为交易所的预测费率(下一期),Time为下一次结算时间 |
| exchange.CreateOrder() | 下单数量以币为单位(1张=1个币)。限价单支持GTC、IOC、FOK和只做Maker;市价单默认为IOC,不能设为只做Maker,并按预言机价格限定成交价格:买单不高于其1.2倍,卖单不低于其0.8倍 |
| exchange.CreateConditionOrder() | 只支持止盈、止损,不支持OCO(止盈、止损分两张下),按最新成交价触发;委托价为-1(市价)时触发后按市价成交,价格界限按创建时的预言机价格计算。修改条件单需要先撤销再重新创建 |
| exchange.GetOrders()、exchange.GetConditionOrders() | 不传品种时返回所有合约的挂单。条件单与普通单在同一张订单表里,未触发的条件单也会出现在exchange.GetOrders()的结果中 |
| exchange.GetHistoryOrders() | 不传limit时最多返回100条;结果中包含已结束的条件单 |
| exchange.GetHistoryConditionOrders() | 第三个参数沿用旧版语义,不表示条数:大于1e12时视为截止时间(毫秒时间戳),否则忽略;返回条数不受限制。不传since时会翻遍该合约的全部历史订单,超过约1万条时报错,建议传入since |
exchange.IO("calcOrderHashAndSign", json)的参数必须恰好包含10个键:assetIdSynthetic、assetIdCollateral、assetIdFee(十六进制)、isBuyingSynthetic(布尔)、amountSynthetic、amountCollateral、amountFee、nonce、accountID、expirationTimestamp(整数,也可以写成十进制字符串;超出JavaScript整数精度的accountID要写成字符串)。缺键或值格式错误报argument X error,多出键报argument error。签名私钥是配置的TradingPrivateKey(按Stark私钥解释),不是旧版账户的Stark私钥;签名随机数是确定性的(RFC 6979),同一输入每次签名相同,与旧托管者签出的值不同但同样有效。