Recentemente, a plataforma FMZ adicionou suporte para Hyperliquid DEX, uma exchange descentralizada de alto desempenho, fornecendo aos usuários mais opções para participar de negociações descentralizadas.
Visão geral da plataforma hiperlíquida
O Hyperliquid é um blockchain L1 de alto desempenho otimizado a partir do zero, com a visão de construir um sistema financeiro aberto totalmente on-chain.
O desempenho do Hyperliquid L1
é suficiente para suportar um ecossistema de aplicativos financeiros sem permissão. Todas as ordens, retiradas, transações e liquidações são concluídas na cadeia de forma completamente transparente, com uma latência de bloco de menos de 1 segundo. O Hyperliquid L1 usa um algoritmo de consenso personalizado chamado HyperBFT, que é inspirado no Hotstuff e seus algoritmos subsequentes.
Através deste guia, esperamos ajudá-lo a começar rapidamente com negociação programática e quantitativa no Hyperliquid DEX na plataforma FMZ e descobrir mais oportunidades de negociação.
Protocolo REST
Protocolo de Websocket
Na página Adicionar plataforma da plataforma FMZ, você pode configurar os objetos de câmbio spot e futuros Hyperliquid:
Endereço da APP da rede principal:
Na utilização real, a rede principal é relativamente estável e tem uma boa velocidade.
O endereço do nó da interface API do protocolo REST correspondente é:https://api.hyperliquid.xyz
- Não.
As informações relacionadas com a assinatura da mensagem também são diferentes:source == "a",chainId = 42161
.
Endereço APP da rede de ensaio:
A rede de teste frequentemente falha, mas é usada apenas como uma interface de teste e para familiarizar-se com as funções de negociação no DEX.
O endereço do nó da interface API do protocolo REST correspondente é:https://api.hyperliquid-testnet.xyz
- Não.
As informações relacionadas com a assinatura da mensagem também são diferentes:source == "b",chainId = 421614
.
Assim como o método de conexão da carteira da maioria das exchanges DEX, você pode usar o APP da carteira para digitalizar o código QR para se conectar ao Hyperliquid (mute a carteira para o Arbitrum e digitalize o código para entrar, a rede de teste e a rede principal são as mesmas).
Depois de receber o USDC para teste, clique no botão
Clique no botão
Ao realizar transações manuais na página do Hyperliquid APP, a página gerará automaticamente um endereço de carteira proxy e uma chave privada, que são gravados no navegador e usados para operações como a colocação de pedidos na página do navegador.
Você pode criar o endereço de carteira proxy necessário e a chave privada correspondente na página da API Hyperliquid:
Em seguida, pode configurar esta informação na plataforma FMZ (a interface de configuração é mencionada acima).
Endereço da carteira: o endereço da carteira conectado ao Hyperliquid (nota, não o endereço da carteira proxy). Wallet PrivateKey: A chave privada da carteira conectada ao Hyperliquid (opcional, só é necessária ao chamar APIs como transferências, pode ser deixada em branco). Chave secreta: chave privada da carteira proxy (gerada na etapa anterior, a chave privada exibida após a autorização).
Informações necessárias para configurar o objeto de troca:
Uma vez que a configuração estiver completa, podemos testá-la na plataforma FMZ. Usamos diretamente a ferramenta de depuração da plataforma FMZ para a prática de testes.
Se você estiver usando um objeto de troca Hyperliquid configurado com informações de testnet, você precisará fazer algumas operações de comutação ao usá-lo, por exemplo:
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()
}
A configuração da rede principal não requer a operação de comutação acima. As interfaces API relacionadas a produtos spot e futuros na troca Hyperliquid DEX são quase as mesmas, com apenas pequenas diferenças em detalhes.Futuros hiperlíquidosObjetos de intercâmbioInformações de configuração da rede principale oInformações de configuração da testnetpara testes.
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 da função:
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 da função:
exchange.GetRawJSON() retorna as informações de resposta da solicitação de configuração de alavancagem:
O que é que se passa?
Uma vez que os parâmetros de interface da troca são relativamente complexos e não podem ser passados usando o método de codificação de URL, quando se usaexchange.IOfunction
Os seguintes são exemplos de várias chamadas de interface.
Documentação de referência sobre hiperlíquidos: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 Comércio:174.57424.”}: err , resposta : Não é possível definir o tempo de cancelamento programado até que o volume suficiente seja negociado.
Esta função tem restrições: a conta deve atingir o nível de negociação para utilizar esta função.
Crie uma ordem 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))
}
Cancele a ordem do TWAP.
function main() {
var params = {
"type": "twapCancel",
"a": 0,
"t": 3805
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, autorize uma nova carteira 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))
}
Autorização com êxito, retorna:
O que é que se passa?
https://app.hyperliquid-testnet.xyz/API
.Retirem bens do cofre.
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, retire os bens para a carteira.
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))
}
Transferência de activos entre contratos a vista/futures (contratos perpétuos).
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
, indicando a direcção da rotação: futuros -> spot.true
, indicando a direcção de rotação: spot -> futuros.Endereço da interface WS da rede principal:
Mainnet: wss://api.hyperliquid.xyz/ws
Uma vez que a interface API do protocolo REST não tem uma interface para obter dados de transações recentes, a interface Websocket tem este canal que pode ser assinado.
Estrutura da mensagem de assinatura
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Exemplo de teste executado em ferramentas de depuração:
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")
}
Os testes acima são baseados no mais recente docker. Você precisa baixar o mais recente docker para suportar o intercâmbio Hyperliquid DEX.
Obrigado pelo apoio e por ler.