メインコンテンツへスキップ

HyperliquidでHIP-4予測市場を取引する方法

更新日:
2026年6月15日

読了時間:19分

概要

HIP-4は2026年5月2日にHyperliquidメインネット上でローンチされ、USDC建てで0または1に決済される完全担保型のバイナリーアウトカム市場が追加されました。これらの市場は、パーペチュアルやスポット市場と同様にHyperCore上に存在し、他のすべてのHyperliquid資産で使用されているものと同じCLOBインフラストラクチャ、WebSocketストリーム、およびデータエンドポイントを共有しています。 このガイドでは、まずデータモデルについて解説し、その後、Hyperliquid API(Quicknodeが提供するHyperliquid向けのゼロカストディ型RESTビルダーAPI)を使用して、市場の発見、オーダーブックの読み取りとストリーミング、および取引の執行について順を追って説明します。


要約
  • HIP-4マーケットは、USDC建てで0または1で決済される「YES/NO」型のバイナリー契約であり、HyperCore CLOB上で取引手数料無料で取引されます。
  • 各側面は、 #N コイン(例えば、 #20 「YES」の場合と #21 (NOの場合)において allMids、データセット、およびすべてのストリーミングAPI
  • Quicknodeは、TypeScript、Python、Go、Rust向けのSDKに加えHyperliquid API(ゼロカストディ型のRESTビルダーAPI)およびgRPCストリーミングエンドポイントの開発・保守を行っています。
  • このガイドの完全なソースコードは、qn-guide-examplesにあります。
  • SQL Explorerを使えば、標準の SQL を使用して HIP-4 の過去の取引や注文を照会できます

主な業務内容

  • HIP-4データモデルについて理解する: #N コイン表記法、 outcomeMeta, allMids、および「trades」「orders」「book-updates」の各データセット
  • プロジェクトを設定し、hyperliquidapi.com の REST API に接続します
  • ビルダー手数料を承認する(ウォレットごとに1回限り)
  • 活発な予測市場を発見し、YES/NO側の動向を分析する
  • 両側の注文板をリアルタイムで確認・閲覧できます
  • USDCでHyperliquidのスポット口座に入金する
  • 指値注文や成行注文の発注、保留中の注文の取消し、およびよくあるエラーへの対処

必要なもの

  • Node.js 20以降 およびパッケージマネージャー(npm, pnpm、または )
  • Hyperliquidウォレットの秘密鍵、および取引を行うためのスポット残高に少なくともある程度のUSDCがあること
  • TypeScript の知識および予測市場の基礎的な概念の理解

HIP-4アウトカム・マーケットとは何か?

HIP-4は、HyperCoreにバイナリー・アウトカム・マーケットを導入します。各マーケットでは、「はい/いいえ」で答える質問が提示されます(例:「満期時点でBTCは79,980米ドルを上回るか?」)。 トレーダーはUSDCを担保として「YES」または「NO」のポジションを購入します。満期時には、勝った側は1単位あたり1 USDCで決済され、負けた側は0で決済されます。「YES」トークンの価格は、その時点における当該事象が発生する市場が想定する確率を表しています。

HIP-4の市場動向:

  • オンチェーンかつパーミッションレス。ブリッジやカストディアンを介さず、Hyperliquid L1上で直接決済されます。
  • 建玉開設手数料は無料です。パーペチュアル先物や現物取引とは異なり、HIP-4では建玉開設手数料はかかりません(ビルダー手数料は引き続き適用されます)。
  • 他のすべてと同じCLOB上にあります。同じL2ブックエンドポイント、WebSocketストリーム、およびフィルデータセットが、HIP-4を含むすべての資産を網羅しています。すでにHyperliquidデータをクエリしている場合は、ほぼ準備は整っています。

Quicknode Hyperliquid 開発者向けツールキット

コードを書く前に、QuicknodeがHyperliquidに対してどのような機能を提供しているかを把握しておくと、構築したいものに合わせて適切なツールを選べるようになります。

ツール得られるものリンク
Hyperliquid APIQuicknodeが開発した、Hyperliquid向けのゼロカストディ型RESTビルダーAPIhyperliquidapi.com
Hyperliquid SDK(TypeScript、Python、Go、Rust)完全な取引およびデータ用SDK:注文、ストリーム、口座の状態Hyperliquid SDK
データセット以下のような、さまざまな種類のブロックチェーンや取引所のイベントを含むデータストリーム 取引, 注文、および 書籍の最新情報 gRPC および JSON-RPC/WebSocket API 経由でドキュメント
WebSocket / JSON-RPC APIリアルタイムの購読(書籍の更新情報, allMids, 取引) およびステートクエリドキュメント
gRPC ストリーミングブロックレベルのオーダーブックおよび取引データへの最低遅延経路であり、高頻度取引戦略に最適ですドキュメント
情報エンドポイントスナップショットクエリ: outcomeMeta, allMids, l2Book, 情報交換センター州ドキュメント
SQL Explorerインデックス付きテーブルに対する履歴クエリ: hyperliquid_trades, hyperliquid_orders、その他35名以上sql-explorer

