Récemment, la plateforme FMZ a ajouté la prise en charge de Hyperliquid DEX, un échange décentralisé à haute performance, offrant aux utilisateurs plus d'options pour participer aux transactions décentralisées.
Vue d'ensemble de la plateforme hyperliquide
Hyperliquid est une blockchain L1 haute performance optimisée à partir de zéro, avec pour vision de créer un système financier ouvert entièrement en chaîne.
Les performances de Hyperliquid L1
sont suffisantes pour prendre en charge un écosystème d'applications financières sans autorisation. Tous les ordres, retraits, transactions et liquidations sont effectués en chaîne de manière complètement transparente, avec une latence de bloc inférieure à 1 seconde. Hyperliquid L1 utilise un algorithme de consensus personnalisé appelé HyperBFT, qui s'inspire de Hotstuff et de ses algorithmes ultérieurs.
Grâce à ce guide, nous espérons vous aider à démarrer rapidement avec le trading programmatique et quantitatif sur Hyperliquid DEX sur la plateforme FMZ et à découvrir plus d'opportunités de trading.
Protocole REST
Protocole Websocket
Sur la page Ajouter une plateforme de la plateforme FMZ, vous pouvez configurer des objets d'échange au comptant et à terme Hyperliquid:
Adresse de l'application principale:
Dans l'utilisation réelle, le réseau principal est relativement stable et a une bonne vitesse.
L'adresse du nœud d'interface API du protocole REST correspondant est:https://api.hyperliquid.xyz
- Je ne sais pas.
L'information relative à la signature du message est également différente:source == "a",chainId = 42161
.
Adresse de l'APP du réseau d'essai:
Le réseau de test tombe souvent en panne, mais il est uniquement utilisé comme interface de test et pour se familiariser avec les fonctions de trading sur DEX.
L'adresse du nœud d'interface API du protocole REST correspondant est:https://api.hyperliquid-testnet.xyz
- Je ne sais pas.
L'information relative à la signature du message est également différente:source == "b",chainId = 421614
.
Tout comme la méthode de connexion de portefeuille de la plupart des échanges DEX, vous pouvez utiliser l'application de portefeuille pour scanner le code QR pour vous connecter à Hyperliquid (switch le portefeuille vers Arbitrum et scannez le code pour vous connecter, le réseau de test et le réseau principal sont les mêmes).
Vous pouvez réclamer des actifs de test. Après avoir reçu l'USDC pour le test, cliquez sur le bouton
Cliquez sur le bouton
Lorsque vous effectuez des transactions manuelles sur la page Hyperliquid APP, la page générera 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.
Vous pouvez créer l'adresse de portefeuille proxy requise et la clé privée correspondante sur la page Hyperliquid API:
Ensuite, vous pouvez configurer ces informations sur la plateforme FMZ (l'interface de configuration est mentionnée ci-dessus).
Adresse du portefeuille: l'adresse du portefeuille connecté à Hyperliquid (note, pas l'adresse du portefeuille proxy). Wallet PrivateKey: La clé privée du portefeuille connectée à Hyperliquid (facultative, uniquement nécessaire lors de l'appel d'API telles que les transferts, elle peut être laissée vierge). Clé secrète: clé privée de portefeuille proxy (générée à l'étape précédente, la clé privée affichée après l'autorisation).
Informations requises pour configurer 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 la pratique des tests.
Si vous utilisez un objet d'échange Hyperliquid configuré avec des informations testnet, vous devrez effectuer certaines opérations de commutation lors de son utilisation, par exemple:
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 configuration du mainnet ne nécessite pas l'opération de commutation ci-dessus. Les interfaces API relatives aux produits au comptant et à terme dans l'échange Hyperliquid DEX sont presque les mêmes, avec seulement de légères différences de détails.Comptes à terme hyperliquidesObjectifs d'échangeinformations sur la configuration du réseau principalet leles informations relatives à la configuration du testnetpour les essais.
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
}
Résultats des fonctions:
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()
}
Résultats des fonctions:
exchange.GetRawJSON() renvoie les informations de réponse de la demande de réglage du levier:
Je ne sais pas si je peux le faire.
Étant donné que les paramètres d'interface de l'échange sont relativement complexes et ne peuvent pas être transmis à l'aide de la méthode d'encodage d'URL, lors de l'utilisationexchange.IOfunction
Les paramètres suivants sont des exemples de divers appels d'interface.
documentation de référence pour l'hyperliquide: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 On a échangé:174.57424.”}: err , response : Impossible de définir l'heure d'annulation prévue jusqu'à ce que suffisamment de volume soit échangé.
Cette fonction est limitée: le compte doit atteindre le niveau de négociation pour utiliser cette fonction.
Créez un ordre 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))
}
Annuler l'ordre du 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))
}
Autorisation réussie, retour:
Je ne sais pas si je peux le faire.
https://app.hyperliquid-testnet.xyz/API
.Retirez les actifs du coffre.
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 au 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 les contrats à terme et les contrats à terme (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))
}
false
, indiquant la direction de rotation: futures -> spot.true
, indiquant la direction de rotation: spot -> futures.Adresse de l'interface WS du réseau principal:
Le réseau principal: wss://api.hyperliquid.xyz/ws
Étant donné que l'interface API du protocole REST n'a pas d'interface pour obtenir des données de transaction récentes, l'interface Websocket a ce canal qui peut être souscrit.
Structure du message d'abonnement
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
Exemple de test effectué dans les outils de débogage:
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")
}
Les tests ci-dessus sont basés sur le dernier docker. Vous devez télécharger le dernier docker pour prendre en charge l'échange Hyperliquid DEX.
Merci pour votre soutien et merci de lire.