[TOC]

Récemment, la plateforme FMZ a ajouté la prise en charge d’Hyperliquid DEX, un échange décentralisé haute performance, offrant aux utilisateurs davantage d’options pour participer à des transactions décentralisées. Actuellement, la fonction de dépositaire de la plateforme FMZ a été entièrement mise à jour pour prendre en charge les transactions au comptant et à contrat perpétuel d’Hyperliquid et couvrir toutes les fonctions API du DEX.
Présentation de la plateforme Hyperliquid
Hyperliquid est une blockchain L1 haute performance optimisée à partir de zéro avec la vision de construire un système financier ouvert entièrement en chaîne. Les utilisateurs peuvent créer des applications de manière indépendante en interagissant avec des composants natifs efficaces tout en garantissant une expérience utilisateur fluide.
Les performances d’Hyperliquid L1 sont suffisantes pour prendre en charge un écosystème d’applications financières sans autorisation. Toutes les commandes, retraits d’ordres, transactions et liquidations sont effectués sur la chaîne de manière totalement transparente, avec des délais de bloc inférieurs à 1 seconde. Actuellement, la chaîne prend en charge une capacité de traitement allant jusqu’à 100 000 commandes par seconde.
Hyperliquid L1 utilise un algorithme de consensus personnalisé appelé HyperBFT, inspiré de Hotstuff et de ses successeurs. Le mécanisme de consensus et l’architecture du réseau sont optimisés de bas en haut pour répondre aux besoins d’une blockchain haute performance.
Grâce à ce guide, nous espérons vous aider à démarrer rapidement avec le trading programmatique et quantitatif d’Hyperliquid DEX sur la plateforme FMZ et à découvrir davantage d’opportunités de trading.
Protocole REST
Protocole Websocket
Sur la page Ajouter un échange de la plateforme FMZ, vous pouvez configurer des objets d’échange au comptant et à terme Hyperliquid :

Division Environnement Comme la plupart des échanges, Hyperliquid dispose d’un environnement de test.
D’après l’expérience d’utilisation réelle, le réseau principal est relativement stable et la vitesse est également bonne.
Adresse du nœud d’interface API du protocole REST correspondant :https://api.hyperliquid.xyz。
Les informations relatives à la signature des messages sont également différentes :source == "a",chainId = 42161
Le réseau de test plante souvent, mais il n’est utilisé que comme interface de test et pour se familiariser avec les fonctions de trading sur DEX.
Adresse du nœud d’interface API du protocole REST correspondant :https://api.hyperliquid-testnet.xyz。
Les informations relatives à la signature des messages sont également différentes :source == "b",chainId = 421614
Tout comme la méthode de connexion au portefeuille de la plupart des échanges DEX, vous pouvez utiliser l’application du portefeuille pour scanner le code QR pour vous connecter à Hyperliquid (basculez le portefeuille sur Arbitrum et scannez le code pour vous connecter, le réseau de test et le réseau principal sont les mêmes) .

Si vous souhaitez d’abord vous familiariser avec le testnet, vous pouvez trouver le faucet directement sur la page Hyperliquid après avoir connecté votre portefeuille à Hyperliquid.

Vous pouvez réclamer des actifs de test. Après avoir reçu l’USDC pour les tests, cliquez sur le bouton « Dépôt » pour le déposer dans Hyperliquid (il est préférable d’avoir de l’ETH pour le réseau de test Arbitrum).
Cliquez sur le bouton « Dépôt » pour effectuer un dépôt, ce qui nécessite une vérification du portefeuille et consommera un peu d’ETH sur Arbitrum.
Lors de l’exécution de transactions manuelles sur la page de l’application Hyperliquid, la page génère automatiquement une adresse de portefeuille proxy et une clé privée, qui sont enregistrées dans le navigateur et utilisées pour des opérations telles que la passation de commandes sur la page du navigateur. Si nous voulons faire du programmatique et du quantitatif Comment la transaction doit-elle obtenir ces informations de configuration ?
Vous pouvez créer l’adresse de portefeuille proxy requise et la clé privée correspondante sur la page API Hyperliquid :


