Recientemente, la plataforma FMZ ha añadido soporte para Hyperliquid DEX, un intercambio descentralizado de alto rendimiento, proporcionando a los usuarios más opciones para participar en operaciones descentralizadas.
Visión general de la plataforma hiperlíquida
Hyperliquid es una cadena de bloques L1 de alto rendimiento optimizada desde cero, con la visión de construir un sistema financiero abierto completamente en cadena.
El rendimiento de Hyperliquid L1
es suficiente para soportar un ecosistema de aplicaciones financieras sin permiso. Todas las órdenes, retiros, transacciones y liquidaciones se completan en la cadena de una manera completamente transparente, con una latencia de bloque de menos de 1 segundo. Hyperliquid L1 utiliza un algoritmo de consenso personalizado llamado HyperBFT, que está inspirado en Hotstuff y sus algoritmos posteriores.
A través de esta guía, esperamos ayudarlo a comenzar con el comercio programático y cuantitativo rápidamente en Hyperliquid DEX en la plataforma FMZ y descubrir más oportunidades comerciales.
Protocolo REST
Protocolo de soporte web
En la página Agregar plataforma de la plataforma FMZ, puede configurar los objetos de intercambio de spot y futuros de Hyperliquid:
Dirección de la APP de la red principal:
En el uso real, la red principal es relativamente estable y tiene una buena velocidad.
La dirección del nodo de la interfaz API del protocolo REST correspondiente es:https://api.hyperliquid.xyz
- ¿ Por qué?
La información relacionada con la firma del mensaje también es diferente:source == "a",chainId = 42161
.
Dirección del APP de la red de ensayo:
La red de prueba a menudo se bloquea, pero solo se utiliza como interfaz de prueba y para familiarizarse con las funciones de negociación en DEX.
La dirección del nodo de la interfaz API del protocolo REST correspondiente es:https://api.hyperliquid-testnet.xyz
- ¿ Por qué?
La información relacionada con la firma del mensaje también es diferente:source == "b",chainId = 421614
.
Al igual que el método de conexión de la cartera de la mayoría de los intercambios DEX, puede usar la APP de la cartera para escanear el código QR para conectarse a Hyperliquid (cambia la cartera a Arbitrum y escanea el código para iniciar sesión, la red de prueba y la red principal son las mismas).
Después de recibir el USDC para la prueba, haga clic en el botón
Haga clic en el botón
Cuando se realizan transacciones manuales en la página de Hyperliquid APP, la página generará automáticamente una dirección de billetera proxy y una clave privada, que se registran en el navegador y se utilizan para operaciones como la colocación de pedidos en la página del navegador.
Puede crear la dirección de cartera proxy requerida y la clave privada correspondiente en la página de la API de Hyperliquid:
Luego puede configurar esta información en la plataforma FMZ (la interfaz de configuración se menciona anteriormente).
Dirección de la billetera: la dirección de la billetera conectada a Hyperliquid (nota, no la dirección de la billetera proxy). Wallet PrivateKey: La clave privada de la billetera conectada a Hyperliquid (opcional, solo se requiere cuando se llaman API como transferencias, se puede dejar en blanco). Clave secreta: Clave privada de la billetera proxy (generada en el paso anterior, la clave privada que se muestra después de la autorización).
Información requerida para configurar el objeto de intercambio:
Una vez que la configuración está completa, podemos probarla en la plataforma FMZ. Usamos directamente la
Si está utilizando un objeto de intercambio Hyperliquid configurado con información de testnet, deberá realizar algunas operaciones de conmutación al usarlo, por ejemplo:
function main() {
// REST protocol API address switched to testnet
exchange.SetBase("https://api.hyperliquid-testnet.xyz")
// source : a Mainnet, b Testnet
exchange.IO("source", "b")
return exchange.GetAccount()
}
La configuración de la red principal no requiere la operación de conmutación anterior. Las interfaces API relacionadas con productos al contado y futuros en el intercambio Hyperliquid DEX son casi las mismas, con solo ligeras diferencias en los detalles.Futuros de activos hiperlíquidosObjetos de intercambioInformación de configuración de red principaly elInformación sobre la configuración de la red de pruebaspara pruebas.
function main() {
var markets = exchange.GetMarkets()
if (!markets) {
throw "get markets error"
}
var tbl = {
type: "table",
title: "test markets",
cols: [
"key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty",
"MaxQty", "MinNotional", "MaxNotional", "CtVal", "CtValCcy"
],
rows: []
}
for (var symbol in markets) {
var market = markets[symbol]
tbl.rows.push([
symbol, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize,
market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal, market.CtValCcy
])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
function main() {
var depth = exchange.GetDepth("ETH_USD.swap")
var asks = depth.Asks
var bids = depth.Bids
Log("asks 3", bids[2])
Log("asks 2", bids[1])
Log("asks 1", bids[0])
Log("bids 1", asks[0])
Log("bids 2", asks[1])
Log("bids 3", asks[2])
}
function main() {
var account = exchange.GetAccount()
return account
}
Resultados de las funciones:
function main() {
var symbols = ["ETH_USD.swap", "XRP_USD.swap", "HYPE_USD.swap"]
var arrDir = ["market_buy", "sell", "buy"]
var markets = exchange.GetMarkets()
var ids = []
for (var i in symbols) {
var symbol = symbols[i]
var side = arrDir[i]
var ticker = exchange.GetTicker(symbol)
var info = markets[symbol]
exchange.SetPrecision(info.PricePrecision, info.AmountPrecision)
// USDC
var qty = 15
var price = null
var amount = null
if (side == "market_buy") {
price = -1
side = "buy"
amount = qty / ticker.Last
} else {
price = side == "buy" ? ticker.Last * 0.9 : ticker.Last * 1.1
amount = qty / price
}
var id = exchange.CreateOrder(symbol, side, price, amount)
ids.push(id)
}
var tbl = {type: "table", title: "test", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var id of ids) {
var order = exchange.GetOrder(id)
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
Sleep(500)
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
function main() {
var orders = exchange.GetOrders("USD.swap")
for (var order of orders) {
exchange.CancelOrder(order.Id, order)
Sleep(1000)
}
var tbl = {type: "table", title: "test", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
function main() {
// Set the current position to cross position
exchange.IO("cross", true)
// Set leverage
exchange.SetMarginLevel("ETH_USD.swap", 10)
return exchange.GetRawJSON()
}
Resultados de las funciones:
exchange.GetRawJSON() devuelve la información de respuesta de la solicitud de configuración de apalancamiento:
¿Qué es lo que está pasando?
Dado que los parámetros de interfaz del intercambio son relativamente complejos y no pueden ser pasados utilizando el método de codificación de URL, cuando se utilizaexchange.IOfunction
Las siguientes son ejemplos de varias llamadas de interfaz.
Documentación de referencia sobre el hiperlíquido:https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
var params = {"type": "scheduleCancel", "time": new Date().getTime()}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
{
status ¿Qué es lo que está pasando?174.57424.”}: err , respuesta : No se puede establecer el tiempo de cancelación programado hasta que se negocie suficiente volumen.
Esta función tiene restricciones: la cuenta debe alcanzar el nivel de negociación para utilizar esta función.
Crear una orden TWAP.
function main() {
var params = {
"type": "twapOrder",
"twap": {
"a": 0,
"b": true,
"s": "1",
"r": false,
"m": 10,
"t": false
}
}
// SOL_USDT.swap , Order Quantity: 1 , twapOrder order has position requirement, minimum value of 100 USD
// a: 0, i.e. SOL_USDT.swap
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Cancela la orden del TWAP.
function main() {
var params = {
"type": "twapCancel",
"a": 0,
"t": 3805
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, autoriza una nueva cartera proxy.
function main() {
var params = {
"type": "approveAgent",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"agentAddress": "0xAAAA",
"agentName": "test02",
"nonce": new Date().getTime()
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Autorización exitosa, devuelve:
¿Qué es lo que está pasando?
https://app.hyperliquid-testnet.xyz/API
.Retira los activos de la bóveda.
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, retira los activos a la cartera.
function main() {
var params = {
"type": "withdraw3",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"amount": "5",
"time": new Date().getTime(),
"destination": "0xAAA"
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Transferencia de activos entre contratos al contado y futuros (contratos perpetuos).
function main() {
var params = {
"type": "usdClassTransfer",
"hyperliquidChain": "Testnet",
"signatureChainId": "0x66eee",
"amount": "5",
"toPerp": false,
"nonce": new Date().getTime()
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
false
, que indica la dirección de rotación: futuros -> spot.true
, que indica la dirección de rotación: spot -> futuros.Dirección de la interfaz WS de la red principal:
En la red principal: wss://api.hyperliquid.xyz/ws
Dado que la interfaz API del protocolo REST no tiene una interfaz para obtener datos de transacciones recientes, la interfaz Websocket tiene este canal que se puede suscribir.
Estructura del mensaje de suscripción
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Ejemplo de prueba ejecutada en herramientas de depuración:
function main() {
var loopCount = 20
var subMsg = {
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
var conn = Dial("wss://api.hyperliquid.xyz/ws")
conn.write(JSON.stringify(subMsg))
if (conn) {
for (var i = 0; i < loopCount; i++) {
var msg = conn.read(1000)
if (msg) {
Log(msg)
}
}
}
conn.close()
Log("End of test")
}
Las pruebas anteriores se basan en el último docker. Necesita descargar el último docker para admitir el intercambio de Hyperliquid DEX.
Gracias por su apoyo y gracias por leer.