关于 ranger-finance
ranger-finance 是面向 Solana 开发者的 Ranger Finance SDK 开发指南,涵盖跨多个永续合约协议的交易路由和仓位管理。指南也介绍供 AI Agent 使用的 MCP 服务及其交易和数据工具。
主要功能
- 01聚合多个协议的永续合约交易
- 02统一 API 获取报价和执行交易
- 03查看并筛选跨平台仓位
- 04获取交易历史、清算与资金费率数据
- 05提供 AI Agent 的 MCP 服务工具
适用场景
- 01比较多个交易场所的永续合约报价
- 02通过统一接口开仓、减仓或平仓
- 03汇总并检查不同平台的仓位
- 04为 AI Agent 接入交易和市场数据
MCP 相关
Ranger MCP 服务向 AI Agent 暴露永续合约报价、增仓、减仓和平仓工具,以及仓位、交易历史、清算和资金费率数据工具。
安装
复制下面的命令,在终端中运行。
$
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 是一个智能订单路由器(SOR),可聚合多个 Solana 协议上的永续期货交易:
- Drift Protocol:Solana 上领先的永续合约 DEX
- Flash Trade:高性能永续合约
- Adrena:杠杆交易协议
- Jupiter Perps:Jupiter 的永续合约平台
主要优势
- 最佳执行:自动将订单路由至定价最佳的平台
- 统一 API:为所有受支持的永续合约协议提供统一接口
- 持仓聚合:查看和管理所有平台上的持仓
- AI Agent 支持:内置 MCP 服务,供 AI 交易 Agent 使用
快速入门
安装(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 Agent 集成
Ranger 提供用于 AI Agent 集成的 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- 平仓
数据 API 工具:
data_get_positions- 获取当前持仓data_get_trade_history- 获取交易历史data_get_liquidations- 获取清算数据和信号data_get_funding_rates- 获取资金费率分析数据
示例:均值回归 Agent
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比较各平台的定价。 -
安全处理交易签名:切勿将私钥硬编码。请使用环境变量或安全的密钥管理方式。
-
监控持仓:定期获取持仓,跟踪盈亏和清算价格。
-
选择合适的平台:减少持仓或平仓时,选择持仓所在的平台。
-
设置合适的抵押品:设置抵押品时应考虑杠杆。抵押品越多,清算风险越低。
资源
Skill 结构
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
评论
支持 Markdown