mcpField
R
ranger-finance

ranger-finance

github.com/sendaifunその他130165 回インストール13 週間前に更新
リポジトリ

ranger-finance について

ranger-finance は、Solana 開発者向けの Ranger Finance SDK 開発ガイドです。複数プロトコルにまたがるパーペチュアル取引のルーティングやポジション管理に加え、AI エージェント向け MCP サーバーの取引・データツールを紹介します。

主な機能

  1. 01複数プロトコルのパーペチュアル取引を集約
  2. 02統一 API による価格照会と取引実行
  3. 03複数取引所のポジション取得と絞り込み
  4. 04履歴、清算、ファンディングレートのデータ取得
  5. 05AI エージェント向け MCP サーバーツール

活用シーン

  1. 01複数取引所のパーペチュアル価格を比較
  2. 02単一 API でポジションの開始、縮小、決済
  3. 03複数プラットフォームのポジションを確認
  4. 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.md
troubleshooting.md
examples/basic/
example.ts
examples/positions/
example.ts
examples/transactions/
example.ts
resources/
api-reference.md
types-reference.md
templates/
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 は、次のプロトコルにまたがる無期限先物マーケットを集約しています。

プロトコルマーケット
DriftSOL、BTC、ETH、その他20以上のアセット
FlashSOL、BTC、ETH
AdrenaSOL、BTC、ETH
JupiterSOL、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;
  }
}

ベストプラクティス

  1. 必ず最初に見積もりを取得する:取引を実行する前に、getOrderMetadata を使用して各取引所の価格を比較します。

  2. トランザクション署名を安全に処理する:秘密鍵をハードコードしないでください。環境変数または安全な鍵管理を使用します。

  3. ポジションを監視する:PnL と清算価格を追跡するため、定期的にポジションを取得します。

  4. 適切な取引所を使用する:ポジションを減らす/決済する場合は、そのポジションがある取引所を選択します。

  5. 適切な担保を設定する:担保を設定する際はレバレッジを考慮します。担保が多いほど、清算リスクは低くなります。

リソース

スキルの構成

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

コメント