このガイドでは、 Hyperliquid API すべての取引業務および Hyperliquid 公開情報 API 市場データのクエリ用です。その結果、依存関係が最小限のセットアップが実現されます。単に viem ローカルでの署名および ws WebSocketストリーミング用。

データモデル

コードを書く前に、HIP-4のデータモデルを理解しておくことが重要です。HIP-4のデータは、他のすべてのHyperliquidアセットと同様に、同じAPIやデータセットを通じて処理されます。唯一の違いは、 #N コイン表記法。このセクションでは、コードを書く前に知っておくべき3つのポイントについて解説します。

市場の特性と発見

HIP-4の各アウトカムサイドは、先頭に #、例えば #20 (はい) そして #21 (NO)。これにより、アウトカム・マーケットのコインは、パーペチュアル(接頭辞なし)やスポット・トークン(@N または xyz: 接頭辞)。整数 N は、エンコーディングを用いて資産の数値IDから導出されます N = 10 * outcomeIndex + sideIndex. その ハイパーリキッド・アセットID この仕様書には、マッピングの全範囲が網羅されています。

2つの指標を見れば、どの活発な市場についても全体像を把握することができます:

outcomeMeta 市場の定義を返します:

outcomeMetaの応答
{
"outcomes": [
{
"outcome": 3,
"name": "Recurring",
"description": "class:priceBinary|underlying:BTC|expiry:20260506-0600|targetPrice:80930|period:1d",
"sideSpecs": [
{ "name": "Yes" },
{ "name": "No" }
]
}
],
"questions": []
}
フィールド説明
outcomes[].outcomeマーケットインスタンスを識別する、インクリメントされる整数
outcomes[].name市場タイプのラベル(例: 「定期的」)
outcomes[].descriptionパイプ区切りのキー:value ペア: クラス, 基礎となる, 有効期限 (フォーマット YYYYMMDD-HHMM), 目標価格, 期間
outcomes[].sideSpecs各辺に1つの要素を持つ配列。 sideSpecs[0] は「はい」です、 sideSpecs[1] NOです
質問ノンバイナリー型市場用に予約されており、価格バイナリー市場の場合は空欄となる

allMids 取引所上のすべての資産について、リアルタイムのミッド価格を表示します。HIP-4市場は次のように表示されます。 #N 通常の「perp」や「spot」のティッカーと並んで表示されるキー:

allMidsの回答(抜粋)
{
"BTC": "96423.0",
"ETH": "1823.5",
"#20": "0.47",
"#21": "0.53"
}

で始まるキーをフィルタリング # アウトカム・マーケットのミッド値を抽出するため。WebSocketによるネイティブサブスクリプションを allMids 連続的なリアルタイムストリームと同じデータを提供します(これについては リアルタイムの注文板情報の更新をストリーミング配信).

データにおけるアクティビティの様子

注文が入り、売買が成立すると、Quicknodeは ハイパーリキッド・データセット その活動を #N 全文を通じての識別子:

取引: 各取引行では、 コイン: "#N". その feeToken field は +N 表記法(例えば、 +20)、および 手数料 は常に "0.0" HIP-4の未約定注文には手数料がかからないためです。

注文: 注文レコードでは同じものが使用されます コイン: "#N" 表記。マッチしたアウトカム取引の両側は、いずれも買い注文として表示されます(面:「B」).

書籍の最新情報: 各イベントには、 raw_book_diff フィールド: {"new": {"sz": "..."}} (新規注文が入りました)、 「削除」 (注文がキャンセルされたか、約定した)、または {"update": {"origSz": "...", "newSz": "..."}} (インプレースでのサイズ変更、HIP-4のみ)。ローカルのオーダーブックのレプリカを維持するためにこれらを使用します。

l2-book そして l4-book: コインごとに検索可能な、集計済みおよび未加工の帳簿スナップショット。パス "#N" 特定の結果の面に関するデータを取得するためのコインフィルターとして。

価格の読み方:インプライド・プロバビリティ

「YES」と「NO」は互いに補完的な結果であるため、これらの中間価格の合計は約1.0となる:

YES mid + NO mid ≈ 1.0

「YES」の真ん中 0.47 とは、市場がその事象が発生する確率を47%と想定していることを意味する。NOの中間値は 0.53 これは53%を意味する。1.0からのわずかな乖離は、スプレッドや両者間の一時的な裁定機会を反映している。

