序文
最近、FMZ プラットフォームは高性能分散型取引所である Hyperliquid DEX のサポートを追加し、ユーザーに分散型取引に参加するためのより多くのオプションを提供します。現在、FMZ プラットフォームのカストディアン機能は、Hyperliquid のスポットおよび永久契約取引をサポートし、DEX のすべての API 機能をカバーできるように完全に更新されています。
Hyperliquid プラットフォームの概要
Hyperliquid は、完全にオンチェーンのオープンな金融システムを構築するというビジョンのもと、ゼロから最適化された高性能 L1 ブロックチェーンです。ユーザーは、効率的なネイティブ コンポーネントと対話しながら、スムーズなエンド ユーザー エクスペリエンスを確保しながら、独自にアプリケーションを作成できます。
Hyperliquid L1 のパフォーマンスは、金融アプリケーションの許可のないエコシステムをサポートするのに十分です。すべての注文、注文の引き出し、取引、清算は、ブロックの遅延が 1 秒未満で、完全に透明な方法でオンチェーンで完了します。現在、このチェーンは 1 秒あたり最大 100,000 件の注文の処理能力をサポートしています。
Hyperliquid L1 は、Hotstuff およびその後継に触発された HyperBFT と呼ばれるカスタム コンセンサス アルゴリズムを使用します。コンセンサス メカニズムとネットワーク アーキテクチャの両方が、高性能ブロックチェーンのニーズを満たすようにボトムアップで最適化されています。
このガイドを通じて、FMZ プラットフォームで Hyperliquid DEX のプログラム取引と定量取引をすぐに開始し、より多くの取引機会を発見できるようにお手伝いしたいと考えています。
練習内容
REST プロトコル
- 市場インターフェースの実践。
- 取引インターフェースの練習(注文の発注、注文のキャンセル)。
- トランザクション関連のクエリの実践 (アカウント、注文)。
- その他の機能(スポット、契約転送、金庫からの引き出し、ウォレットへの資産の転送など)。
Websocket プロトコル
- 取引所情報のサブスクリプションの実践(REST インターフェースには Trades インターフェースがないため、Websocket インターフェースによって補完されます)
Hyperliquid
-
取引種別分類
Hyperliquid は、取引の種類に基づいてスポット契約と永久契約に分かれています。FMZ プラットフォームのアーキテクチャに基づいて、FMZ プラットフォーム上の Hyperliquid スポット取引オブジェクトと Hyperliquid 先物取引オブジェクトにも分かれています。これらはそれぞれ Hyperliquid DEX の異なる種類に対応します。FMZ プラットフォームの [取引所の追加] ページで、Hyperliquid スポットおよび先物取引所オブジェクトを設定できます。
-
環境部門
ほとんどの取引所と同様に、Hyperliquid にはテスト環境があります。-
メインネットAPPアドレス:
実際の使用経験から言うと、メインネットワークは比較的安定しており、速度も良好です。
対応する REST プロトコル API インターフェイス ノード アドレス:https://api.hyperliquid.xyz。
メッセージの署名に関連する情報も異なります。source == "a",chainId = 42161 -
テストネットワーク APP アドレス:
テスト ネットワークは頻繁にクラッシュしますが、テスト インターフェイスとして、また DEX の取引機能に慣れるためにのみ使用されます。
対応する REST プロトコル API インターフェイス ノード アドレス:https://api.hyperliquid-testnet.xyz。
メッセージの署名に関連する情報も異なります。source == "b",chainId = 421614
-
ウォレットの接続、ログイン、設定情報
ほとんどのDEX取引所のウォレット接続方法と同様に、ウォレットアプリを使用してQRコードをスキャンし、Hyperliquidに接続できます(ウォレットをArbitrumに切り替えてコードをスキャンしてログインします。テストネットワークとメインネットワークは同じです) 。
-
Hyperliquidへのウォレット接続
-
テストネット フォーセット (USDC 資産の入金テスト)
最初にテストネットに慣れたい場合は、ウォレットを Hyperliquid に接続した後、Hyperliquid ページで直接 Faucet を見つけることができます。
テスト資産を請求できます。テスト用の USDC を受け取ったら、「入金」ボタンをクリックして Hyperliquid に入金します (Arbitrum テスト ネットワーク用に ETH をいくつか用意しておくのが最適です)。
-
USDC資産をメインネットに預ける
「入金」ボタンをクリックして入金します。このためにはウォレットの確認が必要で、Arbitrum で少量の ETH が消費されます。
-
プロキシウォレット設定を作成する
Hyperliquid APPページで手動取引を実行すると、ページはプロキシウォレットアドレスと秘密鍵を自動的に生成し、ブラウザに記録され、ブラウザページで注文を行うなどの操作に使用されます。プログラム的かつ定量的な取引を行いたい場合は、トランザクションはこの構成情報をどのように取得する必要がありますか?
必要なプロキシ ウォレット アドレスと対応する秘密鍵は、Hyperliquid API ページで作成できます。
-
- 作成するプロキシウォレットに名前を付けます。
-
- アドレスと秘密鍵を生成します。
-
- Hyperliquid に接続されたウォレットを使用してプロキシウォレットを承認します。
-
-
FMZでプロキシウォレットアドレスと秘密鍵を設定する
その後、この情報を FMZ プラットフォームで設定できます (設定インターフェイスについては上記で説明しました)。
- ウォレット アドレス: Hyperliquid に接続されたウォレット アドレス (プロキシ ウォレット アドレスではないことに注意してください)。
- ウォレットの秘密鍵: Hyperliquid に接続されたウォレットの秘密鍵 (オプション、転送などの API を呼び出す場合にのみ必要、空白のままにすることができます)。
- 秘密キー: プロキシ ウォレットの秘密キー (前の手順で生成され、認証後に表示される秘密キー)。
FMZ でのハイパーリキッドの実践
交換オブジェクトを構成するために必要な情報:
- ウォレットアドレスはユーザーの取引情報を照会するために使用されます
- ウォレットのプライベートキーは、送金、転送、その他の操作に使用されます
- 秘密鍵は取引関連の操作に使用されます
設定が完了したら、FMZ プラットフォームでテストできます。テストの練習には、FMZ プラットフォームの「デバッグ ツール」を直接使用します。
テストネット情報で構成された Hyperliquid 交換オブジェクトを使用している場合は、使用時にいくつかの切り替え操作を行う必要があります。次に例を示します。
javascript
function main() {
// REST协议API地址切换到测试网
exchange.SetBase("https://api.hyperliquid-testnet.xyz")
// source : a 主网 , b 测试网
exchange.IO("source", "b")
return exchange.GetAccount()
}
メインネット構成では上記の切り替え操作は必要ありません。Hyperliquid DEX取引所のスポットおよび先物商品に関連するAPIインターフェースは、細部にわずかな違いがあるだけで、ほぼ同じです。次に、メインネット構成情報そしてテストネット設定情報の 超流動性先物テストするオブジェクトを交換します。
品種情報
javascript
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) + "`")
}
注文書データ
javascript
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])
}
アカウント資産
javascript
function main() {
var account = exchange.GetAccount()
return account
}
注文して確認する
javascript
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) + "`")
}
すべての注文をキャンセル
javascript
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) + "`")
}
レバレッジの切り替え、クロスマージン/分離マージンの切り替え
javascript
function main() {
// 设置当前为全仓
exchange.IO("cross", true)
// 设置杠杆
exchange.SetMarginLevel("ETH_USD.swap", 10)
return exchange.GetRawJSON()
}
exchange.GetRawJSON() は、レバレッジ設定リクエストの応答情報を返します。
{"status":"ok","response":{"type":"default"}}
その他のインターフェース
交換のインターフェース パラメータは複雑なため、URL エンコード方式を使用してパラメータを渡すことはできません。exchange.IO関数を呼び出す場合、パラメータとして渡すことができるのは JSON 文字列のみです。以下は各インターフェースを呼び出す例です。
Hyperliquid リファレンスドキュメント: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
Schedule Cancel (dead man's switch)
javascript
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."}
この機能には制限があります。この機能を使用するには、アカウントが取引レベルに達している必要があります。
twapOrder
TWAP 注文を作成します。
javascript
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))
}
twapCancel
TWAP注文をキャンセルします。
javascript
function main() {
var params = {
"type": "twapCancel",
"a": 0,
"t": 3805
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
approveAgent
テストネット、新しいプロキシウォレットを承認します。
javascript
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))
}
承認が正常に返されます:
{"status":"ok","response":{"type":"default"}}
- API プロキシ ウォレットを作成します。0xAAAA は生成されたウォレット アドレスです (単なる例です)。生成時に対応する秘密鍵を保存します。
- 「test02」は API プロキシ ウォレット名です。生成されたキー ペアは、hyperliquid APP ページに表示されます。
https://app.hyperliquid-testnet.xyz/API真ん中。
vaultTransfer
金庫から資産を引き出します。
javascript
function main() {
var params = {
"type": "vaultTransfer",
"vaultAddress": "0xAAA",
"isDeposit": true,
"usd": 5000000
}
return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}
- "usd": 5000000 は 5 USDC を意味します。
- 「0xAAA」: ボールトアドレスです。
- "isDeposit": true、入金と預金を制御します。
withdraw3
テストネット、資産をウォレットに引き出します。
javascript
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))
}
- 現在のウォレットアドレス「0xAAA」に資金を引き出します。
usdClassTransfer
スポット/先物(永久契約)間の資産の移転。
javascript
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))
}
- パラメータ「toPerp」は次のように設定されます。
false回転の方向を示します: 先物 -> スポット。 - パラメータ「toPerp」は次のように設定されます。
true転送方向を示します: スポット -> 先物。
Websocketインターフェースの使用
メインネットワークWSインターフェースアドレス:
Mainnet: wss://api.hyperliquid.xyz/ws
REST プロトコル API インターフェースには最新のトランザクション データを取得するためのインターフェースがないため、Websocket インターフェースにはサブスクライブ可能なこのチャネルがあります。
サブスクリプションメッセージの構造
{
"method": "subscribe",
"subscription": {
"type": "trades",
"coin": "SOL"
}
}
デバッガーで実行されたテストの例:
javascript
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
上記のテストは最新のカストディアンに基づいています。Hyperliquid DEX 取引所をサポートするには、最新のカストディアンをダウンロードする必要があります。
ご支援、そしてご愛読ありがとうございました。
- 1