1. Donnez un nom au portefeuille proxy à créer.
2. Générer l’adresse et la clé privée.
Configurer l’adresse du portefeuille proxy et la clé privée sur FMZ
Vous pouvez ensuite configurer ces informations sur la plateforme FMZ (l’interface de configuration est mentionnée ci-dessus).
Informations nécessaires à la configuration de l’objet d’échange :
Une fois la configuration terminée, nous pouvons la tester sur la plateforme FMZ. Nous utilisons directement l’outil de débogage de la plateforme FMZ pour les tests pratiques.
Si vous utilisez un objet d’échange Hyperliquid configuré avec des informations de testnet, vous devrez effectuer certaines opérations de commutation lors de son utilisation, par exemple :
function main() {
// REST协议API地址切换到测试网
exchange.SetBase("https://api.hyperliquid-testnet.xyz")
// source : a 主网 , b 测试网
exchange.IO("source", "b")
return exchange.GetAccount()
}
La configuration du réseau principal ne nécessite pas l’opération de commutation ci-dessus. Les interfaces API liées aux produits spot et à terme sur la bourse Hyperliquid DEX sont presque les mêmes, avec seulement de légères différences dans les détails. Ensuite, nous utilisonsInformations sur la configuration du réseau principaletInformations sur la configuration du réseau de testde Futures hyperliquidesÉchanger des objets à tester.
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("买3", bids[2])
Log("买2", bids[1])
Log("买1", bids[0])
Log("卖1", asks[0])
Log("卖2", asks[1])
Log("卖3", asks[2])
}

function main() {
var account = exchange.GetAccount()
return account
}

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() {
// 设置当前为全仓
exchange.IO("cross", true)
// 设置杠杆
exchange.SetMarginLevel("ETH_USD.swap", 10)
return exchange.GetRawJSON()
}

exchange.GetRawJSON() renvoie les informations de réponse de la demande de configuration de l’effet de levier :
{“status”:“ok”,“response”:{“type”:“default”}}
Les paramètres de l’interface de l’échange étant complexes, il n’est pas possible d’utiliser la méthode de codage URL pour transmettre les paramètres.exchange.IOLors de l’appel d’une fonction, seules des chaînes JSON peuvent être transmises en tant que paramètres. Voici des exemples d’appel de chaque interface.
Documentation de référence Hyperliquid : 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”:“err”,“response”:“Cannot set scheduled cancel time until enough volume traded. Required: \(1000000. Traded: \)174.57424.”}
Cette fonction a des restrictions : le compte doit atteindre le niveau de trading pour utiliser cette fonction.
Créer une commande TWAP.
function main() {
var params = {
"type": "twapOrder",
"twap": {
"a": 0,
"b": true,
"s": "1",
"r": false,
"m": 10,
"t": false
}
}
// SOL_USDT.swap , 订单量 : 1 , twapOrder 订单有头寸要求,最少100美元价值
// a : 0 , 即 SOL_USDT.swap 这个品种
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Annuler la commande TWAP.
function main() {
var params = {
"type": "twapCancel",
"a": 0,
"t": 3805
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, autorisez un nouveau portefeuille 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))
}
L’autorisation renvoie avec succès :
{“status”:“ok”,“response”:{“type”:“default”}}
https://app.hyperliquid-testnet.xyz/APImilieu.Retirer des actifs du coffre-fort.
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
Testnet, retirez les actifs vers le portefeuille.
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))
}
Transfert d’actifs entre spot/futures (contrats perpétuels).
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))
}
falseIndique le sens de rotation : futures -> spot.trueIndique le sens du transfert : spot -> futures.Adresse de l’interface WS du réseau principal :
Mainnet: wss://api.hyperliquid.xyz/ws
Étant donné que l’interface API du protocole REST ne dispose pas d’interface permettant d’obtenir des données de transaction récentes, l’interface Websocket dispose de ce canal auquel il est possible de s’abonner.
Structure du message d’abonnement
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Exemple de test exécuté dans le débogueur :
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("测试结束")
}

Les tests ci-dessus sont basés sur le dernier dépositaire. Vous devez télécharger le dernier dépositaire pour prendre en charge l’échange Hyperliquid DEX.
Merci pour votre soutien et merci de votre lecture.