その #N APIの生のレスポンスに含まれるアウトカム市場のデータを区別する唯一の要素は、コイン表記です。その対応関係を理解すれば、読み取りは GET /markets hyperliquidapi.com からのデータとフィルタリング allMids ~のために # 必要なのはキーだけです。この基礎が身についたら、このガイドの残りの部分は実践的な内容になります。

QuicknodeでHIP-4市場を取引する

このセクションでは、HIP-4市場でゼロから実取引を開始するために必要なすべての手順を解説します。具体的には、ビルダー手数料の承認、設定の確認、アクティブな市場の発見、オーダーブックの閲覧とストリーミング、そして最初の注文の発注について説明します。

ガイドのサンプルリポジトリには、HIP-4の操作に関する特定の側面をそれぞれ網羅した6つのスタンドアロンスクリプトが含まれています。以下の重要な抜粋を参照して各概念を理解することもできますし、リポジトリ全体をクローンしてスクリプトを1つずつ実行し、ご自身のウォレットからの実際の出力を確認することもできます。

サンプルコードを入手する

クローンを作成してインストールする
git https://github.com/quiknode-labs/qn-guide-examples.git をクローンする
cd qn-guide-examples/hyperliquid/hip4-prediction-markets
npm install
cp .env.example .env

記入してください .env 秘密鍵とウォレットアドレス(詳細は 環境の設定 (以下)の通りに設定したら、任意のスクリプトをビルドして実行します:

ビルドして実行する
npm run build
node --env-file=.env dist/api/0-approve.js

各スクリプトは独立しています:

スクリプト対象範囲
api/0-approve.ts建設手数料(1回限り)の承認
api/1-setup.tsヘルスチェック:API接続、アクティブな市場、アカウントの状態
api/2-list-markets.ts以下の方法で活発な市場を見つけましょう GET /markets およびリアルタイムの平均価格
api/3-orderbook-snapshot.tsすべてのアクティブなHIP-4銘柄のL2オーダーブックを取得し、インプライド・プロバビリティを算出する
api/4-stream-orderbook.ts購読する l2Book そして allMids ネイティブWebSocket経由で
api/5-trade.ts指値注文と成行注文、実行前の確認、注文の取消し

環境の設定

[作成] .env プロジェクトのルートディレクトリに、ウォレットの認証情報を記載したファイルを作成してください:

.env
PRIVATE_KEY=ウォレットの秘密鍵(16進数)
ウォレットアドレス=ウォレットのアドレス

注意

決してコミットしない .env バージョン管理に追加します。これを .gitignore. その PRIVATE_KEY このフィールドを使用すると、ウォレットを完全に制御できます。

依存関係をインストールし、APIクライアントを設定する

以下の方法による取引 Hyperliquid API SDKは不要です。実行時に必要な依存関係は、 viem ローカルでの署名用。 ws Node.jsでのWebSocketストリーミングには以下が必要です:

インストール
npm install viem ws
npm npminstall --save-dev @types/ws

代わりにQuicknode SDKを使うのはどうでしょうか?

このガイドでは、hyperliquidapi.com の REST API を直接使用しています。より高レベルのインターフェースをご希望の場合は、Quicknode が、同じ基盤プロトコルをラップしたTypeScript、Python、Go、および Rust用の SDK も提供しています。

すべての取引処理は、共有の client.ts ヘルパー:

  1. ビルド: アクションを以下の場所に投稿してください /exchange 署名なし。このAPIは ハッシュ そして ノンス.
  2. 看板: 次のコマンドを使用して、ローカルでハッシュに秘密鍵で署名します。 viem. 鍵は決して端末の外に出ることはありません。
  3. 送信:実行するアクション、ノンセ、および署名を指定して、再度POSTリクエストを送信します。
client.ts(キーヘルパー)
import { privateKeyToAccount } from "viem/accounts";
import { parseSignature } from "viem";

export const API_BASE = "https://send.hyperliquidapi.com";
export const HL_INFO = "https://api.hyperliquid.xyz/info";
export const HL_WS = "wss://api.hyperliquid.xyz/ws";

/** GET from hyperliquidapi.com (health, markets, approval status) */
export async function apiGet(path: string) {
const res = await fetch(`${API_BASE}${path}`);
return res.json();
}

/** POST to Hyperliquid public info endpoint (read-only market data) */
export async function hlInfo(type: string, extra?: Record<string, unknown>) {
const res = await fetch(HL_INFO, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ type, ...extra }),
});
return res.json();
}

