마켓 (Market)
Hyperliquid ETH 무기한 선물 오더북 + BTC · ETH · S&P 500 · KOSPI
거래 — Hyperliquid TESTNET
MetaMask로 서명하는 테스트넷 거래(mock USDC). 주문마다 서명 팝업이 뜨며, 키는 저장되지 않습니다.
불러오는 중…
불러오는 중…
기술 노트
각 항목이 실제로 무엇을 보여주고 어떻게 동작하는지 — 위 카드보다 자세한 기술 설명입니다.
하이퍼리퀴드 트레이딩라이브
목적: 실제 퍼페추얼 선물 DEX 오더북을 상대로 한 거래 — 특히 Hyperliquid의 독특한 agent-wallet 위임 서명 모델까지 포함합니다. 장난감 시뮬레이션이 아니라, 테스트넷 위에서 실제 운영 중인 거래소의 서명 프로토콜과 직접 상호작용합니다.
동작 방식: 공개 오더북(/api/orderbook)은 Hyperliquid 메인넷 /info REST 엔드포인트를 서버에서 프록시하며 5초마다 폴링합니다. 거래를 위해서는 MetaMask 지갑이 EIP-712 approveAgent 메시지에 한 번 서명해, 로컬에서 생성된 키(localStorage에만 저장)를 거래용 "agent"로 승인합니다 — 이후의 모든 주문/취소/레버리지 변경은 이 agent 키가 @nktkas/hyperliquid SDK로 서명하며, 추가 지갑 팝업이 없습니다. 이 agent는 거래는 가능하지만 자금 출금은 불가능합니다. 모든 거래는 모의 USDC로 Hyperliquid 테스트넷에서 이루어지고, 시세 표시만 메인넷 데이터를 씁니다.
관련 코드:
"""Hyperliquid Trading PoC — a tiny limit-order-book matching engine.
Illustrates the core mechanism: bids/asks sorted by price-time priority, matched on crossing.
"""
from dataclasses import dataclass, field
from itertools import count
_order_id = count(1)
@dataclass
class Order:
side: str # "buy" or "sell"
price: float
size: float
id: int = field(default_factory=lambda: next(_order_id))
class OrderBook:
def __init__(self):
self.bids: list[Order] = [] # highest price first
self.asks: list[Order] = [] # lowest price first
def submit(self, side: str, price: float, size: float) -> list[str]:
order = Order(side, price, size)
fills = []
book = self.asks if side == "buy" else self.bids
book.sort(key=lambda o: o.price if side == "sell" else -o.price)
while order.size > 0 and book:
best = book[0]
crosses = price >= best.price if side == "buy" else price <= best.price
if not crosses:
break
traded = min(order.size, best.size)
fills.append(f" fill: {traded} @ {best.price} (order #{best.id} vs #{order.id})")
order.size -= traded
best.size -= traded
if best.size <= 0:
book.pop(0)
if order.size > 0:
(self.bids if side == "buy" else self.asks).append(order)
return fills
if __name__ == "__main__":
ob = OrderBook()
print("resting ask: sell 2.0 @ 100")
ob.submit("sell", 100, 2.0)
print("resting ask: sell 1.0 @ 101")
ob.submit("sell", 101, 1.0)
print("\nincoming: buy 2.5 @ 101 (crosses the book)")
for line in ob.submit("buy", 101, 2.5):
print(line)
print(f"\nremaining asks: {[(o.price, o.size) for o in ob.asks]}")
print(f"remaining bids: {[(o.price, o.size) for o in ob.bids]}")