avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

만든 날짜: 2025-01-15 13:43:15, 업데이트 날짜: 2025-01-16 09:52:43
comments   2
hits   3114

[TOC]

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

머리말

최근 FMZ 플랫폼은 고성능 분산형 거래소인 Hyperliquid DEX에 대한 지원을 추가하여 사용자에게 분산형 거래에 참여할 수 있는 더 많은 옵션을 제공합니다. 현재 FMZ 플랫폼의 보관 기능은 Hyperliquid의 현물 및 영구 계약 거래를 지원하고 DEX의 모든 API 기능을 포함하도록 완전히 업데이트되었습니다.

하이퍼리퀴드 플랫폼 개요

하이퍼리퀴드는 완전한 온체인 개방형 금융 시스템을 구축한다는 비전을 가지고 처음부터 최적화된 고성능 L1 블록체인입니다. 사용자는 원활한 최종 사용자 경험을 보장하면서 효율적인 네이티브 구성 요소와 상호 작용하여 독립적으로 애플리케이션을 만들 수 있습니다.

Hyperliquid L1의 성능은 허가 없이도 금융 애플리케이션을 구동할 수 있는 생태계를 지원하기에 충분합니다. 모든 주문, 주문 철회, 거래 및 청산은 완전히 투명한 방식으로 체인상에서 완료되며 블록 지연은 1초 미만입니다. 현재 이 체인은 초당 최대 100,000개의 주문을 처리할 수 있는 용량을 지원합니다.

Hyperliquid L1은 Hotstuff와 그 후속 제품에서 영감을 받은 HyperBFT라는 맞춤형 합의 알고리즘을 사용합니다. 합의 메커니즘과 네트워크 아키텍처는 모두 고성능 블록체인의 요구 사항을 충족하도록 하향식으로 최적화되었습니다.

이 가이드를 통해 FMZ 플랫폼에서 Hyperliquid DEX의 프로그래밍 방식 및 양적 거래를 빠르게 시작하고 더 많은 거래 기회를 발견하는 데 도움이 되기를 바랍니다.

연습 내용

REST 프로토콜

  • 시장 인터페이스 연습.
  • 거래 인터페이스 연습(주문하기, 주문 취소)
  • 거래 관련 쿼리 관행(계정, 주문)
  • 기타 기능(현물 거래, 계약 이전, 금고 인출, 지갑으로 자산 이체 등)

웹소켓 프로토콜

  • 교환 정보 구독 관행(REST 인터페이스에는 Trades 인터페이스가 없으며 Websocket 인터페이스로 보완됨)

Hyperliquid

  • 거래 유형 분류 Hyperliquid는 거래 종류에 따라 현물 계약과 영구 계약으로 나뉩니다. FMZ 플랫폼의 아키텍처에 따라 FMZ 플랫폼에서 Hyperliquid 현물 거래 객체와 Hyperliquid 선물 거래 객체로 나뉩니다. 이들은 각각 Hyperliquid DEX의 다양한 종류에 해당합니다.

FMZ 플랫폼의 거래소 추가 페이지에서 Hyperliquid 현물 및 선물 거래 객체를 구성할 수 있습니다.

https://www.fmz.com/m/platforms/add

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

  • 환경부 대부분의 거래소와 마찬가지로 Hyperliquid에도 테스트 환경이 있습니다.

    • 메인넷 APP 주소:

    https://app.hyperliquid.xyz

    실제 사용 경험에 따르면, 주요 네트워크는 비교적 안정적이고 속도도 좋습니다. 해당 REST 프로토콜 API 인터페이스 노드 주소:https://api.hyperliquid.xyz。 메시지 서명과 관련된 정보도 다릅니다.source == "a"chainId = 42161

    • 테스트 네트워크 APP 주소:

    https://app.hyperliquid-testnet.xyz

    테스트 네트워크는 종종 작동이 중단되지만, 이는 테스트 인터페이스로만 사용되며 DEX의 거래 기능에 익숙해지는 데 사용됩니다. 해당 REST 프로토콜 API 인터페이스 노드 주소:https://api.hyperliquid-testnet.xyz。 메시지 서명과 관련된 정보도 다릅니다.source == "b"chainId = 421614

지갑 연결, 로그인 및 구성 정보

대부분 DEX 거래소의 지갑 연결 방식과 마찬가지로, 지갑 APP를 사용하여 QR 코드를 스캔하여 Hyperliquid에 연결할 수 있습니다(지갑을 Arbitrum으로 전환하고 코드를 스캔하여 로그인, 테스트 네트워크와 메인 네트워크는 동일합니다) .

  • Hyperliquid에 대한 지갑 연결

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

  • Testnet Faucet(USDC 자산 입금 테스트)

먼저 테스트넷에 대해 알아보고 싶다면 지갑을 Hyperliquid에 연결한 후 Hyperliquid 페이지에서 바로 faucet을 찾을 수 있습니다.

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

테스트 자산을 청구할 수 있습니다. 테스트를 위해 USDC를 받은 후 “입금” 버튼을 클릭하여 Hyperliquid에 입금합니다(Arbitrum 테스트 네트워크를 위해 ETH를 약간 보유하는 것이 가장 좋습니다).

  • 메인넷에 USDC 자산 입금