/**
* Build-sign-send: the pattern for every trading action.
* 1. POST action (no sig) → API returns hash + nonce
* 2. Sign hash with viem (local, no key transmission)
* 3. POST with signature → executes on-chain
*/
export async function buildSignSend(action: Record<string, unknown>) {
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const built = await exchangePost({ action }) as any;
const rawSig = await account.sign({ hash: built.hash as `0x${string}` });
const { r, s, v } = parseSignature(rawSig);
return exchangePost({
action: built.action ?? action,
nonce: built.nonce,
signature: { r, s, v: Number(v) },
});
}

行き先は3つあります: apiGet hyperliquidapi.com から「非取引状態」を読み込みます(/健康, /市場, /承認). hlInfo 公開されているHyperliquid info APIから市場データを取得します。 buildSignSend 3段階の署名フローを経て、hyperliquidapi.com 経由であらゆる取引を実行します。WebSocket ストリーミングでは、 wss://api.hyperliquid.xyz/ws 直接。

ソースコード全文:client.ts

ビルダー手数料を承認する

ウォレットで取引を行うには、ビルダー手数料の承認が必要です。これはウォレットごとに1回限りのオンチェーン操作です。この操作を明示的に実行すると、変更前後の状態が表示され、すべてが準備完了していることが確認できます。

api/0-approve.ts(抜粋)
import { buildSignSend, apiGet, getAccount } from "./client.js";

const account = getAccount();

// 1. Check current status
const before = await apiGet(`/approval?user=${account.address}`) as any;

// 2. Build + sign + send the approval action
const result = await buildSignSend({ type: "approveBuilderFee", maxFeeRate: "1%" });

// 3. Verify
const after = await apiGet(`/approval?user=${account.address}`) as any;
console.log("canTradePerps:", after.canTradePerps);
console.log("canTradeSpot :", after.canTradeSpot);

ソース全文:api/0-approve.ts

予想される出力(初回実行時):

api/0-approve.ts の出力
============================================================
BUILDER FEE APPROVAL — hyperliquidapi.com
============================================================
Wallet: 0xYourWalletAddress

── Current Status ───────────────────────────────────────
approved : true
maxFeeRate : 0%
canTradePerps: false
canTradeSpot : false
status msg : Your approval is below the minimum fee. Re-approve with a higher maxFeeRate.

Approving builder fee (maxFeeRate: 1%)...

── Approval Result ──────────────────────────────────────
{
"status": "ok",
"response": { "type": "default" }
}

── Status After Approval ────────────────────────────────
approved : true
maxFeeRate : 1%
canTradePerps: true
canTradeSpot : true
status msg : You can trade both perps and spot.

Approval successful. Ready to trade perps, spot, and HIP-4.

接続状況と取引可能な市場を確認してください

注文を行う前に、APIに接続できること、HIP-4市場が稼働中であること、およびビルダー手数料の承認が得られていることを確認してください。

api/1-setup.ts(抜粋)
import { apiGet, hlInfo, getAccount } from "./client.js";

const account = getAccount();

// API health
const health = await apiGet("/health") as any;
console.log("Health:", JSON.stringify(health));

// Builder fee approval
const approval = await apiGet(`/approval?user=${account.address}`) as any;
console.log("canTradePerps:", approval.canTradePerps);
console.log("canTradeSpot :", approval.canTradeSpot);

// Active HIP-4 markets
const markets = await apiGet("/markets") as any;
console.log("HIP-4 markets:", markets.hip4?.length ?? 0);

// Live mid prices: filter allMids for # symbols
const allMids = await hlInfo("allMids") as any;
const hip4Mids = Object.fromEntries(
Object.entries(allMids).filter(([k]) => k.startsWith("#"))
);
console.log("HIP-4 mids:", JSON.stringify(hip4Mids));

ソース全文:api/1-setup.ts

期待される出力(トリミング済み):

api/1-setup.ts の出力
── Health ───────────────────────────────────────────────
{ "status": "ok" }

── Builder Fee Approval ─────────────────────────────────
canTradePerps: true
canTradeSpot : true
✓ Ready to trade.

── Markets Summary ──────────────────────────────────────
hip4 : 1 market(s)

── HIP-4 Mid Prices (from allMids) ──────────────────────
#20 : 0.47
#21 : 0.53

アクティブな予測市場を閲覧する

GET /markets hyperliquidapi.com からのデータは、タイプ別にグループ化されたすべてのアクティブな市場を返します(犯人, スポット, hip4). 以下の項目を参照してください。 hip4 配列と allMids リアルタイムの価格を確認するには、以下をご利用ください。 最近の取引 各銘柄の最近の取引状況を確認するには。

api/2-list-markets.ts(抜粋)
import { apiGet, hlInfo } from "./client.js";

// Active markets from hyperliquidapi.com
const markets = await apiGet("/markets") as any;
const hip4 = markets.hip4 ?? [];
console.log(`Found ${hip4.length} HIP-4 market(s)`);

