📈 自主交易
概述
Eliza 的自主交易系统能够在 Solana 区块链上实现自动化的代币交易。该系统与 Jupiter 聚合器集成,以实现高效的代币交换,实现了智能订单路由,并包含风险管理功能。
核心组件
代币提供者
管理代币信息和市场数据:
class TokenProvider {
constructor(
private tokenAddress: string,
private walletProvider: WalletProvider,
) {
this.cache = new NodeCache({ stdTTL: 300 }) // 5 分钟的缓存
}
async fetchPrices(): Promise<Prices> {
const { SOL, BTC, ETH } = TOKEN_ADDRESSES
// 获取当前价格
return {
solana: { usd: '0' },
bitcoin: { usd: '0' },
ethereum: { usd: '0' },
}
}
async getProcessedTokenData(): Promise<ProcessedTokenData> {
return {
security: await this.fetchTokenSecurity(),
tradeData: await this.fetchTokenTradeData(),
holderDistributionTrend: await this.analyzeHolderDistribution(),
highValueHolders: await this.filterHighValueHolders(),
recentTrades: await this.checkRecentTrades(),
dexScreenerData: await this.fetchDexScreenerData(),
}
}
}
交换执行
使用 Jupiter 进行代币交换的实现:
async function swapToken(
connection: Connection,
walletPublicKey: PublicKey,
inputTokenCA: string,
outputTokenCA: string,
amount: number,
): Promise<any> {
// 获取代币小数位数
const decimals = await getTokenDecimals(connection, inputTokenCA)
const adjustedAmount = amount * 10 ** decimals
// 获取报价
const quoteResponse = await fetch(
`https://quote-api.jup.ag/v6/quote?inputMint=${inputTokenCA}` +
`&outputMint=${outputTokenCA}` +
`&amount=${adjustedAmount}` +
`&slippageBps=50`,
)
// 执行交换
const swapResponse = await fetch('https://quote-api.jup.ag/v6/swap', {
method: 'POST',
body: JSON.stringify({
quoteResponse: await quoteResponse.json(),
userPublicKey: walletPublicKey.toString(),
wrapAndUnwrapSol: true,
}),
})
return swapResponse.json()
}
头寸管理
订单簿系统
interface Order {
userId: string
ticker: string
contractAddress: string
timestamp: string
buyAmount: number
price: number
}
class OrderBookProvider {
async addOrder(order: Order): Promise<void> {
let orderBook = await this.readOrderBook()
orderBook.push(order)
await this.writeOrderBook(orderBook)
}
async calculateProfitLoss(userId: string): Promise<number> {
const orders = await this.getUserOrders(userId)
return orders.reduce((total, order) => {
const currentPrice = this.getCurrentPrice(order.ticker)
const pl = (currentPrice - order.price) * order.buyAmount
return total + pl
}, 0)
}
}
头寸规模
async function calculatePositionSize(
tokenData: ProcessedTokenData,
riskLevel: 'LOW' | 'MEDIUM' | 'HIGH',
): Promise<CalculatedBuyAmounts> {
const { liquidity, marketCap } = tokenData.dexScreenerData.pairs[0]
// 基于流动性的影响百分比
const impactPercentages = {
LOW: 0.01, // 流动性的 1%
MEDIUM: 0.05, // 流动性的 5%
HIGH: 0.1, // 流动性的 10%
}
return {
none: 0,
low: liquidity.usd * impactPercentages.LOW,
medium: liquidity.usd * impactPercentages.MEDIUM,
high: liquidity.usd * impactPercentages.HIGH,
}
}
风险管理
代币验证
async function validateToken(token: TokenPerformance): Promise<boolean> {
const security = await fetchTokenSecurity(token.tokenAddress)
// 风险检查
if (
security.rugPull ||
security.isScam ||
token.rapidDump ||
token.suspiciousVolume ||
token.liquidity.usd < 1000 || // 最小 1000 美元的流动性
token.marketCap < 100000 // 最小 10 万美元的市值
) {
return false
}
// 持有者分布检查
const holderData = await fetchHolderList(token.tokenAddress)
const topHolderPercent = calculateTopHolderPercentage(holderData)
if (topHolderPercent > 0.5) {
// 前几名持有者持有超过 50%
return false
}
return true
}
交易管理
interface TradeManager {
async executeTrade(params: {
inputToken: string,
outputToken: string,
amount: number,
slippage: number
}): Promise<string>;
async monitorPosition(params: {
tokenAddress: string,
entryPrice: number,
stopLoss: number,
takeProfit: number
}): Promise<void>;
async closePosition(params: {
tokenAddress: string,
amount: number
}): Promise<string>;
}
市场分析
价格数据收集
async function collectMarketData(tokenAddress: string): Promise<TokenTradeData> {
return {
price: await fetchCurrentPrice(tokenAddress),
volume_24h: await fetch24HourVolume(tokenAddress),
price_change_24h: await fetch24HourPriceChange(tokenAddress),
liquidity: await fetchLiquidity(tokenAddress),
holder_data: await fetchHolderData(tokenAddress),
trade_history: await fetchTradeHistory(tokenAddress),
}
}
技术分析
function analyzeMarketConditions(tradeData: TokenTradeData): MarketAnalysis {
return {
trend: analyzePriceTrend(tradeData.price_history),
volume_profile: analyzeVolumeProfile(tradeData.volume_history),
liquidity_depth: analyzeLiquidityDepth(tradeData.liquidity),
holder_behavior: analyzeHolderBehavior(tradeData.holder_data),
}
}
交易执行
交换实现
async function executeSwap(
runtime: IAgentRuntime,
input: {
tokenIn: string
tokenOut: string
amountIn: number
slippage: number
},
): Promise<string> {
// 准备交易
const { swapTransaction } = await getSwapTransaction(input)
// 签署交易
const keypair = getKeypairFromPrivateKey(
runtime.getSetting('SOLANA_PRIVATE_KEY') ?? runtime.getSetting('WALLET_PRIVATE_KEY'),
)
transaction.sign([keypair])
// 执行交换
const signature = await connection.sendTransaction(transaction)
// 确认交易
await connection.confirmTransaction({
signature,
blockhash: latestBlockhash.blockhash,
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
})
return signature
}
DAO 集成
async function executeSwapForDAO(
runtime: IAgentRuntime,
params: {
inputToken: string
outputToken: string
amount: number
},
): Promise<string> {
const authority = getAuthorityKeypair(runtime)
const [statePDA, walletPDA] = await derivePDAs(authority)
// 准备指令数据
const instructionData = prepareSwapInstruction(params)
// 通过 DAO 执行交换
return invokeSwapDao(connection, authority, statePDA, walletPDA, instructionData)
}
监控与安全
健康检查
async function performHealthChecks(): Promise<HealthStatus> {
return {
connection: await checkConnectionStatus(),
wallet: await checkWalletBalance(),
orders: await checkOpenOrders(),
positions: await checkPositions(),
}
}
安全限制
const SAFETY_LIMITS = {
MAX_POSITION_SIZE: 0.1, // 投资组合的 10%
MAX_SLIPPAGE: 0.05, // 5% 的滑点
MIN_LIQUIDITY: 1000, // 最小 1000 美元的流动性
MAX_PRICE_IMPACT: 0.03, // 3% 的价格影响
STOP_LOSS: 0.15, // 15% 的止损
}
错误处理
交易错误
async function handleTransactionError(error: Error, transaction: Transaction): Promise<void> {
if (error.message.includes('insufficient funds')) {
await handleInsufficientFunds()
} else if (error.message.includes('slippage tolerance exceeded')) {
await handleSlippageError(transaction)
} else {
await logTransactionError(error, transaction)
}
}
恢复程序
async function recoverFromError(error: Error, context: TradingContext): Promise<void> {
// 停止所有活跃交易
await stopActiveTrades()
// 关闭风险头寸
await closeRiskyPositions()
// 重置系统状态
await resetTradingState()
// 通知管理员
await notifyAdministrators(error, context)
}