mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-06-06 05:51:19 +08:00
refactor: optimize codebase encoding
This commit is contained in:
@@ -10,49 +10,50 @@ import (
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// AI Data Formatter - AI数据格式化器
|
||||
// AI Data Formatter
|
||||
// ============================================================================
|
||||
// 将交易上下文转换为AI友好的格式,确保AI能够100%理解数据
|
||||
// Converts trading context into AI-friendly format, ensuring AI fully
|
||||
// understands the data regardless of language.
|
||||
// ============================================================================
|
||||
|
||||
// FormatContextForAI 将交易上下文格式化为AI可理解的文本(包含Schema)
|
||||
// FormatContextForAI formats trading context into AI-readable text (including schema)
|
||||
func FormatContextForAI(ctx *Context, lang Language) string {
|
||||
var sb strings.Builder
|
||||
|
||||
// 1. 添加Schema说明(让AI理解数据格式)
|
||||
// 1. Add schema description (so AI understands data format)
|
||||
sb.WriteString(GetSchemaPrompt(lang))
|
||||
sb.WriteString("\n---\n\n")
|
||||
|
||||
// 2. 当前状态概览
|
||||
// 2. Current state overview
|
||||
sb.WriteString(formatContextData(ctx, lang))
|
||||
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// FormatContextDataOnly 仅格式化上下文数据,不包含Schema(用于已有Schema的场景)
|
||||
// FormatContextDataOnly formats context data only, without schema (for use when schema is already present)
|
||||
func FormatContextDataOnly(ctx *Context, lang Language) string {
|
||||
return formatContextData(ctx, lang)
|
||||
}
|
||||
|
||||
// formatContextData 格式化核心数据部分
|
||||
// formatContextData formats the core data section
|
||||
func formatContextData(ctx *Context, lang Language) string {
|
||||
var sb strings.Builder
|
||||
|
||||
// 1. 当前状态概览
|
||||
// 1. Current state overview
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatHeaderZH(ctx))
|
||||
} else {
|
||||
sb.WriteString(formatHeaderEN(ctx))
|
||||
}
|
||||
|
||||
// 3. 账户信息
|
||||
// 3. Account information
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatAccountZH(ctx))
|
||||
} else {
|
||||
sb.WriteString(formatAccountEN(ctx))
|
||||
}
|
||||
|
||||
// 4. 历史交易统计
|
||||
// 4. Historical trading statistics
|
||||
if ctx.TradingStats != nil && ctx.TradingStats.TotalTrades > 0 {
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatTradingStatsZH(ctx.TradingStats))
|
||||
@@ -61,7 +62,7 @@ func formatContextData(ctx *Context, lang Language) string {
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 最近交易记录
|
||||
// 5. Recent trade records
|
||||
if len(ctx.RecentOrders) > 0 {
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatRecentTradesZH(ctx.RecentOrders))
|
||||
@@ -70,7 +71,7 @@ func formatContextData(ctx *Context, lang Language) string {
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 当前持仓
|
||||
// 5. Current positions
|
||||
if len(ctx.Positions) > 0 {
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatCurrentPositionsZH(ctx))
|
||||
@@ -79,7 +80,7 @@ func formatContextData(ctx *Context, lang Language) string {
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 候选币种(带市场数据)
|
||||
// 6. Candidate coins (with market data)
|
||||
if len(ctx.CandidateCoins) > 0 {
|
||||
if lang == LangChinese {
|
||||
sb.WriteString(formatCandidateCoinsZH(ctx))
|
||||
@@ -88,7 +89,7 @@ func formatContextData(ctx *Context, lang Language) string {
|
||||
}
|
||||
}
|
||||
|
||||
// 7. OI排名数据(如果有)
|
||||
// 7. OI ranking data (if available)
|
||||
if ctx.OIRankingData != nil {
|
||||
nofxosLang := nofxos.LangEnglish
|
||||
if lang == LangChinese {
|
||||
@@ -100,15 +101,15 @@ func formatContextData(ctx *Context, lang Language) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// ========== 中文格式化函数 ==========
|
||||
// ========== Chinese Formatting Functions ==========
|
||||
|
||||
// formatHeaderZH 格式化头部信息(中文)
|
||||
// formatHeaderZH formats header information (Chinese)
|
||||
func formatHeaderZH(ctx *Context) string {
|
||||
return fmt.Sprintf("# 📊 交易决策请求\n\n时间: %s | 周期: #%d | 运行时长: %d 分钟\n\n",
|
||||
ctx.CurrentTime, ctx.CallCount, ctx.RuntimeMinutes)
|
||||
}
|
||||
|
||||
// formatAccountZH 格式化账户信息(中文)
|
||||
// formatAccountZH formats account information (Chinese)
|
||||
func formatAccountZH(ctx *Context) string {
|
||||
acc := ctx.Account
|
||||
var sb strings.Builder
|
||||
@@ -120,7 +121,7 @@ func formatAccountZH(ctx *Context) string {
|
||||
sb.WriteString(fmt.Sprintf("保证金使用率: %.1f%% | ", acc.MarginUsedPct))
|
||||
sb.WriteString(fmt.Sprintf("持仓数: %d\n\n", acc.PositionCount))
|
||||
|
||||
// 添加风险提示
|
||||
// Add risk warnings
|
||||
if acc.MarginUsedPct > 70 {
|
||||
sb.WriteString("⚠️ **风险警告**: 保证金使用率 > 70%,处于高风险状态!\n\n")
|
||||
} else if acc.MarginUsedPct > 50 {
|
||||
@@ -130,25 +131,25 @@ func formatAccountZH(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatTradingStatsZH 格式化历史交易统计(中文)
|
||||
// formatTradingStatsZH formats historical trading statistics (Chinese)
|
||||
func formatTradingStatsZH(stats *TradingStats) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## 历史交易统计\n\n")
|
||||
|
||||
// 盈亏比计算
|
||||
// Win/loss ratio calculation
|
||||
var winLossRatio float64
|
||||
if stats.AvgLoss > 0 {
|
||||
winLossRatio = stats.AvgWin / stats.AvgLoss
|
||||
}
|
||||
|
||||
// 指标定义说明(去掉胜率,聚焦核心指标)
|
||||
// Metric definitions (focusing on core metrics, excluding win rate)
|
||||
sb.WriteString("**指标说明**:\n")
|
||||
sb.WriteString("- 盈利因子: 总盈利 ÷ 总亏损(>1表示盈利,>1.5为良好,>2为优秀)\n")
|
||||
sb.WriteString("- 夏普比率: (平均收益 - 无风险收益) ÷ 收益标准差(>1良好,>2优秀)\n")
|
||||
sb.WriteString("- 盈亏比: 平均盈利 ÷ 平均亏损(>1.5为良好,>2为优秀)\n")
|
||||
sb.WriteString("- 最大回撤: 资金曲线从峰值到谷底的最大跌幅(<20%为低风险)\n\n")
|
||||
|
||||
// 数据值
|
||||
// Data values
|
||||
sb.WriteString("**当前数据**:\n")
|
||||
sb.WriteString(fmt.Sprintf("- 总交易: %d 笔\n", stats.TotalTrades))
|
||||
sb.WriteString(fmt.Sprintf("- 盈利因子: %.2f\n", stats.ProfitFactor))
|
||||
@@ -159,10 +160,10 @@ func formatTradingStatsZH(stats *TradingStats) string {
|
||||
sb.WriteString(fmt.Sprintf("- 平均亏损: -%.2f USDT\n", stats.AvgLoss))
|
||||
sb.WriteString(fmt.Sprintf("- 最大回撤: %.1f%%\n\n", stats.MaxDrawdownPct))
|
||||
|
||||
// 综合分析和决策建议
|
||||
// Comprehensive analysis and decision guidance
|
||||
sb.WriteString("**决策参考**:\n")
|
||||
|
||||
// 根据统计数据给出具体建议
|
||||
// Provide specific recommendations based on statistics
|
||||
if stats.TotalTrades < 10 {
|
||||
sb.WriteString("- 样本量较小(<10笔),统计结果参考意义有限\n")
|
||||
}
|
||||
@@ -191,13 +192,13 @@ func formatTradingStatsZH(stats *TradingStats) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatRecentTradesZH 格式化最近交易(中文)
|
||||
// formatRecentTradesZH formats recent trades (Chinese)
|
||||
func formatRecentTradesZH(orders []RecentOrder) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## 最近完成的交易\n\n")
|
||||
|
||||
for i, order := range orders {
|
||||
// 判断盈亏
|
||||
// Determine profit or loss
|
||||
profitOrLoss := "盈利"
|
||||
if order.RealizedPnL < 0 {
|
||||
profitOrLoss = "亏损"
|
||||
@@ -222,13 +223,13 @@ func formatRecentTradesZH(orders []RecentOrder) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatCurrentPositionsZH 格式化当前持仓(中文)
|
||||
// formatCurrentPositionsZH formats current positions (Chinese)
|
||||
func formatCurrentPositionsZH(ctx *Context) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## 当前持仓\n\n")
|
||||
|
||||
for i, pos := range ctx.Positions {
|
||||
// 计算回撤
|
||||
// Calculate drawdown
|
||||
drawdown := pos.UnrealizedPnLPct - pos.PeakPnLPct
|
||||
|
||||
sb.WriteString(fmt.Sprintf("%d. %s %s | ", i+1, pos.Symbol, strings.ToUpper(pos.Side)))
|
||||
@@ -242,7 +243,7 @@ func formatCurrentPositionsZH(ctx *Context) string {
|
||||
sb.WriteString(fmt.Sprintf("保证金 %.0f USDT | ", pos.MarginUsed))
|
||||
sb.WriteString(fmt.Sprintf("强平价 %.4f\n", pos.LiquidationPrice))
|
||||
|
||||
// 添加分析提示
|
||||
// Add analysis hints
|
||||
if drawdown < -0.30*pos.PeakPnLPct && pos.PeakPnLPct > 0.02 {
|
||||
sb.WriteString(fmt.Sprintf(" ⚠️ **止盈提示**: 当前盈亏从峰值 %.2f%% 回撤到 %.2f%%,回撤幅度 %.2f%%,建议考虑止盈\n",
|
||||
pos.PeakPnLPct, pos.UnrealizedPnLPct, (drawdown/pos.PeakPnLPct)*100))
|
||||
@@ -252,7 +253,7 @@ func formatCurrentPositionsZH(ctx *Context) string {
|
||||
sb.WriteString(" ⚠️ **止损提示**: 亏损接近-5%止损线,建议考虑止损\n")
|
||||
}
|
||||
|
||||
// 显示当前价格(如果有市场数据)
|
||||
// Show current price (if market data available)
|
||||
if ctx.MarketDataMap != nil {
|
||||
if mdata, ok := ctx.MarketDataMap[pos.Symbol]; ok {
|
||||
sb.WriteString(fmt.Sprintf(" 📈 当前价格: %.4f\n", mdata.CurrentPrice))
|
||||
@@ -265,7 +266,7 @@ func formatCurrentPositionsZH(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatCandidateCoinsZH 格式化候选币种(中文)
|
||||
// formatCandidateCoinsZH formats candidate coins (Chinese)
|
||||
func formatCandidateCoinsZH(ctx *Context) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## 候选币种\n\n")
|
||||
@@ -273,19 +274,19 @@ func formatCandidateCoinsZH(ctx *Context) string {
|
||||
for i, coin := range ctx.CandidateCoins {
|
||||
sb.WriteString(fmt.Sprintf("### %d. %s\n\n", i+1, coin.Symbol))
|
||||
|
||||
// 当前价格
|
||||
// Current price
|
||||
if ctx.MarketDataMap != nil {
|
||||
if mdata, ok := ctx.MarketDataMap[coin.Symbol]; ok {
|
||||
sb.WriteString(fmt.Sprintf("当前价格: %.4f\n\n", mdata.CurrentPrice))
|
||||
|
||||
// K线数据(多时间框架)
|
||||
// Kline data (multi-timeframe)
|
||||
if mdata.TimeframeData != nil {
|
||||
sb.WriteString(formatKlineDataZH(coin.Symbol, mdata.TimeframeData, ctx.Timeframes))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// OI数据(如果有)
|
||||
// OI data (if available)
|
||||
if ctx.OITopDataMap != nil {
|
||||
if oiData, ok := ctx.OITopDataMap[coin.Symbol]; ok {
|
||||
sb.WriteString(fmt.Sprintf("**持仓量变化**: OI排名 #%d | 变化 %+.2f%% (%+.2fM USDT) | 价格变化 %+.2f%%\n\n",
|
||||
@@ -295,7 +296,7 @@ func formatCandidateCoinsZH(ctx *Context) string {
|
||||
oiData.PriceDeltaPercent,
|
||||
))
|
||||
|
||||
// OI解读
|
||||
// OI interpretation
|
||||
oiChange := "增加"
|
||||
if oiData.OIDeltaPercent < 0 {
|
||||
oiChange = "减少"
|
||||
@@ -314,7 +315,7 @@ func formatCandidateCoinsZH(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatKlineDataZH 格式化K线数据(中文)
|
||||
// formatKlineDataZH formats kline data (Chinese)
|
||||
func formatKlineDataZH(symbol string, tfData map[string]*market.TimeframeSeriesData, timeframes []string) string {
|
||||
var sb strings.Builder
|
||||
|
||||
@@ -324,7 +325,7 @@ func formatKlineDataZH(symbol string, tfData map[string]*market.TimeframeSeriesD
|
||||
sb.WriteString("```\n")
|
||||
sb.WriteString("时间(UTC) 开盘 最高 最低 收盘 成交量\n")
|
||||
|
||||
// 只显示最近30根K线
|
||||
// Only show the latest 30 klines
|
||||
startIdx := 0
|
||||
if len(data.Klines) > 30 {
|
||||
startIdx = len(data.Klines) - 30
|
||||
@@ -343,7 +344,7 @@ func formatKlineDataZH(symbol string, tfData map[string]*market.TimeframeSeriesD
|
||||
))
|
||||
}
|
||||
|
||||
// 标记最后一根K线
|
||||
// Mark the last kline
|
||||
if len(data.Klines) > 0 {
|
||||
sb.WriteString(" <- 当前\n")
|
||||
}
|
||||
@@ -356,7 +357,7 @@ func formatKlineDataZH(symbol string, tfData map[string]*market.TimeframeSeriesD
|
||||
}
|
||||
|
||||
|
||||
// getOIInterpretationZH 获取OI变化解读(中文)
|
||||
// getOIInterpretationZH returns OI change interpretation (Chinese)
|
||||
func getOIInterpretationZH(oiChange, priceChange string) string {
|
||||
if oiChange == "增加" && priceChange == "上涨" {
|
||||
return OIInterpretation.OIUp_PriceUp.ZH
|
||||
@@ -369,15 +370,15 @@ func getOIInterpretationZH(oiChange, priceChange string) string {
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 英文格式化函数 ==========
|
||||
// ========== English Formatting Functions ==========
|
||||
|
||||
// formatHeaderEN 格式化头部信息(英文)
|
||||
// formatHeaderEN formats header information (English)
|
||||
func formatHeaderEN(ctx *Context) string {
|
||||
return fmt.Sprintf("# 📊 Trading Decision Request\n\nTime: %s | Period: #%d | Runtime: %d minutes\n\n",
|
||||
ctx.CurrentTime, ctx.CallCount, ctx.RuntimeMinutes)
|
||||
}
|
||||
|
||||
// formatAccountEN 格式化账户信息(英文)
|
||||
// formatAccountEN formats account information (English)
|
||||
func formatAccountEN(ctx *Context) string {
|
||||
acc := ctx.Account
|
||||
var sb strings.Builder
|
||||
@@ -399,7 +400,7 @@ func formatAccountEN(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatTradingStatsEN 格式化历史交易统计(英文)
|
||||
// formatTradingStatsEN formats historical trading statistics (English)
|
||||
func formatTradingStatsEN(stats *TradingStats) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## Historical Trading Statistics\n\n")
|
||||
@@ -460,7 +461,7 @@ func formatTradingStatsEN(stats *TradingStats) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatRecentTradesEN 格式化最近交易(英文)
|
||||
// formatRecentTradesEN formats recent trades (English)
|
||||
func formatRecentTradesEN(orders []RecentOrder) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## Recent Completed Trades\n\n")
|
||||
@@ -490,7 +491,7 @@ func formatRecentTradesEN(orders []RecentOrder) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatCurrentPositionsEN 格式化当前持仓(英文)
|
||||
// formatCurrentPositionsEN formats current positions (English)
|
||||
func formatCurrentPositionsEN(ctx *Context) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## Current Positions\n\n")
|
||||
@@ -531,7 +532,7 @@ func formatCurrentPositionsEN(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatCandidateCoinsEN 格式化候选币种(英文)
|
||||
// formatCandidateCoinsEN formats candidate coins (English)
|
||||
func formatCandidateCoinsEN(ctx *Context) string {
|
||||
var sb strings.Builder
|
||||
sb.WriteString("## Candidate Coins\n\n")
|
||||
@@ -576,7 +577,7 @@ func formatCandidateCoinsEN(ctx *Context) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// formatKlineDataEN 格式化K线数据(英文)
|
||||
// formatKlineDataEN formats kline data (English)
|
||||
func formatKlineDataEN(symbol string, tfData map[string]*market.TimeframeSeriesData, timeframes []string) string {
|
||||
var sb strings.Builder
|
||||
|
||||
@@ -621,7 +622,7 @@ func formatKlineDataEN(symbol string, tfData map[string]*market.TimeframeSeriesD
|
||||
}
|
||||
|
||||
|
||||
// getOIInterpretationEN 获取OI变化解读(英文)
|
||||
// getOIInterpretationEN returns OI change interpretation (English)
|
||||
func getOIInterpretationEN(oiChange, priceChange string) string {
|
||||
if oiChange == "increase" && priceChange == "up" {
|
||||
return OIInterpretation.OIUp_PriceUp.EN
|
||||
|
||||
Reference in New Issue
Block a user