// Live mid prices: filter allMids for # symbols
const allMids = await hlInfo("allMids") as any;
const hip4Mids = Object.fromEntries(
Object.entries(allMids).filter(([k]) => k.startsWith("#"))
);

for (const [sym, mid] of Object.entries(hip4Mids)) {
console.log(` ${sym.padEnd(6)}: ${mid}`);
}

// Recent trades for each active symbol
for (const symbol of Object.keys(hip4Mids)) {
const trades = await hlInfo("recentTrades", { coin: symbol }) as any[];
console.log(`\nRecent trades for ${symbol}:`);
for (const t of (trades ?? []).slice(0, 3)) {
console.log(` [${new Date(t.time).toISOString()}] ${t.side} px=${t.px} sz=${t.sz}`);
}
}

ソース全文:api/2-list-markets.ts

期待される出力(トリミング済み):

api/2-list-markets.ts の出力
見つかりました 1 HIP-4市場(s) GET /markets 経由

── HIP-4 平均価格 (allMidsより) ──────────────────────
#20 : 0.47
#21 : 0.53

── 最近の取引: #20 ────────────────────────────────────
[2026-05-09T11:00:00.000Z] B px=0.47 sz=25
[2026-05-09T10:58:00.000Z] A px=0.48 sz=30
[2026-05-09T10:55:00.000Z] B px=0.46 sz=15

その # prefix は、すべての Hyperliquid データにおいて、すべての HIP-4 シンボルがどのように表示されるかを示しています: allMids, 最近の取引、データセットのレコード、およびWebSocketメッセージ。使用方法 Object.keys(allMids).filter(k => k.startsWith("#")) 有効なシンボルの「信頼できる情報源」として。

ライブ注文板を確認する

aを #N 記号を hlInfo("l2Book", { coin: sym }) 注文帳の完全な集計データを取得するには。各レベルには px (価格)、 sz (合計サイズ)、および n (保留中の注文数)。すべてのアクティブな銘柄について並行して注文データを取得することで、レイテンシーを最小限に抑えることができます。

api/3-orderbook-snapshot.ts(抜粋)
import { hlInfo } from "./client.js";

const allMids = await hlInfo("allMids") as any;
const hip4Symbols = Object.keys(allMids).filter(k => k.startsWith("#"));

// Fetch all books in parallel
const books = await Promise.all(
hip4Symbols.map(sym => hlInfo("l2Book", { coin: sym }))
) as any[];

for (let i = 0; i < hip4Symbols.length; i++) {
const sym = hip4Symbols[i];
const book = books[i];
const bids = book.levels?.[0] ?? []; // sorted best-to-worst
const asks = book.levels?.[1] ?? [];

const bestBid = parseFloat(bids[0]?.px ?? "0");
const bestAsk = parseFloat(asks[0]?.px ?? "0");
const spread = bestAsk - bestBid;

console.log(`${sym} best bid: ${bestBid} best ask: ${bestAsk} spread: ${spread.toFixed(5)}`);
}

// Implied probabilities: YES mid + NO mid ≈ 1.0
const yesMid = parseFloat(allMids["#20"] ?? "0");
const noMid = parseFloat(allMids["#21"] ?? "0");
console.log(`YES: ${(yesMid * 100).toFixed(2)}% NO: ${(noMid * 100).toFixed(2)}% Sum: ${((yesMid + noMid) * 100).toFixed(2)}%`);

ソース全文:api/3-orderbook-snapshot.ts

期待される出力(トリミング済み):

api/3-orderbook-snapshot.ts の出力
============================================================
HIP-4 ORDERBOOK SNAPSHOT
============================================================
Active HIP-4 symbols: #20, #21
Time: 2026-05-09T11:30:00.000Z

── #1040 ─────────────────────────────────────────────
Best bid : 0.00871
Best ask : 0.01621
Spread : 0.00750 (60.193%)
Mid : 0.01246
Bid depth : 262911 units / 17 levels
Ask depth : 106189 units / 20 levels

PRICE SIZE ORDERS
────────────────────────────────────
0.05 605.0 2 ASK
0.04123 1.0 1 ASK
0.03689 16.0 1 ASK
0.035 11.0 1 ASK
0.032 200.0 1 ASK
0.024 1560.0 1 ASK
0.0213 13650.0 1 ASK
0.02 700.0 1 ASK
── spread 0.00750 ────────────────────────
0.00871 1500.0 1 BID
0.0087 1106.0 1 BID
0.00868 1219.0 1 BID
0.00812 756.0 1 BID
0.0081 2500.0 2 BID
0.0079 1984.0 1 BID
0.0075 2685.0 1 BID
0.0071 5000.0 1 BID

ヒント

