feat: Refactor settings UI and fix commission fee recording
Settings improvements: - Reorganize config groups with logical ordering (server, auth, ai, trading, etc.) - Add description/tooltip for each config item with question mark icon - Add icon to each group header - Support i18n for descriptions (zh-CN, zh-TW, en-US) - Move order execution config (ORDER_MODE, MAKER_WAIT_SEC, MAKER_OFFSET_BPS) to env Commission fee fixes: - Fix fee extraction in exchange clients: Bybit, Coinbase, Kraken, Gate, Kucoin, Bitfinex - Properly accumulate and record commission fees in pending_order_worker - Add fee/fee_ccy fields to wait_for_fill returns Frontend updates: - Remove order_mode config from trading-assistant frontend (now uses env config) - Add sorted schema display by order field - Add tooltip with description on hover
This commit is contained in:
@@ -1911,21 +1911,20 @@ const locale = {
|
||||
'settings.copySuccess': 'Copied',
|
||||
'settings.copyFailed': 'Copy failed',
|
||||
// Settings groups
|
||||
'settings.group.auth': 'Authentication',
|
||||
// Settings groups (ordered by backend order)
|
||||
'settings.group.server': 'Server Configuration',
|
||||
'settings.group.worker': 'Order Worker',
|
||||
'settings.group.notification': 'Signal Notification',
|
||||
'settings.group.smtp': 'Email SMTP',
|
||||
'settings.group.twilio': 'Twilio SMS',
|
||||
'settings.group.auth': 'Security & Authentication',
|
||||
'settings.group.ai': 'AI / LLM Configuration',
|
||||
'settings.group.trading': 'Live Trading',
|
||||
'settings.group.strategy': 'Strategy Execution',
|
||||
'settings.group.proxy': 'Proxy Configuration',
|
||||
'settings.group.app': 'Application',
|
||||
'settings.group.ai': 'AI/LLM Configuration',
|
||||
'settings.group.market': 'Market Presets',
|
||||
'settings.group.data_source': 'Data Sources',
|
||||
'settings.group.search': 'Search Configuration',
|
||||
'settings.group.agent_memory': 'Memory/Reflection',
|
||||
'settings.group.reflection_worker': 'Auto Reflection Verification Worker',
|
||||
'settings.group.notification': 'Notifications',
|
||||
'settings.group.email': 'Email (SMTP)',
|
||||
'settings.group.sms': 'SMS (Twilio)',
|
||||
'settings.group.agent': 'AI Agent',
|
||||
'settings.group.network': 'Network & Proxy',
|
||||
'settings.group.search': 'Web Search',
|
||||
'settings.group.app': 'Application',
|
||||
// Settings fields - Auth
|
||||
'settings.field.SECRET_KEY': 'Secret Key',
|
||||
'settings.field.ADMIN_USER': 'Admin Username',
|
||||
@@ -1937,6 +1936,10 @@ const locale = {
|
||||
// Settings fields - Worker
|
||||
'settings.field.ENABLE_PENDING_ORDER_WORKER': 'Enable Order Worker',
|
||||
'settings.field.PENDING_ORDER_STALE_SEC': 'Order Stale Timeout (sec)',
|
||||
// Settings fields - Trading
|
||||
'settings.field.ORDER_MODE': 'Order Mode',
|
||||
'settings.field.MAKER_WAIT_SEC': 'Limit Order Wait Time (sec)',
|
||||
'settings.field.MAKER_OFFSET_BPS': 'Limit Order Price Offset (bps)',
|
||||
// Settings fields - Notification
|
||||
'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL',
|
||||
'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token',
|
||||
@@ -2014,7 +2017,13 @@ const locale = {
|
||||
'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key',
|
||||
'settings.field.SEARCH_GOOGLE_CX': 'Google CX',
|
||||
'settings.field.SEARCH_BING_API_KEY': 'Bing API Key',
|
||||
'settings.field.INTERNAL_API_KEY': 'Internal API Key'
|
||||
'settings.field.INTERNAL_API_KEY': 'Internal API Key',
|
||||
|
||||
// Settings descriptions (config item descriptions)
|
||||
// Note: These are optional since backend already provides English descriptions
|
||||
'settings.desc.ORDER_MODE': 'maker: Limit order first (lower fees), market: Market order (instant fill)',
|
||||
'settings.desc.MAKER_WAIT_SEC': 'Wait time for limit order fill before switching to market order',
|
||||
'settings.desc.MAKER_OFFSET_BPS': 'Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)'
|
||||
}
|
||||
|
||||
export default {
|
||||
|
||||
@@ -1649,22 +1649,20 @@ const locale = {
|
||||
'settings.copyRestartCmd': '复制重启命令',
|
||||
'settings.copySuccess': '复制成功',
|
||||
'settings.copyFailed': '复制失败',
|
||||
// Settings groups
|
||||
'settings.group.auth': '认证配置',
|
||||
'settings.group.server': '服务器配置',
|
||||
'settings.group.worker': '订单处理配置',
|
||||
'settings.group.notification': '信号通知配置',
|
||||
'settings.group.smtp': '邮件SMTP配置',
|
||||
'settings.group.twilio': 'Twilio短信配置',
|
||||
'settings.group.strategy': '策略执行配置',
|
||||
'settings.group.proxy': '代理配置',
|
||||
'settings.group.app': '应用配置',
|
||||
// Settings groups (按后端 order 排序)
|
||||
'settings.group.server': '服务配置',
|
||||
'settings.group.auth': '安全认证',
|
||||
'settings.group.ai': 'AI/LLM配置',
|
||||
'settings.group.market': '市场预设',
|
||||
'settings.group.data_source': '数据源配置',
|
||||
'settings.group.trading': '实盘交易',
|
||||
'settings.group.strategy': '策略执行',
|
||||
'settings.group.data_source': '数据源',
|
||||
'settings.group.notification': '通知推送',
|
||||
'settings.group.email': '邮件配置',
|
||||
'settings.group.sms': '短信配置',
|
||||
'settings.group.agent': 'AI Agent',
|
||||
'settings.group.network': '网络代理',
|
||||
'settings.group.search': '搜索配置',
|
||||
'settings.group.agent_memory': '记忆/反思配置',
|
||||
'settings.group.reflection_worker': '自动反思验证Worker',
|
||||
'settings.group.app': '应用配置',
|
||||
// Settings fields - Auth
|
||||
'settings.field.SECRET_KEY': 'Secret Key',
|
||||
'settings.field.ADMIN_USER': '管理员用户名',
|
||||
@@ -1676,6 +1674,10 @@ const locale = {
|
||||
// Settings fields - Worker
|
||||
'settings.field.ENABLE_PENDING_ORDER_WORKER': '启用订单处理Worker',
|
||||
'settings.field.PENDING_ORDER_STALE_SEC': '订单超时时间(秒)',
|
||||
// Settings fields - Trading
|
||||
'settings.field.ORDER_MODE': '下单模式',
|
||||
'settings.field.MAKER_WAIT_SEC': '限价单等待时间(秒)',
|
||||
'settings.field.MAKER_OFFSET_BPS': '限价单价格偏移(基点)',
|
||||
// Settings fields - Notification
|
||||
'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL',
|
||||
'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token',
|
||||
@@ -1753,7 +1755,86 @@ const locale = {
|
||||
'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key',
|
||||
'settings.field.SEARCH_GOOGLE_CX': 'Google CX',
|
||||
'settings.field.SEARCH_BING_API_KEY': 'Bing API Key',
|
||||
'settings.field.INTERNAL_API_KEY': '内部API Key'
|
||||
'settings.field.INTERNAL_API_KEY': '内部API Key',
|
||||
|
||||
// Settings descriptions (配置项说明)
|
||||
'settings.desc.PYTHON_API_HOST': '服务监听地址。0.0.0.0 允许外部访问,127.0.0.1 仅本地访问',
|
||||
'settings.desc.PYTHON_API_PORT': '服务监听端口,默认5000',
|
||||
'settings.desc.PYTHON_API_DEBUG': '启用调试模式,开发时使用。生产环境请关闭',
|
||||
'settings.desc.SECRET_KEY': 'JWT签名密钥。生产环境必须修改以确保安全',
|
||||
'settings.desc.ADMIN_USER': '管理员登录用户名',
|
||||
'settings.desc.ADMIN_PASSWORD': '管理员登录密码。生产环境必须修改',
|
||||
'settings.desc.OPENROUTER_API_KEY': 'OpenRouter API密钥,用于访问多种AI模型',
|
||||
'settings.desc.OPENROUTER_API_URL': 'OpenRouter API端点地址',
|
||||
'settings.desc.OPENROUTER_MODEL': '默认使用的AI模型,如 openai/gpt-4o, anthropic/claude-3.5-sonnet',
|
||||
'settings.desc.OPENROUTER_TEMPERATURE': '模型创造性(0-1)。越低越确定性,越高越有创意',
|
||||
'settings.desc.OPENROUTER_MAX_TOKENS': '每次请求最大输出token数',
|
||||
'settings.desc.OPENROUTER_TIMEOUT': 'API请求超时时间(秒)',
|
||||
'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '连接建立超时时间(秒)',
|
||||
'settings.desc.AI_MODELS_JSON': '自定义模型列表,JSON格式,用于模型选择器',
|
||||
'settings.desc.ENABLE_PENDING_ORDER_WORKER': '启用后台订单处理Worker,实盘交易必需',
|
||||
'settings.desc.PENDING_ORDER_STALE_SEC': '等待订单超时时间,超时后标记为过期',
|
||||
'settings.desc.ORDER_MODE': 'maker: 限价单优先(手续费低),market: 市价单(立即成交)',
|
||||
'settings.desc.MAKER_WAIT_SEC': '限价单等待成交时间,超时后自动切换为市价单',
|
||||
'settings.desc.MAKER_OFFSET_BPS': '限价单价格偏移(基点)。买入价=市价*(1-偏移),卖出价=市价*(1+偏移)',
|
||||
'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁止服务重启时自动恢复运行中的策略',
|
||||
'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '策略主循环检查间隔(秒)',
|
||||
'settings.desc.PRICE_CACHE_TTL_SEC': '价格数据缓存有效期(秒)',
|
||||
'settings.desc.MARKET_TYPES_JSON': '自定义市场类型配置,JSON格式',
|
||||
'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易对列表,JSON格式',
|
||||
'settings.desc.DATA_SOURCE_TIMEOUT': '数据源请求默认超时时间',
|
||||
'settings.desc.DATA_SOURCE_RETRY': '数据源请求失败时的重试次数',
|
||||
'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '重试间隔时间(秒)',
|
||||
'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT默认交易所(binance, coinbase, okx等)',
|
||||
'settings.desc.CCXT_TIMEOUT': 'CCXT请求超时时间(毫秒)',
|
||||
'settings.desc.CCXT_PROXY': 'CCXT请求代理地址(如 socks5h://127.0.0.1:1080)',
|
||||
'settings.desc.FINNHUB_API_KEY': 'Finnhub API密钥,用于美股数据(有免费额度)',
|
||||
'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API请求超时时间',
|
||||
'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API速率限制(每分钟请求数)',
|
||||
'settings.desc.TIINGO_API_KEY': 'Tiingo API密钥,用于美股数据(有免费额度)',
|
||||
'settings.desc.TIINGO_TIMEOUT': 'Tiingo API请求超时时间',
|
||||
'settings.desc.AKSHARE_TIMEOUT': 'Akshare API超时时间,用于A股数据',
|
||||
'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API超时时间',
|
||||
'settings.desc.SIGNAL_WEBHOOK_URL': '信号通知Webhook地址(POST JSON)',
|
||||
'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook认证令牌,通过请求头发送',
|
||||
'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知请求超时时间',
|
||||
'settings.desc.TELEGRAM_BOT_TOKEN': 'Telegram机器人Token,从@BotFather获取',
|
||||
'settings.desc.SMTP_HOST': 'SMTP邮件服务器地址(如 smtp.gmail.com)',
|
||||
'settings.desc.SMTP_PORT': 'SMTP端口(TLS用587,SSL用465,明文用25)',
|
||||
'settings.desc.SMTP_USER': 'SMTP认证用户名(通常是邮箱地址)',
|
||||
'settings.desc.SMTP_PASSWORD': 'SMTP认证密码或应用专用密码',
|
||||
'settings.desc.SMTP_FROM': '邮件发件人地址',
|
||||
'settings.desc.SMTP_USE_TLS': '启用STARTTLS加密(推荐端口587)',
|
||||
'settings.desc.SMTP_USE_SSL': '启用SSL加密(端口465)',
|
||||
'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio账户SID,从控制台获取',
|
||||
'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio认证Token,从控制台获取',
|
||||
'settings.desc.TWILIO_FROM_NUMBER': 'Twilio发送短信的号码(如 +1234567890)',
|
||||
'settings.desc.ENABLE_AGENT_MEMORY': '启用AI Agent记忆功能,用于学习历史交易',
|
||||
'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': '启用本地向量相似度搜索进行记忆检索',
|
||||
'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '记忆向量嵌入维度',
|
||||
'settings.desc.AGENT_MEMORY_TOP_K': '检索时返回的相似记忆数量',
|
||||
'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '相似度搜索的候选记忆上限',
|
||||
'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '记忆时间衰减的半衰期(天)',
|
||||
'settings.desc.AGENT_MEMORY_W_SIM': '记忆排序中相似度分数的权重(0-1)',
|
||||
'settings.desc.AGENT_MEMORY_W_RECENCY': '记忆排序中时间新近度的权重(0-1)',
|
||||
'settings.desc.AGENT_MEMORY_W_RETURNS': '记忆排序中收益表现的权重(0-1)',
|
||||
'settings.desc.ENABLE_REFLECTION_WORKER': '启用后台自动交易反思Worker',
|
||||
'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '自动反思运行间隔(默认24小时)',
|
||||
'settings.desc.PROXY_HOST': '代理服务器主机名或IP',
|
||||
'settings.desc.PROXY_PORT': '代理服务器端口(留空则禁用代理)',
|
||||
'settings.desc.PROXY_SCHEME': '代理协议类型。socks5h 表示DNS也走代理',
|
||||
'settings.desc.PROXY_URL': '完整代理URL(设置后覆盖上面的配置)',
|
||||
'settings.desc.SEARCH_PROVIDER': '网页搜索提供商,用于AI研究功能',
|
||||
'settings.desc.SEARCH_MAX_RESULTS': '搜索返回的最大结果数',
|
||||
'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google自定义搜索API密钥',
|
||||
'settings.desc.SEARCH_GOOGLE_CX': 'Google可编程搜索引擎ID (CX)',
|
||||
'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing网页搜索API密钥',
|
||||
'settings.desc.INTERNAL_API_KEY': '内部API认证密钥,用于服务间调用',
|
||||
'settings.desc.CORS_ORIGINS': '允许的CORS来源(* 表示全部,或逗号分隔的列表)',
|
||||
'settings.desc.RATE_LIMIT': '每IP每分钟的API请求限制',
|
||||
'settings.desc.ENABLE_CACHE': '启用响应缓存以提高性能',
|
||||
'settings.desc.ENABLE_REQUEST_LOG': '记录所有API请求日志,用于调试',
|
||||
'settings.desc.ENABLE_AI_ANALYSIS': '启用AI驱动的市场分析功能'
|
||||
}
|
||||
|
||||
export default {
|
||||
|
||||
@@ -1650,21 +1650,20 @@ const locale = {
|
||||
'settings.copySuccess': '複製成功',
|
||||
'settings.copyFailed': '複製失敗',
|
||||
// Settings groups
|
||||
'settings.group.auth': '認證配置',
|
||||
'settings.group.server': '服務器配置',
|
||||
'settings.group.worker': '訂單處理配置',
|
||||
'settings.group.notification': '信號通知配置',
|
||||
'settings.group.smtp': '郵件SMTP配置',
|
||||
'settings.group.twilio': 'Twilio短信配置',
|
||||
'settings.group.strategy': '策略執行配置',
|
||||
'settings.group.proxy': '代理配置',
|
||||
'settings.group.app': '應用配置',
|
||||
// Settings groups (按後端 order 排序)
|
||||
'settings.group.server': '服務配置',
|
||||
'settings.group.auth': '安全認證',
|
||||
'settings.group.ai': 'AI/LLM配置',
|
||||
'settings.group.market': '市場預設',
|
||||
'settings.group.data_source': '數據源配置',
|
||||
'settings.group.trading': '實盤交易',
|
||||
'settings.group.strategy': '策略執行',
|
||||
'settings.group.data_source': '數據源',
|
||||
'settings.group.notification': '通知推送',
|
||||
'settings.group.email': '郵件配置',
|
||||
'settings.group.sms': '短信配置',
|
||||
'settings.group.agent': 'AI Agent',
|
||||
'settings.group.network': '網絡代理',
|
||||
'settings.group.search': '搜索配置',
|
||||
'settings.group.agent_memory': '記憶/反思配置',
|
||||
'settings.group.reflection_worker': '自動反思驗證Worker',
|
||||
'settings.group.app': '應用配置',
|
||||
// Settings fields - Auth
|
||||
'settings.field.SECRET_KEY': 'Secret Key',
|
||||
'settings.field.ADMIN_USER': '管理員用戶名',
|
||||
@@ -1676,6 +1675,10 @@ const locale = {
|
||||
// Settings fields - Worker
|
||||
'settings.field.ENABLE_PENDING_ORDER_WORKER': '啟用訂單處理Worker',
|
||||
'settings.field.PENDING_ORDER_STALE_SEC': '訂單超時時間(秒)',
|
||||
// Settings fields - Trading
|
||||
'settings.field.ORDER_MODE': '下單模式',
|
||||
'settings.field.MAKER_WAIT_SEC': '限價單等待時間(秒)',
|
||||
'settings.field.MAKER_OFFSET_BPS': '限價單價格偏移(基點)',
|
||||
// Settings fields - Notification
|
||||
'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL',
|
||||
'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token',
|
||||
@@ -1753,7 +1756,86 @@ const locale = {
|
||||
'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key',
|
||||
'settings.field.SEARCH_GOOGLE_CX': 'Google CX',
|
||||
'settings.field.SEARCH_BING_API_KEY': 'Bing API Key',
|
||||
'settings.field.INTERNAL_API_KEY': '內部API Key'
|
||||
'settings.field.INTERNAL_API_KEY': '內部API Key',
|
||||
|
||||
// Settings descriptions (配置項說明)
|
||||
'settings.desc.PYTHON_API_HOST': '服務監聽地址。0.0.0.0 允許外部訪問,127.0.0.1 僅本地訪問',
|
||||
'settings.desc.PYTHON_API_PORT': '服務監聽端口,默認5000',
|
||||
'settings.desc.PYTHON_API_DEBUG': '啟用調試模式,開發時使用。生產環境請關閉',
|
||||
'settings.desc.SECRET_KEY': 'JWT簽名密鑰。生產環境必須修改以確保安全',
|
||||
'settings.desc.ADMIN_USER': '管理員登錄用戶名',
|
||||
'settings.desc.ADMIN_PASSWORD': '管理員登錄密碼。生產環境必須修改',
|
||||
'settings.desc.OPENROUTER_API_KEY': 'OpenRouter API密鑰,用於訪問多種AI模型',
|
||||
'settings.desc.OPENROUTER_API_URL': 'OpenRouter API端點地址',
|
||||
'settings.desc.OPENROUTER_MODEL': '默認使用的AI模型,如 openai/gpt-4o, anthropic/claude-3.5-sonnet',
|
||||
'settings.desc.OPENROUTER_TEMPERATURE': '模型創造性(0-1)。越低越確定性,越高越有創意',
|
||||
'settings.desc.OPENROUTER_MAX_TOKENS': '每次請求最大輸出token數',
|
||||
'settings.desc.OPENROUTER_TIMEOUT': 'API請求超時時間(秒)',
|
||||
'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '連接建立超時時間(秒)',
|
||||
'settings.desc.AI_MODELS_JSON': '自定義模型列表,JSON格式,用於模型選擇器',
|
||||
'settings.desc.ENABLE_PENDING_ORDER_WORKER': '啟用後台訂單處理Worker,實盤交易必需',
|
||||
'settings.desc.PENDING_ORDER_STALE_SEC': '等待訂單超時時間,超時後標記為過期',
|
||||
'settings.desc.ORDER_MODE': 'maker: 限價單優先(手續費低),market: 市價單(立即成交)',
|
||||
'settings.desc.MAKER_WAIT_SEC': '限價單等待成交時間,超時後自動切換為市價單',
|
||||
'settings.desc.MAKER_OFFSET_BPS': '限價單價格偏移(基點)。買入價=市價*(1-偏移),賣出價=市價*(1+偏移)',
|
||||
'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁止服務重啟時自動恢復運行中的策略',
|
||||
'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '策略主循環檢查間隔(秒)',
|
||||
'settings.desc.PRICE_CACHE_TTL_SEC': '價格數據緩存有效期(秒)',
|
||||
'settings.desc.MARKET_TYPES_JSON': '自定義市場類型配置,JSON格式',
|
||||
'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易對列表,JSON格式',
|
||||
'settings.desc.DATA_SOURCE_TIMEOUT': '數據源請求默認超時時間',
|
||||
'settings.desc.DATA_SOURCE_RETRY': '數據源請求失敗時的重試次數',
|
||||
'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '重試間隔時間(秒)',
|
||||
'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT默認交易所(binance, coinbase, okx等)',
|
||||
'settings.desc.CCXT_TIMEOUT': 'CCXT請求超時時間(毫秒)',
|
||||
'settings.desc.CCXT_PROXY': 'CCXT請求代理地址(如 socks5h://127.0.0.1:1080)',
|
||||
'settings.desc.FINNHUB_API_KEY': 'Finnhub API密鑰,用於美股數據(有免費額度)',
|
||||
'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API請求超時時間',
|
||||
'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API速率限制(每分鐘請求數)',
|
||||
'settings.desc.TIINGO_API_KEY': 'Tiingo API密鑰,用於美股數據(有免費額度)',
|
||||
'settings.desc.TIINGO_TIMEOUT': 'Tiingo API請求超時時間',
|
||||
'settings.desc.AKSHARE_TIMEOUT': 'Akshare API超時時間,用於A股數據',
|
||||
'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API超時時間',
|
||||
'settings.desc.SIGNAL_WEBHOOK_URL': '信號通知Webhook地址(POST JSON)',
|
||||
'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook認證令牌,通過請求頭發送',
|
||||
'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知請求超時時間',
|
||||
'settings.desc.TELEGRAM_BOT_TOKEN': 'Telegram機器人Token,從@BotFather獲取',
|
||||
'settings.desc.SMTP_HOST': 'SMTP郵件服務器地址(如 smtp.gmail.com)',
|
||||
'settings.desc.SMTP_PORT': 'SMTP端口(TLS用587,SSL用465,明文用25)',
|
||||
'settings.desc.SMTP_USER': 'SMTP認證用戶名(通常是郵箱地址)',
|
||||
'settings.desc.SMTP_PASSWORD': 'SMTP認證密碼或應用專用密碼',
|
||||
'settings.desc.SMTP_FROM': '郵件發件人地址',
|
||||
'settings.desc.SMTP_USE_TLS': '啟用STARTTLS加密(推薦端口587)',
|
||||
'settings.desc.SMTP_USE_SSL': '啟用SSL加密(端口465)',
|
||||
'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio賬戶SID,從控制台獲取',
|
||||
'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio認證Token,從控制台獲取',
|
||||
'settings.desc.TWILIO_FROM_NUMBER': 'Twilio發送短信的號碼(如 +1234567890)',
|
||||
'settings.desc.ENABLE_AGENT_MEMORY': '啟用AI Agent記憶功能,用於學習歷史交易',
|
||||
'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': '啟用本地向量相似度搜索進行記憶檢索',
|
||||
'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '記憶向量嵌入維度',
|
||||
'settings.desc.AGENT_MEMORY_TOP_K': '檢索時返回的相似記憶數量',
|
||||
'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '相似度搜索的候選記憶上限',
|
||||
'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '記憶時間衰減的半衰期(天)',
|
||||
'settings.desc.AGENT_MEMORY_W_SIM': '記憶排序中相似度分數的權重(0-1)',
|
||||
'settings.desc.AGENT_MEMORY_W_RECENCY': '記憶排序中時間新近度的權重(0-1)',
|
||||
'settings.desc.AGENT_MEMORY_W_RETURNS': '記憶排序中收益表現的權重(0-1)',
|
||||
'settings.desc.ENABLE_REFLECTION_WORKER': '啟用後台自動交易反思Worker',
|
||||
'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '自動反思運行間隔(默認24小時)',
|
||||
'settings.desc.PROXY_HOST': '代理服務器主機名或IP',
|
||||
'settings.desc.PROXY_PORT': '代理服務器端口(留空則禁用代理)',
|
||||
'settings.desc.PROXY_SCHEME': '代理協議類型。socks5h 表示DNS也走代理',
|
||||
'settings.desc.PROXY_URL': '完整代理URL(設置後覆蓋上面的配置)',
|
||||
'settings.desc.SEARCH_PROVIDER': '網頁搜索提供商,用於AI研究功能',
|
||||
'settings.desc.SEARCH_MAX_RESULTS': '搜索返回的最大結果數',
|
||||
'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google自定義搜索API密鑰',
|
||||
'settings.desc.SEARCH_GOOGLE_CX': 'Google可編程搜索引擎ID (CX)',
|
||||
'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing網頁搜索API密鑰',
|
||||
'settings.desc.INTERNAL_API_KEY': '內部API認證密鑰,用於服務間調用',
|
||||
'settings.desc.CORS_ORIGINS': '允許的CORS來源(* 表示全部,或逗號分隔的列表)',
|
||||
'settings.desc.RATE_LIMIT': '每IP每分鐘的API請求限制',
|
||||
'settings.desc.ENABLE_CACHE': '啟用響應緩存以提高性能',
|
||||
'settings.desc.ENABLE_REQUEST_LOG': '記錄所有API請求日誌,用於調試',
|
||||
'settings.desc.ENABLE_AI_ANALYSIS': '啟用AI驅動的市場分析功能'
|
||||
}
|
||||
|
||||
export default {
|
||||
|
||||
@@ -28,15 +28,13 @@
|
||||
<a-spin :spinning="loading">
|
||||
<div class="settings-content">
|
||||
<a-collapse v-model="activeKeys" :bordered="false" class="settings-collapse">
|
||||
<a-collapse-panel v-for="(group, groupKey) in schema" :key="groupKey">
|
||||
<a-collapse-panel v-for="(group, groupKey) in sortedSchema" :key="groupKey">
|
||||
<template slot="header">
|
||||
<span class="panel-header">
|
||||
<a-icon :type="group.icon || getGroupIcon(groupKey)" class="panel-icon-left" />
|
||||
<span class="panel-title">{{ getGroupTitle(groupKey, group.title) }}</span>
|
||||
</span>
|
||||
</template>
|
||||
<template slot="extra">
|
||||
<a-icon :type="getGroupIcon(groupKey)" class="panel-icon" />
|
||||
</template>
|
||||
|
||||
<a-form :form="form" layout="vertical" class="settings-form">
|
||||
<a-row :gutter="24">
|
||||
@@ -49,8 +47,14 @@
|
||||
:key="item.key">
|
||||
<a-form-item>
|
||||
<template slot="label">
|
||||
<span class="form-label-with-link">
|
||||
<span>{{ getItemLabel(groupKey, item) }}</span>
|
||||
<span class="form-label-with-tooltip">
|
||||
<span class="label-text">{{ getItemLabel(groupKey, item) }}</span>
|
||||
<a-tooltip v-if="item.description" placement="top">
|
||||
<template slot="title">
|
||||
{{ getItemDescription(groupKey, item) }}
|
||||
</template>
|
||||
<a-icon type="question-circle" class="help-icon" />
|
||||
</a-tooltip>
|
||||
<a
|
||||
v-if="item.link"
|
||||
:href="item.link"
|
||||
@@ -158,7 +162,7 @@ export default {
|
||||
saving: false,
|
||||
schema: {},
|
||||
values: {},
|
||||
activeKeys: ['ai', 'data_source', 'app', 'auth'],
|
||||
activeKeys: ['server', 'auth', 'ai', 'trading'],
|
||||
passwordVisible: {},
|
||||
showRestartTip: false
|
||||
}
|
||||
@@ -166,6 +170,20 @@ export default {
|
||||
computed: {
|
||||
isDarkTheme () {
|
||||
return this.navTheme === 'dark' || this.navTheme === 'realdark'
|
||||
},
|
||||
// 按 order 排序的 schema
|
||||
sortedSchema () {
|
||||
const entries = Object.entries(this.schema)
|
||||
entries.sort((a, b) => {
|
||||
const orderA = a[1].order || 999
|
||||
const orderB = b[1].order || 999
|
||||
return orderA - orderB
|
||||
})
|
||||
const sorted = {}
|
||||
for (const [key, value] of entries) {
|
||||
sorted[key] = value
|
||||
}
|
||||
return sorted
|
||||
}
|
||||
},
|
||||
beforeCreate () {
|
||||
@@ -203,15 +221,16 @@ export default {
|
||||
server: 'cloud-server',
|
||||
worker: 'schedule',
|
||||
notification: 'notification',
|
||||
smtp: 'mail',
|
||||
twilio: 'phone',
|
||||
email: 'mail',
|
||||
sms: 'phone',
|
||||
strategy: 'fund',
|
||||
proxy: 'global',
|
||||
network: 'global',
|
||||
app: 'appstore',
|
||||
ai: 'robot',
|
||||
market: 'stock',
|
||||
trading: 'stock',
|
||||
data_source: 'database',
|
||||
search: 'search'
|
||||
search: 'search',
|
||||
agent: 'experiment'
|
||||
}
|
||||
return icons[groupKey] || 'setting'
|
||||
},
|
||||
@@ -228,6 +247,17 @@ export default {
|
||||
return translated !== key ? translated : item.label
|
||||
},
|
||||
|
||||
getItemDescription (groupKey, item) {
|
||||
// 先尝试从多语言获取描述
|
||||
const key = `settings.desc.${item.key}`
|
||||
const translated = this.$t(key)
|
||||
if (translated !== key) {
|
||||
return translated
|
||||
}
|
||||
// 回退到后端返回的描述
|
||||
return item.description || ''
|
||||
},
|
||||
|
||||
getLinkText (linkText) {
|
||||
if (!linkText) return this.$t('settings.getApi')
|
||||
// 如果是翻译键(以 settings.link. 开头),则翻译
|
||||
@@ -400,17 +430,18 @@ export default {
|
||||
.panel-header {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
flex: 1;
|
||||
|
||||
.panel-icon-left {
|
||||
font-size: 18px;
|
||||
color: @primary-color;
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.panel-icon {
|
||||
font-size: 18px;
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
|
||||
.ant-collapse-content {
|
||||
@@ -432,10 +463,27 @@ export default {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.form-label-with-link {
|
||||
.form-label-with-tooltip {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.label-text {
|
||||
color: #475569;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.help-icon {
|
||||
font-size: 14px;
|
||||
color: #94a3b8;
|
||||
cursor: help;
|
||||
transition: color 0.2s;
|
||||
|
||||
&:hover {
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
|
||||
.api-link {
|
||||
font-size: 12px;
|
||||
@@ -449,6 +497,7 @@ export default {
|
||||
background: rgba(24, 144, 255, 0.08);
|
||||
border-radius: 4px;
|
||||
transition: all 0.2s;
|
||||
margin-left: 4px;
|
||||
|
||||
&:hover {
|
||||
background: rgba(24, 144, 255, 0.15);
|
||||
@@ -540,8 +589,13 @@ export default {
|
||||
color: #e0e6ed;
|
||||
border-bottom-color: rgba(255, 255, 255, 0.06);
|
||||
|
||||
.panel-header .panel-title {
|
||||
color: #e0e6ed;
|
||||
.panel-header {
|
||||
.panel-icon-left {
|
||||
color: #58a6ff;
|
||||
}
|
||||
.panel-title {
|
||||
color: #e0e6ed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -561,12 +615,26 @@ export default {
|
||||
color: #c9d1d9;
|
||||
}
|
||||
|
||||
.form-label-with-link .api-link {
|
||||
background: rgba(24, 144, 255, 0.15);
|
||||
color: #58a6ff;
|
||||
.form-label-with-tooltip {
|
||||
.label-text {
|
||||
color: #c9d1d9;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgba(24, 144, 255, 0.25);
|
||||
.help-icon {
|
||||
color: #6e7681;
|
||||
|
||||
&:hover {
|
||||
color: #58a6ff;
|
||||
}
|
||||
}
|
||||
|
||||
.api-link {
|
||||
background: rgba(24, 144, 255, 0.15);
|
||||
color: #58a6ff;
|
||||
|
||||
&:hover {
|
||||
background: rgba(24, 144, 255, 0.25);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2570,8 +2570,7 @@ export default {
|
||||
trade_direction: tradeDirection,
|
||||
timeframe: values.timeframe,
|
||||
market_type: marketType,
|
||||
// Preset order params (advanced settings removed from UI)
|
||||
order_mode: 'maker',
|
||||
// Order execution settings moved to backend env config (ORDER_MODE, MAKER_WAIT_SEC, MAKER_OFFSET_BPS)
|
||||
margin_mode: 'cross',
|
||||
signal_mode: 'confirmed',
|
||||
// Backtest-like configs
|
||||
|
||||
Reference in New Issue
Block a user