“입금” 버튼을 클릭하여 입금합니다. 입금에는 지갑 확인이 필요하며 Arbitrum에서 약간의 ETH가 소모됩니다.

  • 프록시 지갑 구성 생성

Hyperliquid APP 페이지에서 수동 거래를 수행할 때, 페이지는 자동으로 프록시 지갑 주소와 개인 키를 생성하며, 이는 브라우저에 기록되고 브라우저 페이지에서 주문을 하는 것과 같은 작업에 사용됩니다. 프로그래밍 방식과 양적 작업을 수행하려는 경우 거래에서 이러한 구성 정보를 얻으려면 어떻게 해야 합니까?

Hyperliquid API 페이지에서 필요한 프록시 지갑 주소와 해당 개인 키를 생성할 수 있습니다.

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

  • 1. 생성할 프록시 지갑의 이름을 지정하세요.

  • 2. 주소와 개인키를 생성합니다.

    1. Hyperliquid에 연결된 지갑을 사용하여 프록시 지갑을 인증합니다.
  • FMZ에서 프록시 지갑 주소와 개인 키 구성

그런 다음 FMZ 플랫폼에서 이 정보를 구성할 수 있습니다(구성 인터페이스는 위에 언급되어 있습니다).

https://www.fmz.com/m/platforms/add

  • 지갑 주소: Hyperliquid에 연결된 지갑 주소입니다(프록시 지갑 주소가 아닙니다).
  • 지갑 개인 키: Hyperliquid에 연결된 지갑 개인 키입니다(선택 사항이며, 전송 등의 API를 호출할 때만 필요하며, 비워둘 수 있음).
  • 비밀 키: 프록시 지갑 개인 키(이전 단계에서 생성, 인증 후 개인 키 표시).

FMZ에서의 하이퍼리퀴드 연습

교환 객체를 구성하는 데 필요한 정보:

  • 지갑 주소는 사용자 거래 정보를 쿼리하는 데 사용됩니다.
  • Wallet PrivateKey는 이체, 송금 및 기타 작업에 사용됩니다.
  • 비밀 키는 거래 관련 작업에 사용됩니다.

구성이 완료되면 FMZ 플랫폼에서 테스트할 수 있습니다. FMZ 플랫폼의 “디버깅 도구”를 직접 사용하여 테스트 연습을 합니다.

https://www.fmz.com/m/debug

테스트넷 정보로 구성된 Hyperliquid 교환 객체를 사용하는 경우 사용 시 다음과 같이 일부 전환 작업을 수행해야 합니다.

function main() {
    // REST协议API地址切换到测试网
    exchange.SetBase("https://api.hyperliquid-testnet.xyz")

    // source : a 主网 , b 测试网
    exchange.IO("source", "b")

    return exchange.GetAccount()
}

메인넷 구성에는 위의 스위칭 작업이 필요하지 않습니다. Hyperliquid DEX 거래소의 현물 및 선물 상품과 관련된 API 인터페이스는 거의 동일하며 세부 사항에 약간의 차이만 있습니다. 다음으로,메인넷 구성 정보그리고테스트넷 구성 정보하이퍼리퀴드 선물물건을 교환하여 테스트합니다.

다양한 정보

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) +  "`")
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

주문서 데이터

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])
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

계정 자산

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

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

주문 및 확인

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) +  "`")
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

모든 주문 취소

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) +  "`")
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

레버리지 전환, 교차 마진/격리 마진 전환

function main() {
    // 设置当前为全仓
    exchange.IO("cross", true)

    // 设置杠杆
    exchange.SetMarginLevel("ETH_USD.swap", 10)

    return exchange.GetRawJSON()
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

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)

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 주문을 생성합니다.

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 주문을 취소합니다.

function main() {
    var params = {
        "type": "twapCancel",
        "a": 0,
        "t": 3805
    }

    return exchange.IO("api", "POST", "/exchange", null, JSON.stringify(params))
}

approveAgent

테스트넷에서 새로운 프록시 지갑을 승인합니다.

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

금고에서 자산을 인출합니다.

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

테스트넷, 지갑으로 자산 출금.

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

현물/선물 간 자산 이전(무기한 계약).

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거래 방향을 나타냅니다: 현물 -> 선물.

웹소켓 인터페이스 사용법

메인 네트워크 WS 인터페이스 주소:

Mainnet: wss://api.hyperliquid.xyz/ws

REST 프로토콜 API 인터페이스에는 최근 거래 데이터를 얻기 위한 인터페이스가 없으므로, Websocket 인터페이스에는 구독 가능한 채널이 있습니다.

구독 메시지 구조

{
    "method": "subscribe", 
    "subscription": {
        "type": "trades", 
        "coin": "SOL"
    } 
}

디버거에서 실행되는 테스트의 예:

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("测试结束")
}

DEX Exchange 양적 연습 (2) - Hyperliquid 사용자 가이드

END

위의 테스트는 최신 커스터디언을 기반으로 합니다. Hyperliquid DEX 거래소를 지원하려면 최신 커스터디언을 다운로드해야 합니다.

여러분의 지지에 감사드리며, 읽어주셔서 감사드립니다.