0.50未満の「YES」の中間値は、市場が現在その事象の発生をありそうもないと見なしていることを意味します。0.50を超える「YES」の中間値は、その事象の発生がありそうであることを意味します。両方の側面を注視してください。「NO」の中間値は単に 1 - YES ミッド ライブ注文板では、買い側と売り側それぞれに独自のスプレッドがあるためです。

リアルタイムの注文板情報の更新をストリーミング配信

リアルタイムデータについては、ネイティブのWebSocketを以下に開いてください。 wss://api.hyperliquid.xyz/ws そして、購読してください l2Book アクティブな各HIP-4シンボルについて。購読する allMids 平均価格を追跡するために並行して。その hyperliquidapi.com REST APIは取引専用です。ストリーミングには常にHyperliquidのネイティブWebSocketが使用されます。

api/4-stream-orderbook.ts(抜粋)
import WebSocket from "ws";
import { hlInfo, HL_WS } from "./client.js";

const allMids = await hlInfo("allMids") as any;
const hip4Symbols = Object.keys(allMids).filter(k => k.startsWith("#"));

const ws = new WebSocket(HL_WS);

ws.on("open", () => {
// Subscribe to allMids for mid price ticks
ws.send(JSON.stringify({ method: "subscribe", subscription: { type: "allMids" } }));

// Subscribe to l2Book for each active HIP-4 symbol
for (const sym of hip4Symbols) {
ws.send(JSON.stringify({ method: "subscribe", subscription: { type: "l2Book", coin: sym } }));
}
});

ws.on("message", (raw) => {
const msg = JSON.parse(raw.toString()) as any;

if (msg.channel === "allMids") {
const mids = msg.data?.mids ?? msg.data ?? {};
const hip4 = Object.fromEntries(Object.entries(mids).filter(([k]) => k.startsWith("#")));
console.log("[allMids] HIP-4:", JSON.stringify(hip4));
return;
}

if (msg.channel === "l2Book") {
const data = msg.data;
const bids = data.levels?.[0] ?? [];
const asks = data.levels?.[1] ?? [];
console.log(`[l2Book ${data.coin}] ${bids.length} bids / ${asks.length} asks best bid=${bids[0]?.px} best ask=${asks[0]?.px}`);
}
});

// Stream for 30 seconds then exit
await new Promise((resolve) => setTimeout(resolve, 30_000));
ws.close();

ソース全文:api/4-stream-orderbook.ts

期待される出力(トリミング済み):

api/4-stream-orderbook.ts の出力
============================================================
HIP-4 ORDERBOOK STREAM — native WebSocket
============================================================
Symbols : #20, #21
WS URL : wss://api.hyperliquid.xyz/ws
Streaming for 30 seconds...

[ws] Connected ✓
[ws] subscriptionResponse: {"method":"subscribe","subscription":{"type":"l2Book","coin":"#1040","nSigFigs":null,"mantissa":null}}

[l2Book #1] #1040 bestBid=0.00871 bestAsk=0.01621 t=1781287285958
asks: 0.01621x3500.0 0.01622x10000.0 0.01625x1731.0
bids: 0.00871x1500.0 0.0087x1106.0 0.00868x1219.0
[ws] subscriptionResponse: {"method":"subscribe","subscription":{"type":"l2Book","coin":"#1041","nSigFigs":null,"mantissa":null}}

[l2Book #1] #1041 bestBid=0.98379 bestAsk=0.99129 t=1781287285958
asks: 0.99129x1500.0 0.9913x1106.0 0.99132x1219.0
bids: 0.98379x3500.0 0.98378x10000.0 0.98375x1731.0

// ...

HIP-4での最初の取引を行う

すべての注文には buildSignSendtype: "order" アクション。次の #N 記号として 資産, を指定する 側面 (「購入」 または 「売る」), 価格, サイズ、および tif (有効期間)。成行注文の場合は、 tif: "市場" および省略 価格 (APIは、中間価格にスリッページを加えた価格での約定を自動的に計算します)。


HIP-4のサイズ制限

HIP-4の資産には szDecimals = 0、つまり取引サイズは整数でなければならない。最低注文額は10 USDCである。以下の条件を満たす有効な最小取引サイズを求めよ。 Math.ceil(10 / price). 以下の例では、最小値に5単位のバッファを上乗せしています。

印刷前の確認

「」を使用してください /プリフライト 署名なしで注文を検証するためのエンドポイント。コミットする前に、エラー(残高不足、サイズが小さすぎる、無効な資産など)を検知します:

api/5-trade.ts (プリフライト)
const preflight = await fetch("https://send.hyperliquidapi.com/preflight", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
action: {
type: "order",
orders: [{ asset: yesSymbol, side: "buy", price: String(buyPrice), size: limitSize, tif: "gtc" }],
},
}),
}).then(r => r.json());
console.log(JSON.stringify(preflight, null, 2));

