ranger-finance について
ranger-finance は、Solana 開発者向けの Ranger Finance SDK 開発ガイドです。複数プロトコルにまたがるパーペチュアル取引のルーティングやポジション管理に加え、AI エージェント向け MCP サーバーの取引・データツールを紹介します。
主な機能
- 01複数プロトコルのパーペチュアル取引を集約
- 02統一 API による価格照会と取引実行
- 03複数取引所のポジション取得と絞り込み
- 04履歴、清算、ファンディングレートのデータ取得
- 05AI エージェント向け MCP サーバーツール
活用シーン
- 01複数取引所のパーペチュアル価格を比較
- 02単一 API でポジションの開始、縮小、決済
- 03複数プラットフォームのポジションを確認
- 04AI エージェントを取引・市場データに接続
MCP 対応
Ranger MCP サーバーは、パーペチュアル取引の価格照会、ポジションの増加・縮小・決済ツールを公開します。AI エージェント向けに、ポジション、取引履歴、清算、ファンディングレートのデータツールも提供します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sendaifun/ skills --skill ranger-financeインストール後、Claude Code で/ranger-financeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
docs/ai-agent-integration.mdtroubleshooting.mdexamples/basic/example.tsexamples/positions/example.tsexamples/transactions/example.tsresources/api-reference.mdtypes-reference.mdtemplates/setup.ts詳細
Ranger Finance SDK 開発ガイド
Ranger Finance を使用して Solana アプリケーションを構築するための包括的なガイドです。Ranger Finance は Solana 初の無期限先物アグリゲーターです。
概要
Ranger Finance は、複数の Solana プロトコルにまたがる無期限先物取引を集約するスマートオーダールーター(SOR)です。
- Drift Protocol:Solana を代表する無期限先物 DEX
- Flash Trade:高性能な無期限先物取引
- Adrena:レバレッジ取引プロトコル
- Jupiter Perps:Jupiter の無期限先物プラットフォーム
主なメリット
- 最良執行:最良価格の取引所に注文を自動的にルーティングします
- 統一 API:サポート対象のすべての無期限先物プロトコルに対応する単一のインターフェースです
- ポジション集約:すべての取引所にまたがるポジションを表示・管理できます
- AI エージェントのサポート:AI 取引エージェント向けの MCP サーバーを内蔵しています
クイックスタート
インストール(TypeScript)
# Clone the SDK demo
git clone https://github.com/ranger-finance/sor-ts-demo.git
cd sor-ts-demo
npm install
環境設定
.env ファイルを作成します。
RANGER_API_KEY=your_api_key_here
SOLANA_RPC_URL=https://api.mainnet-beta.solana.com
WALLET_PRIVATE_KEY=your_base58_private_key # Optional, for signing
基本設定
import { SorApi, TradeSide } from 'ranger-sor-sdk';
import dotenv from 'dotenv';
dotenv.config();
// Initialize the SOR API client
const sorApi = new SorApi({
apiKey: process.env.RANGER_API_KEY!,
solanaRpcUrl: process.env.SOLANA_RPC_URL,
});
// Your wallet public key
const walletAddress = 'YOUR_WALLET_PUBLIC_KEY';
基本概念
1. 取引の方向
type TradeSide = 'Long' | 'Short';
2. 調整タイプ
type AdjustmentType =
| 'Quote' // Get a quote only
| 'Increase' // Open or increase position
| 'DecreaseFlash' // Decrease via Flash
| 'DecreaseJupiter' // Decrease via Jupiter
| 'DecreaseDrift' // Decrease via Drift
| 'DecreaseAdrena' // Decrease via Adrena
| 'CloseFlash' // Close via Flash
| 'CloseJupiter' // Close via Jupiter
| 'CloseDrift' // Close via Drift
| 'CloseAdrena' // Close via Adrena
| 'CloseAll'; // Close entire position
3. ポジションインターフェース
interface Position {
id: string;
symbol: string;
side: TradeSide;
quantity: number;
entry_price: number;
liquidation_price: number;
position_leverage: number;
real_collateral: number;
unrealized_pnl: number;
borrow_fee: number;
funding_fee: number;
open_fee: number;
close_fee: number;
created_at: string;
opened_at: string;
platform: string; // 'DRIFT', 'FLASH', 'ADRENA', 'JUPITER'
}
4. 見積もりレスポンス
interface Quote {
base: number;
fee: number;
total: number;
fee_breakdown: {
base_fee: number;
spread_fee: number;
volatility_fee: number;
margin_fee: number;
close_fee: number;
other_fees: number;
};
}
interface VenueAllocation {
venue_name: string;
collateral: number;
size: number;
quote: Quote;
order_available_liquidity: number;
venue_available_liquidity: number;
}
interface OrderMetadataResponse {
venues: VenueAllocation[];
total_collateral: number;
total_size: number;
}
取引操作
見積もりを取得する
取引を実行する前に見積もりを取得し、各取引所の価格を確認します。
import { SorApi, OrderMetadataRequest, TradeSide } from 'ranger-sor-sdk';
const sorApi = new SorApi({ apiKey: process.env.RANGER_API_KEY! });
async function getQuote() {
const request: OrderMetadataRequest = {
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long' as TradeSide,
size: 1.0, // 1 SOL position size
collateral: 10.0, // 10 USDC collateral (10x leverage)
size_denomination: 'SOL',
collateral_denomination: 'USDC',
adjustment_type: 'Quote',
};
const quote = await sorApi.getOrderMetadata(request);
console.log('Available venues:');
quote.venues.forEach(venue => {
console.log(` ${venue.venue_name}: ${venue.quote.total} USDC`);
});
return quote;
}
ポジションを開く/増やす
async function openLongPosition() {
const request = {
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long' as TradeSide,
size: 1.0,
collateral: 10.0,
size_denomination: 'SOL',
collateral_denomination: 'USDC',
adjustment_type: 'Increase' as const,
};
// Get transaction instructions
const response = await sorApi.increasePosition(request);
console.log('Transaction message (base64):', response.message);
if (response.meta) {
console.log('Executed price:', response.meta.executed_price);
console.log('Venues used:', response.meta.venues_used);
}
return response;
}
// Open a short position
async function openShortPosition() {
const request = {
fee_payer: walletAddress,
symbol: 'ETH',
side: 'Short' as TradeSide,
size: 0.5,
collateral: 100.0,
size_denomination: 'ETH',
collateral_denomination: 'USDC',
adjustment_type: 'Increase' as const,
};
return await sorApi.increasePosition(request);
}
ポジションを減らす
async function decreasePosition() {
const request = {
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long' as TradeSide,
size: 0.5, // Decrease by 0.5 SOL
collateral: 5.0, // Withdraw 5 USDC collateral
size_denomination: 'SOL',
collateral_denomination: 'USDC',
adjustment_type: 'DecreaseFlash' as const, // Route through Flash
};
return await sorApi.decreasePosition(request);
}
ポジションを決済する
// Close entire position on a specific venue
async function closePosition() {
const request = {
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long' as TradeSide,
adjustment_type: 'CloseFlash' as const,
};
return await sorApi.closePosition(request);
}
// Close all positions across all venues
async function closeAllPositions() {
const request = {
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long' as TradeSide,
adjustment_type: 'CloseAll' as const,
};
return await sorApi.closePosition(request);
}
トランザクションに署名して実行する
import { Keypair, VersionedTransaction } from '@solana/web3.js';
import bs58 from 'bs58';
async function executeTradeWithSigning() {
// Get transaction instructions
const txResponse = await sorApi.increasePosition({
fee_payer: walletAddress,
symbol: 'SOL',
side: 'Long',
size: 1.0,
collateral: 10.0,
size_denomination: 'SOL',
collateral_denomination: 'USDC',
adjustment_type: 'Increase',
});
// Create keypair from private key
const privateKeyBytes = bs58.decode(process.env.WALLET_PRIVATE_KEY!);
const keypair = Keypair.fromSecretKey(privateKeyBytes);
// Define signing function
const signTransaction = async (tx: VersionedTransaction) => {
tx.sign([keypair]);
return tx;
};
// Execute the transaction
const result = await sorApi.executeTransaction(txResponse, signTransaction);
console.log('Transaction signature:', result.signature);
return result;
}
ポジション管理
すべてのポジションを取得する
async function getAllPositions() {
const positions = await sorApi.getPositions(walletAddress);
positions.positions.forEach(pos => {
console.log(`${pos.symbol} ${pos.side}: ${pos.quantity} @ ${pos.entry_price}`);
console.log(` Platform: ${pos.platform}`);
console.log(` PnL: ${pos.unrealized_pnl}`);
console.log(` Liquidation: ${pos.liquidation_price}`);
});
return positions;
}
プラットフォーム別にポジションを絞り込む
async function getDriftPositions() {
const positions = await sorApi.getPositions(walletAddress, {
platforms: ['DRIFT'],
});
return positions;
}
async function getFlashAndAdrenaPositions() {
const positions = await sorApi.getPositions(walletAddress, {
platforms: ['FLASH', 'ADRENA'],
});
return positions;
}
シンボル別にポジションを絞り込む
async function getSolPositions() {
const positions = await sorApi.getPositions(walletAddress, {
symbols: ['SOL-PERP'],
});
return positions;
}
AI エージェントとの統合
Ranger は、AI エージェントとの統合に対応する MCP(Model Context Protocol)サーバーを提供しています。
インストール(Python)
ranger-agent-kit をクローンし、セットアップ手順に従って README を確認してください。
MCP サーバーのツール
Ranger MCP サーバーでは、次のツールを利用できます。
SOR ツール:
sor_get_trade_quote- 価格見積もりを取得しますsor_increase_position- ポジションを開く/増やしますsor_decrease_position- ポジションを減らしますsor_close_position- ポジションを決済します
Data API ツール:
data_get_positions- 現在のポジションを取得しますdata_get_trade_history- 取引履歴を取得しますdata_get_liquidations- 清算データとシグナルを取得しますdata_get_funding_rates- 資金調達率の分析データを取得します
例:平均回帰エージェント
import asyncio
from ranger_mcp_agent.examples.mean_reversion_agent import run_mean_reversion_agent
async def main():
# Run a mean reversion trading strategy
await run_mean_reversion_agent()
if __name__ == "__main__":
asyncio.run(main())
MCP サーバーの起動
cd ranger-agent-kit/perps-mcp
cp .env.example .env
# Edit .env with your API credentials
python -m ranger_mcp
API リファレンス
SorApi クラス
class SorApi {
constructor(config: SorSdkConfig);
// Get quote for a trade
getOrderMetadata(request: OrderMetadataRequest): Promise<OrderMetadataResponse>;
// Open or increase a position
increasePosition(request: IncreasePositionRequest): Promise<TransactionResponse>;
// Reduce a position
decreasePosition(request: DecreasePositionRequest): Promise<TransactionResponse>;
// Close a position
closePosition(request: ClosePositionRequest): Promise<TransactionResponse>;
// Get positions for a wallet
getPositions(
publicKey: string,
options?: {
platforms?: string[];
symbols?: string[];
startDate?: string;
endDate?: string;
}
): Promise<PositionsResponse>;
// Execute a signed transaction
executeTransaction(
transactionResponse: TransactionResponse,
signTransaction: (tx: VersionedTransaction) => Promise<VersionedTransaction>
): Promise<{ signature: string }>;
// Get Solana connection
getConnection(): Connection;
}
設定
interface SorSdkConfig {
apiKey: string;
sorApiBaseUrl?: string; // Default: Ranger SOR API
dataApiBaseUrl?: string; // Default: Ranger Data API
solanaRpcUrl?: string; // Default: Mainnet RPC
}
リクエストの型
interface BaseRequest {
fee_payer: string;
symbol: string;
side: TradeSide;
size_denomination?: string;
collateral_denomination?: string;
}
interface IncreasePositionRequest extends BaseRequest {
size: number;
collateral: number;
size_denomination: string;
collateral_denomination: string;
adjustment_type: 'Increase';
}
interface DecreasePositionRequest extends BaseRequest {
size: number;
collateral: number;
size_denomination: string;
collateral_denomination: string;
adjustment_type: 'DecreaseFlash' | 'DecreaseJupiter' | 'DecreaseDrift' | 'DecreaseAdrena';
}
interface ClosePositionRequest extends BaseRequest {
adjustment_type: 'CloseFlash' | 'CloseJupiter' | 'CloseDrift' | 'CloseAdrena' | 'CloseAll';
}
レスポンスの型
interface TransactionResponse {
message: string; // Base64-encoded transaction
meta?: {
executed_price?: number;
executed_size?: number;
executed_collateral?: number;
venues_used?: string[];
};
}
interface PositionsResponse {
positions: Position[];
}
サポート対象のマーケット
Ranger は、次のプロトコルにまたがる無期限先物マーケットを集約しています。
| プロトコル | マーケット |
|---|---|
| Drift | SOL、BTC、ETH、その他20以上のアセット |
| Flash | SOL、BTC、ETH |
| Adrena | SOL、BTC、ETH |
| Jupiter | SOL、BTC、ETH |
エラー処理
try {
const response = await sorApi.increasePosition(request);
} catch (error) {
if (error.error_code) {
// API error
console.error('API Error:', error.message);
console.error('Error code:', error.error_code);
} else {
// Network or other error
throw error;
}
}
ベストプラクティス
-
必ず最初に見積もりを取得する:取引を実行する前に、
getOrderMetadataを使用して各取引所の価格を比較します。 -
トランザクション署名を安全に処理する:秘密鍵をハードコードしないでください。環境変数または安全な鍵管理を使用します。
-
ポジションを監視する:PnL と清算価格を追跡するため、定期的にポジションを取得します。
-
適切な取引所を使用する:ポジションを減らす/決済する場合は、そのポジションがある取引所を選択します。
-
適切な担保を設定する:担保を設定する際はレバレッジを考慮します。担保が多いほど、清算リスクは低くなります。
リソース
スキルの構成
ranger-finance/
├── SKILL.md # This file
├── resources/
│ ├── api-reference.md # API endpoint reference
│ └── types-reference.md # Complete TypeScript types
├── examples/
│ ├── basic/
│ │ └── example.ts # Basic trade operations
│ ├── positions/
│ │ └── example.ts # Position queries and management
│ └── transactions/
│ └── example.ts # Transaction signing flow
├── templates/
│ └── setup.ts # Ready-to-use setup template
└── docs/
├── troubleshooting.md # Common issues and solutions
└── ai-agent-integration.md # AI agent setup guide