diff --git a/app/db/analytics.py b/app/db/analytics.py index a40c503..0250bdd 100644 --- a/app/db/analytics.py +++ b/app/db/analytics.py @@ -197,7 +197,7 @@ def _decision_archive_where(archive_filter): ) """ if archive_filter == "executed": - # 已执行口径以 paper trading 账本为准。正在持仓中的模拟交易, + # 已执行口径以策略交易账本为准。正在持仓中的策略交易, # 其 recommendation 仍可能是 active/watch_pool,不能被归档条件挡掉。 return executed_where if archive_filter == "invalid": diff --git a/app/db/review_center.py b/app/db/review_center.py index 4972e33..76b3bdb 100644 --- a/app/db/review_center.py +++ b/app/db/review_center.py @@ -162,7 +162,7 @@ def _paper_review(conn, since, days): exit_reasons = _bucket_count([t for t in trades if t.get("status") == "closed"], "exit_reason", "unknown") event_types = _bucket_count(events, "event_type", "unknown") return { - "definition": "模拟交易复盘是唯一收益口径,基于 paper_trades 的开仓、平仓、移动止盈事件。", + "definition": "策略交易复盘是唯一收益口径,基于交易账本的开仓、平仓、移动止盈事件。", "summary": summary, "exit_reasons": exit_reasons, "event_types": event_types, @@ -306,7 +306,7 @@ def get_review_center_dashboard(days=30): "generated_at": datetime.now().isoformat(timespec="seconds"), "principles": [ "机会归档不计算交易收益,只记录发现、确认、失效和漏选。", - "真实收益口径只来自模拟交易或未来真实交易账本。", + "真实收益口径只来自策略交易或未来真实交易账本。", "链上、舆情、LLM 属于证据层,只做发现和解释,不直接改变推荐状态。", "策略迭代只发布经过样本约束和灰度闸门验证的规则。", ], diff --git a/app/db/scheduler_db.py b/app/db/scheduler_db.py index 2e6afac..0614dd6 100644 --- a/app/db/scheduler_db.py +++ b/app/db/scheduler_db.py @@ -45,7 +45,7 @@ DEFAULT_JOBS = [ "every_seconds": 180, "initial_delay": 30, "lock_group": "paper_trading_write", - "description": "模拟交易账本同步", + "description": "策略交易账本同步", "sort_order": 25, }, { @@ -386,7 +386,7 @@ def _display_job_name(job_name): "sentiment": "舆情", "onchain": "链上", "llm-sentiment": "AI舆情", - "paper-trader": "模拟交易", + "paper-trader": "策略交易", "review": "复盘", }.get(job_name, job_name) diff --git a/app/db/strategy_insights.py b/app/db/strategy_insights.py index 33d4d93..c607da9 100644 --- a/app/db/strategy_insights.py +++ b/app/db/strategy_insights.py @@ -75,7 +75,7 @@ def get_strategy_insights(): "paper_realized_pnl_usdt": paper_realized_usdt, "actionable_conversion_pct": round(len(actionable) / total * 100, 1) if total else 0, "paper_conversion_pct": round(len(paper_items) / len(buy_now) * 100, 1) if buy_now else 0, - "definition": "策略归因只看机会转化和模拟交易转化;收益只来自 paper_trades,不读取 recommendation.pnl_pct。", + "definition": "策略归因只看机会转化和策略交易转化;收益只来自交易账本,不读取 recommendation.pnl_pct。", } def add_bucket(bucket_map, key, item): @@ -135,8 +135,8 @@ def get_strategy_insights(): "metric_definition": { "opportunity_count": "进入 opportunity/recommendation 表的机会样本数,不代表交易。", "actionable_count": "确认层输出 buy_now 或 wait_pullback 的样本数。", - "paper_trade_count": "已经被模拟交易账本执行的样本数。", - "paper_realized_pnl_usdt": "仅来自 paper_trades 的已平仓模拟收益。", + "paper_trade_count": "已经被策略交易账本执行的样本数。", + "paper_realized_pnl_usdt": "仅来自交易账本的已平仓策略收益。", }, "factor_attribution": serialize_buckets("factor", factor_map)[:30], "market_environment": serialize_buckets("environment", env_map)[:20], diff --git a/app/services/altcoin_confirm.py b/app/services/altcoin_confirm.py index 9008abb..44e2efa 100644 --- a/app/services/altcoin_confirm.py +++ b/app/services/altcoin_confirm.py @@ -1299,7 +1299,7 @@ def confirm_burst(symbol, cand): def _watch_candidate_plan(symbol, result, cand_detail): - """把强势但未形成交易买点的样本写成机会观察,不触发模拟交易。""" + """把强势但未形成交易买点的样本写成机会观察,不触发策略交易。""" market_context = result.get("market_context") or {} signals = list(result.get("signals") or []) price = float(result.get("price") or 0) diff --git a/app/services/chat_assistant.py b/app/services/chat_assistant.py index e960f93..5897ebe 100644 --- a/app/services/chat_assistant.py +++ b/app/services/chat_assistant.py @@ -123,7 +123,7 @@ def extract_symbol(message: str, session=None, preferences=None) -> str: def detect_intent(message: str, symbol: str = "") -> str: text = str(message or "").lower() - if any(k in text for k in ("模拟交易", "纸面交易", "paper trading", "paper-trading", "paper")): + if any(k in text for k in ("策略交易", "模拟交易", "纸面交易", "paper trading", "paper-trading", "paper")): return "restricted" if not _is_crypto_question(text, symbol): return "unsupported" @@ -479,8 +479,8 @@ def build_context(intent: str, message: str, symbol: str, preferences=None) -> d def _fallback_answer(intent: str, message: str, context: dict) -> dict: if intent == "restricted": return { - "summary": "内部模拟交易数据不可在智能问答中直接访问。", - "answer": "我不能读取或解释内部模拟交易数据。你可以继续问公开行情、单币技术面、推荐解释、链上异动、舆情影响或复盘结果(不含纸面交易明细)。", + "summary": "内部策略交易数据不可在智能问答中直接访问。", + "answer": "我不能读取或解释内部策略交易数据。你可以继续问公开行情、单币技术面、推荐解释、链上异动、舆情影响或复盘结果(不含交易账本明细)。", "evidence": [], "related_records": [], "followups": ["分析 BTC/USDT 的技术面", "解释最新推荐为什么不是可买"], @@ -614,7 +614,7 @@ def _call_chat_llm(message: str, context: dict, history=None) -> dict: "context": context, "recent_history": (history or [])[-8:], "rules": [ - "只回答加密货币、AlphaX 当前数据、技术面、链上、舆情、复盘相关问题,不要访问内部模拟交易数据。", + "只回答加密货币、AlphaX 当前数据、技术面、链上、舆情、复盘相关问题,不要访问内部策略交易数据。", "不要给真实下单指令,不要修改推荐状态,不要承诺收益。", "回答使用中文,采用两段式:先结论,再证据。", "根据 intent 选择 answer_style:technical/decision/market/news/onchain/review/notice/help/default。", diff --git a/app/services/paper_trader.py b/app/services/paper_trader.py index 78cda96..6c0112c 100644 --- a/app/services/paper_trader.py +++ b/app/services/paper_trader.py @@ -52,7 +52,7 @@ def main(limit: int = 100): except Exception as exc: finished_at = datetime.now() log_cron_run( - job_name="模拟交易", + job_name="策略交易", script_name="paper_trader.py", run_status="error", result_status="exception", @@ -65,7 +65,7 @@ def main(limit: int = 100): raise finished_at = datetime.now() log_cron_run( - job_name="模拟交易", + job_name="策略交易", script_name="paper_trader.py", run_status="success", result_status=output.get("status", "completed"), diff --git a/app/services/price_tracker.py b/app/services/price_tracker.py index 8ad4625..d07db03 100644 --- a/app/services/price_tracker.py +++ b/app/services/price_tracker.py @@ -1,7 +1,7 @@ """ -山寨币爆发监控系统 — 推荐信号跟踪 + paper trading 执行账本 +山寨币爆发监控系统 — 推荐信号跟踪 + 策略交易执行账本 趋势反转检测:1H连续阴动K、量价背离、空头加速(替代MACD/RSI) -推荐层只管理信号状态;模拟成交、TP/SL、移动止盈由 paper_trading 独立负责。 +推荐层只管理信号状态;策略交易成交、TP/SL、移动止盈由 paper_trading 独立负责。 """ import sys, os, shutil @@ -140,14 +140,14 @@ def analyze_tracking_signals(symbol, rec, current_price): # ---- 止盈信号检测 ---- pnl_pct = ((current_price / entry_price) - 1) * 100 if entry_price > 0 else 0 - # TP/SL 是模拟交易生命周期,不再写成推荐信号动作。 + # TP/SL 是策略交易生命周期,不再写成推荐信号动作。 if tp1 > 0 and current_price >= tp1: - sell_signals.append(f"模拟交易目标价已到达(${tp1:.4f}),执行结果以 paper trading 为准") + sell_signals.append(f"策略交易目标价已到达(${tp1:.4f}),执行结果以交易账本为准") rules = load_rules() if tp1 == 0 and pnl_pct >= 15: - sell_signals.append(f"无TP保护但浮盈已达+{pnl_pct:.1f}%,仅作为信号风险提醒,是否平仓由 paper trading/人工处理") + sell_signals.append(f"无TP保护但浮盈已达+{pnl_pct:.1f}%,仅作为信号风险提醒,是否平仓由策略交易/人工处理") # ---- 止损接近警告 ---- if stop_loss > 0: @@ -155,7 +155,7 @@ def analyze_tracking_signals(symbol, rec, current_price): if loss_pct < 3: # 当前价离止损不到3% sell_signals.append(f"⚠️ 接近止损!当前${current_price:.4f}离止损${stop_loss:.4f}仅{loss_pct:.1f}%") if current_price <= stop_loss: - sell_signals.append(f"🔴 模拟交易止损价已触达!${current_price:.4f}≤${stop_loss:.4f},执行结果以 paper trading 为准") + sell_signals.append(f"🔴 策略交易止损价已触达!${current_price:.4f}≤${stop_loss:.4f},执行结果以交易账本为准") # ---- 趋势反转信号(PA行为检测,替代MACD) ---- if h1_df is not None and len(h1_df) >= 30 and atr_1h > 0: diff --git a/static/app.html b/static/app.html index 46f74c0..5f92160 100644 --- a/static/app.html +++ b/static/app.html @@ -904,12 +904,12 @@ function historyOutcome(r) { if (paper && paper.status === 'closed') { var exitReason = String(paper.exit_reason || '').toLowerCase(); if (exitReason === 'stop_loss' || exitReason === 'sl' || exitReason === 'stopped_out') { - return { resolved: true, type: 'executed_failed', label: '模拟交易止损', detail: '已进入模拟交易并触发止损' }; + return { resolved: true, type: 'executed_failed', label: '策略交易止损', detail: '已进入策略交易并触发止损' }; } - return { resolved: true, type: 'executed_success', label: '模拟交易兑现', detail: '已进入模拟交易并完成退出' }; + return { resolved: true, type: 'executed_success', label: '策略交易兑现', detail: '已进入策略交易并完成退出' }; } if (paper && paper.status === 'open') { - return { resolved: true, type: 'executed_open', label: '模拟交易持有', detail: '已进入模拟交易,仍在持仓中' }; + return { resolved: true, type: 'executed_open', label: '策略交易持有', detail: '已进入策略交易,仍在持仓中' }; } if (status === 'hit_tp1' || status === 'hit_tp2' || execution === 'completed') { return { resolved: true, type: 'executed_success', label: '执行后兑现', detail: '已进入模拟/持仓口径验证' }; @@ -949,7 +949,7 @@ async function loadHistoryRecommendations(reset) { $('histCount').textContent = totalCount ? ' ' + totalCount : ''; $('historyStats').innerHTML = '
'+totalCount+'
归档信号
机会/观察历史
'+ - '
'+executedCount+'
进入执行
收益见模拟交易
'+ + '
'+executedCount+'
进入执行
收益见策略交易
'+ '
'+notExecutedCount+'
未执行归档
观察/等回踩失效
'+ '
'+invalidCount+'
信号失效
含过期/风控失效
'; var items = Array.isArray(page.items) ? page.items : []; @@ -994,14 +994,14 @@ async function loadHistoryRecommendations(reset) { var sigs = Array.isArray(r.signals)?r.signals:[]; var sigHtml = sigs.slice(0,4).map(function(s){ return ''+cleanDisplayText(s).replace(/^(\\d+H|\\d+m|日线|周线)\\s*/,'').slice(0,12)+''; }).join(''); var duration = daysBetween(r.rec_time, r.last_track_time||r.hit_tp1_time||r.stopped_out_time); - var execText = hasPaper ? (paper.status === 'closed' ? '模拟交易已完成' : '模拟交易持有中') : (Number(r.entry_triggered || 0) ? '已触发执行' : '未执行'); + var execText = hasPaper ? (paper.status === 'closed' ? '策略交易已完成' : '策略交易持有中') : (Number(r.entry_triggered || 0) ? '已触发执行' : '未执行'); var signalStateText = hasPaper ? '已执行归档' : (historyArchiveFilter === 'invalid' ? '失效归档' : '未执行归档'); var outcomeText = outcome.label; var outcomeDetail = outcome.detail; return '
'+ '
'+base.slice(0,2).toUpperCase()+'
'+base+'
'+outcomeText+'
'+ '
'+(hasPaper ? '$'+fmtN(entryP)+''+(paper.status === 'closed' ? '$'+fmtN(exitP) : '持有中')+'' : '未执行失效/归档')+'机会分 '+score+''+duration+'
'+ - '
交易阶段'+(hasPaper ? (paper.status === 'closed' ? '已完成模拟交易' : '模拟交易持有中') : '未执行归档')+'
结果说明'+outcomeDetail+'
执行状态'+execText+'
'+ + '
交易阶段'+(hasPaper ? (paper.status === 'closed' ? '已完成策略交易' : '策略交易持有中') : '未执行归档')+'
结果说明'+outcomeDetail+'
执行状态'+execText+'
'+ '
'+ (sigHtml?'
'+sigHtml+'
':'')+ '
'; diff --git a/static/base.html b/static/base.html index 9145ad8..483c4b6 100644 --- a/static/base.html +++ b/static/base.html @@ -183,7 +183,7 @@ a { color: inherit; text-decoration: none; } 订阅 邀请 - + diff --git a/static/config.html b/static/config.html index c688250..41bb931 100644 --- a/static/config.html +++ b/static/config.html @@ -23,7 +23,7 @@ -
建议:新闻源、LLM、链上、调度、模拟交易属于系统配置;复盘 meta、learned_rules、策略覆盖属于策略运行时配置。
+
建议:新闻源、LLM、链上、调度、策略交易属于系统配置;复盘 meta、learned_rules、策略覆盖属于策略运行时配置。
配置列表
--
diff --git a/static/data_export.html b/static/data_export.html index 0fc87c8..38ce8e9 100644 --- a/static/data_export.html +++ b/static/data_export.html @@ -34,7 +34,7 @@
导出内容
推荐链路recommendation / screening_log / cron_run_log
-
交易账本paper_orders / paper_trades / events
+
策略交易挂单 / 持仓 / 交易事件
复盘迭代review / missed / strategy rules
证据源舆情 / 链上 / AI 记录
运行配置策略与系统配置快照
diff --git a/static/iteration.html b/static/iteration.html index 642972b..2b23616 100644 --- a/static/iteration.html +++ b/static/iteration.html @@ -118,7 +118,7 @@ h2 { font-size:26px; font-weight:900; margin:0 0 8px; color:var(--ink); }
加载中…
-
发现的规律 未达标不发布
这些是系统复盘后发现的可能规律。只有样本、机会表现和稳定性都达标,才会进入线上策略;交易收益以模拟交易页为准。
+
发现的规律 未达标不发布
这些是系统复盘后发现的可能规律。只有样本、机会表现和稳定性都达标,才会进入线上策略;交易收益以策略交易页为准。
发布预演 只读评估,不改线上策略
主要失败原因
失败样本
版本机会表现
diff --git a/static/paper_trading.html b/static/paper_trading.html index 9bb16cd..9c84bd7 100644 --- a/static/paper_trading.html +++ b/static/paper_trading.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}AlphaX Agent — 模拟交易{% endblock %} +{% block title %}AlphaX Agent — 策略交易{% endblock %} {% block extra_head_css %}