指値注文(GTC)

指値注文は、約定するかキャンセルされるまで注文簿に残ります。使用方法 tif: "gtc" (「キャンセルされるまで有効」)。設定しないでください グループ分け ~以外のものに対して 「な」 HIP-4の注文について; 優先手数料 はサポートされておらず、エラーが返されます。

api/5-trade.ts(指値注文)
const limitBuyResult = await buildSignSend({
type: "order",
orders: [{
asset: yesSymbol, // e.g. "#20"
side: "buy",
price: String(buyPrice), // 3% below mid
size: limitSize, // Math.ceil(10 / buyPrice) + 5
tif: "gtc",
}],
}) as any;

// Extract OID from response
const oid = limitBuyResult?.exchangeResponse?.data?.statuses?.[0]?.resting?.oid ?? null;
console.log("OID:", oid);

// Cancel when done
await buildSignSend({ type: "cancel", cancels: [{ a: yesSymbol, o: oid }] });

成行注文(IOC)

成行注文は即座に約定します。設定 tif: "市場" および省略 価格; APIは、中間価格に3%のスリッページを加えた金額を自動的に算出します。注文数量は、最悪の約定価格においても、10 USDC以上の最低注文数量を満たしている必要があります。

api/5-trade.ts(成行注文)
const mktBuyResult = await buildSignSend({
type: "order",
orders: [{
asset: yesSymbol,
side: "buy",
size: marketSize,
tif: "market", // no price field — API auto-computes slippage
}],
});
console.log(JSON.stringify(mktBuyResult, null, 2));

ソース全文:api/5-trade.ts

期待される出力(トリミング済み):

api/5-trade.ts の出力
── Limit BUY (GTC) ──────────────────────────────────────
Placing: BUY 27 #20 @ 0.4559
{
"exchangeResponse": {
"data": { "statuses": [{ "resting": { "oid": 4830012 } }] }
}
}
OID: 4830012

── Market BUY (IOC, auto-slippage) ──────────────────────
{
"exchangeResponse": {
"data": { "statuses": [{ "filled": { "oid": 4830014, "avgPx": "0.471", "totalSz": "27" } }] }
}
}

── Cancel Resting Limit Orders ──────────────────────────
{
"exchangeResponse": {
"data": { "statuses": [{ "success": "" }] }
}
}

よくある間違い


これらには気をつけてください

USDCの残高が不足しています。 USDCのスポット残高が少なすぎる場合、HIP-4の注文は失敗します。残高を確認するには、 hlInfo("spotClearinghouseState", { user: walletAddress }) ご注文の前に。

注文金額が10 USDC未満です。 すべてのHIP-4注文は、以下の条件を満たさなければなりません。 サイズ × 価格 ≥ 10. 価格が 0.05 の場合、少なくとも 200 単位が必要です。数量は常に次のように計算してください。 Math.ceil(10 / price) + buffer 数値をハードコーディングするのではなく。

優先手数料 / 未対応 グループ分け HIP-4にて。 その 優先手数料 パラメータおよびデフォルト値以外 グループ分け アウトカム・マーケット注文では、値はサポートされていません。両方を省略してください。デフォルトは グループ分け: "na" 自動的に適用されます。

小数サイズ。 szDecimals = 0 すべてのHIP-4アセットについて。サイズとしては、 10.5 は却下されます。必ず Math.ceil() または Math.floor().

建設業者への手数料は承認されませんでした。 もし apiGet("/approval?user=address") 表示 canTradeSpot: false, 取引は一切成立しません。まず承認手順を実行してください。

署名欄が欠落しています。 「ビルド・署名・送信」というパターンでは、まずビルドが正常に完了している必要があります。もし ハッシュ または ノンス ビルド応答にこの情報が欠落している場合、署名前にアクションが拒否されました。生の応答を確認して、エラーメッセージを確認してください。

結論

これで、Hyperliquid上のHIP-4予測市場において、生データから実際の取引に至るまでの完全なプロセスが整いました。重要なポイントは、HIP-4が独立したシステムではないということです。HIP-4は、他のすべてのHyperliquid資産と同様に、同じCLOB、同じWebSocketストリーム、そして同じ約定データセットを使用しています。その #N APIの生のレスポンスにおけるアウトカム市場のデータを区別する唯一の要素は、コイン表記です。hyperliquidapi.comの「ビルド・署名・送信」パターンを用いれば、あらゆる取引操作は3回のHTTP呼び出しとローカルでの署名に集約されます。

次に何を作るか

基礎が身についたところで、それを土台にして何を作れるか、いくつかのアイデアをご紹介します:

リアルタイム確率アラートボット。 購読する allMids WebSocket経由で、かつ以下の条件でフィルタリングする #N キー。市場の中間価格をリアルタイムでストリーミングし、市場のインプライド・プロバビリティが設定した閾値を超えた際に通知(Telegram、Discord、またはSlack)を送信します(満期間近の市場や、大きなニュースが発生した後の市場を監視するのに役立ちます)。

SQL Explorer を使用した有効期限切れ前の挙動の分析。 使用方法 SQL Explorer クエリを実行する hyperliquid_trades WHERE coin LIKE '#%' また、決済前の数時間にわたる取引量、約定頻度、価格変動を測定します。これを以下の要素と組み合わせて hyperliquid_orders 複数の市場サイクルにわたる注文発注の傾向を追跡するため。

YES/NOスプレッド・アービトラージ・スキャナー。 購読する l2Book WebSocket 経由で、すべてのアクティブな YES/NO ペアについて。 YES mid + NO mid 1.0から有意に乖離している場合は、そのスプレッドを潜在的なアービトラージの機会としてマークする。実行する前に、深さデータを活用して約定確率を見積もる。

gRPC を用いた高頻度市場データパイプライン。 レイテンシーに敏感な戦略においては、Quicknodeの gRPC ストリーミング API ブロックレベルのオーダーブックや取引データへの、最もレイテンシの低い経路を提供します。Parse #N サーバーサイドでイベントを処理し、WebSocketポーリングに比べてオーバーヘッドを最小限に抑えながら、各ブロックに対応します。

リソース

よくある質問

HIP-4ではどのような担保が使用されていますか?

HIP-4の予測マーケットでは、USDCが担保として使用されます。Hyperliquidのスポット口座にUSDCを入金すれば、稼働中のHIP-4マーケットならどれでも直接取引できます。トークンのスワップは必要ありません。

なぜ「YES mid」+「NO mid」がおよそ1.0になるのでしょうか?

「YES」と「NO」は互いに補完的な二者択一の結果であり、一方が1となり、もう一方が0となる。効率的な市場では、その価格は各結果のインプライド・プロバビリティを反映しており、その合計は必ず100%となる。1.0からのわずかな乖離は、両者間のスプレッドや一時的な裁定取引の機会を反映している。

USDCを使わずにHIP-4の市場で取引することはできますか?

No. USDC is the required collateral for all HIP-4 orders. Attempting to place an order without sufficient USDC spot balance will result in an error. Verify your balance with hlInfo("spotClearinghouseState", { user: walletAddress }) before trading.

なぜHIP-4の注文数量は整数でなければならないのですか?

Hyperliquidでは、HIP-4の資産のszDecimalsは0に設定されているため、取引所では整数の数量のみ受け付けられます。10.5のような小数を含む数量を指定すると、注文は却下されます。有効な最小数量を計算する際は、常にMath.ceil()を使用してください:Math.ceil(10 / 価格)。

APIのレスポンスにある「#20」のような記号は、どういう意味ですか?

#N という表記は、HIP-4 のアウトカム・マーケットサイドを表します。数値 N は、資産 ID から N = 10 * outcomeIndex + sideIndex の式を用いて算出されます。ここで、outcomeIndex はアウトカムを、sideIndex は取引サイドを識別します。実際には、allMids を # で始まるキーでフィルタリングすることで、すべてのアクティブな HIP-4 シンボルを特定できます。allMids、trades、orders、および book-updates のレスポンスには、生の #N 値が含まれています。

「ビルド・署名・送信」パターンとは何ですか?また、なぜそれが存在するのでしょうか?

Build-sign-send は、hyperliquidapi.com で採用されているゼロカストディ型の署名フローです。まず、署名なしで API に POST リクエストを送信してハッシュを取得し、Viem を使用してローカルで秘密鍵でそのハッシュに署名した後、署名付きのリクエストを再度 POST して実行します。秘密鍵が自分のマシンから外部に漏れることは一切ありません。これは Hyperliquid がネイティブに採用しているのと同じ暗号モデルであり、REST API ではこれを 3 ステップの HTTP フローとして提供しています。

HIP-4は以前はUSDHとスポット市場(230)を基準にしていましたが、何が変わったのでしょうか?

Hyperliquidは、担保として使用されていたHIP-4のUSDHをUSDCに移行しました。USDHやスポット市場@230を参照している古いガイドやコードは、現在では古くなっています。USDCを担保として使用する場合、中間的なスワップ手順は不要です。スポット口座にUSDCを入金して、直接取引を行ってください。

皆様からのフィードバックを心よりお待ちしております!❤️

ご意見や新しいトピックに関するご要望などがありましたら、ぜひお知らせください。皆様からのご連絡を心よりお待ちしております。

このガイドをシェアする