diff --git a/__pycache__/market_screener.cpython-312.pyc b/__pycache__/market_screener.cpython-312.pyc index ae51445..1828e84 100644 Binary files a/__pycache__/market_screener.cpython-312.pyc and b/__pycache__/market_screener.cpython-312.pyc differ diff --git a/__pycache__/multi_timeframe.cpython-312.pyc b/__pycache__/multi_timeframe.cpython-312.pyc index bc1a9c4..18d42c6 100644 Binary files a/__pycache__/multi_timeframe.cpython-312.pyc and b/__pycache__/multi_timeframe.cpython-312.pyc differ diff --git a/__pycache__/price_monitor.cpython-312.pyc b/__pycache__/price_monitor.cpython-312.pyc index de3fcc6..8926ee0 100644 Binary files a/__pycache__/price_monitor.cpython-312.pyc and b/__pycache__/price_monitor.cpython-312.pyc differ diff --git a/__pycache__/stock_profile.cpython-312.pyc b/__pycache__/stock_profile.cpython-312.pyc index 40bc964..68d30a9 100644 Binary files a/__pycache__/stock_profile.cpython-312.pyc and b/__pycache__/stock_profile.cpython-312.pyc differ diff --git a/__pycache__/strategy_evaluator.cpython-312.pyc b/__pycache__/strategy_evaluator.cpython-312.pyc index 9f55607..fc575e5 100644 Binary files a/__pycache__/strategy_evaluator.cpython-312.pyc and b/__pycache__/strategy_evaluator.cpython-312.pyc differ diff --git a/__pycache__/strategy_lifecycle.cpython-312.pyc b/__pycache__/strategy_lifecycle.cpython-312.pyc index a5a1bcf..ca22d5f 100644 Binary files a/__pycache__/strategy_lifecycle.cpython-312.pyc and b/__pycache__/strategy_lifecycle.cpython-312.pyc differ diff --git a/__pycache__/technical_analysis.cpython-312.pyc b/__pycache__/technical_analysis.cpython-312.pyc index 72df9e7..cb3b840 100644 Binary files a/__pycache__/technical_analysis.cpython-312.pyc and b/__pycache__/technical_analysis.cpython-312.pyc differ diff --git a/data/analyst-knowledge-log.md b/data/analyst-knowledge-log.md new file mode 100644 index 0000000..f3c7220 --- /dev/null +++ b/data/analyst-knowledge-log.md @@ -0,0 +1,29 @@ + +## 2026-07-01 盘中自检:科创50跌3%HIGH信号分析 + +**事件:** 自愈执行器上报盘中宏观风险HIGH信号(科创50指数跌幅扩大至3%) + +**原因分析:** +- 韩国政府计划设立智库利用芯片巨头超额利润的传闻引发半导体板块恐慌 +- 三星电子一度跌超6%,SK海力士一度跌超5%,韩国KOSPI从+1.7%急跌至-4% +- 韩国产业通商资源部已紧急辟谣,KOSPI收窄至-0.87% +- 另一重因素:阳光电源崩跌近20%(光伏逆变器美国政策不确定性) + +**市场状态(14:13):** +- 上证指数 +0.39%(大盘整体稳定) +- 科创50 -2.37%(已从-3%回升) +- 创业板指 -1.63% + +**持仓影响:** +- 海博思创 -9.95%(距止损5.8%) +- 长芯博创 -8.53%(距止损仅2.9%⚠️) +- 中芯国际科创 -2.76%(距止损仅2.5%⚠️) +- 中际旭创 -3.73%(距止损3.9%) +- 均为高景气被动杀跌,按规则不动止损 + +**操作:** 已更新 macro_risk_state.json level从high降为medium,追加修正覆盖说明。无持仓操作建议。 + +**知识萃取:** +1. 韩国芯片巨头利税分配传闻是典型的「情绪性杀跌」——传闻已被辟谣,辟谣后指数快速回升。对A股科创板的影响主要通过半导体板块联动传导。 +2. 科创50跌3%触发的HIGH信号本身是正确的——但需要结合消息面做上下文修正。这正是实时信号采集器(红绿灯)产生信号后需要LLM深度分析验证的原因。本次红绿灯正确捕捉到信号,LLM分析修正了级别。 +3. 重仓科技股在情绪杀跌日不做止损调整——这是系统性应对规则的正确应用。长芯博创距止损仅2.9%也不应在恐慌日调宽,等1-2个交易日确认趋势。 diff --git a/data/decisions.json b/data/decisions.json index 37e67c4..ad236ea 100644 --- a/data/decisions.json +++ b/data/decisions.json @@ -3,21 +3,21 @@ { "code": "000657", "name": "中钨高新", - "price": 95.99, + "price": 95.94, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标105.13 | 止损93.58 | 买入区94.07~97.91", - "stop_loss": 93.58, - "entry_low": 94.07, - "entry_high": 97.91, - "tech_snapshot": "形态:带下影阳线/neutral 量价:主动买盘占优 强撑:86.01 弱撑:93.58 弱压:97.36 强压:105.13 | MA5=100.67 MA10=97.91 MA20=84.67 MA60=65.7", + "action": "盈利持有 | 目标105.29 | 止损93.12 | 买入区94.02~97.86", + "stop_loss": 93.12, + "entry_low": 94.02, + "entry_high": 97.86, + "tech_snapshot": "形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.12 弱压:100.04 强压:105.29 | MA5=98.52 MA10=99.15 MA20=87.78 MA60=67.28", "timing_signal": "信号不充分", - "rr_ratio": 3.79, + "rr_ratio": 3.32, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:00", + "updated_at": "2026-07-01 15:00", "type": "自选策略", "source": "auto", "sector_context": "", @@ -25,14 +25,14 @@ "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 93.58, - "entry_zone": "94.07~97.91", - "take_profit_zone": "0~105.13" + "stop_loss": 93.12, + "entry_zone": "94.02~97.86", + "take_profit_zone": "0~105.29" }, "created_at": "2026-06-24 14:23", - "last_reassessed_price": 94.87, - "take_profit": 105.13, - "updated_reason": "技术面重评: 止损92.71→93.58 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:86.01 弱撑:93.58 弱压:97.36 强压:105", + "last_reassessed_price": 96.21, + "take_profit": 105.29, + "updated_reason": "技术面重评: 止损93.11→93.12 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.12 弱压:100.04 强压:10", "changelog": [ { "date": "2026-06-24 14:23", @@ -1741,30 +1741,317 @@ "new_action": "盈利持有 | 目标105.13 | 止损93.58 | 买入区94.07~97.91", "reason": "技术面重评: 止损92.71→93.58 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:86.01 弱撑:93.58 弱压:97.36 强压:105", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | 目标105.13 | 止损93.58 | 买入区94.07~97.91", + "new_action": "盈利持有 | 目标105.13 | 止损93.06 | 买入区93.81~97.63", + "reason": "技术面重评: 止损93.58→93.06 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:86.01 弱撑:93.06 弱压:97.84 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:16", + "old_action": "盈利持有 | 目标105.13 | 止损93.06 | 买入区93.81~97.63", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损92.15 | 买入区94.07~97.91", + "reason": "技术面重评: 止损93.06→92.15 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:20", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损92.15 | 买入区94.07~97.91", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损92.74 | 买入区94.67~98.53", + "reason": "技术面重评: 止损92.15→92.74 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损92.74 | 买入区94.67~98.53", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.01~99.55", + "reason": "价格变动(96.6→100.01): 止损92.74→95.72 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:95.72 弱压:101.36 强压:10", + "trigger": "价格变动(96.6→100.01)" + }, + { + "date": "2026-07-01 09:37", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.01~99.55", + "new_action": "盈利持有 | 目标105.29 | 止损95.72 | 买入区96.05~99.55", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标105.29 | 止损95.72 | 买入区96.05~99.55", + "new_action": "盈利持有 | 目标105.29 | 止损95.72 | 买入区96.63~99.55", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:43", + "old_action": "盈利持有 | 目标105.29 | 止损95.72 | 买入区96.63~99.55", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.1~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:48", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.1~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.23~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.23~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.69~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:52", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.69~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.15~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区98.15~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标105.29 | 止损95.72 | 买入区97.13~99.55", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标105.29 | 止损95.72 | 买入区97.13~99.55", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标105.29 | 止损95.72 | 买入区97.03~99.55", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:00", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标105.29 | 止损95.72 | 买入区97.03~99.55", + "new_action": "盈利持有 | 目标105.29 | 止损95.72 | 买入区96.64~99.55", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:02", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标105.29 | 止损95.72 | 买入区97.14~99.55", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.72~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:04", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.72~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.87~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:08", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.87~99.55 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.77~99.55 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标105.29 | 止损95.72 | 买入区97.77~99.55 | 信号:买入", + "new_action": "盈利持有 | 目标105.29 | 止损95.24 | 买入区95.05~98.93 | 信号:关注", + "reason": "技术信号变化: 关注: 止损95.72→95.24 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:95.24 弱压:100.06 强压:10", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | 目标105.29 | 止损94.44 | 买入区94.29~98.13 | 信号:关注", + "new_action": "盈利持有 | 目标105.29 | 止损94.7 | 买入区94.45~98.31 | 信号:关注", + "reason": "技术面重评: 止损94.44→94.7 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:94.7 弱压:99.95 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 目标105.29 | 止损94.7 | 买入区94.45~98.31 | 信号:关注", + "new_action": "盈利持有 | 目标105.29 | 止损93.96 | 买入区93.88~97.72 | 信号:关注", + "reason": "技术面重评: 止损94.7→93.96 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.96 弱压:99.49 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:38", + "old_action": "盈利持有 | 目标105.29 | 止损93.96 | 买入区93.88~97.72 | 信号:关注", + "new_action": "盈利持有 | 目标105.29 | 止损94.05 | 买入区94.13~97.97", + "reason": "技术信号变化: 信号不充分: 止损93.96→94.05 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:94.05 弱压:99.69 强压:105", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 10:40", + "old_action": "盈利持有 | 目标105.29 | 止损94.05 | 买入区94.13~97.97", + "new_action": "盈利持有 | 目标105.29 | 止损94.04 | 买入区94.09~97.93", + "reason": "技术面重评: 止损94.05→94.04 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:94.04 弱压:99.68 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "盈利持有 | 目标105.29 | 止损94.04 | 买入区94.09~97.93", + "new_action": "盈利持有 | 目标105.29 | 止损93.4 | 买入区93.74~97.56", + "reason": "技术面重评: 止损94.04→93.4 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.4 弱压:99.6 强压:105.2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:50", + "old_action": "盈利持有 | 目标105.29 | 止损93.4 | 买入区93.74~97.56", + "new_action": "盈利持有 | 目标105.29 | 止损93.88 | 买入区94.43~98.29", + "reason": "技术面重评: 止损93.4→93.88 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.88 弱压:100.08 强压:10", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:52", + "old_action": "盈利持有 | 目标105.29 | 止损93.88 | 买入区94.43~98.29", + "new_action": "盈利持有 | 目标105.29 | 止损94.39 | 买入区95.18~98.75", + "reason": "技术面重评: 止损93.88→94.39 | 形态:倒T线/射击之星/neutral 量价:主动买盘占优 强撑:86.15 弱撑:94.39 弱压:100.59 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | 目标105.29 | 止损94.39 | 买入区95.18~98.75", + "new_action": "盈利持有 | 目标105.29 | 止损94.1 | 买入区94.75~98.58", + "reason": "技术面重评: 止损94.39→94.1 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:94.1 弱压:100.3 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:00", + "old_action": "盈利持有 | 目标105.29 | 止损94.1 | 买入区94.75~98.58", + "new_action": "盈利持有 | 目标105.29 | 止损93.55 | 买入区93.94~97.78", + "reason": "技术面重评: 止损94.1→93.55 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.55 弱压:99.75 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:18", + "old_action": "盈利持有 | 目标105.29 | 止损93.55 | 买入区93.94~97.78", + "new_action": "盈利持有 | 目标105.29 | 止损93.36 | 买入区94.18~98.02", + "reason": "技术面重评: 止损93.55→93.36 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.36 弱压:100.09 强压:10", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:23", + "old_action": "盈利持有 | 目标105.29 | 止损93.36 | 买入区94.18~98.02", + "new_action": "盈利持有 | 目标105.29 | 止损93.87 | 买入区94.93~98.44", + "reason": "技术面重评: 止损93.36→93.87 | 形态:倒T线/射击之星/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.87 弱压:100.6 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:26", + "old_action": "盈利持有 | 目标105.29 | 止损93.87 | 买入区94.93~98.44", + "new_action": "盈利持有 | 目标105.29 | 止损93.2 | 买入区93.94~97.78", + "reason": "技术面重评: 止损93.87→93.2 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.2 弱压:99.93 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:55", + "old_action": "盈利持有 | 目标105.29 | 止损93.2 | 买入区93.94~97.78", + "new_action": "盈利持有 | 目标105.29 | 止损92.24 | 买入区92.72~96.5", + "reason": "技术面重评: 止损93.2→92.24 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:92.24 弱压:99.16 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:58", + "old_action": "盈利持有 | 目标105.29 | 止损92.24 | 买入区92.72~96.5", + "new_action": "盈利持有 | 目标105.29 | 止损92.56 | 买入区93.2~97.0", + "reason": "技术面重评: 止损92.24→92.56 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:92.56 弱压:99.48 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:02", + "old_action": "盈利持有 | 目标105.29 | 止损92.56 | 买入区93.2~97.0", + "new_action": "盈利持有 | 目标105.29 | 止损93.1 | 买入区93.99~97.83", + "reason": "技术面重评: 止损92.56→93.1 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.1 弱压:100.02 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标105.29 | 止损93.1 | 买入区93.99~97.83", + "new_action": "盈利持有 | 目标105.29 | 止损93.56 | 买入区94.67~98.25", + "reason": "技术面重评: 止损93.1→93.56 | 形态:小阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.56 弱压:100.48 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标105.29 | 止损93.56 | 买入区94.67~98.25", + "new_action": "盈利持有 | 目标105.29 | 止损93.63 | 买入区94.77~98.29", + "reason": "技术面重评: 止损93.56→93.63 | 形态:小阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.63 弱压:100.55 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:20", + "old_action": "盈利持有 | 目标105.29 | 止损93.63 | 买入区94.77~98.29", + "new_action": "盈利持有 | 目标105.29 | 止损92.78 | 买入区93.51~97.33", + "reason": "技术面重评: 止损93.63→92.78 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:92.78 弱压:99.7 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:22", + "old_action": "盈利持有 | 目标105.29 | 止损92.78 | 买入区93.51~97.33", + "new_action": "盈利持有 | 目标105.29 | 止损93.08 | 买入区93.95~97.79", + "reason": "技术面重评: 止损92.78→93.08 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.08 弱压:100.0 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "盈利持有 | 目标105.29 | 止损93.08 | 买入区93.95~97.79", + "new_action": "盈利持有 | 目标105.29 | 止损92.94 | 买入区93.76~97.58", + "reason": "技术面重评: 止损93.08→92.94 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:92.94 弱压:99.86 强压:105", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:32", + "old_action": "盈利持有 | 目标105.29 | 止损92.94 | 买入区93.76~97.58", + "new_action": "盈利持有 | 目标105.29 | 止损92.7 | 买入区93.4~97.22", + "reason": "技术面重评: 止损92.94→92.7 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:92.7 弱压:99.62 强压:105.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:54", + "old_action": "盈利持有 | 目标105.29 | 止损92.7 | 买入区93.4~97.22", + "new_action": "盈利持有 | 目标105.29 | 止损93.09 | 买入区93.97~97.81", + "reason": "技术面重评: 止损92.7→93.09 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.09 弱压:100.01 强压:10", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "盈利持有 | 目标105.29 | 止损93.09 | 买入区93.97~97.81", + "new_action": "盈利持有 | 目标105.29 | 止损93.11 | 买入区94.01~97.85", + "reason": "技术面重评: 止损93.09→93.11 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.11 弱压:100.03 强压:10", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:00", + "old_action": "盈利持有 | 目标105.29 | 止损93.11 | 买入区94.01~97.85", + "new_action": "盈利持有 | 目标105.29 | 止损93.12 | 买入区94.02~97.86", + "reason": "技术面重评: 止损93.11→93.12 | 形态:带上影阴线/neutral 量价:主动买盘占优 强撑:86.15 弱撑:93.12 弱压:100.04 强压:10", + "trigger": "技术面重评" } ] }, { "code": "000700", "name": "模塑科技", - "price": 14.58, + "price": 15.34, "cost": 14.83, "shares": 1400, "avg_price": 14.83, - "action": "持有观察 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", "stop_loss": 13.91, "entry_low": 13.32, "entry_high": 14.09, - "tech_snapshot": "形态:带下影阳线/bullish 量价:主动买盘占优 强撑:12.56 弱撑:13.86 弱压:14.93 强压:15.25 | MA5=14.54 MA10=15.05 MA20=15.38 MA60=13.59", + "tech_snapshot": "形态:带上影阳线/neutral 量价:主动买盘占优 强撑:13.28 弱撑:14.55 弱压:16.1 强压:16.24 | MA5=14.44 MA10=14.83 MA20=15.44 MA60=13.73", "timing_signal": "持有", - "rr_ratio": 1.43, + "rr_ratio": 0.14, "status": "manual", "note": "⚠️盈亏比极低,关注", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:00", + "updated_at": "2026-07-01 15:00", "type": "持仓策略", "source": "manual", - "sector_context": "行业汽车零部件+0.9%,中性", + "sector_context": "行业汽车零部件上涨+1.7%,正常", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", @@ -2427,6 +2714,146 @@ "new_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", "reason": "价格变动(14.1→14.6): 策略文字调整", "trigger": "价格变动(14.1→14.6)" + }, + { + "date": "2026-07-01 09:33", + "old_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:37", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:43", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:48", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:53", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:38", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:50", + "old_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:52", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:00", + "old_action": "盈利良好 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:18", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:23", + "old_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:26", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:02", + "old_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ], "execution": { @@ -2436,36 +2863,35 @@ { "code": "000711", "name": "ST京蓝", - "price": 4.1, + "price": 4.77, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标4.54 | 止损3.98 | 买入区4.02~4.18 | 信号:观望", - "stop_loss": 3.98, - "entry_low": 4.02, - "entry_high": 4.18, - "tech_snapshot": "形态:倒T线/射击之星/neutral 量价:主动卖盘占优 强撑:3.51 弱撑:4.09 弱压:4.32 强压:4.54 | MA5=4.76 MA10=5.12 MA20=5.45 MA60=5.1", + "action": "盈利持有 | 目标5.44 | 止损4.63 | 买入区4.67~4.87 | 信号:观望", + "stop_loss": 4.63, + "entry_low": 4.67, + "entry_high": 4.87, + "tech_snapshot": "形态:平盘/neutral 量价:主动卖盘占优 强撑:4.31 弱撑:4.54 弱压:4.77 强压:5.44 | MA5=4.59 MA10=4.91 MA20=5.31 MA60=5.13", "timing_signal": "观望", - "rr_ratio": 3.67, + "rr_ratio": 2.91, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业房地产-0.7%,中性", + "sector_context": "行业房地产上涨+3.0%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 3.98, - "entry_zone": "4.02~4.18", - "take_profit_zone": "0~4.54" + "stop_loss": 4.63, + "entry_zone": "4.67~4.87", + "take_profit_zone": "0~5.44" }, "created_at": "2026-06-24 14:23", - "last_reassessed_price": 4.1, - "take_profit": 4.54, - "updated_reason": "技术面重评: 止损3.62→3.98 | 形态:倒T线/射击之星/neutral 量价:主动卖盘占优 强撑:3.51 弱撑:4.09 弱压:4.32 强压:4.5", + "last_reassessed_price": 4.77, + "take_profit": 5.44, "changelog": [ { "date": "2026-06-24 14:23", @@ -3061,40 +3487,62 @@ "new_action": "盈利持有 | 目标4.54 | 止损3.98 | 买入区4.02~4.18 | 信号:观望", "reason": "技术面重评: 止损3.62→3.98 | 形态:倒T线/射击之星/neutral 量价:主动卖盘占优 强撑:3.51 弱撑:4.09 弱压:4.32 强压:4.5", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | 目标4.54 | 止损3.98 | 买入区4.02~4.18 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标4.99 | 止损4.25 | 买入区4.45~4.55 | 信号:观望", + "reason": "价格变动(4.1→4.54): 止损3.98→4.25 | 形态:光头光脚阳线/neutral 量价:主动卖盘占优 强撑:4.1 弱撑:4.25 弱压:4.69 强压:4.99 |", + "trigger": "价格变动(4.1→4.54)" + }, + { + "date": "2026-07-01 09:16", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标4.99 | 止损4.25 | 买入区4.45~4.55 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损4.58 | 买入区4.67~4.87 | 信号:观望", + "reason": "价格变动(4.54→4.77): 止损4.25→4.58 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "价格变动(4.54→4.77)" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标5.44 | 止损4.54 | 买入区4.67~4.87 | 信号:观望", + "new_action": "盈利持有 | 目标5.44 | 止损4.63 | 买入区4.67~4.87 | 信号:观望", + "reason": "技术面重评: 止损4.54→4.63 | 形态:平盘/neutral 量价:主动卖盘占优 强撑:4.31 弱撑:4.54 弱压:4.77 强压:5.44 | MA", + "trigger": "技术面重评" } ] }, { "code": "001309", "name": "德明利", - "price": 928.6, + "price": 893.22, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", - "stop_loss": 810.0, - "entry_low": 873.18, - "entry_high": 908.82, - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:873.0 弱撑:902.38 弱压:970.0 强压:1031.82 | MA5=875.4 MA10=783.32 MA20=702.92 MA60=602.86", - "timing_signal": "买入", - "rr_ratio": 1.89, + "action": "盈利持有 | 止损参考858.0 | 买入区877.1~912.9", + "stop_loss": 858.0, + "entry_low": 877.1, + "entry_high": 912.9, + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:848.61 弱撑:856.81 弱压:952.81 强压:1024.1 | MA5=934.98 MA10=839.86 MA20=735.9 MA60=621.38", + "timing_signal": "neutral", + "rr_ratio": 3.73, "status": "manual", "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "manual", - "sector_context": "行业半导体大涨+3.8%,可适度积极", + "sector_context": "行业半导体-0.5%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 810.0, - "entry_zone": "873.18~908.82", - "take_profit_zone": "0~1153.26" + "stop_loss": 858.0, + "entry_zone": "877.1~912.9", + "take_profit_zone": "0~1024.69" }, "created_at": "2026-06-18 17:15", - "take_profit": 1153.26, + "last_reassessed_price": 895.0, + "take_profit": 1024.69, "changelog": [ { "date": "2026-06-18 10:25", @@ -3758,42 +4206,175 @@ "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", "reason": "技术信号变化: 买入: 策略文字调整", "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 09:16", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术信号变化: 买入: 策略文字调整", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 09:37", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "reason": "技术信号变化: 关注: 策略文字调整", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术信号变化: 买入: 策略文字调整", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 09:53", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 09:58", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术信号变化: 买入: 策略文字调整", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 10:00", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 10:02", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术信号变化: 买入: 策略文字调整", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 10:04", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:08", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:买入", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "reason": "技术信号变化: 关注: 策略文字调整", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "reason": "技术信号变化: 关注: 策略文字调整", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 10:50", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 12:00", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "reason": "技术信号变化: 关注: 策略文字调整", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 13:18", + "old_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82 | 信号:关注", + "new_action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 13:55", + "old_action": "盈利持有 | 目标1036.89 | 止损882.41 | 买入区889.84~926.16", + "new_action": "盈利持有 | 止损参考882.41 | 买入区889.84~926.16", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" + }, + { + "date": "2026-07-01 14:32", + "old_action": "盈利持有 | 目标1024.69 | 止损858.0 | 买入区877.1~912.9", + "new_action": "盈利持有 | 止损参考858.0 | 买入区877.1~912.9", + "reason": "技术信号变化: neutral: 策略文字调整", + "trigger": "技术信号变化: neutral" } ] }, { "code": "002594", "name": "比亚迪", - "price": 78.94, + "price": 80.66, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标85.2 | 止损73.51 | 买入区77.36~80.02 | 信号:观望", - "stop_loss": 73.51, - "entry_low": 77.36, - "entry_high": 80.02, - "tech_snapshot": "形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:73.5 弱撑:78.16 弱压:80.13 强压:85.2 | MA5=98.51 MA10=98.21 MA20=96.86 MA60=96.26", + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.24 | 买入区79.05~80.74 | 信号:观望", + "stop_loss": 78.24, + "entry_low": 79.05, + "entry_high": 80.74, + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.09 弱撑:78.92 弱压:82.02 强压:84.49 | MA5=99.16 MA10=98.47 MA20=96.75 MA60=96.44", "timing_signal": "观望", - "rr_ratio": 2.64, + "rr_ratio": 1.58, "status": "updated", - "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "note": "⚠️盈亏比偏低(1:1.6),谨慎买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业汽车整车下跌-1.2%,适度防御", + "sector_context": "行业汽车整车上涨+1.6%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 73.51, - "entry_zone": "77.36~80.02", - "take_profit_zone": "0~85.2" + "stop_loss": 78.24, + "entry_zone": "79.05~80.74", + "take_profit_zone": "0~84.49" }, "created_at": "2026-06-24 14:23", - "last_reassessed_price": 78.96, - "take_profit": 85.2, - "updated_reason": "技术面重评: 止损75.6→73.51 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:73.5 弱撑:78.16 弱压:80.13 强压:85.2", + "last_reassessed_price": 80.34, + "take_profit": 84.49, + "updated_reason": "技术面重评: 止损78.23→78.24 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.09 弱撑:78.92 弱压:82.02 强压:8", "changelog": [ { "date": "2026-06-24 14:23", @@ -5516,42 +6097,307 @@ "new_action": "盈利持有 | 目标85.2 | 止损73.51 | 买入区77.36~80.02 | 信号:观望", "reason": "技术面重评: 止损75.6→73.51 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:73.5 弱撑:78.16 弱压:80.13 强压:85.2", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | 目标85.2 | 止损73.51 | 买入区77.36~80.02 | 信号:观望", + "new_action": "盈利持有 | 目标85.52 | 止损77.31 | 买入区78.11~80.59 | 信号:观望", + "reason": "技术面重评: 止损73.51→77.31 | 形态:长影星线/neutral 量价:主动卖盘占优 强撑:73.7 弱撑:78.67 弱压:80.64 强压:85.52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "盈利持有 | 目标85.52 | 止损77.31 | 买入区78.11~80.59 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损76.51 | 买入区78.11~81.29 | 信号:观望", + "reason": "技术面重评: 止损77.31→76.51 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.68 | 止损78.16 | 买入区78.97~80.77 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.67 | 止损78.01 | 买入区78.81~80.67 | 信号:观望", + "reason": "技术面重评: 止损78.16→78.01 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:76.27 弱撑:79.7 弱压:81.03 强压:84.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:37", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.67 | 止损78.01 | 买入区78.81~80.67 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.61 | 止损77.84 | 买入区78.64~80.55 | 信号:观望", + "reason": "技术面重评: 止损78.01→77.84 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:76.21 弱撑:79.7 弱压:80.92 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.61 | 止损77.84 | 买入区78.64~80.55 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.6 | 止损77.83 | 买入区78.64~80.54 | 信号:观望", + "reason": "技术面重评: 止损77.84→77.83 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:76.2 弱撑:79.7 弱压:80.91 强压:84", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:43", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.6 | 止损77.83 | 买入区78.64~80.54 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.54 | 止损77.71 | 买入区78.51~80.44 | 信号:观望", + "reason": "技术面重评: 止损77.83→77.71 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:76.14 弱撑:79.61 弱压:80.79 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:48", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.54 | 止损77.71 | 买入区78.51~80.44 | 信号:观望", + "new_action": "盈利持有 | 目标85.55 | 止损76.79 | 买入区77.59~80.29 | 信号:观望", + "reason": "技术面重评: 止损77.71→76.79 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:74.05 弱撑:78.52 弱压:80.45 强压:85.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标85.55 | 止损76.79 | 买入区77.59~80.29 | 信号:观望", + "new_action": "盈利持有 | 目标86.34 | 止损76.52 | 买入区77.31~80.45 | 信号:观望", + "reason": "技术面重评: 止损76.79→76.52 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:72.85 弱撑:78.11 弱压:80.38 强压:86.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:53", + "old_action": "盈利持有 | 目标86.34 | 止损76.52 | 买入区77.31~80.45 | 信号:观望", + "new_action": "盈利持有 | 目标86.36 | 止损76.56 | 买入区77.35~80.48 | 信号:观望", + "reason": "技术面重评: 止损76.52→76.56 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:72.86 弱撑:78.15 弱压:80.42 强压:86.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标86.36 | 止损76.56 | 买入区77.35~80.48 | 信号:观望", + "new_action": "盈利持有 | 目标86.4 | 止损76.67 | 买入区77.46~80.56 | 信号:观望", + "reason": "技术面重评: 止损76.56→76.67 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:72.89 弱撑:78.21 弱压:80.48 强压:86.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "盈利持有 | 目标86.38 | 止损76.62 | 买入区77.41~80.52 | 信号:观望", + "new_action": "盈利持有 | 目标86.41 | 止损76.71 | 买入区77.5~80.59 | 信号:观望", + "reason": "技术面重评: 止损76.62→76.71 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:72.89 弱撑:78.23 弱压:80.5 强压:86.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:00", + "old_action": "盈利持有 | 目标86.41 | 止损76.71 | 买入区77.5~80.59 | 信号:观望", + "new_action": "盈利持有 | 目标86.37 | 止损76.6 | 买入区77.39~80.51 | 信号:观望", + "reason": "技术面重评: 止损76.71→76.6 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:72.87 弱撑:78.16 弱压:80.43 强压:86.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:02", + "old_action": "盈利持有 | 目标86.37 | 止损76.6 | 买入区77.39~80.51 | 信号:观望", + "new_action": "盈利持有 | 目标83.66 | 止损76.29 | 买入区77.08~79.24 | 信号:观望", + "reason": "技术面重评: 止损76.6→76.29 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:75.26 弱撑:77.85 弱压:80.28 强压:83.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:04", + "old_action": "盈利持有 | 目标83.66 | 止损76.29 | 买入区77.08~79.24 | 信号:观望", + "new_action": "盈利持有 | 目标83.66 | 止损76.32 | 买入区77.11~79.26 | 信号:观望", + "reason": "技术面重评: 止损76.29→76.32 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:75.26 弱撑:77.84 弱压:80.31 强压:83.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | 目标83.66 | 止损76.32 | 买入区77.11~79.26 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标83.77 | 止损76.72 | 买入区77.51~79.54 | 信号:观望", + "reason": "技术面重评: 止损76.32→76.72 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:75.37 弱撑:78.07 弱压:80.6 强压:83.7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标83.77 | 止损76.72 | 买入区77.51~79.54 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标83.82 | 止损76.84 | 买入区77.64~79.63 | 信号:观望", + "reason": "技术面重评: 止损76.72→76.84 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:75.42 弱撑:78.15 弱压:80.68 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标83.82 | 止损76.84 | 买入区77.64~79.63 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.0 | 止损77.38 | 买入区78.17~80.03 | 信号:观望", + "reason": "技术面重评: 止损76.84→77.38 | 形态:长影星线/neutral 量价:主动卖盘占优 强撑:75.6 弱撑:78.52 弱压:81.05 强压:84.0 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:38", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标84.0 | 止损77.38 | 买入区78.17~80.03 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标83.92 | 止损77.16 | 买入区77.96~79.86 | 信号:观望", + "reason": "技术面重评: 止损77.38→77.16 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:75.52 弱撑:78.35 弱压:80.88 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:40", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标83.92 | 止损77.16 | 买入区77.96~79.86 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.1 | 止损77.64 | 买入区78.44~80.22 | 信号:观望", + "reason": "技术面重评: 止损77.16→77.64 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:75.7 弱撑:78.73 弱压:81.26 强压:84", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.1 | 止损77.64 | 买入区78.44~80.22 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.07 | 止损77.59 | 买入区78.39~80.18 | 信号:观望", + "reason": "技术面重评: 止损77.64→77.59 | 形态:十字星/neutral 量价:主动卖盘占优 强撑:75.67 弱撑:78.67 弱压:81.2 强压:84.07 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:50", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.07 | 止损77.59 | 买入区78.39~80.18 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.2 | 止损77.95 | 买入区78.75~80.45 | 信号:观望", + "reason": "技术面重评: 止损77.59→77.95 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:75.8 弱撑:78.91 弱压:81.44 强压:84", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:52", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.2 | 止损77.95 | 买入区78.75~80.45 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.16 | 止损77.85 | 买入区78.65~80.37 | 信号:观望", + "reason": "技术面重评: 止损77.95→77.85 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:75.76 弱撑:78.85 弱压:81.38 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.11 | 止损77.71 | 买入区78.51~80.27 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.2 | 止损77.96 | 买入区78.76~80.46 | 信号:观望", + "reason": "技术面重评: 止损77.71→77.96 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:75.8 弱撑:78.92 弱压:81.45 强压:84", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:00", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.2 | 止损77.96 | 买入区78.76~80.46 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标84.31 | 止损78.28 | 买入区79.09~80.69 | 信号:观望", + "reason": "技术面重评: 止损77.96→78.28 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:75.91 弱撑:79.14 弱压:81.67 强压:84.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:18", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标84.31 | 止损78.28 | 买入区79.09~80.69 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标84.45 | 止损78.51 | 买入区79.32~80.89 | 信号:观望", + "reason": "技术面重评: 止损78.28→78.51 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:76.05 弱撑:79.23 弱压:81.96 强压:84.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:23", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标84.45 | 止损78.51 | 买入区79.32~80.89 | 信号:观望", + "new_action": "盈利持有 | 目标86.75 | 止损78.55 | 买入区79.36~81.83 | 信号:观望", + "reason": "技术面重评: 止损78.51→78.55 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:73.79 弱撑:79.27 弱压:82.0 强压:86.7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:26", + "old_action": "盈利持有 | 目标86.75 | 止损78.55 | 买入区79.36~81.83 | 信号:观望", + "new_action": "盈利持有 | 目标86.82 | 止损78.73 | 买入区79.54~81.97 | 信号:观望", + "reason": "技术面重评: 止损78.55→78.73 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:73.84 弱撑:79.38 弱压:82.11 强压:86.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:55", + "old_action": "盈利持有 | 目标86.97 | 止损78.78 | 买入区79.6~82.06 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.33 | 止损77.79 | 买入区78.6~80.41 | 信号:观望", + "reason": "技术面重评: 止损78.78→77.79 | 形态:长影星线/neutral 量价:主动卖盘占优 强撑:75.93 弱撑:78.62 弱压:81.72 强压:84.3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:58", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.33 | 止损77.79 | 买入区78.6~80.41 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.42 | 止损78.06 | 买入区78.86~80.6 | 信号:观望", + "reason": "技术面重评: 止损77.79→78.06 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.02 弱撑:78.8 弱压:81.9 强压:84.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.38 | 止损77.93 | 买入区78.73~80.51 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.4 | 止损77.93 | 买入区78.73~80.52 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标84.4 | 止损77.93 | 买入区78.73~80.52 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.42 | 止损78.04 | 买入区78.84~80.59 | 信号:观望", + "reason": "技术面重评: 止损77.93→78.04 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.02 弱撑:78.8 弱压:81.9 强压:84.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.42 | 止损78.04 | 买入区78.84~80.59 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.43 | 止损78.08 | 买入区78.88~80.62 | 信号:观望", + "reason": "技术面重评: 止损78.04→78.08 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.03 弱撑:78.81 弱压:81.91 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:20", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.43 | 止损78.08 | 买入区78.88~80.62 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.25 | 买入区79.06~80.75 | 信号:观望", + "reason": "技术面重评: 止损78.08→78.25 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.09 弱撑:78.92 弱压:82.02 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:22", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.25 | 买入区79.06~80.75 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标84.52 | 止损78.36 | 买入区79.16~80.82 | 信号:观望", + "reason": "技术面重评: 止损78.25→78.36 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.12 弱撑:78.98 弱压:82.08 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标84.52 | 止损78.36 | 买入区79.16~80.82 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.47 | 止损78.19 | 买入区79.0~80.7 | 信号:观望", + "reason": "技术面重评: 止损78.36→78.19 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.07 弱撑:78.89 弱压:81.99 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:32", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.47 | 止损78.19 | 买入区79.0~80.7 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.47 | 止损78.18 | 买入区78.99~80.7 | 信号:观望", + "reason": "技术面重评: 止损78.19→78.18 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.07 弱撑:78.88 弱压:81.98 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:54", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.47 | 止损78.18 | 买入区78.99~80.7 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.23 | 买入区79.04~80.73 | 信号:观望", + "reason": "技术面重评: 止损78.18→78.23 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.09 弱撑:78.92 弱压:82.02 强压:8", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:01", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.23 | 买入区79.04~80.73 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标84.49 | 止损78.24 | 买入区79.05~80.74 | 信号:观望", + "reason": "技术面重评: 止损78.23→78.24 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:76.09 弱撑:78.92 弱压:82.02 强压:8", + "trigger": "技术面重评" } ] }, { "code": "00700", - "name": "腾讯控股", - "price": 420.8, + "name": "腾讯", + "price": 429.8, "cost": 442.68, "shares": 100, "avg_price": 442.68, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损408.18 | 目标439.59 | 买入区416.13~423.07 | 信号:持有", - "stop_loss": 408.18, - "entry_low": 416.13, - "entry_high": 423.07, - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:388.22 弱撑:416.13 弱压:427.73 强压:457.91 | MA5=615.8 MA10=618.1 MA20=613.3 MA60=563.41", - "timing_signal": "持有", - "rr_ratio": 1.14, - "status": "updated", - "note": "⚠️盈亏比偏低(1:1.1),不建议加仓", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 损414.51 | 盈452.53 | 买421.2~429.72", + "stop_loss": 416.91, + "entry_low": 421.2, + "entry_high": 429.72, + "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:403.33 弱撑:420.2 弱压:437.47 强压:452.53 | MA5=620.7 MA10=621.4 MA20=614.35 MA60=561.43", + "timing_signal": "信号不充分", + "rr_ratio": 1.49, + "status": "review", + "note": "⚠️盈亏比不足1:1.5,不建议买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业软件开发上涨+1.5%,正常", + "sector_context": "行业软件开发上涨+3.0%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 408.18, - "entry_zone": "416.13~423.07", - "take_profit_zone": "0~439.59" + "stop_loss": 416.91, + "entry_zone": "421.2~429.72", + "take_profit_zone": "0~434.43" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 421.2, - "take_profit": 439.59, - "updated_reason": "技术面重评: 止损409.73→408.18, 止盈453.81→439.59 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:388.22 弱撑:416.13 弱压:427.73 强压", + "take_profit": 434.43, "changelog": [ { "date": "2026-06-18 10:26", @@ -7554,42 +8400,62 @@ "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损408.18 | 目标439.59 | 买入区416.13~423.07 | 信号:持有", "reason": "技术面重评: 止损409.73→408.18, 止盈453.81→439.59 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:388.22 弱撑:416.13 弱压:427.73 强压", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损408.18 | 目标439.59 | 买入区416.13~423.07 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 损414.51 | 盈452.53 | 买421.2~429.72", + "reason": "技术信号变化: 信号不充分: 止损408.18→416.91, 止盈439.59→434.43 | 形态:带上影阳线/neutral 量价:数据不足 强撑:403.33 弱撑:420.2 弱压:437.47 强压:452", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:48", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 损414.51 | 盈452.53 | 买421.2~429.72", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 损416.91 | 盈452.53 | 买421.2~431.16", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 损416.91 | 盈452.53 | 买421.2~431.16", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 损414.51 | 盈452.53 | 买421.2~429.72", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "00968", "name": "信义光能", - "price": 2.04, + "price": 2.06, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标2.23 | 止损1.92 | 买入区2.0~2.04 | 信号:关注", - "stop_loss": 1.92, - "entry_low": 2.0, - "entry_high": 2.04, - "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:1.86 弱撑:2.02 弱压:2.08 强压:2.23 | MA5=3.07 MA10=3.13 MA20=3.2 MA60=3.33", - "timing_signal": "关注", - "rr_ratio": 1.58, - "status": "updated", - "note": "⚠️盈亏比偏低(1:1.6),谨慎买入", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.98 | 买入区2.02~2.05 | 信号:弱势持有", + "stop_loss": 1.98, + "entry_low": 2.02, + "entry_high": 2.05, + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | MA5=3.11 MA10=3.14 MA20=3.22 MA60=3.33", + "timing_signal": "弱势持有", + "rr_ratio": 1.25, + "status": "review", + "note": "⚠️盈亏比不足1:1.5,不建议买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业电力-0.6%,中性", + "sector_context": "行业电力上涨+2.3%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 1.92, - "entry_zone": "2.0~2.04", - "take_profit_zone": "0~2.23" + "stop_loss": 1.98, + "entry_zone": "2.02~2.05", + "take_profit_zone": "0~2.21" }, "created_at": "2026-06-24 14:23", "last_reassessed_price": 2.05, - "take_profit": 2.23, - "updated_reason": "技术面重评: 止损1.75→1.92 | 形态:带上影阳线/neutral 量价:数据不足 强撑:1.86 弱撑:2.02 弱压:2.08 强压:2.23 | M", + "take_profit": 2.21, "changelog": [ { "date": "2026-06-24 14:23", @@ -8745,6 +9611,34 @@ "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标2.23 | 止损1.92 | 买入区2.0~2.04 | 信号:关注", "reason": "技术面重评: 止损1.75→1.92 | 形态:带上影阳线/neutral 量价:数据不足 强撑:1.86 弱撑:2.02 弱压:2.08 强压:2.23 | M", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标2.23 | 止损1.92 | 买入区2.0~2.04 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.94 | 买入区2.02~2.05 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损1.92→1.94 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | ", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.94 | 买入区2.02~2.05 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.98 | 买入区2.02~2.05 | 信号:弱势持有", + "reason": "技术面重评: 止损1.94→1.98 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.98 | 买入区2.02~2.05 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损2.0 | 买入区2.02~2.05 | 信号:弱势持有", + "reason": "技术面重评: 止损1.98→2.0 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损2.0 | 买入区2.02~2.05 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.98 | 买入区2.02~2.05 | 信号:弱势持有", + "reason": "技术面重评: 止损2.0→1.98 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | ", + "trigger": "技术面重评" } ] }, @@ -8755,32 +9649,31 @@ "cost": 75.86, "shares": 500, "avg_price": 75.86, - "action": "盈利良好 | 止损86.72 | 目标97.27 | 买入区84.8~89.04 | 信号:持有", + "action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", "stop_loss": 86.72, "entry_low": 84.8, "entry_high": 89.04, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:77.18 弱撑:84.8 弱压:91.32 强压:98.38 | MA5=82.69 MA10=79.53 MA20=78.08 MA60=70.8", + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 | MA5=85.0 MA10=80.8 MA20=78.58 MA60=71.43", "timing_signal": "持有", - "rr_ratio": 2.01, + "rr_ratio": 2.57, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业半导体大涨+3.8%,可适度积极", + "sector_context": "行业半导体-0.5%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { "stop_loss": 86.72, "entry_zone": "84.8~89.04", - "take_profit_zone": "0~97.27" + "take_profit_zone": "0~96.86" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 88.8, - "take_profit": 97.27, - "updated_reason": "技术面重评: 止损84.8→86.72, 止盈97.55→97.27 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:77.18 弱撑:84.8 弱压:91.32 强压:98.38", + "take_profit": 96.86, "changelog": [ { "date": "2026-06-18 11:31", @@ -10797,42 +11690,83 @@ "new_action": "盈利良好 | 止损86.72 | 目标97.27 | 买入区84.8~89.04 | 信号:持有", "reason": "技术面重评: 止损84.8→86.72, 止盈97.55→97.27 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:77.18 弱撑:84.8 弱压:91.32 强压:98.38", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利良好 | 止损86.72 | 目标97.27 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损86.72 | 目标99.77 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止盈97.27→99.77 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利良好 | 止损86.72 | 目标99.77 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止盈99.77→96.86 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损86.72 | 目标99.77 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止盈96.86→99.77 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "盈利良好 | 止损86.72 | 目标99.77 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止盈99.77→96.86 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:32", + "old_action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损83.25 | 目标92.02 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止损86.72→83.25, 止盈96.86→92.02 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利良好 | 止损83.25 | 目标92.02 | 买入区84.8~89.04 | 信号:持有", + "new_action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "reason": "技术面重评: 止损83.25→86.72, 止盈92.02→96.86 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 ", + "trigger": "技术面重评" } ] }, { "code": "01070", "name": "TCL电子", - "price": 12.95, + "price": 12.89, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.75 | 止损12.56 | 买入区12.69~12.76 | 信号:弱势持有", - "stop_loss": 12.56, - "entry_low": 12.69, - "entry_high": 12.76, - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:12.11 弱撑:12.63 弱压:13.26 强压:13.75 | MA5=12.9 MA10=13.46 MA20=13.74 MA60=14.32", - "timing_signal": "弱势持有", - "rr_ratio": 0.94, + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.13 | 买入区12.63~12.77", + "stop_loss": 12.13, + "entry_low": 12.63, + "entry_high": 12.77, + "tech_snapshot": "形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 | MA5=12.84 MA10=13.3 MA20=13.67 MA60=14.33", + "timing_signal": "信号不充分", + "rr_ratio": 1.09, "status": "review", "note": "⚠️盈亏比不足1:1.5,不建议买入", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业消费电子大涨+3.1%,可适度积极", + "sector_context": "行业消费电子-0.2%,中性", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 12.56, - "entry_zone": "12.69~12.76", - "take_profit_zone": "0~13.75" + "stop_loss": 12.13, + "entry_zone": "12.63~12.77", + "take_profit_zone": "0~13.72" }, "created_at": "2026-06-24 14:23", "last_reassessed_price": 12.61, - "take_profit": 13.75, - "updated_reason": "技术信号变化: 弱势持有: 止损11.97→12.56 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:12.11 弱撑:12.63 弱压:13.26 强压:13.", + "take_profit": 13.72, "changelog": [ { "date": "2026-06-24 14:23", @@ -12415,42 +13349,69 @@ "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.75 | 止损12.56 | 买入区12.69~12.76 | 信号:弱势持有", "reason": "技术信号变化: 弱势持有: 止损11.97→12.56 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:12.11 弱撑:12.63 弱压:13.26 强压:13.", "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:00", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.75 | 止损12.56 | 买入区12.69~12.76 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.5 | 买入区12.63~12.77", + "reason": "技术信号变化: 信号不充分: 止损12.56→12.5 | 形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 ", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.5 | 买入区12.63~12.77", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.13 | 买入区12.63~12.77", + "reason": "技术面重评: 止损12.5→12.13 | 形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.13 | 买入区12.63~12.77", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.37 | 买入区12.63~12.77", + "reason": "技术面重评: 止损12.13→12.37 | 形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.37 | 买入区12.63~12.77", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.13 | 买入区12.63~12.77", + "reason": "技术面重评: 止损12.37→12.13 | 形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 ", + "trigger": "技术面重评" } ] }, { "code": "01088", "name": "中国神华", - "price": 40.56, + "price": 40.12, "cost": 45.85, "shares": 500, "avg_price": 45.85, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损37.77 | 目标40.33 | 买入区40.09~40.79 | 信号:持有", - "stop_loss": 37.77, - "entry_low": 40.09, - "entry_high": 40.79, - "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:37.36 弱撑:40.09 弱压:41.25 强压:44.22 | MA5=41.25 MA10=42.05 MA20=44.1 MA60=45.26", + "action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "stop_loss": 38.92, + "entry_low": 39.41, + "entry_high": 40.45, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.45 | MA5=40.86 MA10=41.76 MA20=43.74 MA60=45.14", "timing_signal": "持有", - "rr_ratio": 1.14, + "rr_ratio": 1.39, "status": "updated", - "note": "⚠️盈亏比偏低(1:1.1),不建议加仓", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "note": "⚠️盈亏比偏低(1:1.4),不建议加仓", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业煤炭开采加工下跌-2.5%,适度防御", + "sector_context": "行业煤炭开采加工大涨+3.1%,可适度积极", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 37.77, - "entry_zone": "40.09~40.79", - "take_profit_zone": "0~40.33" + "stop_loss": 38.92, + "entry_zone": "39.41~40.45", + "take_profit_zone": "0~41.97" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 40.38, - "take_profit": 40.33, - "updated_reason": "技术面重评: 止损37.43→37.77, 止盈44.05→40.33 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:37.36 弱撑:40.09 弱压:41.25 强压:44.2", + "take_profit": 41.97, "changelog": [ { "date": "2026-06-18 11:31", @@ -14299,42 +15260,90 @@ "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损37.77 | 目标40.33 | 买入区40.09~40.79 | 信号:持有", "reason": "技术面重评: 止损37.43→37.77, 止盈44.05→40.33 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:37.36 弱撑:40.09 弱压:41.25 强压:44.2", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:00", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损37.77 | 目标40.33 | 买入区40.09~40.79 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损37.36 | 目标38.71 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止损37.77→37.36, 止盈40.33→38.71 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损37.36 | 目标38.71 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止损37.36→38.92, 止盈38.71→40.75 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止盈40.75→41.97 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止盈41.97→40.75 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止盈40.75→41.97 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止盈41.97→40.75 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标40.75 | 买入区39.41~40.45 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "reason": "技术面重评: 止盈40.75→41.97 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.4", + "trigger": "技术面重评" } ] }, { "code": "01211", "name": "比亚迪股份", - "price": 72.1, + "price": 72.45, "cost": 104.76, "shares": 600, "avg_price": 104.76, - "action": "深套持有 | 深套持有 | 止损62.36 | 目标71.43 | 买入区64.89~75.7 | 信号:持有", - "stop_loss": 62.36, - "entry_low": 64.89, - "entry_high": 75.7, - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:66.78 弱撑:71.0 弱压:73.7 强压:78.32 | MA5=97.34 MA10=96.41 MA20=97.65 MA60=98.08", + "action": "深套持有 | 深套持有 | 止损66.58 | 目标73.73 | 买入区65.2~76.07 | 信号:持有", + "stop_loss": 66.58, + "entry_low": 65.2, + "entry_high": 76.07, + "tech_snapshot": "形态:十字星/neutral 量价:数据不足 强撑:68.5 弱撑:71.2 弱压:73.9 强压:76.8 | MA5=96.88 MA10=96.41 MA20=97.91 MA60=98.22", "timing_signal": "持有", - "rr_ratio": 0.57, + "rr_ratio": 0.4, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业汽车整车下跌-1.2%,适度防御", + "sector_context": "行业汽车整车上涨+1.6%,正常", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 62.36, - "entry_zone": "64.89~75.7", - "take_profit_zone": "0~71.43" + "stop_loss": 66.58, + "entry_zone": "65.2~76.07", + "take_profit_zone": "0~73.73" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 71.65, - "take_profit": 71.43, - "updated_reason": "技术面重评: 止损64.18→62.36, 止盈78.18→71.43 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:66.78 弱撑:71.0 弱压:73.7 强压:78.3", + "take_profit": 73.73, "changelog": [ { "date": "2026-06-18 11:31", @@ -16302,42 +17311,55 @@ "new_action": "深套持有 | 深套持有 | 止损62.36 | 目标71.43 | 买入区64.89~75.7 | 信号:持有", "reason": "技术面重评: 止损64.18→62.36, 止盈78.18→71.43 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:66.78 弱撑:71.0 弱压:73.7 强压:78.3", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损62.36 | 目标71.43 | 买入区64.89~75.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损65.27 | 目标73.73 | 买入区65.2~76.07 | 信号:持有", + "reason": "技术面重评: 止损62.36→65.27, 止盈71.43→73.73 | 形态:十字星/neutral 量价:数据不足 强撑:68.5 弱撑:71.2 弱压:73.9 强压:76.8 | MA5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "深套持有 | 深套持有 | 止损65.27 | 目标73.73 | 买入区65.2~76.07 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损66.58 | 目标73.73 | 买入区65.2~76.07 | 信号:持有", + "reason": "技术面重评: 止损65.27→66.58 | 形态:十字星/neutral 量价:数据不足 强撑:68.5 弱撑:71.2 弱压:73.9 强压:76.8 | MA5", + "trigger": "技术面重评" } ] }, { "code": "01478", "name": "丘钛科技", - "price": 6.89, + "price": 6.86, "cost": 13.77, "shares": 11000, "avg_price": 13.77, - "action": "深套持有 | 深套持有 | 止损6.52 | 目标7.44 | 买入区6.2~7.23 | 信号:持有", - "stop_loss": 6.52, - "entry_low": 6.2, - "entry_high": 7.23, - "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.38 弱撑:6.75 弱压:7.1 强压:7.52 | MA5=8.83 MA10=8.99 MA20=9.38 MA60=8.89", + "action": "深套持有 | 深套持有 | 止损6.18 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "stop_loss": 6.18, + "entry_low": 6.17, + "entry_high": 7.2, + "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | MA5=8.98 MA10=9.17 MA20=9.44 MA60=8.88", "timing_signal": "持有", - "rr_ratio": 0.61, + "rr_ratio": 0.62, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业消费电子大涨+3.1%,可适度积极", + "sector_context": "行业消费电子-0.2%,中性", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 6.52, - "entry_zone": "6.2~7.23", - "take_profit_zone": "0~7.44" + "stop_loss": 6.18, + "entry_zone": "6.17~7.2", + "take_profit_zone": "0~7.2" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 6.88, - "take_profit": 7.44, - "updated_reason": "技术面重评: 止损6.16→6.52, 止盈7.52→7.44 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.38 弱撑:6.75 弱压:7.1 强压:7.52 | M", + "take_profit": 7.2, "changelog": [ { "date": "2026-06-18 11:31", @@ -18074,42 +19096,69 @@ "new_action": "深套持有 | 深套持有 | 止损6.52 | 目标7.44 | 买入区6.2~7.23 | 信号:持有", "reason": "技术面重评: 止损6.16→6.52, 止盈7.52→7.44 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.38 弱撑:6.75 弱压:7.1 强压:7.52 | M", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损6.52 | 目标7.44 | 买入区6.2~7.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损6.49 | 目标7.42 | 买入区6.17~7.2 | 信号:持有", + "reason": "技术面重评: 止损6.52→6.49, 止盈7.44→7.42 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "深套持有 | 深套持有 | 止损6.49 | 目标7.42 | 买入区6.17~7.2 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损6.18 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "reason": "技术面重评: 止损6.49→6.18, 止盈7.42→7.2 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损6.18 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损6.3 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "reason": "技术面重评: 止损6.18→6.3 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "深套持有 | 深套持有 | 止损6.3 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损6.18 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "reason": "技术面重评: 止损6.3→6.18 | 形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | M", + "trigger": "技术面重评" } ] }, { "code": "01888", "name": "建滔积层板", - "price": 100.4, + "price": 99.15, "cost": 88.14, "shares": 500, "avg_price": 88.14, - "action": "盈利良好 | 止损97.39 | 目标111.71 | 买入区96.3~101.11 | 信号:持有", - "stop_loss": 97.39, - "entry_low": 96.3, - "entry_high": 101.11, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:84.08 弱撑:96.3 弱压:102.57 强压:112.98 | MA5=95.97 MA10=91.83 MA20=74.34 MA60=48.8", + "action": "盈利良好 | 止损92.33 | 目标103.21 | 买入区94.93~99.68 | 信号:持有", + "stop_loss": 92.33, + "entry_low": 94.93, + "entry_high": 99.68, + "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.17 | MA5=98.35 MA10=93.72 MA20=76.92 MA60=50.12", "timing_signal": "持有", - "rr_ratio": 3.07, + "rr_ratio": 3.32, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:56", - "updated_at": "2026-06-30 10:56", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业元件大涨+3.0%,可适度积极", + "sector_context": "行业元件下跌-1.2%,适度防御", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 97.39, - "entry_zone": "96.3~101.11", - "take_profit_zone": "0~111.71" + "stop_loss": 92.33, + "entry_zone": "94.93~99.68", + "take_profit_zone": "0~103.21" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 97.2, - "take_profit": 111.71, - "updated_reason": "价格变动(97.2→100.4): 止损94.62→97.39, 止盈111.65→111.71 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:84.08 弱撑:96.3 弱压:102.57 强压:112.", + "take_profit": 103.21, "changelog": [ { "date": "2026-06-18 11:31", @@ -20182,42 +21231,76 @@ "new_action": "盈利良好 | 止损97.39 | 目标111.71 | 买入区96.3~101.11 | 信号:持有", "reason": "价格变动(97.2→100.4): 止损94.62→97.39, 止盈111.65→111.71 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:84.08 弱撑:96.3 弱压:102.57 强压:112.", "trigger": "价格变动(97.2→100.4)" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利良好 | 止损97.39 | 目标111.71 | 买入区96.3~101.11 | 信号:持有", + "new_action": "盈利良好 | 止损96.18 | 目标111.9 | 买入区94.93~99.68 | 信号:持有", + "reason": "技术面重评: 止损97.39→96.18, 止盈111.71→111.9 | 形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利良好 | 止损96.18 | 目标111.9 | 买入区94.93~99.68 | 信号:持有", + "new_action": "盈利良好 | 止损96.18 | 目标108.64 | 买入区94.93~99.68 | 信号:持有", + "reason": "技术面重评: 止盈111.9→108.64 | 形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利良好 | 止损96.18 | 目标108.64 | 买入区94.93~99.68 | 信号:持有", + "new_action": "盈利良好 | 止损96.18 | 目标111.9 | 买入区94.93~99.68 | 信号:持有", + "reason": "技术面重评: 止盈108.64→111.9 | 形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利良好 | 止损96.18 | 目标111.9 | 买入区94.93~99.68 | 信号:持有", + "new_action": "盈利良好 | 止损96.18 | 目标108.64 | 买入区94.93~99.68 | 信号:持有", + "reason": "技术面重评: 止盈111.9→108.64 | 形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利良好 | 止损96.18 | 目标108.64 | 买入区94.93~99.68 | 信号:持有", + "new_action": "盈利良好 | 止损92.33 | 目标103.21 | 买入区94.93~99.68 | 信号:持有", + "reason": "技术面重评: 止损96.18→92.33, 止盈108.64→103.21 | 形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.", + "trigger": "技术面重评" } ] }, { "code": "02202", "name": "万科企业", - "price": 2.11, + "price": 2.12, "cost": 4.66, "shares": 19700, "avg_price": 4.66, - "action": "深套持有 | 深套持有 | 止损1.9 | 目标2.31 | 买入区1.9~2.22 | 信号:持有", - "stop_loss": 1.9, - "entry_low": 1.9, - "entry_high": 2.22, - "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | MA5=3.36 MA10=3.39 MA20=3.47 MA60=3.52", + "action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "stop_loss": 1.95, + "entry_low": 1.91, + "entry_high": 2.23, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | MA5=3.37 MA10=3.39 MA20=3.5 MA60=3.52", "timing_signal": "持有", - "rr_ratio": 0.94, + "rr_ratio": 0.91, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业房地产-0.7%,中性", + "sector_context": "行业房地产上涨+3.0%,正常", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 1.9, - "entry_zone": "1.9~2.22", + "stop_loss": 1.95, + "entry_zone": "1.91~2.23", "take_profit_zone": "0~2.31" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 2.12, "take_profit": 2.31, - "updated_reason": "技术面重评: 止损1.8→1.9, 止盈2.41→2.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", "changelog": [ { "date": "2026-06-18 11:31", @@ -21639,30 +22722,86 @@ "new_action": "深套持有 | 深套持有 | 止损1.9 | 目标2.31 | 买入区1.9~2.22 | 信号:持有", "reason": "技术面重评: 止损1.8→1.9, 止盈2.41→2.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损1.9 | 目标2.31 | 买入区1.9~2.22 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损1.91 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损1.9→1.91 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损1.91 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损1.91→1.95 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损1.95→2.01, 止盈2.31→2.38 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损2.01→1.95, 止盈2.38→2.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损1.95→2.01, 止盈2.31→2.38 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损2.01→1.95, 止盈2.38→2.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损1.95→2.01, 止盈2.31→2.38 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:32", + "old_action": "深套持有 | 深套持有 | 止损2.01 | 目标2.38 | 买入区1.91~2.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "reason": "技术面重评: 止损2.01→1.95, 止盈2.38→2.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | ", + "trigger": "技术面重评" } ] }, { "code": "02318", "name": "中国平安", - "price": 51.3, + "price": 51.05, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", + "action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:弱势持有", "stop_loss": 49.36, "entry_low": 50.08, "entry_high": 51.12, - "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:47.22 弱撑:50.73 弱压:52.23 强压:56.11 | MA5=67.7 MA10=68.83 MA20=68.64 MA60=67.4", - "timing_signal": "关注", - "rr_ratio": 1.27, + "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:48.87 弱撑:50.33 弱压:52.18 强压:54.07 | MA5=68.73 MA10=69.1 MA20=68.89 MA60=67.28", + "timing_signal": "弱势持有", + "rr_ratio": 1.6, "status": "manual", - "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "⚠️盈亏比偏低(1:2.0),谨慎买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "manual", - "sector_context": "行业保险下跌-2.7%,适度防御", + "sector_context": "行业保险大涨+7.1%,可适度积极", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", @@ -22087,42 +23226,55 @@ "new_action": "盈利持有 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", "reason": "技术面重评: 策略文字调整", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 策略文字调整", + "trigger": "技术信号变化: 弱势持有" } ] }, { "code": "02359", "name": "药明康德", - "price": 156.2, + "price": 153.7, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标170.5 | 止损144.56 | 买入区153.08~158.55 | 信号:买入", - "stop_loss": 144.56, - "entry_low": 153.08, - "entry_high": 158.55, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:140.5 弱撑:152.6 弱压:159.3 强压:170.5 | MA5=143.16 MA10=134.93 MA20=129.48 MA60=129.42", + "action": "盈利持有 | 目标169.6 | 止损149.09 | 买入区150.63~156.77 | 信号:买入", + "stop_loss": 149.09, + "entry_low": 150.63, + "entry_high": 156.77, + "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:169.6 | MA5=147.74 MA10=137.78 MA20=130.76 MA60=130.08", "timing_signal": "买入", - "rr_ratio": 2.54, + "rr_ratio": 3.01, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业医疗服务下跌-1.9%,适度防御", + "sector_context": "行业医疗服务大涨+4.2%,可适度积极", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 144.56, - "entry_zone": "153.08~158.55", - "take_profit_zone": "0~170.5" + "stop_loss": 149.09, + "entry_zone": "150.63~156.77", + "take_profit_zone": "0~169.6" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 156.3, - "take_profit": 170.5, - "updated_reason": "技术面重评: 止损150.68→144.56 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:140.5 弱撑:152.6 弱压:159.3 强压:170.", + "last_reassessed_price": 153.7, + "take_profit": 169.6, "changelog": [ { "date": "2026-06-24 14:24", @@ -23936,42 +25088,83 @@ "new_action": "盈利持有 | 目标170.5 | 止损144.56 | 买入区153.08~158.55 | 信号:买入", "reason": "技术面重评: 止损150.68→144.56 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:140.5 弱撑:152.6 弱压:159.3 强压:170.", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标170.5 | 止损144.56 | 买入区153.08~158.55 | 信号:买入", + "new_action": "盈利持有 | 目标169.6 | 止损142.47 | 买入区150.63~156.77 | 信号:关注", + "reason": "技术信号变化: 关注: 止损144.56→142.47 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:16", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标169.6 | 止损148.41 | 买入区150.63~156.77 | 信号:关注", + "new_action": "盈利持有 | 目标169.6 | 止损142.47 | 买入区150.63~156.77 | 信号:关注", + "reason": "技术面重评: 止损148.41→142.47 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:16", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | 目标169.6 | 止损142.47 | 买入区150.63~156.77 | 信号:关注", + "new_action": "盈利持有 | 目标169.6 | 止损136.54 | 买入区150.63~156.77 | 信号:关注", + "reason": "技术面重评: 止损142.47→136.54 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:16", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | 目标169.6 | 止损136.54 | 买入区150.63~156.77 | 信号:关注", + "new_action": "盈利持有 | 目标169.6 | 止损148.41 | 买入区150.63~156.77 | 信号:关注", + "reason": "技术面重评: 止损136.54→148.41 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:16", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "盈利持有 | 目标169.6 | 止损148.41 | 买入区150.63~156.77 | 信号:关注", + "new_action": "盈利持有 | 目标169.6 | 止损149.09 | 买入区150.63~156.77 | 信号:关注", + "reason": "技术面重评: 止损148.41→149.09 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:16", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标169.6 | 止损149.09 | 买入区150.63~156.77 | 信号:关注", + "new_action": "盈利持有 | 目标169.6 | 止损149.09 | 买入区150.63~156.77 | 信号:买入", + "reason": "技术信号变化: 买入: 策略文字调整", + "trigger": "技术信号变化: 买入" } ] }, { "code": "02388", "name": "中银香港", - "price": 42.18, + "price": 42.38, "cost": 43.67, "shares": 0, "avg_price": 43.67, - "action": "盈利持有 | 目标46.82 | 止损39.27 | 买入区41.34~43.02 | 信号:关注", - "stop_loss": 39.27, - "entry_low": 41.34, - "entry_high": 43.02, - "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.38 弱撑:41.6 弱压:43.6 强压:46.82 | MA5=45.8 MA10=47.04 MA20=47.33 MA60=45.85", - "timing_signal": "关注", - "rr_ratio": 3.65, + "action": "盈利持有 | 目标47.08 | 止损41.11 | 买入区41.53~43.23 | 信号:弱势持有", + "stop_loss": 41.11, + "entry_low": 41.53, + "entry_high": 43.23, + "tech_snapshot": "形态:带下影阴线/neutral 量价:数据不足 强撑:38.12 弱撑:41.6 弱压:43.6 强压:47.08 | MA5=44.88 MA10=46.42 MA20=47.03 MA60=45.88", + "timing_signal": "弱势持有", + "rr_ratio": 3.7, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业银行下跌-2.0%,适度防御", + "sector_context": "行业银行+0.9%,中性", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 39.27, - "entry_zone": "41.34~43.02", - "take_profit_zone": "0~46.82" + "stop_loss": 41.11, + "entry_zone": "41.53~43.23", + "take_profit_zone": "0~47.08" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 42.3, - "take_profit": 46.82, - "updated_reason": "技术面重评: 止损41.03→39.27 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.38 弱撑:41.6 弱压:43.6 强压:46.82 ", + "take_profit": 47.08, "changelog": [ { "date": "2026-06-18 11:31", @@ -25861,42 +27054,62 @@ "new_action": "盈利持有 | 目标46.82 | 止损39.27 | 买入区41.34~43.02 | 信号:关注", "reason": "技术面重评: 止损41.03→39.27 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.38 弱撑:41.6 弱压:43.6 强压:46.82 ", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标46.82 | 止损39.27 | 买入区41.34~43.02 | 信号:关注", + "new_action": "盈利持有 | 目标47.08 | 止损39.47 | 买入区41.53~43.23 | 信号:关注", + "reason": "技术面重评: 止损39.27→39.47 | 形态:带下影阴线/neutral 量价:数据不足 强撑:38.12 弱撑:41.6 弱压:43.6 强压:47.08 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | 目标47.08 | 止损39.47 | 买入区41.53~43.23 | 信号:关注", + "new_action": "盈利持有 | 目标47.08 | 止损41.11 | 买入区41.53~43.23 | 信号:关注", + "reason": "技术面重评: 止损39.47→41.11 | 形态:带下影阴线/neutral 量价:数据不足 强撑:38.12 弱撑:41.6 弱压:43.6 强压:47.08 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标47.08 | 止损41.11 | 买入区41.53~43.23 | 信号:关注", + "new_action": "盈利持有 | 目标47.08 | 止损41.11 | 买入区41.53~43.23 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 策略文字调整", + "trigger": "技术信号变化: 弱势持有" } ] }, { "code": "02628", "name": "中国人寿", - "price": 26.52, + "price": 26.66, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标28.85 | 止损24.51 | 买入区25.99~26.86 | 信号:关注", - "stop_loss": 24.51, - "entry_low": 25.99, - "entry_high": 26.86, - "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:24.6 弱撑:26.27 弱压:26.99 强压:28.85 | MA5=29.02 MA10=30.44 MA20=31.44 MA60=31.17", - "timing_signal": "关注", - "rr_ratio": 2.35, + "action": "盈利持有 | 目标28.96 | 止损25.86 | 买入区26.13~27.02 | 信号:弱势持有", + "stop_loss": 25.86, + "entry_low": 26.13, + "entry_high": 27.02, + "tech_snapshot": "形态:小阴线/bearish 量价:数据不足 强撑:24.48 弱撑:26.26 弱压:27.12 强压:28.96 | MA5=29.79 MA10=30.92 MA20=31.8 MA60=31.12", + "timing_signal": "弱势持有", + "rr_ratio": 2.47, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业保险下跌-2.7%,适度防御", + "sector_context": "行业保险大涨+7.1%,可适度积极", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 24.51, - "entry_zone": "25.99~26.86", - "take_profit_zone": "0~28.85" + "stop_loss": 25.86, + "entry_zone": "26.13~27.02", + "take_profit_zone": "0~28.96" }, "created_at": "2026-06-24 14:24", "last_reassessed_price": 26.72, - "take_profit": 28.85, - "updated_reason": "技术面重评: 止损25.73→24.51 | 形态:带上影阴线/bearish 量价:数据不足 强撑:24.6 弱撑:26.27 弱压:26.99 强压:28.85 ", + "take_profit": 28.96, "changelog": [ { "date": "2026-06-24 14:24", @@ -27703,42 +28916,69 @@ "new_action": "盈利持有 | 目标28.85 | 止损24.51 | 买入区25.99~26.86 | 信号:关注", "reason": "技术面重评: 止损25.73→24.51 | 形态:带上影阴线/bearish 量价:数据不足 强撑:24.6 弱撑:26.27 弱压:26.99 强压:28.85 ", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标28.85 | 止损24.51 | 买入区25.99~26.86 | 信号:关注", + "new_action": "盈利持有 | 目标28.96 | 止损24.7 | 买入区26.13~27.02 | 信号:关注", + "reason": "技术面重评: 止损24.51→24.7 | 形态:小阴线/bearish 量价:数据不足 强撑:24.48 弱撑:26.26 弱压:27.12 强压:28.96 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | 目标28.96 | 止损24.7 | 买入区26.13~27.02 | 信号:关注", + "new_action": "盈利持有 | 目标28.96 | 止损25.73 | 买入区26.13~27.02 | 信号:关注", + "reason": "技术面重评: 止损24.7→25.73 | 形态:小阴线/bearish 量价:数据不足 强撑:24.48 弱撑:26.26 弱压:27.12 强压:28.96 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | 目标28.96 | 止损25.73 | 买入区26.13~27.02 | 信号:关注", + "new_action": "盈利持有 | 目标28.96 | 止损25.86 | 买入区26.13~27.02 | 信号:关注", + "reason": "技术面重评: 止损25.73→25.86 | 形态:小阴线/bearish 量价:数据不足 强撑:24.48 弱撑:26.26 弱压:27.12 强压:28.96 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标28.96 | 止损25.86 | 买入区26.13~27.02 | 信号:关注", + "new_action": "盈利持有 | 目标28.96 | 止损25.86 | 买入区26.13~27.02 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 策略文字调整", + "trigger": "技术信号变化: 弱势持有" } ] }, { "code": "06160", "name": "百济神州", - "price": 168.7, + "price": 170.4, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标183.23 | 止损162.12 | 买入区165.33~170.56 | 信号:关注", - "stop_loss": 162.12, - "entry_low": 165.33, - "entry_high": 170.56, - "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:158.63 弱撑:165.67 弱压:174.5 强压:183.23 | MA5=186.6 MA10=193.58 MA20=197.85 MA60=193.44", - "timing_signal": "关注", - "rr_ratio": 2.21, + "action": "盈利持有 | 目标183.83 | 止损165.29 | 买入区166.99~172.03", + "stop_loss": 165.29, + "entry_low": 166.99, + "entry_high": 172.03, + "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:183.83 | MA5=189.84 MA10=195.82 MA20=199.25 MA60=193.25", + "timing_signal": "信号不充分", + "rr_ratio": 2.15, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业生物制品下跌-1.4%,适度防御", + "sector_context": "行业生物制品大涨+4.4%,可适度积极", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2周~3月", "trigger": { - "stop_loss": 155.44, - "entry_zone": "165.13~170.51", - "take_profit_zone": "0~183.4" + "stop_loss": 165.29, + "entry_zone": "166.99~172.03", + "take_profit_zone": "0~183.83" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 168.7, - "take_profit": 183.23, - "updated_reason": "技术面重评: 止损164.42→155.44 | 形态:带上影阴线/bearish 量价:数据不足 强撑:158.8 弱撑:166.0 弱压:174.5 强压:183.4", + "last_reassessed_price": 170.4, + "take_profit": 183.83, "changelog": [ { "date": "2026-06-24 14:24", @@ -29594,145 +30834,69 @@ "new_action": "盈利持有 | 目标183.4 | 止损155.44 | 买入区165.13~170.51 | 信号:关注", "reason": "技术面重评: 止损164.42→155.44 | 形态:带上影阴线/bearish 量价:数据不足 强撑:158.8 弱撑:166.0 弱压:174.5 强压:183.4", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标183.23 | 止损162.12 | 买入区165.33~170.56 | 信号:关注", + "new_action": "盈利持有 | 目标183.83 | 止损164.16 | 买入区166.99~172.03", + "reason": "技术信号变化: 信号不充分: 止损162.12→164.16 | 形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:18", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标183.83 | 止损164.16 | 买入区166.99~172.03", + "new_action": "盈利持有 | 目标183.83 | 止损157.59 | 买入区166.99~172.03", + "reason": "技术面重评: 止损164.16→157.59 | 形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | 目标183.83 | 止损157.59 | 买入区166.99~172.03", + "new_action": "盈利持有 | 目标183.83 | 止损164.16 | 买入区166.99~172.03", + "reason": "技术面重评: 止损157.59→164.16 | 形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:42", + "old_action": "盈利持有 | 目标183.83 | 止损164.16 | 买入区166.99~172.03", + "new_action": "盈利持有 | 目标183.83 | 止损165.29 | 买入区166.99~172.03", + "reason": "技术面重评: 止损164.16→165.29 | 形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:18", + "trigger": "技术面重评" } - ], - "strategy_tree": { - "branches": [ - { - "id": "06160_stop_loss", - "condition": { - "price": "<162.12" - }, - "action": { - "type": "sell", - "amount": "all", - "reason": "止损" - }, - "priority": 0, - "rationale": "止损保护本金", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "06160_buy_dip", - "condition": { - "scenario": "weak_consolidation", - "price": "<=170.56", - "price_lower": ">=165.33" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": 165.33, - "reason": "回调支撑买入" - }, - "priority": 1, - "rationale": "价格回调到支撑区,弱势市场低吸", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "06160_breakout_chase", - "condition": { - "scenario": "bullish_recovery", - "price": ">=183.23" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": "market", - "reason": "突破确认追涨" - }, - "priority": 2, - "rationale": "价格突破阻力,确认上升趋势后买入", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "06160_trim", - "condition": { - "scenario": "sharp_decline", - "loss_pct": "<-15%" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "急跌降风险" - }, - "priority": 3, - "rationale": "急跌市场,深套股减半仓减少敞口", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "06160_take_profit", - "condition": { - "price": ">=183.23" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "止盈锁利" - }, - "priority": 4, - "rationale": "达到目标价,减半仓锁定利润", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "06160_hold", - "condition": {}, - "action": { - "type": "hold", - "reason": "无明确信号,继续持有" - }, - "priority": 99, - "rationale": "没有分支匹配时的默认动作", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - } - ] - } + ] }, { "code": "06869", "name": "长飞光纤光缆", - "price": 255.6, + "price": 255.4, "cost": 263.45, "shares": 500, "avg_price": 263.45, - "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", - "stop_loss": 216.0, + "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损205.71 | 目标300.74 | 买入区239.4~251.37 | 信号:持有", + "stop_loss": 205.71, "entry_low": 239.4, "entry_high": 251.37, - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:313.27 | MA5=260.68 MA10=251.16 MA20=244.02 MA60=230.35", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:313.27 | MA5=258.84 MA10=252.78 MA20=246.28 MA60=231.33", "timing_signal": "持有", "rr_ratio": 0.94, "status": "updated", "note": "⚠️盈亏比偏低(1:0.9),不建议加仓", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业通信设备大涨+4.1%,可适度积极", + "sector_context": "行业通信设备-0.4%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 216.0, + "stop_loss": 205.71, "entry_zone": "239.4~251.37", - "take_profit_zone": "0~309.76" + "take_profit_zone": "0~300.74" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 252.8, - "take_profit": 309.76, - "updated_reason": "技术面重评: 止损210.89→216.0, 止盈312.27→309.76 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:3", + "take_profit": 300.74, "changelog": [ { "date": "2026-06-18 11:31", @@ -31728,30 +32892,51 @@ "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", "reason": "技术面重评: 止损210.89→216.0, 止盈312.27→309.76 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:3", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损205.71 | 目标300.74 | 买入区239.4~251.37 | 信号:持有", + "reason": "技术面重评: 止损216.0→205.71, 止盈309.76→300.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损205.71 | 目标300.74 | 买入区239.4~251.37 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", + "reason": "技术面重评: 止损205.71→216.0, 止盈300.74→309.76 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损205.71 | 目标300.74 | 买入区239.4~251.37 | 信号:持有", + "reason": "技术面重评: 止损216.0→205.71, 止盈309.76→300.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:3", + "trigger": "技术面重评" } ] }, { "code": "09868", "name": "小鹏汽车-W", - "price": 49.2, + "price": 50.65, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 止损参考45.44 | 买入区46.98~47.89", + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 止损参考45.44 | 买入区46.98~47.89 | 信号:弱势持有", "stop_loss": 45.44, "entry_low": 46.98, "entry_high": 47.89, - "tech_snapshot": "形态:倒T线/射击之星/neutral 量价:数据不足 强撑:44.45 弱撑:47.4 弱压:50.07 强压:54.21 | MA5=79.25 MA10=79.43 MA20=78.84 MA60=73.3", - "timing_signal": "neutral", - "rr_ratio": 0.63, + "tech_snapshot": "形态:带下影阳线/bullish 量价:数据不足 强撑:44.43 弱撑:47.4 弱压:51.54 强压:55.69 | MA5=78.84 MA10=79.64 MA20=78.58 MA60=73.08", + "timing_signal": "弱势持有", + "rr_ratio": 0.18, "status": "manual", - "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "⚠️盈亏比偏低(1:1.6),谨慎买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "manual", - "sector_context": "行业汽车整车下跌-1.2%,适度防御", + "sector_context": "行业汽车整车上涨+1.6%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", @@ -32281,42 +33466,48 @@ "new_action": "盈利持有 | 止损参考45.44 | 买入区46.98~47.89", "reason": "技术面重评: 策略文字调整", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 止损参考45.44 | 买入区46.98~47.89", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 止损参考45.44 | 买入区46.98~47.89 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 策略文字调整", + "trigger": "技术信号变化: 弱势持有" } ] }, { "code": "09988", "name": "阿里巴巴-W", - "price": 92.2, + "price": 92.85, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标99.38 | 止损88.92 | 买入区90.36~92.06 | 信号:关注", - "stop_loss": 88.92, - "entry_low": 90.36, - "entry_high": 92.06, - "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:85.78 弱撑:91.42 弱压:93.47 强压:99.38 | MA5=147.98 MA10=148.91 MA20=157.03 MA60=148.01", - "timing_signal": "关注", - "rr_ratio": 1.43, - "status": "review", - "note": "⚠️盈亏比不足1:1.5,不建议买入", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "stop_loss": 89.74, + "entry_low": 90.99, + "entry_high": 93.04, + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.64 | MA5=148.26 MA10=151.36 MA20=158.48 MA60=147.61", + "timing_signal": "弱势持有", + "rr_ratio": 1.6, + "status": "updated", + "note": "⚠️盈亏比偏低(1:1.6),谨慎买入", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业软件开发上涨+1.5%,正常", + "sector_context": "行业软件开发上涨+3.0%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 88.92, - "entry_zone": "90.36~92.06", - "take_profit_zone": "0~99.38" + "stop_loss": 89.74, + "entry_zone": "90.99~93.04", + "take_profit_zone": "0~100.64" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 92.8, - "take_profit": 99.38, - "updated_reason": "技术面重评: 止损89.43→88.92 | 形态:带上影阴线/bearish 量价:数据不足 强撑:85.78 弱撑:91.42 弱压:93.47 强压:99.38", + "take_profit": 100.64, "changelog": [ { "date": "2026-06-18 11:31", @@ -34375,42 +35566,90 @@ "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标99.38 | 止损88.92 | 买入区90.36~92.06 | 信号:关注", "reason": "技术面重评: 止损89.43→88.92 | 形态:带上影阴线/bearish 量价:数据不足 强撑:85.78 弱撑:91.42 弱压:93.47 强压:99.38", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标99.38 | 止损88.92 | 买入区90.36~92.06 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损88.92→89.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损87.98 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损89.74→87.98 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损87.98 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损87.98→89.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损90.06 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损89.74→90.06 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损90.06 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损90.06→89.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损90.06 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损89.74→90.06 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损90.06 | 买入区90.99~93.04 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "reason": "技术面重评: 止损90.06→89.74 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.", + "trigger": "技术面重评" } ] }, { "code": "300035", "name": "中科电气", - "price": 14.38, + "price": 14.44, "cost": 22.29, "shares": 1400, "avg_price": 22.29, - "action": "深套持有 | 深套持有 | 止损13.21 | 目标15.05 | 买入区12.94~15.1 | 信号:持有", - "stop_loss": 13.21, - "entry_low": 12.94, - "entry_high": 15.1, - "tech_snapshot": "形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:12.92 弱撑:14.17 弱压:14.5 强压:15.68 | MA5=21.55 MA10=21.83 MA20=22.11 MA60=21.46", + "action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区13.0~15.16 | 信号:持有", + "stop_loss": 13.01, + "entry_low": 13.0, + "entry_high": 15.16, + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.01 弱撑:14.12 弱压:14.71 强压:15.77 | MA5=21.52 MA10=21.86 MA20=22.15 MA60=21.45", "timing_signal": "持有", - "rr_ratio": 0.6, + "rr_ratio": 0.61, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", - "sector_context": "行业电池上涨+2.0%,正常", + "sector_context": "行业电池+0.8%,中性", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 13.21, - "entry_zone": "12.94~15.1", - "take_profit_zone": "0~15.05" + "stop_loss": 13.01, + "entry_zone": "13.0~15.16", + "take_profit_zone": "0~15.14" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 14.19, - "take_profit": 15.05, - "updated_reason": "技术面重评: 止损13.41→13.21, 止盈15.46→15.05 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:12.92 弱撑:14.17 弱压:14.5 强压:15.6", + "take_profit": 15.14, "changelog": [ { "date": "2026-06-18 11:31", @@ -36238,42 +37477,308 @@ "new_action": "深套持有 | 深套持有 | 止损13.21 | 目标15.05 | 买入区12.94~15.1 | 信号:持有", "reason": "技术面重评: 止损13.41→13.21, 止盈15.46→15.05 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:12.92 弱撑:14.17 弱压:14.5 强压:15.6", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损13.21 | 目标15.05 | 买入区12.94~15.1 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.65 | 目标15.57 | 买入区12.98~15.14 | 信号:持有", + "reason": "技术面重评: 止损13.21→13.65, 止盈15.05→15.57 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:12.99 弱撑:14.15 弱压:14.64 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "深套持有 | 深套持有 | 止损13.65 | 目标15.57 | 买入区12.98~15.14 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.55 | 目标0 | 买入区12.89~15.04 | 信号:持有", + "reason": "技术面重评: 止损13.65→13.55 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "深套持有 | 深套持有 | 止损13.55 | 目标0 | 买入区12.89~15.04 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.79 | 目标0 | 买入区13.12~15.31 | 信号:持有", + "reason": "技术面重评: 止损13.55→13.79 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "深套持有 | 深套持有 | 止损13.79 | 目标0 | 买入区13.12~15.31 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.85 | 目标15.08 | 买入区12.83~14.97 | 信号:持有", + "reason": "技术面重评: 止损13.79→12.85 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.95 弱撑:14.13 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:37", + "old_action": "深套持有 | 深套持有 | 止损12.85 | 目标15.08 | 买入区12.83~14.97 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.69 | 目标14.99 | 买入区12.67~14.78 | 信号:持有", + "reason": "技术面重评: 止损12.85→12.69, 止盈15.08→14.99 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.85 弱撑:13.95 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "深套持有 | 深套持有 | 止损12.69 | 目标14.99 | 买入区12.67~14.78 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.86 | 目标15.04 | 买入区12.84~14.98 | 信号:持有", + "reason": "技术面重评: 止损12.69→12.86, 止盈14.99→15.04 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.91 弱撑:14.06 弱压:14.51 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:43", + "old_action": "深套持有 | 深套持有 | 止损12.86 | 目标15.04 | 买入区12.84~14.98 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.85 | 目标15.03 | 买入区12.83~14.97 | 信号:持有", + "reason": "技术面重评: 止损12.86→12.85, 止盈15.04→15.03 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.9 弱撑:14.04 弱压:14.49 强压:15.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "深套持有 | 深套持有 | 止损12.85 | 目标15.03 | 买入区12.83~14.97 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.82 | 目标15.01 | 买入区12.8~14.93 | 信号:持有", + "reason": "技术面重评: 止损12.85→12.82, 止盈15.03→15.01 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.88 弱撑:14.0 弱压:14.45 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "深套持有 | 深套持有 | 止损12.82 | 目标15.01 | 买入区12.8~14.93 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.78 | 目标15.01 | 买入区12.77~14.9 | 信号:持有", + "reason": "技术面重评: 止损12.82→12.78 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.88 弱撑:14.01 弱压:14.46 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "深套持有 | 深套持有 | 止损12.78 | 目标15.01 | 买入区12.77~14.9 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.01 | 买入区12.81~14.94 | 信号:持有", + "reason": "技术面重评: 止损12.78→12.83 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.88 弱撑:13.99 弱压:14.44 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.01 | 买入区12.81~14.94 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.0 | 买入区12.75~14.88 | 信号:持有", + "reason": "技术面重评: 止损12.83→12.76, 止盈15.01→15.0 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.87 弱撑:13.99 弱压:14.44 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.0 | 买入区12.75~14.88 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.01 | 买入区12.75~14.88 | 信号:持有", + "reason": "技术面重评: 止盈15.0→15.01 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.88 弱撑:13.99 弱压:14.44 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.01 | 买入区12.75~14.88 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.0 | 买入区12.75~14.88 | 信号:持有", + "reason": "技术面重评: 止盈15.01→15.0 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.87 弱撑:13.97 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "深套持有 | 深套持有 | 止损12.76 | 目标15.0 | 买入区12.75~14.88 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.74 | 目标15.0 | 买入区12.73~14.85 | 信号:持有", + "reason": "技术面重评: 止损12.76→12.74 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.87 弱撑:13.97 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "深套持有 | 深套持有 | 止损12.74 | 目标15.0 | 买入区12.73~14.85 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.75 | 目标15.0 | 买入区12.74~14.86 | 信号:持有", + "reason": "技术面重评: 止损12.74→12.75 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.86 弱撑:13.97 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "深套持有 | 深套持有 | 止损12.75 | 目标15.0 | 买入区12.74~14.86 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.73 | 目标14.99 | 买入区12.72~14.84 | 信号:持有", + "reason": "技术面重评: 止损12.75→12.73, 止盈15.0→14.99 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.85 弱撑:13.95 弱压:14.42 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "深套持有 | 深套持有 | 止损12.73 | 目标14.99 | 买入区12.72~14.84 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损11.72 | 目标13.5 | 买入区12.73~14.85 | 信号:持有", + "reason": "技术面重评: 止损12.73→11.72, 止盈14.99→13.5 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:12.87 弱撑:13.98 弱压:14.43 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "深套持有 | 深套持有 | 止损11.72 | 目标13.5 | 买入区12.73~14.85 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.78 | 目标15.02 | 买入区12.77~14.9 | 信号:持有", + "reason": "技术面重评: 止损11.72→12.78, 止盈13.5→15.02 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.89 弱撑:14.02 弱压:14.47 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "深套持有 | 深套持有 | 止损12.78 | 目标15.02 | 买入区12.77~14.9 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.02 | 买入区12.82~14.95 | 信号:持有", + "reason": "技术面重评: 止损12.78→12.83 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.89 弱撑:14.02 弱压:14.47 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.02 | 买入区12.82~14.95 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.8 | 目标15.03 | 买入区12.79~14.92 | 信号:持有", + "reason": "技术面重评: 止损12.83→12.8, 止盈15.02→15.03 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.9 弱撑:14.03 弱压:14.48 强压:15.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:40", + "old_action": "深套持有 | 深套持有 | 止损12.8 | 目标15.03 | 买入区12.79~14.92 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.84 | 目标15.02 | 买入区12.83~14.96 | 信号:持有", + "reason": "技术面重评: 止损12.8→12.84, 止盈15.03→15.02 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.89 弱撑:14.02 弱压:14.47 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "深套持有 | 深套持有 | 止损12.84 | 目标15.02 | 买入区12.83~14.96 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.03 | 买入区12.82~14.95 | 信号:持有", + "reason": "技术面重评: 止损12.84→12.83, 止盈15.02→15.03 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.9 弱撑:14.04 弱压:14.49 强压:15.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "深套持有 | 深套持有 | 止损12.83 | 目标15.03 | 买入区12.82~14.95 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.9 | 目标15.05 | 买入区12.89~15.04 | 信号:持有", + "reason": "技术面重评: 止损12.83→12.9, 止盈15.03→15.05 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.92 弱撑:14.08 弱压:14.53 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "深套持有 | 深套持有 | 止损12.9 | 目标15.05 | 买入区12.89~15.04 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损12.93 | 目标15.07 | 买入区12.91~15.07 | 信号:持有", + "reason": "技术面重评: 止损12.9→12.93, 止盈15.05→15.07 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:12.94 弱撑:14.13 弱压:14.58 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "深套持有 | 深套持有 | 止损12.93 | 目标15.07 | 买入区12.91~15.07 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.45 | 目标15.2 | 买入区13.17~15.36 | 信号:持有", + "reason": "技术面重评: 止损12.93→13.45, 止盈15.07→15.2 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.07 弱撑:14.25 弱压:14.83 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "深套持有 | 深套持有 | 止损13.45 | 目标15.2 | 买入区13.17~15.36 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.36 | 目标15.17 | 买入区13.09~15.27 | 信号:持有", + "reason": "技术面重评: 止损13.45→13.36, 止盈15.2→15.17 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.04 弱撑:14.18 弱压:14.77 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:23", + "old_action": "深套持有 | 深套持有 | 止损13.36 | 目标15.17 | 买入区13.09~15.27 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.38 | 目标15.18 | 买入区13.1~15.29 | 信号:持有", + "reason": "技术面重评: 止损13.36→13.38, 止盈15.17→15.18 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.05 弱撑:14.21 弱压:14.8 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "深套持有 | 深套持有 | 止损13.38 | 目标15.18 | 买入区13.1~15.29 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.25 | 目标15.13 | 买入区12.97~15.13 | 信号:持有", + "reason": "技术面重评: 止损13.38→13.25, 止盈15.18→15.13 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.0 弱撑:14.09 弱压:14.68 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "深套持有 | 深套持有 | 止损13.25 | 目标15.13 | 买入区12.97~15.13 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.3 | 目标15.15 | 买入区13.02~15.19 | 信号:持有", + "reason": "技术面重评: 止损13.25→13.3, 止盈15.13→15.15 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.02 弱撑:14.14 弱压:14.73 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "深套持有 | 深套持有 | 止损13.3 | 目标15.15 | 买入区13.02~15.19 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.03 | 目标15.15 | 买入区13.01~15.18 | 信号:持有", + "reason": "技术面重评: 止损13.3→13.03 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.02 弱撑:14.14 弱压:14.73 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "深套持有 | 深套持有 | 止损13.03 | 目标15.15 | 买入区13.01~15.18 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.06 | 目标15.16 | 买入区13.05~15.23 | 信号:持有", + "reason": "技术面重评: 止损13.03→13.06, 止盈15.15→15.16 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.03 弱撑:14.16 弱压:14.75 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "深套持有 | 深套持有 | 止损13.06 | 目标15.16 | 买入区13.05~15.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.08 | 目标15.17 | 买入区13.07~15.25 | 信号:持有", + "reason": "技术面重评: 止损13.06→13.08, 止盈15.16→15.17 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.04 弱撑:14.18 弱压:14.77 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "深套持有 | 深套持有 | 止损13.08 | 目标15.17 | 买入区13.07~15.25 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.15 | 买入区13.0~15.16 | 信号:持有", + "reason": "技术面重评: 止损13.08→13.01, 止盈15.17→15.15 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.02 弱撑:14.14 弱压:14.73 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:22", + "old_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.15 | 买入区13.0~15.16 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.04 | 目标15.15 | 买入区13.02~15.19 | 信号:持有", + "reason": "技术面重评: 止损13.01→13.04 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.02 弱撑:14.14 弱压:14.73 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "深套持有 | 深套持有 | 止损13.04 | 目标15.15 | 买入区13.02~15.19 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区13.0~15.16 | 信号:持有", + "reason": "技术面重评: 止损13.04→13.01, 止盈15.15→15.14 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.01 弱撑:14.11 弱压:14.7 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区13.0~15.16 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.0 | 目标15.13 | 买入区12.98~15.14 | 信号:持有", + "reason": "技术面重评: 止损13.01→13.0, 止盈15.14→15.13 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.0 弱撑:14.11 弱压:14.7 强压:15.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "深套持有 | 深套持有 | 止损13.0 | 目标15.13 | 买入区12.98~15.14 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区12.99~15.15 | 信号:持有", + "reason": "技术面重评: 止损13.0→13.01, 止盈15.13→15.14 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.01 弱撑:14.11 弱压:14.7 强压:15", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区12.99~15.15 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区13.0~15.16 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "300124", "name": "汇川技术", - "price": 65.89, + "price": 68.2, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标70.99 | 止损63.91 | 买入区64.57~66.74 | 信号:观望", - "stop_loss": 63.91, - "entry_low": 64.57, - "entry_high": 66.74, - "tech_snapshot": "形态:锤子线/T字线/neutral 量价:主动卖盘占优 强撑:60.65 弱撑:64.46 弱压:67.25 强压:70.99 | MA5=73.95 MA10=75.8 MA20=77.5 MA60=73.76", + "action": "盈利持有 | 目标75.14 | 止损66.15 | 买入区66.84~69.56 | 信号:观望", + "stop_loss": 66.15, + "entry_low": 66.84, + "entry_high": 69.56, + "tech_snapshot": "形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.4 弱撑:66.17 弱压:69.81 强压:75.14 | MA5=74.88 MA10=76.52 MA20=77.68 MA60=73.65", "timing_signal": "观望", - "rr_ratio": 2.58, + "rr_ratio": 3.39, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "自选策略", "source": "auto", - "sector_context": "行业自动化设备大涨+3.0%,可适度积极", + "sector_context": "行业自动化设备上涨+1.4%,正常", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 63.83, - "entry_zone": "64.48~66.68", - "take_profit_zone": "0~70.95" + "stop_loss": 66.15, + "entry_zone": "66.84~69.56", + "take_profit_zone": "0~75.14" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 65.89, - "take_profit": 70.99, - "updated_reason": "技术面重评: 止损63.19→63.83 | 形态:锤子线/T字线/neutral 量价:主动卖盘占优 强撑:60.61 弱撑:64.39 弱压:67.18 强压:7", + "last_reassessed_price": 68.2, + "take_profit": 75.14, + "updated_reason": "技术面重评: 止损66.17→66.15 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.4 弱撑:66.17 弱压:69.81 强压:75.1", "changelog": [ { "date": "2026-06-24 14:24", @@ -38024,130 +39529,314 @@ "new_action": "盈利持有 | 目标70.95 | 止损63.83 | 买入区64.48~66.68 | 信号:观望", "reason": "技术面重评: 止损63.19→63.83 | 形态:锤子线/T字线/neutral 量价:主动卖盘占优 强撑:60.61 弱撑:64.39 弱压:67.18 强压:7", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标70.99 | 止损63.91 | 买入区64.57~66.74 | 信号:观望", + "new_action": "盈利持有 | 目标71.31 | 止损64.34 | 买入区65.0~67.13 | 信号:观望", + "reason": "技术面重评: 止损63.91→64.34 | 形态:锤子线/T字线/neutral 量价:主动卖盘占优 强撑:60.69 弱撑:64.72 弱压:67.61 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "盈利持有 | 目标71.31 | 止损64.34 | 买入区65.0~67.13 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损64.97 | 买入区65.64~68.32 | 信号:观望", + "reason": "技术面重评: 止损64.34→64.97 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损64.97 | 买入区65.64~68.32 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损64.6 | 买入区65.27~67.93 | 信号:观望", + "reason": "技术面重评: 止损64.97→64.6 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | 目标72.11 | 止损65.21 | 买入区65.89~67.97 | 信号:观望", + "new_action": "盈利持有 | 目标72.55 | 止损65.33 | 买入区66.0~68.22 | 信号:观望", + "reason": "技术面重评: 止损65.21→65.33 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:61.33 弱撑:66.31 弱压:68.15 强压:72.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | 目标72.55 | 止损65.33 | 买入区66.0~68.22 | 信号:观望", + "new_action": "盈利持有 | 目标72.24 | 止损64.73 | 买入区65.4~67.73 | 信号:观望", + "reason": "技术面重评: 止损65.33→64.73 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:61.08 弱撑:65.73 弱压:67.58 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标72.24 | 止损64.73 | 买入区65.4~67.73 | 信号:观望", + "new_action": "盈利持有 | 目标72.41 | 止损65.04 | 买入区65.71~67.99 | 信号:观望", + "reason": "技术面重评: 止损64.73→65.04 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:61.18 弱撑:66.0 弱压:67.85 强压:72.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:43", + "old_action": "盈利持有 | 目标72.41 | 止损65.04 | 买入区65.71~67.99 | 信号:观望", + "new_action": "盈利持有 | 目标72.58 | 止损65.12 | 买入区65.79~68.1 | 信号:观望", + "reason": "技术面重评: 止损65.04→65.12 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:61.29 弱撑:66.28 弱压:68.13 强压:72.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | 目标72.58 | 止损65.12 | 买入区65.79~68.1 | 信号:观望", + "new_action": "盈利持有 | 目标73.11 | 止损65.74 | 买入区66.41~68.69 | 信号:观望", + "reason": "技术面重评: 止损65.12→65.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:61.23 弱撑:66.33 弱压:68.59 强压:73", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标73.11 | 止损65.74 | 买入区66.41~68.69 | 信号:观望", + "new_action": "盈利持有 | 目标73.49 | 止损65.94 | 买入区66.62~68.96 | 信号:观望", + "reason": "技术面重评: 止损65.74→65.94 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:61.19 弱撑:66.33 弱压:68.94 强压:73", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | 目标73.49 | 止损65.94 | 买入区66.62~68.96 | 信号:观望", + "new_action": "盈利持有 | 目标73.39 | 止损65.62 | 买入区66.3~68.73 | 信号:观望", + "reason": "技术面重评: 止损65.94→65.62 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:61.09 弱撑:66.31 弱压:68.73 强压:73", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标73.39 | 止损65.62 | 买入区66.3~68.73 | 信号:观望", + "new_action": "盈利持有 | 目标73.73 | 止损66.14 | 买入区66.83~69.18 | 信号:观望", + "reason": "技术面重评: 止损65.62→66.14 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:61.15 弱撑:66.33 弱压:69.14 强压:73", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "盈利持有 | 目标73.83 | 止损66.18 | 买入区66.87~69.24 | 信号:观望", + "new_action": "盈利持有 | 目标74.38 | 止损66.59 | 买入区67.28~69.55 | 信号:观望", + "reason": "技术面重评: 止损66.18→66.59 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.98 弱撑:66.33 弱压:69.63 强压:74", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | 目标74.38 | 止损66.59 | 买入区67.28~69.55 | 信号:观望", + "new_action": "盈利持有 | 目标74.54 | 止损66.53 | 买入区67.22~69.61 | 信号:观望", + "reason": "技术面重评: 止损66.59→66.53 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.98 弱撑:66.33 弱压:69.78 强压:74", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | 目标74.54 | 止损66.53 | 买入区67.22~69.61 | 信号:观望", + "new_action": "盈利持有 | 目标75.5 | 止损67.13 | 买入区67.83~70.0 | 信号:观望", + "reason": "技术面重评: 止损66.53→67.13 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.76 弱撑:66.33 弱压:70.51 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | 目标75.5 | 止损67.13 | 买入区67.83~70.0 | 信号:观望", + "new_action": "盈利持有 | 目标75.31 | 止损67.16 | 买入区67.86~69.92 | 信号:观望", + "reason": "技术面重评: 止损67.13→67.16 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.57 弱撑:66.33 弱压:70.14 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "盈利持有 | 目标75.31 | 止损67.16 | 买入区67.86~69.92 | 信号:观望", + "new_action": "盈利持有 | 目标75.18 | 止损66.36 | 买入区67.04~69.78 | 信号:观望", + "reason": "技术面重评: 止损67.16→66.36 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.44 弱撑:66.23 弱压:69.87 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利持有 | 目标75.18 | 止损66.36 | 买入区67.04~69.78 | 信号:观望", + "new_action": "盈利持有 | 目标75.39 | 止损66.33 | 买入区67.29~69.95 | 信号:观望", + "reason": "技术面重评: 止损66.36→66.33 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.65 弱撑:66.33 弱压:70.3 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | 目标75.41 | 止损66.33 | 买入区67.63~69.96 | 信号:观望", + "new_action": "盈利持有 | 目标75.35 | 止损66.71 | 买入区67.39~69.94 | 信号:观望", + "reason": "技术面重评: 止损66.33→66.71 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.61 弱撑:66.33 弱压:70.21 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 目标75.35 | 止损66.71 | 买入区67.39~69.94 | 信号:观望", + "new_action": "盈利持有 | 目标75.26 | 止损66.5 | 买入区67.19~69.9 | 信号:观望", + "reason": "技术面重评: 止损66.71→66.5 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.52 弱撑:66.33 弱压:70.05 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | 目标75.26 | 止损66.5 | 买入区67.19~69.9 | 信号:观望", + "new_action": "盈利持有 | 目标75.15 | 止损66.23 | 买入区66.91~69.65 | 信号:观望", + "reason": "技术面重评: 止损66.5→66.23 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.41 弱撑:66.19 弱压:69.83 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:40", + "old_action": "盈利持有 | 目标75.15 | 止损66.23 | 买入区66.91~69.65 | 信号:观望", + "new_action": "盈利持有 | 目标75.04 | 止损65.91 | 买入区66.59~69.31 | 信号:观望", + "reason": "技术面重评: 止损66.23→65.91 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.3 弱撑:65.96 弱压:69.6 强压:75.04", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | 目标75.04 | 止损65.91 | 买入区66.59~69.31 | 信号:观望", + "new_action": "盈利持有 | 目标75.05 | 止损65.86 | 买入区66.54~69.26 | 信号:观望", + "reason": "技术面重评: 止损65.91→65.86 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.31 弱撑:65.97 弱压:69.61 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | 目标75.05 | 止损65.86 | 买入区66.54~69.26 | 信号:观望", + "new_action": "盈利持有 | 目标75.23 | 止损66.31 | 买入区66.99~69.73 | 信号:观望", + "reason": "技术面重评: 止损65.86→66.31 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.49 弱撑:66.33 弱压:69.97 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | 目标75.23 | 止损66.31 | 买入区66.99~69.73 | 信号:观望", + "new_action": "盈利持有 | 目标75.24 | 止损66.42 | 买入区67.1~69.84 | 信号:观望", + "reason": "技术面重评: 止损66.31→66.42 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.5 弱撑:66.33 弱压:70.01 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | 目标75.18 | 止损66.24 | 买入区66.94~69.68 | 信号:观望", + "new_action": "盈利持有 | 目标75.21 | 止损66.23 | 买入区66.91~69.65 | 信号:观望", + "reason": "技术面重评: 止损66.24→66.23 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.47 弱撑:66.29 弱压:69.93 强压:75", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利持有 | 目标75.21 | 止损66.23 | 买入区66.91~69.65 | 信号:观望", + "new_action": "盈利持有 | 目标75.01 | 止损65.78 | 买入区66.45~69.17 | 信号:观望", + "reason": "技术面重评: 止损66.23→65.78 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.27 弱撑:65.91 弱压:69.55 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "盈利持有 | 目标75.01 | 止损65.78 | 买入区66.45~69.17 | 信号:观望", + "new_action": "盈利持有 | 目标75.07 | 止损65.89 | 买入区66.57~69.29 | 信号:观望", + "reason": "技术面重评: 止损65.78→65.89 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.33 弱撑:66.01 弱压:69.65 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标75.07 | 止损65.89 | 买入区66.57~69.29 | 信号:观望", + "new_action": "盈利持有 | 目标75.19 | 止损66.42 | 买入区67.1~69.83 | 信号:观望", + "reason": "技术面重评: 止损65.89→66.42 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:60.45 弱撑:66.26 弱压:69.9 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标75.19 | 止损66.42 | 买入区67.1~69.83 | 信号:观望", + "new_action": "盈利持有 | 目标75.11 | 止损66.07 | 买入区66.75~69.47 | 信号:观望", + "reason": "技术面重评: 止损66.42→66.07 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.37 弱撑:66.1 弱压:69.74 强压:75.1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标75.11 | 止损66.07 | 买入区66.75~69.47 | 信号:观望", + "new_action": "盈利持有 | 目标74.89 | 止损65.39 | 买入区66.06~68.76 | 信号:观望", + "reason": "技术面重评: 止损66.07→65.39 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:60.15 弱撑:65.65 弱压:69.29 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标74.89 | 止损65.39 | 买入区66.06~68.76 | 信号:观望", + "new_action": "盈利持有 | 目标74.95 | 止损65.62 | 买入区66.3~69.0 | 信号:观望", + "reason": "技术面重评: 止损65.39→65.62 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.21 弱撑:65.78 弱压:69.42 强压:74.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标74.91 | 止损65.48 | 买入区66.16~68.86 | 信号:观望", + "new_action": "盈利持有 | 目标74.94 | 止损65.5 | 买入区66.18~68.88 | 信号:观望", + "reason": "技术面重评: 止损65.48→65.5 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.2 弱撑:65.75 弱压:69.39 强压:74.9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标74.94 | 止损65.5 | 买入区66.18~68.88 | 信号:观望", + "new_action": "盈利持有 | 目标74.98 | 止损65.64 | 买入区66.32~69.02 | 信号:观望", + "reason": "技术面重评: 止损65.5→65.64 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.24 弱撑:65.85 弱压:69.49 强压:74.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标74.98 | 止损65.64 | 买入区66.32~69.02 | 信号:观望", + "new_action": "盈利持有 | 目标75.06 | 止损65.89 | 买入区66.57~69.29 | 信号:观望", + "reason": "技术面重评: 止损65.64→65.89 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.32 弱撑:66.0 弱压:69.64 强压:75.0", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标75.06 | 止损65.89 | 买入区66.57~69.29 | 信号:观望", + "new_action": "盈利持有 | 目标75.13 | 止损65.75 | 买入区66.42~69.14 | 信号:观望", + "reason": "技术面重评: 止损65.89→65.75 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.39 弱撑:66.15 弱压:69.79 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:22", + "old_action": "盈利持有 | 目标75.13 | 止损65.75 | 买入区66.42~69.14 | 信号:观望", + "new_action": "盈利持有 | 目标75.12 | 止损66.06 | 买入区66.74~69.46 | 信号:观望", + "reason": "技术面重评: 止损65.75→66.06 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.38 弱撑:66.12 弱压:69.76 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "盈利持有 | 目标75.12 | 止损66.06 | 买入区66.74~69.46 | 信号:观望", + "new_action": "盈利持有 | 目标75.07 | 止损65.96 | 买入区66.64~69.36 | 信号:观望", + "reason": "技术面重评: 止损66.06→65.96 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.33 弱撑:66.03 弱压:69.67 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标75.15 | 止损66.15 | 买入区66.84~69.56 | 信号:观望", + "new_action": "盈利持有 | 目标75.13 | 止损66.11 | 买入区66.79~69.51 | 信号:观望", + "reason": "技术面重评: 止损66.15→66.11 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.39 弱撑:66.14 弱压:69.78 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标75.13 | 止损66.11 | 买入区66.79~69.51 | 信号:观望", + "new_action": "盈利持有 | 目标75.16 | 止损66.2 | 买入区66.89~69.61 | 信号:观望", + "reason": "技术面重评: 止损66.11→66.2 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.42 弱撑:66.19 弱压:69.83 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "盈利持有 | 目标75.16 | 止损66.2 | 买入区66.89~69.61 | 信号:观望", + "new_action": "盈利持有 | 目标75.15 | 止损66.17 | 买入区66.86~69.58 | 信号:观望", + "reason": "技术面重评: 止损66.2→66.17 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.41 弱撑:66.18 弱压:69.82 强压:75.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:01", + "old_action": "盈利持有 | 目标75.15 | 止损66.17 | 买入区66.86~69.58 | 信号:观望", + "new_action": "盈利持有 | 目标75.14 | 止损66.15 | 买入区66.84~69.56 | 信号:观望", + "reason": "技术面重评: 止损66.17→66.15 | 形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:60.4 弱撑:66.17 弱压:69.81 强压:75.1", + "trigger": "技术面重评" } - ], - "strategy_tree": { - "branches": [ - { - "id": "300124_stop_loss", - "condition": { - "price": "<63.91" - }, - "action": { - "type": "sell", - "amount": "all", - "reason": "止损" - }, - "priority": 0, - "rationale": "止损保护本金", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "300124_buy_dip", - "condition": { - "scenario": "weak_consolidation", - "price": "<=66.74", - "price_lower": ">=64.57" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": 64.57, - "reason": "回调支撑买入" - }, - "priority": 1, - "rationale": "价格回调到支撑区,弱势市场低吸", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "300124_breakout_chase", - "condition": { - "scenario": "bullish_recovery", - "price": ">=70.99" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": "market", - "reason": "突破确认追涨" - }, - "priority": 2, - "rationale": "价格突破阻力,确认上升趋势后买入", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "300124_trim", - "condition": { - "scenario": "sharp_decline", - "loss_pct": "<-15%" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "急跌降风险" - }, - "priority": 3, - "rationale": "急跌市场,深套股减半仓减少敞口", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "300124_take_profit", - "condition": { - "price": ">=70.99" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "止盈锁利" - }, - "priority": 4, - "rationale": "达到目标价,减半仓锁定利润", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "300124_hold", - "condition": {}, - "action": { - "type": "hold", - "reason": "无明确信号,继续持有" - }, - "priority": 99, - "rationale": "没有分支匹配时的默认动作", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - } - ] - } + ] }, { "code": "300308", "name": "中际旭创", - "price": 1272.01, + "price": 1223.17, "cost": 1316.53, "shares": 100, "avg_price": 1316.53, - "action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1196.55 | 目标1328.37 | 买入区1220.0~1256.27 | 信号:持有", - "stop_loss": 1196.55, - "entry_low": 1220.0, - "entry_high": 1256.27, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1128.82 弱撑:1220.0 弱压:1294.32 强压:1383.72 | MA5=1283.9 MA10=1293.89 MA20=1237.53 MA60=1001.87", + "action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1169.0 | 目标1339.19 | 买入区1182.26~1248.91 | 信号:持有", + "stop_loss": 1169.0, + "entry_low": 1182.26, + "entry_high": 1248.91, + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.83 弱撑:1182.26 弱压:1289.83 强压:1394.99 | MA5=1262.5 MA10=1296.1 MA20=1247.2 MA60=1024.3", "timing_signal": "持有", - "rr_ratio": 0.78, + "rr_ratio": 1.43, "status": "updated", - "note": "⚠️盈亏比偏低(1:0.8),不建议加仓", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "⚠️盈亏比偏低(1:1.4),不建议加仓", + "timestamp": "2026-07-01 15:01", + "updated_at": "2026-07-01 15:01", "type": "持仓策略", "source": "auto", "sector_context": "", @@ -38155,14 +39844,14 @@ "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 1196.55, - "entry_zone": "1220.0~1256.27", - "take_profit_zone": "0~1328.37" + "stop_loss": 1169.0, + "entry_zone": "1182.26~1248.91", + "take_profit_zone": "0~1339.19" }, "created_at": "2026-06-24 14:24", "last_reassessed_price": 1178.1, - "take_profit": 1328.37, - "updated_reason": "技术面重评: 止损1190.07→1196.55, 止盈1322.51→1328.37 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1128.82 弱撑:1220.0 弱压:1294.32 ", + "take_profit": 1339.19, + "updated_reason": "技术面重评: 止损1169.02→1169.0, 止盈1339.21→1339.19 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.83 弱撑:1182.26 弱压:1289.83 ", "changelog": [ { "date": "2026-06-24 14:24", @@ -39913,42 +41602,322 @@ "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1196.55 | 目标1328.37 | 买入区1220.0~1256.27 | 信号:持有", "reason": "技术面重评: 止损1190.07→1196.55, 止盈1322.51→1328.37 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1128.82 弱撑:1220.0 弱压:1294.32 ", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1196.55 | 目标1328.37 | 买入区1220.0~1256.27 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1201.85 | 目标1333.17 | 买入区1220.0~1261.27 | 信号:持有", + "reason": "技术面重评: 止损1196.55→1201.85, 止盈1328.37→1333.17 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1133.82 弱撑:1220.0 弱压:1304.33 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1201.85 | 目标1333.17 | 买入区1220.0~1261.27 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损1184.66 | 目标0 | 买入区1143.0~1333.5 | 信号:持有", + "reason": "技术面重评: 止损1201.85→1184.66 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损1184.66 | 目标0 | 买入区1143.0~1333.5 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1225.5 | 目标1358.54 | 买入区1270.0~1285.64 | 信号:持有", + "reason": "技术面重评: 止损1184.66→1225.5 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1156.13 弱撑:1270.0 弱压:1309.36 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1225.5 | 目标1358.54 | 买入区1270.0~1285.64 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1219.47 | 目标1374.12 | 买入区1270.0~1290.91 | 信号:持有", + "reason": "技术面重评: 止损1225.5→1219.47, 止盈1358.54→1374.12 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1150.44 弱撑:1270.0 弱压:1319.9 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1219.47 | 目标1374.12 | 买入区1270.0~1290.91 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1216.36 | 目标1371.31 | 买入区1266.01~1287.98 | 信号:持有", + "reason": "技术面重评: 止损1219.47→1216.36, 止盈1374.12→1371.31 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1147.51 弱撑:1266.01 弱压:1314.06 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1216.36 | 目标1371.31 | 买入区1266.01~1287.98 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1218.45 | 目标1373.2 | 买入区1269.93~1289.95 | 信号:持有", + "reason": "技术面重评: 止损1216.36→1218.45, 止盈1371.31→1373.2 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1149.48 弱撑:1269.93 弱压:1317.98", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1218.45 | 目标1373.2 | 买入区1269.93~1289.95 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1221.16 | 目标1379.58 | 买入区1270.0~1294.55 | 信号:持有", + "reason": "技术面重评: 止损1218.45→1221.16, 止盈1373.2→1379.58 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1152.04 弱撑:1270.0 弱压:1327.18 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1221.16 | 目标1379.58 | 买入区1270.0~1294.55 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1220.54 | 目标1385.85 | 买入区1270.0~1297.52 | 信号:持有", + "reason": "技术面重评: 止损1221.16→1220.54, 止盈1379.58→1385.85 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1151.45 弱撑:1270.0 弱压:1333.12 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1220.54 | 目标1385.85 | 买入区1270.0~1297.52 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1218.37 | 目标1383.91 | 买入区1270.0~1295.49 | 信号:持有", + "reason": "技术面重评: 止损1220.54→1218.37, 止盈1385.85→1383.91 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1149.41 弱撑:1270.0 弱压:1329.08 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1218.37 | 目标1383.91 | 买入区1270.0~1295.49 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1217.0 | 目标1382.66 | 买入区1270.0~1294.19 | 信号:持有", + "reason": "技术面重评: 止损1218.37→1217.0, 止盈1383.91→1382.66 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1148.11 弱撑:1270.0 弱压:1326.47 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:58", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1217.0 | 目标1382.66 | 买入区1270.0~1294.19 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1213.82 | 目标1379.78 | 买入区1266.82~1291.19 | 信号:持有", + "reason": "技术面重评: 止损1217.0→1213.82, 止盈1382.66→1379.78 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1145.11 弱撑:1266.82 弱压:1320.48 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损1213.82 | 目标1379.78 | 买入区1266.82~1291.19 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1212.04 | 目标1378.17 | 买入区1263.45~1289.51 | 信号:持有", + "reason": "技术面重评: 止损1213.82→1212.04, 止盈1379.78→1378.17 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1143.43 弱撑:1263.45 弱压:1317.11 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1212.04 | 目标1378.17 | 买入区1263.45~1289.51 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1213.09 | 目标1379.12 | 买入区1265.42~1290.5 | 信号:持有", + "reason": "技术面重评: 止损1212.04→1213.09, 止盈1378.17→1379.12 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1144.42 弱撑:1265.42 弱压:1319.08 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1213.09 | 目标1379.12 | 买入区1265.42~1290.5 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1210.76 | 目标1377.01 | 买入区1261.05~1288.31 | 信号:持有", + "reason": "技术面重评: 止损1213.09→1210.76, 止盈1379.12→1377.01 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1142.23 弱撑:1261.05 弱压:1314.71 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损1210.76 | 目标1377.01 | 买入区1261.05~1288.31 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损1206.95 | 目标1373.56 | 买入区1253.85~1284.71 | 信号:持有", + "reason": "技术面重评: 止损1210.76→1206.95, 止盈1377.01→1373.56 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1138.63 弱撑:1253.85 弱压:1307.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损1206.95 | 目标1373.56 | 买入区1253.85~1284.71 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1206.39 | 目标1373.05 | 买入区1252.78~1284.18 | 信号:持有", + "reason": "技术面重评: 止损1206.95→1206.39, 止盈1373.56→1373.05 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1138.1 弱撑:1252.78 弱压:1306.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1206.39 | 目标1373.05 | 买入区1252.78~1284.18 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1203.53 | 目标1370.47 | 买入区1247.41~1281.49 | 信号:持有", + "reason": "技术面重评: 止损1206.39→1203.53, 止盈1373.05→1370.47 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1135.41 弱撑:1247.41 弱压:1301.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1203.53 | 目标1370.47 | 买入区1247.41~1281.49 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1203.18 | 目标1370.15 | 买入区1246.75~1281.16 | 信号:持有", + "reason": "技术面重评: 止损1203.53→1203.18, 止盈1370.47→1370.15 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1135.08 弱撑:1246.75 弱压:1300.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1203.18 | 目标1370.15 | 买入区1246.75~1281.16 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1200.63 | 目标1367.84 | 买入区1241.93~1278.75 | 信号:持有", + "reason": "技术面重评: 止损1203.18→1200.63, 止盈1370.15→1367.84 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1132.67 弱撑:1241.93 弱压:1298.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1200.63 | 目标1367.84 | 买入区1241.93~1278.75 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1200.69 | 目标1367.89 | 买入区1242.06~1278.81 | 信号:持有", + "reason": "技术面重评: 止损1200.63→1200.69, 止盈1367.84→1367.89 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1132.73 弱撑:1242.06 弱压:1298.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1200.69 | 目标1367.89 | 买入区1242.06~1278.81 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1198.15 | 目标1365.59 | 买入区1237.25~1276.41 | 信号:持有", + "reason": "技术面重评: 止损1200.69→1198.15, 止盈1367.89→1365.59 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1130.33 弱撑:1237.25 弱压:1297.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1198.15 | 目标1365.59 | 买入区1237.25~1276.41 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1204.5 | 目标1371.34 | 买入区1249.24~1282.4 | 信号:持有", + "reason": "技术面重评: 止损1198.15→1204.5, 止盈1365.59→1371.34 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1136.32 弱撑:1249.24 弱压:1309.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1204.5 | 目标1371.34 | 买入区1249.24~1282.4 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损1203.43 | 目标1370.37 | 买入区1247.22~1281.39 | 信号:持有", + "reason": "技术面重评: 止损1204.5→1203.43, 止盈1371.34→1370.37 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1135.31 弱撑:1247.22 弱压:1307.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损1203.43 | 目标1370.37 | 买入区1247.22~1281.39 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1198.46 | 目标1365.87 | 买入区1237.82~1276.7 | 信号:持有", + "reason": "技术面重评: 止损1203.43→1198.46, 止盈1370.37→1365.87 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1130.62 弱撑:1237.82 弱压:1297.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损1198.46 | 目标1365.87 | 买入区1237.82~1276.7 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1190.31 | 目标1358.49 | 买入区1222.46~1269.01 | 信号:持有", + "reason": "技术面重评: 止损1198.46→1190.31, 止盈1365.87→1358.49 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1122.93 弱撑:1222.46 弱压:1293.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1190.31 | 目标1358.49 | 买入区1222.46~1269.01 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1184.56 | 目标1353.28 | 买入区1211.61~1263.59 | 信号:持有", + "reason": "技术面重评: 止损1190.31→1184.56, 止盈1358.49→1353.28 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1117.51 弱撑:1211.61 弱压:1297.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1184.56 | 目标1353.28 | 买入区1211.61~1263.59 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1184.51 | 目标1353.24 | 买入区1211.5~1263.54 | 信号:持有", + "reason": "技术面重评: 止损1184.56→1184.51, 止盈1353.28→1353.24 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1117.46 弱撑:1211.5 弱压:1297.0", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损1184.51 | 目标1353.24 | 买入区1211.5~1263.54 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1182.73 | 目标1351.62 | 买入区1208.14~1261.86 | 信号:持有", + "reason": "技术面重评: 止损1184.51→1182.73, 止盈1353.24→1351.62 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1115.78 弱撑:1208.14 弱压:1293.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1182.73 | 目标1351.62 | 买入区1208.14~1261.86 | 信号:持有", + "new_action": "持有观察 | 止损1172.79 | 目标1342.63 | 买入区1189.41~1250.7 | 信号:持有", + "reason": "技术面重评: 止损1182.73→1172.79, 止盈1351.62→1342.63 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1106.41 弱撑:1189.41 弱压:1284.98 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "持有观察 | 止损1172.79 | 目标1342.63 | 买入区1189.41~1250.7 | 信号:持有", + "new_action": "持有观察 | 止损1172.82 | 目标1342.65 | 买入区1189.46~1250.7 | 信号:持有", + "reason": "技术面重评: 止损1172.79→1172.82, 止盈1342.63→1342.65 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1106.43 弱撑:1189.46 弱压:1285.03 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "持有观察 | 止损1172.82 | 目标1342.65 | 买入区1189.46~1250.7 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.5),不建议加仓 | 止损1173.88 | 目标1343.61 | 买入区1191.46~1251.03 | 信号:持有", + "reason": "技术面重评: 止损1172.82→1173.88, 止盈1342.65→1343.61 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1107.43 弱撑:1191.46 弱压:1287.03 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.5),不建议加仓 | 止损1173.88 | 目标1343.61 | 买入区1191.46~1251.03 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1174.78 | 目标1344.42 | 买入区1193.16~1252.82 | 信号:持有", + "reason": "技术面重评: 止损1173.88→1174.78, 止盈1343.61→1344.42 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1108.28 弱撑:1193.16 弱压:1288.73 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1174.78 | 目标1344.42 | 买入区1193.16~1252.82 | 信号:持有", + "new_action": "持有观察 | 止损1172.64 | 目标1342.48 | 买入区1189.11~1250.7 | 信号:持有", + "reason": "技术面重评: 止损1174.78→1172.64, 止盈1344.42→1342.48 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1106.26 弱撑:1189.11 弱压:1285.88 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "持有观察 | 止损1172.64 | 目标1342.48 | 买入区1189.11~1250.7 | 信号:持有", + "new_action": "持有观察 | 止损1167.54 | 目标1337.87 | 买入区1179.48~1247.53 | 信号:持有", + "reason": "技术面重评: 止损1172.64→1167.54, 止盈1342.48→1337.87 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1101.45 弱撑:1179.48 弱压:1285.04 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "持有观察 | 止损1167.54 | 目标1337.87 | 买入区1179.48~1247.53 | 信号:持有", + "new_action": "持有观察 | 止损1166.5 | 目标1336.92 | 买入区1177.53~1246.55 | 信号:持有", + "reason": "技术面重评: 止损1167.54→1166.5, 止盈1337.87→1336.92 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1100.47 弱撑:1177.53 弱压:1283.09 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "持有观察 | 止损1166.5 | 目标1336.92 | 买入区1177.53~1246.55 | 信号:持有", + "new_action": "持有观察 | 止损1166.11 | 目标1336.57 | 买入区1176.79~1246.18 | 信号:持有", + "reason": "技术面重评: 止损1166.5→1166.11, 止盈1336.92→1336.57 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1100.1 弱撑:1176.79 弱压:1282.35 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "持有观察 | 止损1166.11 | 目标1336.57 | 买入区1176.79~1246.18 | 信号:持有", + "new_action": "持有观察 | 止损1166.12 | 目标1336.58 | 买入区1176.82~1246.19 | 信号:持有", + "reason": "技术面重评: 止损1166.11→1166.12, 止盈1336.57→1336.58 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1100.11 弱撑:1176.82 弱压:1282.38 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "持有观察 | 止损1166.12 | 目标1336.58 | 买入区1176.82~1246.19 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1168.95 | 目标1339.14 | 买入区1182.14~1248.86 | 信号:持有", + "reason": "技术面重评: 止损1166.12→1168.95, 止盈1336.58→1339.14 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.78 弱撑:1182.14 弱压:1289.71 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1168.95 | 目标1339.14 | 买入区1182.14~1248.86 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1169.02 | 目标1339.21 | 买入区1182.29~1248.93 | 信号:持有", + "reason": "技术面重评: 止损1168.95→1169.02, 止盈1339.14→1339.21 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.85 弱撑:1182.29 弱压:1289.86 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1169.02 | 目标1339.21 | 买入区1182.29~1248.93 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1169.0 | 目标1339.19 | 买入区1182.26~1248.91 | 信号:持有", + "reason": "技术面重评: 止损1169.02→1169.0, 止盈1339.21→1339.19 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.83 弱撑:1182.26 弱压:1289.83 ", + "trigger": "技术面重评" } ] }, { "code": "300548", "name": "长芯博创", - "price": 273.98, + "price": 254.0, "cost": 231.46, "shares": 100, "avg_price": 231.46, - "action": "盈利良好 | 止损265.76 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", - "stop_loss": 265.76, - "entry_low": 253.19, - "entry_high": 265.85, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:224.93 弱撑:253.19 弱压:280.65 强压:303.83 | MA5=273.2 MA10=276.81 MA20=252.3 MA60=243.4", + "action": "盈利良好 | 止损246.38 | 目标291.58 | 买入区241.67~253.75 | 信号:持有", + "stop_loss": 246.38, + "entry_low": 241.67, + "entry_high": 253.75, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:241.67 弱压:278.0 强压:303.73 | MA5=266.91 MA10=275.27 MA20=256.44 MA60=247.14", "timing_signal": "持有", - "rr_ratio": 2.18, + "rr_ratio": 4.03, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业光学光电子大涨+5.0%,可适度积极", + "sector_context": "行业光学光电子+0.0%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 265.76, - "entry_zone": "253.19~265.85", - "take_profit_zone": "0~300.43" + "stop_loss": 246.38, + "entry_zone": "241.67~253.75", + "take_profit_zone": "0~291.58" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 253.19, - "take_profit": 300.43, - "updated_reason": "技术面重评: 止损259.62→265.76 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:224.93 弱撑:253.19 弱压:280.65 强压", + "take_profit": 291.58, + "updated_reason": "技术面重评: 止损244.44→246.38, 止盈291.17→291.58 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:241.67 弱压:278.0 强压:3", "changelog": [ { "date": "2026-06-18 11:31", @@ -41825,42 +43794,329 @@ "new_action": "盈利良好 | 止损265.76 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", "reason": "技术面重评: 止损259.62→265.76 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:224.93 弱撑:253.19 弱压:280.65 强压", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利良好 | 止损265.76 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", + "new_action": "盈利良好 | 止损269.66 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", + "reason": "技术面重评: 止损265.76→269.66 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:228.4 弱撑:253.19 弱压:287.6 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "盈利良好 | 止损269.66 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损268.69 | 目标0 | 买入区249.3~290.85 | 信号:持有", + "reason": "技术面重评: 止损269.66→268.69 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损268.69 | 目标0 | 买入区249.3~290.85 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损267.72 | 目标0 | 买入区248.4~289.8 | 信号:持有", + "reason": "技术面重评: 止损268.69→267.72 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损267.72 | 目标0 | 买入区248.4~289.8 | 信号:持有", + "new_action": "盈利良好 | 止损270.56 | 目标306.99 | 买入区273.79~287.48 | 信号:持有", + "reason": "技术面重评: 止损267.72→270.56 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:233.98 弱撑:273.79 弱压:280.1 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利良好 | 止损270.56 | 目标306.99 | 买入区273.79~287.48 | 信号:持有", + "new_action": "盈利良好 | 止损264.52 | 目标304.96 | 买入区269.55~283.03 | 信号:持有", + "reason": "技术面重评: 止损270.56→264.52, 止盈306.99→304.96 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:231.87 弱撑:269.55 弱压:278.0 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利良好 | 止损264.52 | 目标304.96 | 买入区269.55~283.03 | 信号:持有", + "new_action": "盈利良好 | 止损262.98 | 目标303.61 | 买入区266.75~280.09 | 信号:持有", + "reason": "技术面重评: 止损264.52→262.98, 止盈304.96→303.61 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:230.46 弱撑:266.75 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利良好 | 止损262.98 | 目标303.61 | 买入区266.75~280.09 | 信号:持有", + "new_action": "盈利良好 | 止损265.15 | 目标303.91 | 买入区267.36~280.73 | 信号:持有", + "reason": "技术面重评: 止损262.98→265.15, 止盈303.61→303.91 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:230.77 弱撑:267.36 弱压:278.34 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利良好 | 止损265.15 | 目标303.91 | 买入区267.36~280.73 | 信号:持有", + "new_action": "盈利良好 | 止损266.11 | 目标304.39 | 买入区268.36~281.78 | 信号:持有", + "reason": "技术面重评: 止损265.15→266.11, 止盈303.91→304.39 | 形态:长影星线/neutral 量价:主动买盘占优 强撑:231.27 弱撑:268.36 弱压:279.34 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利良好 | 止损266.11 | 目标304.39 | 买入区268.36~281.78 | 信号:持有", + "new_action": "盈利良好 | 止损265.78 | 目标304.37 | 买入区268.32~281.74 | 信号:持有", + "reason": "技术面重评: 止损266.11→265.78, 止盈304.39→304.37 | 形态:长影星线/neutral 量价:主动买盘占优 强撑:231.25 弱撑:268.32 弱压:279.3 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利良好 | 止损265.78 | 目标304.37 | 买入区268.32~281.74 | 信号:持有", + "new_action": "盈利良好 | 止损262.9 | 目标303.0 | 买入区265.47~278.74 | 信号:持有", + "reason": "技术面重评: 止损265.78→262.9, 止盈304.37→303.0 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:229.83 弱撑:265.47 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利良好 | 止损262.9 | 目标303.0 | 买入区265.47~278.74 | 信号:持有", + "new_action": "盈利良好 | 止损260.02 | 目标302.05 | 买入区263.51~276.69 | 信号:持有", + "reason": "技术面重评: 止损262.9→260.02, 止盈303.0→302.05 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:228.84 弱撑:263.51 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利良好 | 止损260.02 | 目标302.05 | 买入区263.51~276.69 | 信号:持有", + "new_action": "盈利良好 | 止损259.62 | 目标301.67 | 买入区262.7~275.83 | 信号:持有", + "reason": "技术面重评: 止损260.02→259.62, 止盈302.05→301.67 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:228.44 弱撑:262.7 弱压:278.0 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利良好 | 止损259.62 | 目标301.67 | 买入区262.7~275.83 | 信号:持有", + "new_action": "盈利良好 | 止损258.33 | 目标301.55 | 买入区262.44~275.56 | 信号:持有", + "reason": "技术面重评: 止损259.62→258.33, 止盈301.67→301.55 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:228.31 弱撑:262.44 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利良好 | 止损258.33 | 目标301.55 | 买入区262.44~275.56 | 信号:持有", + "new_action": "盈利良好 | 止损260.93 | 目标301.65 | 买入区262.65~275.78 | 信号:持有", + "reason": "技术面重评: 止损258.33→260.93, 止盈301.55→301.65 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:228.42 弱撑:262.65 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利良好 | 止损260.93 | 目标301.65 | 买入区262.65~275.78 | 信号:持有", + "new_action": "盈利良好 | 止损260.93 | 目标302.25 | 买入区263.89~277.08 | 信号:持有", + "reason": "技术面重评: 止盈301.65→302.25 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:229.04 弱撑:263.89 弱压:278.22 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "盈利良好 | 止损260.93 | 目标302.25 | 买入区263.89~277.08 | 信号:持有", + "new_action": "盈利良好 | 止损261.12 | 目标301.59 | 买入区262.53~275.66 | 信号:持有", + "reason": "技术面重评: 止损260.93→261.12, 止盈302.25→301.59 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:228.36 弱撑:262.53 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:29", + "old_action": "盈利良好 | 止损261.12 | 目标301.59 | 买入区262.53~275.66 | 信号:持有", + "new_action": "盈利良好 | 止损257.63 | 目标310.02 | 买入区261.27~274.33 | 信号:持有", + "reason": "技术面重评: 止损261.12→257.63, 止盈301.59→310.02 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:227.73 弱撑:261.27 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利良好 | 止损257.63 | 目标310.02 | 买入区261.27~274.33 | 信号:持有", + "new_action": "盈利良好 | 止损257.54 | 目标300.61 | 买入区260.49~273.51 | 信号:持有", + "reason": "技术面重评: 止损257.63→257.54, 止盈310.02→300.61 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:227.34 弱撑:260.49 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利良好 | 止损257.54 | 目标300.61 | 买入区260.49~273.51 | 信号:持有", + "new_action": "盈利良好 | 止损256.46 | 目标299.79 | 买入区258.79~271.73 | 信号:持有", + "reason": "技术面重评: 止损257.54→256.46, 止盈300.61→299.79 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:226.48 弱撑:258.79 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利良好 | 止损256.46 | 目标299.79 | 买入区258.79~271.73 | 信号:持有", + "new_action": "盈利良好 | 止损256.18 | 目标299.4 | 买入区257.97~270.87 | 信号:持有", + "reason": "技术面重评: 止损256.46→256.18, 止盈299.79→299.4 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:226.08 弱撑:257.97 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利良好 | 止损256.18 | 目标299.4 | 买入区257.97~270.87 | 信号:持有", + "new_action": "盈利良好 | 止损255.67 | 目标298.84 | 买入区256.81~269.65 | 信号:持有", + "reason": "技术面重评: 止损256.18→255.67, 止盈299.4→298.84 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:225.49 弱撑:256.81 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利良好 | 止损255.67 | 目标298.84 | 买入区256.81~269.65 | 信号:持有", + "new_action": "盈利良好 | 止损254.95 | 目标298.93 | 买入区256.99~269.84 | 信号:持有", + "reason": "技术面重评: 止损255.67→254.95, 止盈298.84→298.93 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:225.59 弱撑:256.99 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利良好 | 止损254.95 | 目标298.93 | 买入区256.99~269.84 | 信号:持有", + "new_action": "盈利良好 | 止损257.22 | 目标299.57 | 买入区258.32~271.24 | 信号:持有", + "reason": "技术面重评: 止损254.95→257.22, 止盈298.93→299.57 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:226.25 弱撑:258.32 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利良好 | 止损257.22 | 目标299.57 | 买入区258.32~271.24 | 信号:持有", + "new_action": "盈利良好 | 止损255.97 | 目标299.15 | 买入区257.45~270.32 | 信号:持有", + "reason": "技术面重评: 止损257.22→255.97, 止盈299.57→299.15 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:225.81 弱撑:257.45 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利良好 | 止损255.97 | 目标299.15 | 买入区257.45~270.32 | 信号:持有", + "new_action": "盈利良好 | 止损254.78 | 目标298.74 | 买入区256.6~269.43 | 信号:持有", + "reason": "技术面重评: 止损255.97→254.78, 止盈299.15→298.74 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:225.39 弱撑:256.6 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利良好 | 止损254.78 | 目标298.74 | 买入区256.6~269.43 | 信号:持有", + "new_action": "盈利良好 | 止损252.39 | 目标297.26 | 买入区253.53~266.21 | 信号:持有", + "reason": "技术面重评: 止损254.78→252.39, 止盈298.74→297.26 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:223.85 弱撑:253.53 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "盈利良好 | 止损252.39 | 目标297.26 | 买入区253.53~266.21 | 信号:持有", + "new_action": "盈利良好 | 止损250.42 | 目标296.01 | 买入区250.89~263.43 | 信号:持有", + "reason": "技术面重评: 止损252.39→250.42, 止盈297.26→296.01 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.54 弱撑:250.89 弱压:278.0 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利良好 | 止损250.42 | 目标296.01 | 买入区250.89~263.43 | 信号:持有", + "new_action": "盈利良好 | 止损251.67 | 目标295.87 | 买入区250.61~263.14 | 信号:持有", + "reason": "技术面重评: 止损250.42→251.67, 止盈296.01→295.87 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:250.61 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利良好 | 止损251.67 | 目标295.87 | 买入区250.61~263.14 | 信号:持有", + "new_action": "盈利良好 | 止损250.22 | 目标295.7 | 买入区250.27~262.78 | 信号:持有", + "reason": "技术面重评: 止损251.67→250.22, 止盈295.87→295.7 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:250.27 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利良好 | 止损250.22 | 目标295.7 | 买入区250.27~262.78 | 信号:持有", + "new_action": "盈利良好 | 止损245.23 | 目标292.44 | 买入区243.45~255.62 | 信号:持有", + "reason": "技术面重评: 止损250.22→245.23, 止盈295.7→292.44 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:243.45 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利良好 | 止损245.23 | 目标292.44 | 买入区243.45~255.62 | 信号:持有", + "new_action": "盈利良好 | 止损246.97 | 目标293.05 | 买入区244.75~256.99 | 信号:持有", + "reason": "技术面重评: 止损245.23→246.97, 止盈292.44→293.05 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:244.75 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利良好 | 止损246.97 | 目标293.05 | 买入区244.75~256.99 | 信号:持有", + "new_action": "盈利良好 | 止损245.69 | 目标292.61 | 买入区243.82~256.01 | 信号:持有", + "reason": "技术面重评: 止损246.97→245.69, 止盈293.05→292.61 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:243.82 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利良好 | 止损245.69 | 目标292.61 | 买入区243.82~256.01 | 信号:持有", + "new_action": "盈利良好 | 止损247.02 | 目标293.06 | 买入区244.77~257.01 | 信号:持有", + "reason": "技术面重评: 止损245.69→247.02, 止盈292.61→293.06 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:244.77 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利良好 | 止损247.02 | 目标293.06 | 买入区244.77~257.01 | 信号:持有", + "new_action": "盈利良好 | 止损245.96 | 目标292.8 | 买入区244.21~256.42 | 信号:持有", + "reason": "技术面重评: 止损247.02→245.96, 止盈293.06→292.8 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:244.21 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利良好 | 止损245.96 | 目标292.8 | 买入区244.21~256.42 | 信号:持有", + "new_action": "盈利良好 | 止损243.26 | 目标291.14 | 买入区240.75~252.79 | 信号:持有", + "reason": "技术面重评: 止损245.96→243.26, 止盈292.8→291.14 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:240.75 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利良好 | 止损243.26 | 目标291.14 | 买入区240.75~252.79 | 信号:持有", + "new_action": "盈利良好 | 止损243.62 | 目标291.26 | 买入区241.01~253.06 | 信号:持有", + "reason": "技术面重评: 止损243.26→243.62, 止盈291.14→291.26 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:241.01 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "盈利良好 | 止损243.62 | 目标291.26 | 买入区241.01~253.06 | 信号:持有", + "new_action": "盈利良好 | 止损242.71 | 目标290.85 | 买入区240.16~252.17 | 信号:持有", + "reason": "技术面重评: 止损243.62→242.71, 止盈291.26→290.85 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:240.16 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利良好 | 止损242.71 | 目标290.85 | 买入区240.16~252.17 | 信号:持有", + "new_action": "盈利良好 | 止损242.79 | 目标290.93 | 买入区240.31~252.33 | 信号:持有", + "reason": "技术面重评: 止损242.71→242.79, 止盈290.85→290.93 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:240.31 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利良好 | 止损242.79 | 目标290.93 | 买入区240.31~252.33 | 信号:持有", + "new_action": "盈利良好 | 止损243.48 | 目标290.66 | 买入区239.75~251.74 | 信号:持有", + "reason": "技术面重评: 止损242.79→243.48, 止盈290.93→290.66 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:239.75 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "盈利良好 | 止损243.48 | 目标290.66 | 买入区239.75~251.74 | 信号:持有", + "new_action": "盈利良好 | 止损244.44 | 目标291.17 | 买入区240.83~252.87 | 信号:持有", + "reason": "技术面重评: 止损243.48→244.44, 止盈290.66→291.17 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:240.83 弱压:278.0 强压:3", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利良好 | 止损244.44 | 目标291.17 | 买入区240.83~252.87 | 信号:持有", + "new_action": "盈利良好 | 止损246.38 | 目标291.58 | 买入区241.67~253.75 | 信号:持有", + "reason": "技术面重评: 止损244.44→246.38, 止盈291.17→291.58 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:241.67 弱压:278.0 强压:3", + "trigger": "技术面重评" } ] }, { "code": "300750", "name": "宁德时代", - "price": 391.0, + "price": 383.84, "cost": 401.78, "shares": 100, "avg_price": 401.78, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损379.27 | 目标409.12 | 买入区386.75~394.56 | 信号:弱势持有", - "stop_loss": 379.27, - "entry_low": 386.75, - "entry_high": 394.56, - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:362.95 弱撑:386.75 弱压:399.11 强压:426.17 | MA5=392.63 MA10=396.43 MA20=400.7 MA60=414.36", - "timing_signal": "弱势持有", - "rr_ratio": 1.25, + "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.31 | 目标404.56 | 买入区372.23~381.61 | 信号:持有", + "stop_loss": 362.31, + "entry_low": 372.23, + "entry_high": 381.61, + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.8 弱撑:372.23 弱压:393.23 强压:421.42 | MA5=390.94 MA10=394.21 MA20=396.97 MA60=414.12", + "timing_signal": "持有", + "rr_ratio": 0.89, "status": "updated", - "note": "⚠️盈亏比偏低(1:1.3),不建议加仓", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "⚠️盈亏比偏低(1:0.9),不建议加仓", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业电池上涨+2.0%,正常", + "sector_context": "行业电池+0.8%,中性", "stock_category": "弱势", "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 379.27, - "entry_zone": "386.75~394.56", - "take_profit_zone": "0~409.12" + "stop_loss": 362.31, + "entry_zone": "372.23~381.61", + "take_profit_zone": "0~404.56" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 381.0, - "take_profit": 409.12, - "updated_reason": "技术面重评: 止损375.83→379.27, 止盈409.0→409.12 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:362.95 弱撑:386.75 弱压:399.11 强压", + "take_profit": 404.56, + "updated_reason": "技术面重评: 止损362.33→362.31, 止盈404.58→404.56 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.8 弱撑:372.23 弱压:393.23 强压:4", "changelog": [ { "date": "2026-06-18 11:31", @@ -43751,42 +46007,470 @@ "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损379.27 | 目标409.12 | 买入区386.75~394.56 | 信号:弱势持有", "reason": "技术面重评: 止损375.83→379.27, 止盈409.0→409.12 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:362.95 弱撑:386.75 弱压:399.11 强压", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损379.27 | 目标409.12 | 买入区386.75~394.56 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损381.22 | 目标421.95 | 买入区387.89~395.12 | 信号:弱势持有", + "reason": "技术面重评: 止损379.27→381.22, 止盈409.12→421.95 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:363.51 弱撑:387.89 弱压:400.25 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损381.22 | 目标421.95 | 买入区387.89~395.12 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损381.21 | 目标0 | 买入区353.7~412.65 | 信号:持有", + "reason": "技术信号变化: 持有: 止损381.22→381.21 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术信号变化: 持有" + }, + { + "date": "2026-07-01 09:21", + "old_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损381.21 | 目标0 | 买入区353.7~412.65 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损381.22 | 目标0 | 买入区353.71~412.66 | 信号:持有", + "reason": "技术面重评: 止损381.21→381.22 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "持有观察 | ⚠️盈亏比极低,关注 | 止损381.22 | 目标0 | 买入区353.71~412.66 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损373.65 | 目标401.39 | 买入区382.0~386.5 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损381.22→373.65 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:354.89 弱撑:382.0 弱压:393.01 强压:41", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:38", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损373.65 | 目标401.39 | 买入区382.0~386.5 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损370.25 | 目标399.46 | 买入区377.16~384.08 | 信号:弱势持有", + "reason": "技术面重评: 止损373.65→370.25, 止盈401.39→399.46 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:352.06 弱撑:377.16 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损370.25 | 目标399.46 | 买入区377.16~384.08 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损366.88 | 目标397.71 | 买入区373.93~382.47 | 信号:弱势持有", + "reason": "技术面重评: 止损370.25→366.88, 止盈399.46→397.71 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:350.66 弱撑:373.93 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损366.88 | 目标397.71 | 买入区373.93~382.47 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损367.13 | 目标398.14 | 买入区373.41~382.2 | 信号:弱势持有", + "reason": "技术面重评: 止损366.88→367.13, 止盈397.71→398.14 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:349.67 弱撑:373.41 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损367.13 | 目标398.14 | 买入区373.41~382.2 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损359.56 | 目标399.81 | 买入区364.67~377.84 | 信号:持有", + "reason": "技术信号变化: 持有: 止损367.13→359.56, 止盈398.14→399.81 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:339.21 弱撑:364.67 弱压:393.01 强压:4", + "trigger": "技术信号变化: 持有" + }, + { + "date": "2026-07-01 09:50", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损359.56 | 目标399.81 | 买入区364.67~377.84 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损360.53 | 目标400.68 | 买入区366.49~378.75 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损359.56→360.53, 止盈399.81→400.68 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:340.12 弱撑:366.49 弱压:393.01 强压:4", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:54", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损360.53 | 目标400.68 | 买入区366.49~378.75 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损360.0 | 目标400.2 | 买入区365.5~378.25 | 信号:持有", + "reason": "技术信号变化: 持有: 止损360.53→360.0, 止盈400.68→400.2 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:339.62 弱撑:365.5 弱压:393.01 强压:41", + "trigger": "技术信号变化: 持有" + }, + { + "date": "2026-07-01 09:56", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损360.0 | 目标400.2 | 买入区365.5~378.25 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损359.82 | 目标400.04 | 买入区365.15~378.08 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损360.0→359.82, 止盈400.2→400.04 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:339.45 弱撑:365.15 弱压:393.01 强压:4", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:59", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损359.82 | 目标400.04 | 买入区365.15~378.08 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损359.62 | 目标399.86 | 买入区364.79~377.89 | 信号:弱势持有", + "reason": "技术面重评: 止损359.82→359.62, 止盈400.04→399.86 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:339.26 弱撑:364.79 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损359.62 | 目标399.86 | 买入区364.79~377.89 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损358.18 | 目标400.46 | 买入区364.05~377.53 | 信号:弱势持有", + "reason": "技术面重评: 止损359.62→358.18, 止盈399.86→400.46 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:337.91 弱撑:364.05 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损358.18 | 目标400.46 | 买入区364.05~377.53 | 信号:弱势持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.42 | 目标400.14 | 买入区363.01~377.0 | 信号:持有", + "reason": "技术信号变化: 持有: 止损358.18→357.42, 止盈400.46→400.14 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:337.19 弱撑:363.01 弱压:393.01 强压:4", + "trigger": "技术信号变化: 持有" + }, + { + "date": "2026-07-01 10:05", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.42 | 目标400.14 | 买入区363.01~377.0 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.49 | 目标400.2 | 买入区363.11~377.06 | 信号:持有", + "reason": "技术面重评: 止损357.42→357.49, 止盈400.14→400.2 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:337.25 弱撑:363.11 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.49 | 目标400.2 | 买入区363.11~377.06 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.46 | 目标400.18 | 买入区363.09~377.04 | 信号:持有", + "reason": "技术面重评: 止损357.49→357.46, 止盈400.2→400.18 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:337.23 弱撑:363.09 弱压:393.01 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损357.46 | 目标400.18 | 买入区363.09~377.04 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损360.16 | 目标402.61 | 买入区368.16~379.58 | 信号:持有", + "reason": "技术面重评: 止损357.46→360.16, 止盈400.18→402.61 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:339.77 弱撑:368.16 弱压:393.01 强压:41", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损360.16 | 目标402.61 | 买入区368.16~379.58 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.42 | 目标403.76 | 买入区370.54~380.77 | 信号:持有", + "reason": "技术面重评: 止损360.16→361.42, 止盈402.61→403.76 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:340.96 弱撑:370.54 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.42 | 目标403.76 | 买入区370.54~380.77 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损362.04 | 目标404.32 | 买入区371.73~381.36 | 信号:持有", + "reason": "技术面重评: 止损361.42→362.04, 止盈403.76→404.32 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.55 弱撑:371.73 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损362.04 | 目标404.32 | 买入区371.73~381.36 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损362.34 | 目标404.59 | 买入区372.27~381.64 | 信号:持有", + "reason": "技术面重评: 止损362.04→362.34, 止盈404.32→404.59 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.83 弱撑:372.27 弱压:393.27 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损362.34 | 目标404.59 | 买入区372.27~381.64 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.84 | 目标405.04 | 买入区373.23~382.11 | 信号:持有", + "reason": "技术面重评: 止损362.34→362.84, 止盈404.59→405.04 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:342.3 弱撑:373.23 弱压:394.23 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.84 | 目标405.04 | 买入区373.23~382.11 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.43 | 目标405.58 | 买入区374.33~382.67 | 信号:持有", + "reason": "技术面重评: 止损362.84→363.43, 止盈405.04→405.58 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:342.86 弱撑:374.33 弱压:395.33 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.43 | 目标405.58 | 买入区374.33~382.67 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损364.31 | 目标406.38 | 买入区376.0~383.5 | 信号:持有", + "reason": "技术面重评: 止损363.43→364.31, 止盈405.58→406.38 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:343.69 弱撑:376.0 弱压:397.0 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损364.31 | 目标406.38 | 买入区376.0~383.5 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.96 | 目标406.06 | 买入区375.33~383.17 | 信号:持有", + "reason": "技术面重评: 止损364.31→363.96, 止盈406.38→406.06 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:343.36 弱撑:375.33 弱压:396.33 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.96 | 目标406.06 | 买入区375.33~383.17 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.9 | 目标406.0 | 买入区375.22~383.11 | 信号:持有", + "reason": "技术面重评: 止损363.96→363.9, 止盈406.06→406.0 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:343.3 弱撑:375.22 弱压:396.22 强压:4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损363.9 | 目标406.0 | 买入区375.22~383.11 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损371.8 | 目标406.56 | 买入区376.37~383.69 | 信号:持有", + "reason": "技术面重评: 止损363.9→371.8, 止盈406.0→406.56 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:343.88 弱撑:376.37 弱压:397.37 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损371.8 | 目标406.56 | 买入区376.37~383.69 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.49 | 目标405.4 | 买入区373.97~382.48 | 信号:持有", + "reason": "技术面重评: 止损371.8→370.49, 止盈406.56→405.4 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:342.67 弱撑:373.97 弱压:394.97 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.49 | 目标405.4 | 买入区373.97~382.48 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.56 | 目标405.46 | 买入区374.07~382.54 | 信号:持有", + "reason": "技术面重评: 止损370.49→370.56, 止盈405.4→405.46 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:342.73 弱撑:374.07 弱压:395.07 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.56 | 目标405.46 | 买入区374.07~382.54 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.73 | 目标405.61 | 买入区374.4~382.7 | 信号:持有", + "reason": "技术面重评: 止损370.56→370.73, 止盈405.46→405.61 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:342.89 弱撑:374.4 弱压:395.4 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损370.73 | 目标405.61 | 买入区374.4~382.7 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损368.77 | 目标403.87 | 买入区370.77~380.89 | 信号:持有", + "reason": "技术面重评: 止损370.73→368.77, 止盈405.61→403.87 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.08 弱撑:370.77 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损368.77 | 目标403.87 | 买入区370.77~380.89 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损369.4 | 目标404.43 | 买入区371.93~381.47 | 信号:持有", + "reason": "技术面重评: 止损368.77→369.4, 止盈403.87→404.43 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.66 弱撑:371.93 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损369.4 | 目标404.43 | 买入区371.93~381.47 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.23 | 目标404.5 | 买入区372.08~381.54 | 信号:持有", + "reason": "技术面重评: 止损369.4→362.23, 止盈404.43→404.5 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.73 弱撑:372.08 弱压:393.08 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.23 | 目标404.5 | 买入区372.08~381.54 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.05 | 目标404.33 | 买入区371.73~381.37 | 信号:持有", + "reason": "技术面重评: 止损362.23→362.05, 止盈404.5→404.33 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.56 弱撑:371.73 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.05 | 目标404.33 | 买入区371.73~381.37 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.81 | 目标404.11 | 买入区371.27~381.14 | 信号:持有", + "reason": "技术面重评: 止损362.05→361.81, 止盈404.33→404.11 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.33 弱撑:371.27 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.81 | 目标404.11 | 买入区371.27~381.14 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.38 | 目标403.72 | 买入区370.47~380.73 | 信号:持有", + "reason": "技术面重评: 止损361.81→361.38, 止盈404.11→403.72 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:340.92 弱撑:370.47 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.38 | 目标403.72 | 买入区370.47~380.73 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.79 | 目标404.09 | 买入区371.24~381.12 | 信号:持有", + "reason": "技术面重评: 止损361.38→361.79, 止盈403.72→404.09 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.31 弱撑:371.24 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.79 | 目标404.09 | 买入区371.24~381.12 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.34 | 目标403.69 | 买入区370.41~380.7 | 信号:持有", + "reason": "技术面重评: 止损361.79→361.34, 止盈404.09→403.69 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:340.89 弱撑:370.41 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损361.34 | 目标403.69 | 买入区370.41~380.7 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.79 | 目标404.09 | 买入区371.25~381.12 | 信号:持有", + "reason": "技术面重评: 止损361.34→361.79, 止盈403.69→404.09 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:341.31 弱撑:371.25 弱压:393.01 强压:42", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损361.79 | 目标404.09 | 买入区371.25~381.12 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.36 | 目标404.61 | 买入区372.32~381.66 | 信号:持有", + "reason": "技术面重评: 止损361.79→362.36, 止盈404.09→404.61 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.85 弱撑:372.32 弱压:393.32 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:57", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.36 | 目标404.61 | 买入区372.32~381.66 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.33 | 目标404.58 | 买入区372.27~381.63 | 信号:持有", + "reason": "技术面重评: 止损362.36→362.33, 止盈404.61→404.58 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.82 弱撑:372.27 弱压:393.27 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.33 | 目标404.58 | 买入区372.27~381.63 | 信号:持有", + "new_action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.31 | 目标404.56 | 买入区372.23~381.61 | 信号:持有", + "reason": "技术面重评: 止损362.33→362.31, 止盈404.58→404.56 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.8 弱撑:372.23 弱压:393.23 强压:4", + "trigger": "技术面重评" + } + ] + }, + { + "code": "301308", + "name": "江波龙", + "price": 667.84, + "cost": 0, + "shares": 0, + "avg_price": 0, + "action": "盈利持有 | 目标786.56 | 止损631.16 | 买入区654.48~681.2", + "stop_loss": 631.16, + "entry_low": 654.48, + "entry_high": 681.2, + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:594.48 弱撑:631.16 弱压:727.2 强压:786.56 | MA5=695.3 MA10=645.81 MA20=584.25 MA60=496.25", + "timing_signal": "信号不充分", + "rr_ratio": 3.24, + "status": "updated", + "note": "", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", + "type": "自选策略", + "source": "auto", + "sector_context": "", + "stock_category": "中短线", + "position_advice": "中等仓位", + "time_horizon": "2~6周", + "trigger": { + "stop_loss": 631.16, + "entry_zone": "654.48~681.2", + "take_profit_zone": "0~786.56" + }, + "created_at": "2026-07-01 13:19", + "last_reassessed_price": 665.17, + "take_profit": 786.56, + "updated_reason": "技术面重评: 策略文字调整", + "changelog": [ + { + "date": "2026-07-01 13:19", + "old_action": "", + "new_action": "盈利持有 | 目标780.51 | 止损661.37 | 买入区674.42~701.94", + "reason": "初始策略创建 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:630.75 弱撑:661.37 弱压:736.25 ", + "trigger": "初始创建" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标780.51 | 止损661.37 | 买入区674.42~701.94", + "new_action": "盈利持有 | 目标782.16 | 止损664.69 | 买入区677.98~705.66", + "reason": "技术面重评: 止损661.37→664.69 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:632.4 弱撑:664.69 弱压:739.57 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标782.16 | 止损664.69 | 买入区677.98~705.66", + "new_action": "盈利持有 | 目标779.62 | 止损659.61 | 买入区676.2~703.8", + "reason": "技术面重评: 止损664.69→659.61 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:629.86 弱撑:659.61 弱压:734.49 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标778.72 | 止损657.79 | 买入区672.9~700.36", + "new_action": "盈利持有 | 目标780.06 | 止损636.48 | 买入区653.97~680.67", + "reason": "技术面重评: 止损657.79→636.48 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:606.3 弱撑:636.48 弱压:723.36 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标780.06 | 止损636.48 | 买入区653.97~680.67", + "new_action": "盈利持有 | 目标783.51 | 止损643.37 | 买入区663.46~690.54", + "reason": "技术面重评: 止损636.48→643.37 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:609.75 弱撑:643.37 弱压:730.25 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标784.03 | 止损644.43 | 买入区665.01~692.15", + "new_action": "盈利持有 | 目标785.51 | 止损647.37 | 买入区666.69~693.91", + "reason": "技术面重评: 止损644.43→647.37 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:611.75 弱撑:647.37 弱压:734.25 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标785.51 | 止损647.37 | 买入区666.69~693.91", + "new_action": "盈利持有 | 目标784.44 | 止损645.24 | 买入区665.03~692.17", + "reason": "技术面重评: 止损647.37→645.24 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:610.68 弱撑:645.24 弱压:732.12 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标784.44 | 止损645.24 | 买入区665.03~692.17", + "new_action": "盈利持有 | 目标781.51 | 止损639.37 | 买入区658.94~685.84", + "reason": "技术面重评: 止损645.24→639.37 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:607.75 弱撑:639.37 弱压:726.25 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标781.51 | 止损639.37 | 买入区658.94~685.84", + "new_action": "盈利持有 | 目标780.56 | 止损637.48 | 买入区654.37~681.07", + "reason": "技术面重评: 止损639.37→637.48 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:606.8 弱撑:637.48 弱压:724.36 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | 目标780.56 | 止损637.48 | 买入区654.37~681.07", + "new_action": "盈利持有 | 目标781.91 | 止损640.17 | 买入区657.58~684.42", + "reason": "技术面重评: 止损637.48→640.17 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:608.15 弱撑:640.17 弱压:727.05 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:24", + "old_action": "盈利持有 | 目标781.91 | 止损640.17 | 买入区657.58~684.42", + "new_action": "盈利持有 | 目标780.74 | 止损637.84 | 买入区656.21~682.99", + "reason": "技术面重评: 止损640.17→637.84 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:606.98 弱撑:637.84 弱压:724.72 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标779.56 | 止损635.49 | 买入区651.87~678.47", + "new_action": "盈利持有 | 目标780.38 | 止损637.13 | 买入区653.29~679.95", + "reason": "技术面重评: 止损635.49→637.13 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:606.62 弱撑:637.13 弱压:724.01 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标780.38 | 止损637.13 | 买入区653.29~679.95", + "new_action": "盈利持有 | 目标786.95 | 止损631.94 | 买入区657.57~684.41", + "reason": "技术面重评: 止损637.13→631.94 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:594.87 弱撑:631.94 弱压:727.98 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "盈利持有 | 目标786.95 | 止损631.94 | 买入区657.57~684.41", + "new_action": "盈利持有 | 目标786.56 | 止损631.16 | 买入区654.6~681.32", + "reason": "技术面重评: 止损631.94→631.16 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:594.48 弱撑:631.16 弱压:727.2 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | 目标786.56 | 止损631.16 | 买入区654.6~681.32", + "new_action": "盈利持有 | 目标786.56 | 止损631.16 | 买入区654.48~681.2", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "518880", "name": "黄金ETF华安", - "price": 8.241, + "price": 8.271, "cost": 12.19, "shares": 2400, "avg_price": 12.19, - "action": "深套持有 | 深套持有 | 止损7.12 | 目标8.12 | 买入区7.42~8.65 | 信号:持有", - "stop_loss": 7.12, - "entry_low": 7.42, - "entry_high": 8.65, - "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:7.6 弱撑:8.22 弱压:8.45 强压:8.91 | MA5=9.49 MA10=9.51 MA20=9.79 MA60=10.33", + "action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.44~8.68 | 信号:持有", + "stop_loss": 7.45, + "entry_low": 7.44, + "entry_high": 8.68, + "tech_snapshot": "形态:小阴线/bearish 量价:数据不足 强撑:7.61 弱撑:8.25 弱压:8.38 强压:8.94 | MA5=9.47 MA10=9.53 MA20=9.86 MA60=10.33", "timing_signal": "持有", "rr_ratio": 0.54, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业贵金属下跌-2.9%,适度防御", + "sector_context": "行业贵金属+0.1%,中性", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 7.12, - "entry_zone": "7.42~8.65", - "take_profit_zone": "0~8.12" + "stop_loss": 7.45, + "entry_zone": "7.44~8.68", + "take_profit_zone": "0~8.58" }, "created_at": "2026-06-19 11:24", "last_reassessed_price": 8.39, - "take_profit": 8.12, - "updated_reason": "技术面重评: 止损6.76→7.12, 止盈7.69→8.12 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.6 弱撑:8.22 弱压:8.45 强压:8.91 | MA", + "take_profit": 8.58, + "updated_reason": "技术面重评: 策略文字调整", "changelog": [ { "date": "2026-06-19 11:24", @@ -45117,27 +47801,258 @@ "new_action": "深套持有 | 深套持有 | 止损7.12 | 目标8.12 | 买入区7.42~8.65 | 信号:持有", "reason": "技术面重评: 止损6.76→7.12, 止盈7.69→8.12 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.6 弱撑:8.22 弱压:8.45 强压:8.91 | MA", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损7.12 | 目标8.12 | 买入区7.42~8.65 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.25 | 目标8.05 | 买入区7.54~8.8 | 信号:持有", + "reason": "技术面重评: 止损7.12→7.25, 止盈8.12→8.05 | 形态:光头光脚阳线/neutral 量价:数据不足 强撑:7.84 弱撑:8.27 弱压:8.45 强压:8.82 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "深套持有 | 深套持有 | 止损7.25 | 目标8.05 | 买入区7.54~8.8 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.25 | 目标0 | 买入区7.54~8.8 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "深套持有 | 深套持有 | 止损7.25 | 目标0 | 买入区7.54~8.8 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.25 | 目标0 | 买入区7.54~8.79 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "深套持有 | 深套持有 | 止损7.25 | 目标0 | 买入区7.54~8.79 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "reason": "技术面重评: 止损7.25→7.46 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.45, 止盈8.35→8.58 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.62 弱撑:8.26 弱压:8.38 强压:8.94 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止盈8.58→8.34 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止盈8.34→8.58 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.62 弱撑:8.26 弱压:8.38 强压:8.94 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.45→7.46, 止盈8.58→8.35 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.45, 止盈8.35→8.58 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.62 弱撑:8.26 弱压:8.38 强压:8.94 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止盈8.58→8.35 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.35 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.45→7.46, 止盈8.35→8.34 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.26 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.45 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止盈8.34→8.58 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.62 弱撑:8.26 弱压:8.38 强压:8.94 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.44~8.68 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.44~8.68 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损6.86 | 目标7.51 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.45→6.86, 止盈8.58→7.51 | 形态:十字星/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | MA5=", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "深套持有 | 深套持有 | 止损6.86 | 目标7.51 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.47 | 目标8.35 | 买入区7.46~8.71 | 信号:持有", + "reason": "技术面重评: 止损6.86→7.47, 止盈7.51→8.35 | 形态:锤子线/T字线/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "深套持有 | 深套持有 | 止损7.47 | 目标8.35 | 买入区7.46~8.71 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "reason": "技术面重评: 止损7.47→7.46 | 形态:锤子线/T字线/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.47 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.47 | 形态:锤子线/T字线/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "深套持有 | 深套持有 | 止损7.47 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "reason": "技术面重评: 止损7.47→7.46 | 形态:锤子线/T字线/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.35 | 买入区7.46~8.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.62 | 目标8.35 | 买入区7.46~8.71 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.62 | 形态:锤子线/T字线/neutral 量价:数据不足 强撑:7.87 弱撑:8.27 弱压:8.38 强压:8.7 | ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "深套持有 | 深套持有 | 止损7.62 | 目标8.35 | 买入区7.46~8.71 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.6 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.62→7.6, 止盈8.35→8.34 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.26 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "深套持有 | 深套持有 | 止损7.6 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.6→7.46 | 形态:长影星线/neutral 量价:数据不足 强撑:7.87 弱撑:8.26 弱压:8.38 强压:8.69 | MA", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.45 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.26 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.45→7.46 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:7.87 弱撑:8.26 弱压:8.38 强压:8.69 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "深套持有 | 深套持有 | 止损7.46 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "reason": "技术面重评: 止损7.46→7.45, 止盈8.34→8.57 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.61 弱撑:8.24 弱压:8.38 强压:8.93 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "reason": "技术面重评: 止损7.45→7.44 | 形态:带上影阴线/bearish 量价:数据不足 强撑:7.61 弱撑:8.24 弱压:8.38 强压:8.93 | M", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.43~8.67 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.43~8.67 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.44~8.68 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.43~8.67 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "深套持有 | 深套持有 | 止损7.44 | 目标8.57 | 买入区7.43~8.67 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止损7.44→7.45, 止盈8.57→8.34 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:7.86 弱撑:8.25 弱压:8.38 强压:8.69 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.34 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "reason": "技术面重评: 止盈8.34→8.58 | 形态:锤子线/T字线/bullish 量价:数据不足 强撑:7.61 弱撑:8.25 弱压:8.38 强压:8.94 |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.45~8.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.44~8.68 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "600519", "name": "贵州茅台", - "price": 1179.45, + "price": 1193.01, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1246.52 | 止损1144.07 | 买入区1155.86~1185.05 | 信号:关注", - "stop_loss": 1144.07, - "entry_low": 1155.86, - "entry_high": 1185.05, - "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1118.54 弱撑:1171.47 弱压:1194.96 强压:1246.52 | MA5=1371.42 MA10=1382.57 MA20=1366.31 MA60=1396.39", + "action": "盈利持有 | 目标1277.36 | 止损1157.22 | 买入区1169.15~1205.28 | 信号:关注", + "stop_loss": 1157.22, + "entry_low": 1169.15, + "entry_high": 1205.28, + "tech_snapshot": "形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.4 弱撑:1173.96 弱压:1204.43 强压:1277.36 | MA5=1373.78 MA10=1383.48 MA20=1362.71 MA60=1396.98", "timing_signal": "关注", - "rr_ratio": 1.9, + "rr_ratio": 2.36, "status": "updated", - "note": "⚠️盈亏比偏低(1:1.9),谨慎买入", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "自选策略", "source": "auto", "sector_context": "", @@ -45145,14 +48060,14 @@ "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 1144.07, - "entry_zone": "1155.86~1185.05", - "take_profit_zone": "0~1246.52" + "stop_loss": 1157.22, + "entry_zone": "1169.15~1205.28", + "take_profit_zone": "0~1277.36" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 1179.84, - "take_profit": 1246.52, - "updated_reason": "技术面重评: 止损1144.57→1144.07 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1118.54 弱撑:1171.47 弱压:1194.96 ", + "last_reassessed_price": 1192.33, + "take_profit": 1277.36, + "updated_reason": "技术面重评: 止损1157.96→1157.22 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.4 弱撑:1173.96 弱压:1204.43 强", "changelog": [ { "date": "2026-06-24 14:24", @@ -46896,1882 +49811,571 @@ "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1246.52 | 止损1144.07 | 买入区1155.86~1185.05 | 信号:关注", "reason": "技术面重评: 止损1144.57→1144.07 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1118.54 弱撑:1171.47 弱压:1194.96 ", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1246.52 | 止损1144.07 | 买入区1155.86~1185.05 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1249.71 | 止损1149.93 | 买入区1161.78~1189.84 | 信号:关注", + "reason": "技术面重评: 止损1144.07→1149.93 | 形态:长影星线/neutral 量价:主动买盘占优 强撑:1121.73 弱撑:1175.77 弱压:1195.44 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1249.71 | 止损1149.93 | 买入区1161.78~1189.84 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损1132.9 | 买入区1156.5~1203.7", + "reason": "技术信号变化: 信号不充分: 止损1149.93→1132.9 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损1132.9 | 买入区1156.5~1203.7", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损1132.91 | 买入区1156.51~1203.71", + "reason": "技术面重评: 止损1132.9→1132.91 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损1132.91 | 买入区1156.51~1203.71", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1246.09 | 止损1147.5 | 买入区1159.33~1186.94 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损1132.91→1147.5 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1118.11 弱撑:1179.2 弱压:1186.7 强压", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1246.09 | 止损1147.5 | 买入区1159.33~1186.94 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1244.18 | 止损1145.3 | 买入区1157.11~1184.85 | 信号:关注", + "reason": "技术信号变化: 关注: 止损1147.5→1145.3 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1116.2 弱撑:1175.37 弱压:1185.4", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1244.18 | 止损1145.3 | 买入区1157.11~1184.85 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1244.32 | 止损1142.76 | 买入区1154.54~1183.38 | 信号:关注", + "reason": "技术面重评: 止损1145.3→1142.76 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:1116.34 弱撑:1175.67 弱压:1185.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1244.32 | 止损1142.76 | 买入区1154.54~1183.38 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1241.64 | 止损1140.56 | 买入区1152.31~1180.99 | 信号:关注", + "reason": "技术面重评: 止损1142.76→1140.56 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1113.66 弱撑:1170.31 弱压:1185.49 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1241.64 | 止损1140.56 | 买入区1152.31~1180.99 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1239.02 | 止损1134.89 | 买入区1146.59~1176.54 | 信号:关注", + "reason": "技术面重评: 止损1140.56→1134.89 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1111.04 弱撑:1165.06 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1239.02 | 止损1134.89 | 买入区1146.59~1176.54 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.37 | 止损1134.88 | 买入区1146.58~1176.28 | 信号:关注", + "reason": "技术面重评: 止损1134.89→1134.88 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1110.39 弱撑:1163.76 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.37 | 止损1134.88 | 买入区1146.58~1176.28 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1238.75 | 止损1134.15 | 买入区1145.85~1175.99 | 信号:关注", + "reason": "技术面重评: 止损1134.88→1134.15 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1110.77 弱撑:1164.52 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1238.75 | 止损1134.15 | 买入区1145.85~1175.99 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1239.29 | 止损1137.41 | 买入区1149.14~1178.16 | 信号:关注", + "reason": "技术面重评: 止损1134.15→1137.41 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1111.31 弱撑:1165.59 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1239.29 | 止损1137.41 | 买入区1149.14~1178.16 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1239.54 | 止损1137.97 | 买入区1149.7~1178.6 | 信号:关注", + "reason": "技术面重评: 止损1137.41→1137.97 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:1111.56 弱撑:1166.1 弱压:1185.49 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1239.54 | 止损1137.97 | 买入区1149.7~1178.6 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.91 | 止损1137.95 | 买入区1149.68~1178.33 | 信号:关注", + "reason": "技术面重评: 止损1137.97→1137.95 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1110.93 弱撑:1164.84 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.91 | 止损1137.95 | 买入区1149.68~1178.33 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1237.6 | 止损1133.33 | 买入区1145.01~1175.04 | 信号:关注", + "reason": "技术面重评: 止损1137.95→1133.33 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1109.62 弱撑:1162.23 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1237.6 | 止损1133.33 | 买入区1145.01~1175.04 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1238.33 | 止损1133.54 | 买入区1145.23~1175.46 | 信号:关注", + "reason": "技术面重评: 止损1133.33→1133.54 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:1110.35 弱撑:1163.68 弱压:1185.49", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1238.33 | 止损1133.54 | 买入区1145.23~1175.46 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.45 | 止损1137.67 | 买入区1149.4~1177.98 | 信号:关注", + "reason": "技术面重评: 止损1133.54→1137.67 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:1110.47 弱撑:1163.93 弱压:1185.49 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1238.45 | 止损1137.67 | 买入区1149.4~1177.98 | 信号:关注", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标1241.99 | 止损1146.12 | 买入区1157.94~1184.47 | 信号:弱势持有", + "reason": "技术信号变化: 弱势持有: 止损1137.67→1146.12 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1114.01 弱撑:1171.0 弱压:1189.67", + "trigger": "技术信号变化: 弱势持有" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标1241.99 | 止损1146.12 | 买入区1157.94~1184.47 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标1242.76 | 止损1148.48 | 买入区1160.32~1186.19 | 信号:弱势持有", + "reason": "技术面重评: 止损1146.12→1148.48 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1114.78 弱撑:1172.53 弱压:1191.2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标1242.76 | 止损1148.48 | 买入区1160.32~1186.19 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1252.7 | 止损1152.31 | 买入区1164.19~1192.47 | 信号:弱势持有", + "reason": "技术面重评: 止损1148.48→1152.31 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1110.15 弱撑:1172.86 弱压:1196.52 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1252.7 | 止损1152.31 | 买入区1164.19~1192.47 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1253.51 | 止损1151.4 | 买入区1163.27~1192.24 | 信号:弱势持有", + "reason": "技术面重评: 止损1152.31→1151.4 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1110.71 弱撑:1174.21 弱压:1197.88 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1253.51 | 止损1151.4 | 买入区1163.27~1192.24 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1260.13 | 止损1155.48 | 买入区1167.4~1197.34 | 信号:弱势持有", + "reason": "技术面重评: 止损1151.4→1155.48 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1105.83 弱撑:1173.96 弱压:1199.62 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1260.13 | 止损1155.48 | 买入区1167.4~1197.34 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1259.52 | 止损1154.63 | 买入区1166.53~1196.59 | 信号:弱势持有", + "reason": "技术面重评: 止损1155.48→1154.63 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1105.41 弱撑:1172.94 弱压:1198.6 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1259.52 | 止损1154.63 | 买入区1166.53~1196.59 | 信号:弱势持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1260.91 | 止损1154.67 | 买入区1166.57~1197.17 | 信号:弱势持有", + "reason": "技术面重评: 止损1154.63→1154.67 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1105.76 弱撑:1174.67 弱压:1200.34 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1260.91 | 止损1154.67 | 买入区1166.57~1197.17 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1264.22 | 止损1156.85 | 买入区1168.78~1199.8 | 信号:弱势持有", + "reason": "技术面重评: 止损1154.67→1156.85 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1103.31 弱撑:1174.53 弱压:1201.2 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | 目标1264.22 | 止损1156.85 | 买入区1168.78~1199.8 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1262.44 | 止损1153.04 | 买入区1164.93~1196.8 | 信号:弱势持有", + "reason": "技术面重评: 止损1156.85→1153.04 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1102.13 弱撑:1171.57 弱压:1198.2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利持有 | 目标1262.44 | 止损1153.04 | 买入区1164.93~1196.8 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1263.82 | 止损1155.23 | 买入区1167.14~1198.67 | 信号:弱势持有", + "reason": "技术面重评: 止损1153.04→1155.23 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1103.04 弱撑:1173.86 弱压:1200.53 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "盈利持有 | 目标1269.52 | 止损1156.56 | 买入区1168.48~1201.74 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1270.98 | 止损1155.46 | 买入区1167.38~1201.67 | 信号:弱势持有", + "reason": "技术面重评: 止损1156.56→1155.46 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1097.9 弱撑:1173.9 弱压:1202.55 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标1270.98 | 止损1155.46 | 买入区1167.38~1201.67 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1270.15 | 止损1153.28 | 买入区1165.17~1200.03 | 信号:弱势持有", + "reason": "技术面重评: 止损1155.46→1153.28 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1097.37 弱撑:1172.54 弱压:1201.19 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标1270.15 | 止损1153.28 | 买入区1165.17~1200.03 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1277.9 | 止损1160.78 | 买入区1172.75~1207.63 | 信号:弱势持有", + "reason": "技术面重评: 止损1153.28→1160.78 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.74 弱撑:1174.84 弱压:1205.31 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标1277.9 | 止损1160.78 | 买入区1172.75~1207.63 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1275.05 | 止损1153.21 | 买入区1165.1~1201.95 | 信号:弱势持有", + "reason": "技术面重评: 止损1160.78→1153.21 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1091.96 弱撑:1170.21 弱压:1200.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标1275.05 | 止损1153.21 | 买入区1165.1~1201.95 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1275.44 | 止损1151.9 | 买入区1163.78~1201.32 | 信号:弱势持有", + "reason": "技术面重评: 止损1153.21→1151.9 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1092.2 弱撑:1170.83 弱压:1201.3 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标1275.44 | 止损1151.9 | 买入区1163.78~1201.32 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1274.89 | 止损1151.11 | 买入区1162.98~1200.62 | 信号:弱势持有", + "reason": "技术面重评: 止损1151.9→1151.11 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1091.85 弱撑:1169.94 弱压:1200.4", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | 目标1274.89 | 止损1151.11 | 买入区1162.98~1200.62 | 信号:弱势持有", + "new_action": "盈利持有 | 目标1275.3 | 止损1151.05 | 买入区1162.92~1200.75 | 信号:关注", + "reason": "技术信号变化: 关注: 止损1151.11→1151.05 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1092.12 弱撑:1170.62 弱压:1201.0", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标1275.3 | 止损1151.05 | 买入区1162.92~1200.75 | 信号:关注", + "new_action": "盈利持有 | 目标1275.4 | 止损1152.46 | 买入区1164.34~1201.64 | 信号:关注", + "reason": "技术面重评: 止损1151.05→1152.46 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:1092.17 弱撑:1170.77 弱压:1201.2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标1275.4 | 止损1152.46 | 买入区1164.34~1201.64 | 信号:关注", + "new_action": "盈利持有 | 目标1276.59 | 止损1155.68 | 买入区1167.59~1204.04 | 信号:关注", + "reason": "技术面重评: 止损1152.46→1155.68 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1092.92 弱撑:1172.71 弱压:1203.18 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | 目标1276.59 | 止损1155.68 | 买入区1167.59~1204.04 | 信号:关注", + "new_action": "盈利持有 | 目标1276.72 | 止损1155.56 | 买入区1167.47~1204.02 | 信号:关注", + "reason": "技术面重评: 止损1155.68→1155.56 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.0 弱撑:1172.91 弱压:1203.38 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "盈利持有 | 目标1276.72 | 止损1155.56 | 买入区1167.47~1204.02 | 信号:关注", + "new_action": "盈利持有 | 目标1276.34 | 止损1155.22 | 买入区1167.13~1203.67 | 信号:关注", + "reason": "技术面重评: 止损1155.56→1155.22 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1092.76 弱撑:1172.3 弱压:1202.77 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标1276.34 | 止损1155.22 | 买入区1167.13~1203.67 | 信号:关注", + "new_action": "盈利持有 | 目标1277.03 | 止损1156.72 | 买入区1168.65~1204.84 | 信号:关注", + "reason": "技术面重评: 止损1155.22→1156.72 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.19 弱撑:1173.43 弱压:1203.9 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标1277.03 | 止损1156.72 | 买入区1168.65~1204.84 | 信号:关注", + "new_action": "盈利持有 | 目标1277.77 | 止损1159.0 | 买入区1170.95~1206.51 | 信号:关注", + "reason": "技术面重评: 止损1156.72→1159.0 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.65 弱撑:1174.62 弱压:1205.09 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "盈利持有 | 目标1277.77 | 止损1159.0 | 买入区1170.95~1206.51 | 信号:关注", + "new_action": "盈利持有 | 目标1277.43 | 止损1157.96 | 买入区1169.89~1205.75 | 信号:关注", + "reason": "技术面重评: 止损1159.0→1157.96 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.44 弱撑:1174.07 弱压:1204.54 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | 目标1277.43 | 止损1157.96 | 买入区1169.89~1205.75 | 信号:关注", + "new_action": "盈利持有 | 目标1277.36 | 止损1157.22 | 买入区1169.15~1205.28 | 信号:关注", + "reason": "技术面重评: 止损1157.96→1157.22 | 形态:带下影阳线/bullish 量价:主动买盘占优 强撑:1093.4 弱撑:1173.96 弱压:1204.43 强", + "trigger": "技术面重评" } ] }, { "code": "600563", "name": "法拉电子", - "price": 189.67, + "price": 182.55, "cost": 147.18, - "shares": 100, - "avg_price": 147.18, - "action": "盈利良好 | 止损183.98 | 目标206.01 | 买入区183.44~192.61 | 信号:持有", - "stop_loss": 183.98, - "entry_low": 183.44, - "entry_high": 192.61, - "tech_snapshot": "形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:183.44 弱压:195.02 强压:208.34 | MA5=181.89 MA10=174.62 MA20=165.95 MA60=142.47", + "shares": 0, + "avg_price": 0, + "action": "盈利良好 | 止损169.99 | 目标188.19 | 买入区175.29~184.05 | 信号:持有", + "stop_loss": 174.5, + "entry_low": 175.29, + "entry_high": 184.05, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.29 弱压:192.5 强压:206.35 | MA5=187.94 MA10=179.22 MA20=168.75 MA60=144.49", "timing_signal": "持有", - "rr_ratio": 3.0, + "rr_ratio": 3.28, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 21:20", "type": "持仓策略", "source": "auto", - "sector_context": "行业元件大涨+3.0%,可适度积极", + "sector_context": "行业元件下跌-1.2%,适度防御", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 183.98, - "entry_zone": "183.44~192.61", - "take_profit_zone": "0~206.01" + "stop_loss": 169.99, + "entry_zone": "175.29~184.05", + "take_profit_zone": "0~188.19" }, - "created_at": "2026-06-18 17:15", - "last_reassessed_price": 188.76, - "take_profit": 206.01, - "updated_reason": "技术面重评: 止损183.7→183.98 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:183.44 弱压:195.02 强压", + "created_at": "2026-07-01 09:56", + "take_profit": 188.19, + "updated_reason": "技术面重评: 止损169.96→169.99 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.29 弱压:192.5 强压:20", "changelog": [ { - "date": "2026-06-18 11:31", + "date": "2026-07-01 09:56", "old_action": "", - "new_action": "盈利良好 | 止损164.39 | 目标187.06 | 买入区166.77~175.11 | 信号:持有", - "reason": "初始策略创建 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:153.05 弱撑:166.77 弱压:173.78 强压", + "new_action": "盈利良好 | 止损183.95 | 目标201.48 | 买入区185.95~195.25 | 信号:持有", + "reason": "初始策略创建 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:171.72 弱撑:185.95 弱压:194.84 强压:", "trigger": "初始创建" }, { - "date": "2026-06-18 14:17", - "old_action": "盈利良好 | 止损164.39 | 目标187.06 | 买入区166.77~175.11 | 信号:持有", - "new_action": "盈利良好 | 止损163.7 | 目标187.06 | 买入区166.12~174.43 | 信号:持有", - "reason": "技术面重评: 止损164.39→163.7, 止盈187.06→189.87 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:153.05 弱撑:166.12 弱压:173.51 强压", + "date": "2026-07-01 09:59", + "old_action": "盈利良好 | 止损183.95 | 目标201.48 | 买入区185.95~195.25 | 信号:持有", + "new_action": "盈利良好 | 止损183.23 | 目标201.48 | 买入区185.23~194.49 | 信号:持有", + "reason": "技术面重评: 止损183.95→183.23 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:185.23 弱压:194.12 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-18 16:00", - "old_action": "盈利良好 | 止损163.7 | 目标187.06 | 买入区166.12~174.43 | 信号:持有", - "new_action": "盈利良好 | 止损163.14 | 目标187.06 | 买入区165.51~173.79 | 信号:持有", - "reason": "技术面重评: 止损163.7→163.14 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:153.05 弱撑:165.51 弱压:173.13 强压", + "date": "2026-07-01 10:01", + "old_action": "盈利良好 | 止损183.23 | 目标201.48 | 买入区185.23~194.49 | 信号:持有", + "new_action": "盈利良好 | 止损183.82 | 目标201.48 | 买入区186.65~195.98 | 信号:持有", + "reason": "技术面重评: 止损183.23→183.82 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:171.72 弱撑:186.65 弱压:195.54 强压:", "trigger": "技术面重评" }, { - "date": "2026-06-18 23:35", - "old_action": "盈利良好 | 止损163.14 | 目标187.06 | 买入区165.51~173.79 | 信号:持有", - "new_action": "盈利良好 | 止损151.92 | 目标180.38 | 买入区165.51~173.79 | 信号:持有", - "reason": "技术面重评: 策略文字调整", + "date": "2026-07-01 10:03", + "old_action": "盈利良好 | 止损183.82 | 目标201.48 | 买入区186.65~195.98 | 信号:持有", + "new_action": "盈利良好 | 止损185.91 | 目标201.48 | 买入区185.8~195.09 | 信号:持有", + "reason": "技术面重评: 止损183.82→185.91 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:171.72 弱撑:185.8 弱压:194.69 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-19 11:24", - "old_action": "盈利良好 | 止损151.92 | 目标180.38 | 买入区165.51~173.79 | 信号:持有", - "new_action": "盈利良好 | 止损163.14 | 目标192.67 | 买入区165.51~173.79 | 信号:持有", - "reason": "技术面重评: 止损151.92→163.14, 止盈180.38→192.67 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:153.05 弱撑:165.51 弱压:173.13 强压", + "date": "2026-07-01 10:05", + "old_action": "盈利良好 | 止损185.91 | 目标201.48 | 买入区185.8~195.09 | 信号:持有", + "new_action": "盈利良好 | 止损184.16 | 目标201.48 | 买入区185.47~194.74 | 信号:持有", + "reason": "技术面重评: 止损185.91→184.16 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:185.47 弱压:194.36 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-19 15:37", - "old_action": "盈利良好 | 止损163.14 | 目标192.67 | 买入区165.51~173.79 | 信号:持有", - "new_action": "盈利良好 | 止损161.41 | 目标192.67 | 买入区165.51~173.79 | 信号:持有", - "reason": "技术面重评: 止损163.14→161.41 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:153.05 弱撑:165.51 弱压:173.13 强压", + "date": "2026-07-01 10:09", + "old_action": "盈利良好 | 止损184.16 | 目标201.48 | 买入区185.47~194.74 | 信号:持有", + "new_action": "盈利良好 | 止损183.37 | 目标201.48 | 买入区184.81~194.05 | 信号:持有", + "reason": "技术面重评: 止损184.16→183.37 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:184.81 弱压:193.7 强压:209", "trigger": "技术面重评" }, { - "date": "2026-06-22 12:01", - "old_action": "盈利良好 | 止损161.41 | 目标192.67 | 买入区165.51~173.79 | 信号:持有", - "new_action": "盈利良好 | 止损153.13 | 目标175.76 | 买入区166.06~174.36 | 信号:持有", - "reason": "技术面重评: 止损161.41→153.13, 止盈192.67→175.76 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:151.37 弱撑:166.06 弱压:175.12 强压", + "date": "2026-07-01 10:30", + "old_action": "盈利良好 | 止损183.37 | 目标201.48 | 买入区184.81~194.05 | 信号:持有", + "new_action": "盈利良好 | 止损179.76 | 目标207.51 | 买入区182.31~191.43 | 信号:持有", + "reason": "技术面重评: 止损183.37→179.76, 止盈201.48→207.51 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:182.31 弱压:192.51 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-23 09:01", - "old_action": "盈利良好 | 止损153.13 | 目标175.76 | 买入区166.06~174.36 | 信号:持有", - "new_action": "盈利良好 | 止损167.75 | 目标185.01 | 买入区167.88~176.27 | 信号:持有", - "reason": "技术信号变化: 大盘中性,行业中性,持有: 止损153.13→167.75, 止盈175.76→185.01 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:151.37 弱撑:167.88 弱压:177.63 强压", - "trigger": "技术信号变化: 大盘中性,行业中性,持有" - }, - { - "date": "2026-06-23 12:01", - "old_action": "盈利良好 | 止损167.75 | 目标190.23 | 买入区162.07~170.17 | 信号:持有", - "new_action": "盈利良好 | 止损147.72 | 目标171.21 | 买入区160.56~168.59 | 信号:持有", - "reason": "技术面重评: 止损167.75→147.72, 止盈190.23→171.21 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:155.65 弱撑:160.56 弱压:172.94 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 09:01", - "old_action": "盈利良好 | 止损147.72 | 目标171.21 | 买入区160.56~168.59 | 信号:持有", - "new_action": "盈利持有 | 止损145.02 | 目标164.36 | 买入区158.07~165.97 | 信号:持有", - "reason": "技术面重评: 止损147.72→145.02, 止盈171.21→164.36 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:155.65 弱撑:158.07 弱压:172.94 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 11:06", - "old_action": "盈利持有 | 止损145.02 | 目标164.36 | 买入区158.07~165.97 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损167.87 | 目标184.12 | 买入区162.51~170.64 | 信号:持有", - "reason": "价格变动(162.51→173.49): 止损145.02→167.87, 止盈164.36→184.12 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:146.26 弱撑:162.51 弱压:181.32 强压:1", - "trigger": "价格变动(162.51→173.49)" - }, - { - "date": "2026-06-24 11:17", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.6),不建议加仓 | 止损167.87 | 目标184.12 | 买入区162.51~170.64 | 信号:持有", - "new_action": "盈利良好 | 止损172.96 | 目标216.73 | 买入区162.51~170.64 | 信号:持有", - "reason": "技术面重评: 止损167.87→172.96, 止盈184.12→216.73 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:146.26 弱撑:162.51 弱压:184.36 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 12:00", - "old_action": "盈利良好 | 止损172.96 | 目标216.73 | 买入区162.51~170.64 | 信号:持有", - "new_action": "盈利良好 | 止损168.02 | 目标210.42 | 买入区162.51~170.64 | 信号:持有", - "reason": "技术面重评: 止损172.96→168.02, 止盈216.73→210.42 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:146.26 弱撑:162.51 弱压:184.36 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 13:17", - "old_action": "盈利良好 | 止损168.02 | 目标210.42 | 买入区162.51~170.64 | 信号:持有", - "new_action": "盈利良好 | 止损168.02 | 目标213.58 | 买入区162.51~170.64 | 信号:持有", - "reason": "技术面重评: 止盈210.42→213.58 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:146.26 弱撑:162.51 弱压:184.36 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 14:15", - "old_action": "盈利良好 | 止损168.02 | 目标213.58 | 买入区162.51~170.64 | 信号:持有", - "new_action": "盈利良好 | 止损172.96 | 目标219.99 | 买入区162.51~170.64 | 信号:持有", - "reason": "技术面重评: 止损168.02→172.96, 止盈213.58→219.99 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:146.26 弱撑:162.51 弱压:184.36 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:17", - "old_action": "盈利良好 | 止损172.96 | 目标219.99 | 买入区162.51~170.64 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损164.73 | 目标0 | 买入区160.88~187.7 | 信号:持有", - "reason": "技术面重评: 止损172.96→164.73 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损164.73 | 目标0 | 买入区160.88~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损173.24 | 目标0 | 买入区169.2~197.4 | 信号:持有", - "reason": "价格变动(178.76→188.0): 止损164.73→173.24 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "价格变动(178.76→188.0)" - }, - { - "date": "2026-06-25 09:33", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损173.24 | 目标0 | 买入区169.2~197.4 | 信号:持有", - "new_action": "盈利良好 | 止损158.95 | 目标179.63 | 买入区178.17~187.08 | 信号:持有", - "reason": "价格变动(188.0→180.83): 止损173.24→158.95 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:160.88 弱撑:178.17 弱压:185.53 强压", - "trigger": "价格变动(188.0→180.83)" - }, - { - "date": "2026-06-25 09:35", - "old_action": "盈利良好 | 止损158.95 | 目标179.63 | 买入区178.17~187.08 | 信号:持有", - "new_action": "盈利良好 | 止损159.07 | 目标179.63 | 买入区178.25~187.16 | 信号:持有", - "reason": "技术面重评: 止损158.95→159.07 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:160.88 弱撑:178.25 弱压:186.48 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:36", - "old_action": "盈利良好 | 止损159.07 | 目标179.63 | 买入区178.25~187.16 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损159.53 | 目标179.63 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损159.07→159.53 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:189.58 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:39", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损159.53 | 目标179.63 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损159.53 | 目标179.63 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:43", - "old_action": "盈利良好 | 止损159.53 | 目标179.63 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损180.52 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损159.53→180.52, 止盈179.63→205.58 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:189.4 强压:196", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:47", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损180.52 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.36 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损180.52→181.36 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:189.72 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:49", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.36 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损179.75 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.36→179.75 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:189.0 强压:196", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:51", - "old_action": "盈利良好 | 止损179.75 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损179.04 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损179.75→179.04 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:188.01 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:52", - "old_action": "盈利良好 | 止损179.04 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损179.76 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损179.04→179.76 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:188.62 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:54", - "old_action": "盈利良好 | 止损179.76 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损178.83 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损179.76→178.83 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:187.81 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:02", - "old_action": "盈利良好 | 止损178.83 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.37 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损178.83→181.37 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:190.84 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:04", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.37 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.66 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.37→181.66 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.3 强压:196", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:07", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.66 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损181.89 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.66→181.89 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.29 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:08", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损181.89 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.06 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.89→182.06 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.18 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:11", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.06 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.06→182.07 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.52 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:17", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.39 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.07→177.39, 止盈205.58→199.59 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.22 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:18", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.39 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.39→176.87 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.29 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:21", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:23", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:25", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:27", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:31", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损177.17 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损176.87→177.17 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.17 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:37", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损177.17 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.17→176.87 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.56 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:41", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:43", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:45", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:49", - "old_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:52", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:54", - "old_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:56", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:12", - "old_action": "盈利良好 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损180.27 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损176.87→180.27, 止盈199.59→205.58 | 形态:小阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:190.34 强压:196.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:16", - "old_action": "盈利良好 | 止损180.27 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损180.87 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损180.27→180.87 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:190.72 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:18", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损180.87 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损180.9 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损180.87→180.9 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:190.88 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:21", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损180.9 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.3 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损180.9→181.3 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.42 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:23", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.3 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.76 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.3→181.76 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.54 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:25", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.76 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.03 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.76→182.03 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.63 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:26", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.03 | 目标205.58 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.03→176.87, 止盈205.58→199.59 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.26 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:29", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:31", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 12:07", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标199.59 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止盈199.59→202.54 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.06 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:01", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:03", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损181.95 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损176.87→181.95, 止盈202.54→208.62 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.58 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:05", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损181.95 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.95→182.07 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.86 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:07", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.16 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.07→181.16 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.03 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:09", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.16 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | 止损180.22 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.16→180.22 | 形态:小阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:190.57 强压:196.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:11", - "old_action": "盈利良好 | 止损180.22 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.48 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损180.22→181.48 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.12 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:17", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损181.48 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.19 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.48→181.19 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.47 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:19", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损181.19 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.02 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损181.19→182.02 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.86 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:21", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.02 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.02→182.07 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.73 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:25", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.07→176.87, 止盈208.62→202.54 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.66 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:29", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.51 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损176.87→177.51 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.34 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:31", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.51 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.31 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.51→177.31 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.34 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:35", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.31 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.38 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.31→177.38 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.2 强压:196", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:38", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.38 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.94 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.38→182.94, 止盈202.54→208.62 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.66 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:40", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.94 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.78 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.94→182.78 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.54 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:46", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.78 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.78→182.07 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.66 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:49", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:53", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损182.07 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.35 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.07→177.35, 止盈208.62→202.54 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.53 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:57", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.35 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.35→176.87 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:191.54 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:03", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:05", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损176.87 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损177.2 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损176.87→177.2 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.53 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:07", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损177.2 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.92 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.2→182.92, 止盈202.54→208.62 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.37 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:08", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.92 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.65 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.92→182.65 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.53 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:10", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.65 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.94 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.65→182.94 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:192.71 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:12", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损182.94 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损183.56 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损182.94→183.56 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:193.65 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:17", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损183.56 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损183.21 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损183.56→183.21 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:193.38 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:25", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损183.21 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.98 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损183.21→177.98, 止盈208.62→202.54 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:193.36 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:44", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损177.98 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损178.37 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损177.98→178.37 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:194.65 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 16:17", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损178.37 | 目标202.54 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损183.88 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "reason": "技术面重评: 止损178.37→183.88, 止盈202.54→208.62 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:160.88 弱撑:178.76 弱压:194.74 强压:19", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:10", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:0.7),不建议加仓 | 止损183.88 | 目标208.62 | 买入区178.76~187.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损175.12 | 目标0 | 买入区171.04~199.54 | 信号:持有", - "reason": "技术面重评: 止损183.88→175.12 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:17", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损175.12 | 目标0 | 买入区171.04~199.54 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损175.13 | 目标0 | 买入区171.05~199.55 | 信号:持有", - "reason": "技术面重评: 止损175.12→175.13 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损175.13 | 目标0 | 买入区171.05~199.55 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损173.7 | 目标0 | 买入区169.65~197.93 | 信号:持有", - "reason": "技术面重评: 止损175.13→173.7 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:27", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损173.7 | 目标0 | 买入区169.65~197.93 | 信号:持有", - "new_action": "盈利良好 | 止损179.62 | 目标215.31 | 买入区188.0~197.11 | 信号:持有", - "reason": "技术面重评: 止损173.7→179.62 | 形态:平盘/neutral 量价:买卖均衡 强撑:171.04 弱撑:188.0 弱压:190.04 强压:209.04", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:30", - "old_action": "盈利良好 | 止损179.62 | 目标215.31 | 买入区188.0~197.11 | 信号:持有", - "new_action": "盈利良好 | 止损179.62 | 目标215.31 | 买入区188.17~197.11 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:33", - "old_action": "盈利良好 | 止损179.62 | 目标215.31 | 买入区188.17~197.11 | 信号:持有", - "new_action": "盈利良好 | 止损182.27 | 目标215.31 | 买入区187.91~197.31 | 信号:持有", - "reason": "技术面重评: 止损179.62→182.27 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:171.04 弱撑:187.91 弱压:195.41 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:36", - "old_action": "盈利良好 | 止损182.27 | 目标215.31 | 买入区187.91~197.31 | 信号:持有", - "new_action": "盈利良好 | 止损178.3 | 目标200.68 | 买入区186.35~195.67 | 信号:持有", - "reason": "技术面重评: 止损182.27→178.3, 止盈215.31→200.68 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.04 弱撑:186.35 弱压:193.85 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:39", - "old_action": "盈利良好 | 止损178.3 | 目标200.68 | 买入区186.35~195.67 | 信号:持有", - "new_action": "盈利良好 | 止损179.61 | 目标200.68 | 买入区187.37~196.74 | 信号:持有", - "reason": "技术面重评: 止损178.3→179.61 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:171.04 弱撑:187.37 弱压:194.87 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:40", - "old_action": "盈利良好 | 止损179.61 | 目标200.68 | 买入区187.37~196.74 | 信号:持有", - "new_action": "盈利良好 | 止损178.7 | 目标200.68 | 买入区186.45~195.77 | 信号:持有", - "reason": "技术面重评: 止损179.61→178.7 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.04 弱撑:186.45 弱压:193.95 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:44", - "old_action": "盈利良好 | 止损178.7 | 目标200.68 | 买入区186.45~195.77 | 信号:持有", - "new_action": "盈利良好 | 止损178.48 | 目标200.68 | 买入区186.39~195.71 | 信号:持有", - "reason": "技术面重评: 止损178.7→178.48 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.04 弱撑:186.39 弱压:193.89 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:47", - "old_action": "盈利良好 | 止损178.48 | 目标200.68 | 买入区186.39~195.71 | 信号:持有", - "new_action": "盈利良好 | 止损177.7 | 目标200.68 | 买入区186.52~195.85 | 信号:持有", - "reason": "技术面重评: 止损178.48→177.7 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.04 弱撑:186.52 弱压:194.02 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:49", - "old_action": "盈利良好 | 止损177.7 | 目标200.68 | 买入区186.52~195.85 | 信号:持有", - "new_action": "盈利良好 | 止损176.54 | 目标200.68 | 买入区185.05~194.3 | 信号:持有", - "reason": "技术面重评: 止损177.7→176.54 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:185.05 弱压:192.95 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:51", - "old_action": "盈利良好 | 止损176.54 | 目标200.68 | 买入区185.05~194.3 | 信号:持有", - "new_action": "盈利良好 | 止损176.19 | 目标200.68 | 买入区184.23~193.44 | 信号:持有", - "reason": "技术面重评: 止损176.54→176.19 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:184.23 弱压:193.02 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:53", - "old_action": "盈利良好 | 止损176.19 | 目标200.68 | 买入区184.23~193.44 | 信号:持有", - "new_action": "盈利良好 | 止损175.19 | 目标200.68 | 买入区183.0~192.15 | 信号:持有", - "reason": "技术面重评: 止损176.19→175.19 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:183.0 弱压:192.45 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:01", - "old_action": "盈利良好 | 止损175.19 | 目标200.68 | 买入区183.0~192.15 | 信号:持有", - "new_action": "盈利良好 | 止损161.44 | 目标180.61 | 买入区182.25~191.36 | 信号:持有", - "reason": "技术面重评: 止损175.19→161.44, 止盈200.68→180.61 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:182.25 弱压:192.2 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:03", - "old_action": "盈利良好 | 止损161.44 | 目标180.61 | 买入区182.25~191.36 | 信号:持有", - "new_action": "盈利良好 | 止损160.15 | 目标180.61 | 买入区181.87~190.96 | 信号:持有", - "reason": "技术面重评: 止损161.44→160.15 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:181.87 弱压:192.37 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:05", - "old_action": "盈利良好 | 止损160.15 | 目标180.61 | 买入区181.87~190.96 | 信号:持有", - "new_action": "盈利良好 | 止损160.91 | 目标180.61 | 买入区182.31~191.43 | 信号:持有", - "reason": "技术面重评: 止损160.15→160.91 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:182.31 弱压:192.81 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:07", - "old_action": "盈利良好 | 止损160.91 | 目标180.61 | 买入区182.31~191.43 | 信号:持有", - "new_action": "盈利良好 | 止损160.62 | 目标180.61 | 买入区180.83~189.87 | 信号:持有", - "reason": "技术面重评: 止损160.91→160.62 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:180.83 弱压:191.83 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:09", - "old_action": "盈利良好 | 止损160.62 | 目标180.61 | 买入区180.83~189.87 | 信号:持有", - "new_action": "盈利良好 | 止损160.56 | 目标180.61 | 买入区181.51~190.59 | 信号:持有", - "reason": "技术面重评: 止损160.62→160.56 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:181.51 弱压:192.6 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:11", - "old_action": "盈利良好 | 止损160.56 | 目标180.61 | 买入区181.51~190.59 | 信号:持有", - "new_action": "盈利良好 | 止损160.2 | 目标180.61 | 买入区181.28~190.34 | 信号:持有", - "reason": "技术面重评: 止损160.56→160.2 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:181.28 弱压:192.37 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:13", - "old_action": "盈利良好 | 止损160.2 | 目标180.61 | 买入区181.28~190.34 | 信号:持有", - "new_action": "盈利良好 | 止损173.71 | 目标200.68 | 买入区180.65~189.68 | 信号:持有", - "reason": "技术面重评: 止损160.2→173.71, 止盈180.61→200.68 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:180.65 弱压:192.14 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:17", - "old_action": "盈利良好 | 止损173.71 | 目标200.68 | 买入区180.65~189.68 | 信号:持有", - "new_action": "盈利良好 | 止损173.01 | 目标200.68 | 买入区180.01~189.01 | 信号:持有", - "reason": "技术面重评: 止损173.71→173.01 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:180.01 弱压:191.65 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:19", - "old_action": "盈利良好 | 止损173.01 | 目标200.68 | 买入区180.01~189.01 | 信号:持有", - "new_action": "盈利良好 | 止损173.66 | 目标200.68 | 买入区180.28~189.29 | 信号:持有", - "reason": "技术面重评: 止损173.01→173.66 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:180.28 弱压:191.95 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:27", - "old_action": "盈利良好 | 止损173.66 | 目标200.68 | 买入区180.28~189.29 | 信号:持有", - "new_action": "盈利良好 | 止损158.61 | 目标180.61 | 买入区179.05~188.0 | 信号:持有", - "reason": "技术面重评: 止损173.66→158.61, 止盈200.68→180.61 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:179.05 弱压:191.52 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:28", - "old_action": "盈利良好 | 止损158.61 | 目标180.61 | 买入区179.05~188.0 | 信号:持有", - "new_action": "盈利良好 | 止损158.51 | 目标180.61 | 买入区179.01~187.96 | 信号:持有", - "reason": "技术面重评: 止损158.61→158.51 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:179.01 弱压:191.48 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:38", - "old_action": "盈利良好 | 止损158.51 | 目标180.61 | 买入区179.01~187.96 | 信号:持有", - "new_action": "盈利良好 | 止损171.8 | 目标200.68 | 买入区177.3~186.17 | 信号:持有", - "reason": "技术面重评: 止损158.51→171.8, 止盈180.61→200.68 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:177.3 弱压:191.03 强压:209", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:41", - "old_action": "盈利良好 | 止损171.8 | 目标200.68 | 买入区177.3~186.17 | 信号:持有", - "new_action": "盈利良好 | 止损157.54 | 目标180.61 | 买入区177.41~186.28 | 信号:持有", - "reason": "技术面重评: 止损171.8→157.54, 止盈200.68→180.61 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:177.41 弱压:191.14 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:44", - "old_action": "盈利良好 | 止损157.54 | 目标180.61 | 买入区177.41~186.28 | 信号:持有", - "new_action": "盈利良好 | 止损157.43 | 目标180.61 | 买入区177.46~186.33 | 信号:持有", - "reason": "技术面重评: 止损157.54→157.43 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:177.46 弱压:191.19 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:45", - "old_action": "盈利良好 | 止损157.43 | 目标180.61 | 买入区177.46~186.33 | 信号:持有", - "new_action": "盈利良好 | 止损157.89 | 目标180.61 | 买入区177.69~186.57 | 信号:持有", - "reason": "技术面重评: 止损157.43→157.89 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:177.69 弱压:191.42 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:53", - "old_action": "盈利良好 | 止损157.89 | 目标180.61 | 买入区177.69~186.57 | 信号:持有", - "new_action": "盈利良好 | 止损155.9 | 目标180.61 | 买入区174.72~183.46 | 信号:持有", - "reason": "技术面重评: 止损157.89→155.9 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:174.72 弱压:190.34 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:55", - "old_action": "盈利良好 | 止损155.9 | 目标180.61 | 买入区174.72~183.46 | 信号:持有", - "new_action": "盈利良好 | 止损155.3 | 目标180.61 | 买入区173.75~182.44 | 信号:持有", - "reason": "技术面重评: 止损155.9→155.3 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:173.75 弱压:190.07 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:57", - "old_action": "盈利良好 | 止损155.3 | 目标180.61 | 买入区173.75~182.44 | 信号:持有", - "new_action": "盈利良好 | 止损154.84 | 目标180.61 | 买入区173.09~181.74 | 信号:持有", - "reason": "技术面重评: 止损155.3→154.84 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:173.09 弱压:190.04 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:59", - "old_action": "盈利良好 | 止损154.84 | 目标180.61 | 买入区173.09~181.74 | 信号:持有", - "new_action": "盈利良好 | 止损154.55 | 目标180.61 | 买入区172.63~181.26 | 信号:持有", - "reason": "技术面重评: 止损154.84→154.55 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:172.63 弱压:190.43 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:01", - "old_action": "盈利良好 | 止损154.55 | 目标180.61 | 买入区172.63~181.26 | 信号:持有", - "new_action": "盈利良好 | 止损156.16 | 目标180.61 | 买入区173.79~182.48 | 信号:持有", - "reason": "技术面重评: 止损154.55→156.16 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:173.79 弱压:191.59 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:03", - "old_action": "盈利良好 | 止损156.16 | 目标180.61 | 买入区173.79~182.48 | 信号:持有", - "new_action": "盈利良好 | 止损157.46 | 目标180.61 | 买入区174.42~183.14 | 信号:持有", - "reason": "技术面重评: 止损156.16→157.46 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:174.42 弱压:192.22 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:05", - "old_action": "盈利良好 | 止损157.46 | 目标180.61 | 买入区174.42~183.14 | 信号:持有", - "new_action": "盈利良好 | 止损159.71 | 目标180.61 | 买入区176.25~185.06 | 信号:持有", - "reason": "技术面重评: 止损157.46→159.71 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:176.25 弱压:194.05 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:09", - "old_action": "盈利良好 | 止损159.71 | 目标180.61 | 买入区176.25~185.06 | 信号:持有", - "new_action": "盈利良好 | 止损160.34 | 目标180.61 | 买入区176.88~185.72 | 信号:持有", - "reason": "技术面重评: 止损159.71→160.34 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.04 弱撑:176.88 弱压:194.68 强压:209", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:11", - "old_action": "盈利良好 | 止损160.34 | 目标180.61 | 买入区176.88~185.72 | 信号:持有", - "new_action": "盈利良好 | 止损160.0 | 目标180.61 | 买入区176.53~185.36 | 信号:持有", - "reason": "技术面重评: 止损160.34→160.0 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.04 弱撑:176.53 弱压:194.33 强压:209", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:28", - "old_action": "盈利良好 | 止损160.0 | 目标180.61 | 买入区176.53~185.36 | 信号:持有", - "new_action": "盈利良好 | 止损158.89 | 目标180.61 | 买入区175.59~184.37 | 信号:持有", - "reason": "技术面重评: 止损160.0→158.89 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.59 弱压:193.39 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:30", - "old_action": "盈利良好 | 止损158.89 | 目标180.61 | 买入区175.59~184.37 | 信号:持有", - "new_action": "盈利良好 | 止损158.85 | 目标180.61 | 买入区175.63~184.41 | 信号:持有", - "reason": "技术面重评: 止损158.89→158.85 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.63 弱压:193.43 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:45", - "old_action": "盈利良好 | 止损158.85 | 目标180.61 | 买入区175.63~184.41 | 信号:持有", - "new_action": "盈利良好 | 止损165.75 | 目标190.65 | 买入区175.63~184.41 | 信号:持有", - "reason": "技术面重评: 止损158.85→165.75, 止盈180.61→190.65 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.63 弱压:193.43 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:17", - "old_action": "盈利良好 | 止损165.75 | 目标190.65 | 买入区175.63~184.41 | 信号:持有", - "new_action": "盈利良好 | 止损157.98 | 目标180.61 | 买入区175.27~184.03 | 信号:持有", - "reason": "技术面重评: 止损165.75→157.98, 止盈190.65→180.61 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.27 弱压:193.07 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:19", - "old_action": "盈利良好 | 止损157.98 | 目标180.61 | 买入区175.27~184.03 | 信号:持有", - "new_action": "盈利良好 | 止损157.73 | 目标180.61 | 买入区174.97~183.72 | 信号:持有", - "reason": "技术面重评: 止损157.98→157.73 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:174.97 弱压:192.77 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:21", - "old_action": "盈利良好 | 止损157.73 | 目标180.61 | 买入区174.97~183.72 | 信号:持有", - "new_action": "盈利良好 | 止损158.13 | 目标180.61 | 买入区175.08~183.83 | 信号:持有", - "reason": "技术面重评: 止损157.73→158.13 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.08 弱压:192.88 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:23", - "old_action": "盈利良好 | 止损158.13 | 目标180.61 | 买入区175.08~183.83 | 信号:持有", - "new_action": "盈利良好 | 止损164.85 | 目标190.65 | 买入区175.07~183.82 | 信号:持有", - "reason": "技术面重评: 止损158.13→164.85, 止盈180.61→190.65 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.07 弱压:192.87 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:24", - "old_action": "盈利良好 | 止损164.85 | 目标190.65 | 买入区175.07~183.82 | 信号:持有", - "new_action": "盈利良好 | 止损165.01 | 目标190.65 | 买入区175.3~184.07 | 信号:持有", - "reason": "技术面重评: 止损164.85→165.01 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.3 弱压:193.1 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:26", - "old_action": "盈利良好 | 止损165.01 | 目标190.65 | 买入区175.3~184.07 | 信号:持有", - "new_action": "盈利良好 | 止损165.77 | 目标190.65 | 买入区175.67~184.45 | 信号:持有", - "reason": "技术面重评: 止损165.01→165.77 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.67 弱压:193.47 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:30", - "old_action": "盈利良好 | 止损165.77 | 目标190.65 | 买入区175.67~184.45 | 信号:持有", - "new_action": "盈利良好 | 止损165.45 | 目标190.65 | 买入区175.47~184.24 | 信号:持有", - "reason": "技术面重评: 止损165.77→165.45 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.47 弱压:193.27 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:32", - "old_action": "盈利良好 | 止损165.45 | 目标190.65 | 买入区175.47~184.24 | 信号:持有", - "new_action": "盈利良好 | 止损165.73 | 目标190.65 | 买入区175.67~184.45 | 信号:持有", - "reason": "技术面重评: 止损165.45→165.73 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:171.04 弱撑:175.67 弱压:193.47 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:34", - "old_action": "盈利良好 | 止损165.73 | 目标190.65 | 买入区175.67~184.45 | 信号:持有", - "new_action": "盈利良好 | 止损167.19 | 目标190.65 | 买入区176.69~185.52 | 信号:持有", - "reason": "技术面重评: 止损165.73→167.19 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.04 弱撑:176.69 弱压:194.49 强压:209", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:41", - "old_action": "盈利良好 | 止损167.19 | 目标190.65 | 买入区176.69~185.52 | 信号:持有", - "new_action": "盈利良好 | 止损169.81 | 目标190.65 | 买入区178.86~187.8 | 信号:持有", - "reason": "技术面重评: 止损167.19→169.81 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:178.86 弱压:196.66 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:43", - "old_action": "盈利良好 | 止损169.81 | 目标190.65 | 买入区178.86~187.8 | 信号:持有", - "new_action": "盈利良好 | 止损169.66 | 目标190.65 | 买入区179.17~188.13 | 信号:持有", - "reason": "技术面重评: 止损169.81→169.66 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.17 弱压:196.97 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:44", - "old_action": "盈利良好 | 止损169.66 | 目标190.65 | 买入区179.17~188.13 | 信号:持有", - "new_action": "盈利良好 | 止损168.97 | 目标190.65 | 买入区178.02~186.92 | 信号:持有", - "reason": "技术面重评: 止损169.66→168.97 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.04 弱撑:178.02 弱压:195.82 强压:209", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:47", - "old_action": "盈利良好 | 止损168.97 | 目标190.65 | 买入区178.02~186.92 | 信号:持有", - "new_action": "盈利良好 | 止损169.81 | 目标190.65 | 买入区178.63~187.56 | 信号:持有", - "reason": "技术面重评: 止损168.97→169.81 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:178.63 弱压:196.43 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:49", - "old_action": "盈利良好 | 止损169.81 | 目标190.65 | 买入区178.63~187.56 | 信号:持有", - "new_action": "盈利良好 | 止损170.25 | 目标190.65 | 买入区178.7~187.63 | 信号:持有", - "reason": "技术面重评: 止损169.81→170.25 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:178.7 弱压:196.5 强压:209.04", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:53", - "old_action": "盈利良好 | 止损170.25 | 目标190.65 | 买入区178.7~187.63 | 信号:持有", - "new_action": "盈利良好 | 止损171.1 | 目标190.65 | 买入区179.8~188.79 | 信号:持有", - "reason": "技术面重评: 止损170.25→171.1 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.8 弱压:197.6 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:57", - "old_action": "盈利良好 | 止损171.1 | 目标190.65 | 买入区179.8~188.79 | 信号:持有", - "new_action": "盈利良好 | 止损172.72 | 目标190.65 | 买入区181.23~190.29 | 信号:持有", - "reason": "技术面重评: 止损171.1→172.72 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:181.23 弱压:199.03 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:59", - "old_action": "盈利良好 | 止损172.72 | 目标190.65 | 买入区181.23~190.29 | 信号:持有", - "new_action": "盈利良好 | 止损174.21 | 目标190.65 | 买入区181.58~190.66 | 信号:持有", - "reason": "技术面重评: 止损172.72→174.21 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:181.58 弱压:199.38 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:01", - "old_action": "盈利良好 | 止损174.21 | 目标190.65 | 买入区181.58~190.66 | 信号:持有", - "new_action": "盈利良好 | 止损173.87 | 目标190.65 | 买入区180.83~189.87 | 信号:持有", - "reason": "技术面重评: 止损174.21→173.87 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:180.83 弱压:198.63 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:07", - "old_action": "盈利良好 | 止损173.87 | 目标190.65 | 买入区180.83~189.87 | 信号:持有", - "new_action": "盈利良好 | 止损172.07 | 目标190.65 | 买入区179.82~188.81 | 信号:持有", - "reason": "技术面重评: 止损173.87→172.07 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.82 弱压:197.62 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:09", - "old_action": "盈利良好 | 止损172.07 | 目标190.65 | 买入区179.82~188.81 | 信号:持有", - "new_action": "盈利良好 | 止损170.82 | 目标190.65 | 买入区179.49~188.46 | 信号:持有", - "reason": "技术面重评: 止损172.07→170.82 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.49 弱压:197.29 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:13", - "old_action": "盈利良好 | 止损170.82 | 目标190.65 | 买入区179.49~188.46 | 信号:持有", - "new_action": "盈利良好 | 止损170.85 | 目标190.65 | 买入区179.11~188.07 | 信号:持有", - "reason": "技术面重评: 止损170.82→170.85 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.11 弱压:196.91 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:16", - "old_action": "盈利良好 | 止损170.85 | 目标190.65 | 买入区179.11~188.07 | 信号:持有", - "new_action": "盈利良好 | 止损170.66 | 目标190.65 | 买入区179.43~188.4 | 信号:持有", - "reason": "技术面重评: 止损170.85→170.66 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.43 弱压:197.23 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:24", - "old_action": "盈利良好 | 止损170.66 | 目标190.65 | 买入区179.43~188.4 | 信号:持有", - "new_action": "盈利良好 | 止损170.76 | 目标190.65 | 买入区179.33~188.3 | 信号:持有", - "reason": "技术面重评: 止损170.66→170.76 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.33 弱压:197.13 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:26", - "old_action": "盈利良好 | 止损170.76 | 目标190.65 | 买入区179.33~188.3 | 信号:持有", - "new_action": "盈利良好 | 止损171.08 | 目标190.65 | 买入区179.71~188.7 | 信号:持有", - "reason": "技术面重评: 止损170.76→171.08 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.71 弱压:197.51 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:32", - "old_action": "盈利良好 | 止损171.08 | 目标190.65 | 买入区179.71~188.7 | 信号:持有", - "new_action": "盈利良好 | 止损163.21 | 目标180.61 | 买入区179.0~187.95 | 信号:持有", - "reason": "技术面重评: 止损171.08→163.21, 止盈190.65→180.61 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.0 弱压:196.8 强压:209.04", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:35", - "old_action": "盈利良好 | 止损163.21 | 目标180.61 | 买入区179.0~187.95 | 信号:持有", - "new_action": "盈利良好 | 止损164.07 | 目标180.61 | 买入区179.66~188.64 | 信号:持有", - "reason": "技术面重评: 止损163.21→164.07 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.66 弱压:197.46 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:39", - "old_action": "盈利良好 | 止损164.07 | 目标180.61 | 买入区179.66~188.64 | 信号:持有", - "new_action": "盈利良好 | 止损164.22 | 目标180.61 | 买入区179.89~188.88 | 信号:持有", - "reason": "技术面重评: 止损164.07→164.22 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.89 弱压:197.69 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:43", - "old_action": "盈利良好 | 止损164.22 | 目标180.61 | 买入区179.89~188.88 | 信号:持有", - "new_action": "盈利良好 | 止损163.7 | 目标180.61 | 买入区179.48~188.45 | 信号:持有", - "reason": "技术面重评: 止损164.22→163.7 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.48 弱压:197.28 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:45", - "old_action": "盈利良好 | 止损163.7 | 目标180.61 | 买入区179.48~188.45 | 信号:持有", - "new_action": "盈利良好 | 止损164.04 | 目标180.61 | 买入区179.57~188.55 | 信号:持有", - "reason": "技术面重评: 止损163.7→164.04 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.57 弱压:197.37 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:47", - "old_action": "盈利良好 | 止损164.04 | 目标180.61 | 买入区179.57~188.55 | 信号:持有", - "new_action": "盈利良好 | 止损164.18 | 目标180.61 | 买入区179.71~188.7 | 信号:持有", - "reason": "技术面重评: 止损164.04→164.18 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.71 弱压:197.51 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:53", - "old_action": "盈利良好 | 止损164.18 | 目标180.61 | 买入区179.71~188.7 | 信号:持有", - "new_action": "盈利良好 | 止损163.43 | 目标180.61 | 买入区179.19~188.15 | 信号:持有", - "reason": "技术面重评: 止损164.18→163.43 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.19 弱压:196.99 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:59", - "old_action": "盈利良好 | 止损163.43 | 目标180.61 | 买入区179.19~188.15 | 信号:持有", - "new_action": "盈利良好 | 止损163.39 | 目标180.61 | 买入区179.13~188.09 | 信号:持有", - "reason": "技术面重评: 止损163.43→163.39 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.13 弱压:196.93 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 15:01", - "old_action": "盈利良好 | 止损163.39 | 目标180.61 | 买入区179.13~188.09 | 信号:持有", - "new_action": "盈利良好 | 止损170.5 | 目标190.65 | 买入区179.14~188.1 | 信号:持有", - "reason": "技术面重评: 止损163.39→170.5, 止盈180.61→190.65 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.14 弱压:196.94 强压:209.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 22:41", - "old_action": "盈利良好 | 止损170.5 | 目标190.65 | 买入区179.14~188.1 | 信号:持有", - "new_action": "盈利良好 | 止损170.5 | 目标187.07 | 买入区179.14~188.1 | 信号:持有", - "reason": "技术面重评: 止盈190.65→187.07 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.14 弱压:196.94 强压:205.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 22:47", - "old_action": "盈利良好 | 止损179.32 | 目标205.12 | 买入区179.14~188.1 | 信号:持有", - "new_action": "盈利良好 | 止损170.5 | 目标187.07 | 买入区179.14~188.1 | 信号:持有", - "reason": "技术面重评: 止损179.32→170.5, 止盈205.12→187.07 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.14 弱压:196.94 强压:205.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:04", - "old_action": "盈利良好 | 止损170.5 | 目标187.07 | 买入区179.14~188.1 | 信号:持有", - "new_action": "盈利良好 | 止损177.61 | 目标196.92 | 买入区179.14~188.1 | 信号:持有", - "reason": "技术面重评: 止损170.5→177.61, 止盈187.07→196.92 | 形态:十字星/neutral 量价:买卖均衡 强撑:171.04 弱撑:179.14 弱压:196.94 强压:205.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:17", - "old_action": "盈利良好 | 止损177.61 | 目标196.92 | 买入区179.14~188.1 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损177.64 | 目标0 | 买入区169.91~198.23 | 信号:持有", - "reason": "技术面重评: 止损177.61→177.64 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损177.64 | 目标0 | 买入区169.91~198.23 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损177.76 | 目标0 | 买入区170.04~198.38 | 信号:持有", - "reason": "技术面重评: 止损177.64→177.76 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:28", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损177.76 | 目标0 | 买入区170.04~198.38 | 信号:持有", - "new_action": "盈利良好 | 止损179.71 | 目标199.33 | 买入区188.76~197.88 | 信号:持有", - "reason": "技术面重评: 止损177.76→179.71 | 形态:平盘/neutral 量价:买卖均衡 强撑:173.2 弱撑:188.76 弱压:191.0 强压:207.64", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:33", - "old_action": "盈利良好 | 止损179.71 | 目标199.33 | 买入区188.76~197.88 | 信号:持有", - "new_action": "盈利良好 | 止损187.33 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损179.71→187.33, 止盈199.33→205.31 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:175.3 弱撑:188.76 弱压:195.2 强压:207.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:34", - "old_action": "盈利良好 | 止损187.33 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损188.77 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损187.33→188.77 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:176.06 弱撑:188.76 弱压:197.54 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:36", - "old_action": "盈利良好 | 止损188.77 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.66 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损188.77→191.66 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:175.13 弱撑:188.76 弱压:199.61 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:38", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.66 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损190.01 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损191.66→190.01 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:174.45 弱撑:188.76 弱压:198.25 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:40", - "old_action": "盈利良好 | 止损190.01 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.72 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损190.01→191.72 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:174.82 弱撑:188.76 弱压:200.85 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:42", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.72 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.88 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损191.72→191.88 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:174.9 弱撑:188.76 弱压:201.01 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:44", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损191.88 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损190.64 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损191.88→190.64 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:174.27 弱撑:188.76 弱压:199.73 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:46", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损190.64 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损191.35 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损190.64→191.35 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:174.2 弱撑:188.76 弱压:199.61 强压:207", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:49", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.2),不建议加仓 | 止损191.35 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损189.13 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损191.35→189.13 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:174.5 弱撑:188.76 弱压:200.21 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:50", - "old_action": "盈利良好 | 止损189.13 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比偏低(1:1.5),不建议加仓 | 止损190.49 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损189.13→190.49 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:174.34 弱撑:188.76 弱压:199.89 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:52", - "old_action": "盈利良好 | ⚠️盈亏比偏低(1:1.5),不建议加仓 | 止损190.49 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损189.12 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损190.49→189.12 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:174.12 弱撑:188.76 弱压:199.45 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:55", - "old_action": "盈利良好 | 止损189.12 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损189.77 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损189.12→189.77 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:174.2 弱撑:188.76 弱压:199.59 强压:207", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:57", - "old_action": "盈利良好 | 止损189.77 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损188.93 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损189.77→188.93 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:173.53 弱撑:188.76 弱压:198.27 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:59", - "old_action": "盈利良好 | 止损188.93 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损186.85 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损188.93→186.85 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:173.26 弱撑:188.76 弱压:197.71 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:01", - "old_action": "盈利良好 | 止损186.85 | 目标205.31 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损167.07 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损186.85→167.07, 止盈205.31→179.4 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:173.28 弱撑:188.76 弱压:197.76 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:03", - "old_action": "盈利良好 | 止损167.07 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损167.1 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损167.07→167.1 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:172.93 弱撑:188.76 弱压:197.07 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:05", - "old_action": "盈利良好 | 止损167.1 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损165.74 | 目标179.4 | 买入区188.74~198.12 | 信号:持有", - "reason": "技术面重评: 止损167.1→165.74 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:172.67 弱撑:188.74 弱压:196.54 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:07", - "old_action": "盈利良好 | 止损165.74 | 目标179.4 | 买入区188.74~198.12 | 信号:持有", - "new_action": "盈利良好 | 止损166.11 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "reason": "技术面重评: 止损165.74→166.11 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:172.91 弱撑:188.76 弱压:197.02 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:09", - "old_action": "盈利良好 | 止损166.11 | 目标179.4 | 买入区188.76~198.2 | 信号:持有", - "new_action": "盈利良好 | 止损164.55 | 目标179.4 | 买入区185.8~195.09 | 信号:持有", - "reason": "技术面重评: 止损166.11→164.55 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.2 弱撑:185.8 弱压:195.61 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:12", - "old_action": "盈利良好 | 止损164.55 | 目标179.4 | 买入区185.8~195.09 | 信号:持有", - "new_action": "盈利良好 | 止损164.04 | 目标179.4 | 买入区185.69~194.97 | 信号:持有", - "reason": "技术面重评: 止损164.55→164.04 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:171.14 弱撑:185.69 弱压:195.54 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:15", - "old_action": "盈利良好 | 止损164.04 | 目标179.4 | 买入区185.69~194.97 | 信号:持有", - "new_action": "盈利良好 | 止损163.41 | 目标179.4 | 买入区185.15~194.41 | 信号:持有", - "reason": "技术面重评: 止损164.04→163.41 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.87 弱撑:185.15 弱压:195.55 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:17", - "old_action": "盈利良好 | 止损163.41 | 目标179.4 | 买入区185.15~194.41 | 信号:持有", - "new_action": "盈利良好 | 止损164.18 | 目标179.4 | 买入区184.99~194.24 | 信号:持有", - "reason": "技术面重评: 止损163.41→164.18 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.8 弱撑:184.99 弱压:195.78 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:19", - "old_action": "盈利良好 | 止损164.18 | 目标179.4 | 买入区184.99~194.24 | 信号:持有", - "new_action": "盈利良好 | 止损161.87 | 目标179.4 | 买入区182.07~191.17 | 信号:持有", - "reason": "技术面重评: 止损164.18→161.87 | 形态:带上影阴线/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.07 弱压:195.27 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:20", - "old_action": "盈利良好 | 止损161.87 | 目标179.4 | 买入区182.07~191.17 | 信号:持有", - "new_action": "盈利良好 | 止损161.61 | 目标179.4 | 买入区182.11~191.22 | 信号:持有", - "reason": "技术面重评: 止损161.87→161.61 | 形态:带上影阴线/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.11 弱压:195.31 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:23", - "old_action": "盈利良好 | 止损161.61 | 目标179.4 | 买入区182.11~191.22 | 信号:持有", - "new_action": "盈利良好 | 止损161.61 | 目标179.4 | 买入区182.12~191.23 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:25", - "old_action": "盈利良好 | 止损161.61 | 目标179.4 | 买入区182.12~191.23 | 信号:持有", - "new_action": "盈利良好 | 止损162.0 | 目标179.4 | 买入区182.71~191.85 | 信号:持有", - "reason": "技术面重评: 止损161.61→162.0 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.71 弱压:195.91 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:26", - "old_action": "盈利良好 | 止损162.0 | 目标179.4 | 买入区182.71~191.85 | 信号:持有", - "new_action": "盈利良好 | 止损163.17 | 目标179.4 | 买入区182.71~191.85 | 信号:持有", - "reason": "技术面重评: 止损162.0→163.17 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.71 弱压:195.91 强压", + "date": "2026-07-01 10:34", + "old_action": "盈利良好 | 止损179.76 | 目标207.51 | 买入区182.31~191.43 | 信号:持有", + "new_action": "盈利良好 | 止损178.49 | 目标200.23 | 买入区179.73~188.72 | 信号:持有", + "reason": "技术面重评: 止损179.76→178.49, 止盈207.51→200.23 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:179.73 弱压:191.33 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:29", - "old_action": "盈利良好 | 止损163.17 | 目标179.4 | 买入区182.71~191.85 | 信号:持有", - "new_action": "盈利良好 | 止损163.49 | 目标179.4 | 买入区183.05~192.2 | 信号:持有", - "reason": "技术面重评: 止损163.17→163.49 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.05 弱压:196.25 强压", + "date": "2026-07-01 10:36", + "old_action": "盈利良好 | 止损178.49 | 目标200.23 | 买入区179.73~188.72 | 信号:持有", + "new_action": "盈利良好 | 止损177.8 | 目标199.82 | 买入区178.91~187.86 | 信号:持有", + "reason": "技术面重评: 止损178.49→177.8, 止盈200.23→199.82 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:178.91 弱压:191.13 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:31", - "old_action": "盈利良好 | 止损163.49 | 目标179.4 | 买入区183.05~192.2 | 信号:持有", - "new_action": "盈利良好 | 止损167.3 | 目标179.4 | 买入区183.84~193.03 | 信号:持有", - "reason": "技术面重评: 止损163.49→167.3 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.22 弱撑:183.84 弱压:197.04 强压", + "date": "2026-07-01 10:39", + "old_action": "盈利良好 | 止损177.8 | 目标199.82 | 买入区178.91~187.86 | 信号:持有", + "new_action": "盈利良好 | 止损177.13 | 目标199.54 | 买入区178.29~187.2 | 信号:持有", + "reason": "技术面重评: 止损177.8→177.13, 止盈199.82→199.54 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:178.29 弱压:191.39 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:32", - "old_action": "盈利良好 | 止损167.3 | 目标179.4 | 买入区183.84~193.03 | 信号:持有", - "new_action": "盈利良好 | 止损167.39 | 目标179.4 | 买入区183.85~193.04 | 信号:持有", - "reason": "技术面重评: 止损167.3→167.39 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.23 弱撑:183.85 弱压:197.05 强压", + "date": "2026-07-01 10:41", + "old_action": "盈利良好 | 止损177.13 | 目标199.54 | 买入区178.29~187.2 | 信号:持有", + "new_action": "盈利良好 | 止损176.84 | 目标198.91 | 买入区177.01~185.86 | 信号:持有", + "reason": "技术面重评: 止损177.13→176.84, 止盈199.54→198.91 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:177.01 弱压:190.8 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:35", - "old_action": "盈利良好 | 止损167.39 | 目标179.4 | 买入区183.85~193.04 | 信号:持有", - "new_action": "盈利良好 | 止损165.95 | 目标179.4 | 买入区182.66~191.79 | 信号:持有", - "reason": "技术面重评: 止损167.39→165.95 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.66 弱压:195.86 强压", + "date": "2026-07-01 10:43", + "old_action": "盈利良好 | 止损176.84 | 目标198.91 | 买入区177.01~185.86 | 信号:持有", + "new_action": "盈利良好 | 止损176.15 | 目标198.81 | 买入区176.79~185.63 | 信号:持有", + "reason": "技术面重评: 止损176.84→176.15, 止盈198.91→198.81 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:176.79 弱压:191.19 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:36", - "old_action": "盈利良好 | 止损165.95 | 目标179.4 | 买入区182.66~191.79 | 信号:持有", - "new_action": "盈利良好 | 止损165.57 | 目标179.4 | 买入区182.67~191.8 | 信号:持有", - "reason": "技术面重评: 止损165.95→165.57 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.67 弱压:195.87 强压", + "date": "2026-07-01 10:51", + "old_action": "盈利良好 | 止损176.15 | 目标198.81 | 买入区176.79~185.63 | 信号:持有", + "new_action": "盈利良好 | 止损177.8 | 目标199.36 | 买入区177.95~186.85 | 信号:持有", + "reason": "技术面重评: 止损176.15→177.8, 止盈198.81→199.36 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:177.95 弱压:192.35 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:40", - "old_action": "盈利良好 | 止损165.57 | 目标179.4 | 买入区182.67~191.8 | 信号:持有", - "new_action": "盈利良好 | 止损168.02 | 目标179.4 | 买入区184.31~193.53 | 信号:持有", - "reason": "技术面重评: 止损165.57→168.02 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:184.31 弱压:197.51 强压", + "date": "2026-07-01 10:53", + "old_action": "盈利良好 | 止损177.8 | 目标199.36 | 买入区177.95~186.85 | 信号:持有", + "new_action": "盈利良好 | 止损178.33 | 目标199.36 | 买入区177.93~186.83 | 信号:持有", + "reason": "技术面重评: 止损177.8→178.33 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:177.93 弱压:192.33 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:45", - "old_action": "盈利良好 | 止损168.02 | 目标179.4 | 买入区184.31~193.53 | 信号:持有", - "new_action": "盈利良好 | 止损165.81 | 目标179.4 | 买入区185.19~194.45 | 信号:持有", - "reason": "技术面重评: 止损168.02→165.81 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.89 弱撑:185.19 弱压:198.39 强压:207.", + "date": "2026-07-01 11:03", + "old_action": "盈利良好 | 止损178.33 | 目标199.36 | 买入区177.93~186.83 | 信号:持有", + "new_action": "盈利良好 | 止损178.59 | 目标199.45 | 买入区178.11~187.02 | 信号:持有", + "reason": "技术面重评: 止损178.33→178.59, 止盈199.36→199.45 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:178.11 弱压:192.51 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:47", - "old_action": "盈利良好 | 止损165.81 | 目标179.4 | 买入区185.19~194.45 | 信号:持有", - "new_action": "盈利良好 | 止损165.94 | 目标179.4 | 买入区185.16~194.42 | 信号:持有", - "reason": "技术面重评: 止损165.81→165.94 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.88 弱撑:185.16 弱压:198.36 强压:207.", + "date": "2026-07-01 12:01", + "old_action": "盈利良好 | 止损178.59 | 目标199.45 | 买入区178.11~187.02 | 信号:持有", + "new_action": "盈利良好 | 止损169.05 | 目标188.52 | 买入区176.02~184.82 | 信号:持有", + "reason": "技术面重评: 止损178.59→169.05, 止盈199.45→188.52 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:176.02 弱压:191.13 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:49", - "old_action": "盈利良好 | 止损165.94 | 目标179.4 | 买入区185.16~194.42 | 信号:持有", - "new_action": "盈利良好 | 止损165.1 | 目标179.4 | 买入区184.66~193.89 | 信号:持有", - "reason": "技术面重评: 止损165.94→165.1 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.63 弱撑:184.66 弱压:197.86 强压:207.", + "date": "2026-07-01 13:19", + "old_action": "盈利良好 | 止损169.05 | 目标188.52 | 买入区176.02~184.82 | 信号:持有", + "new_action": "盈利良好 | 止损167.65 | 目标187.94 | 买入区174.75~183.49 | 信号:持有", + "reason": "技术面重评: 止损169.05→167.65, 止盈188.52→187.94 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:174.75 弱压:190.95 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:50", - "old_action": "盈利良好 | 止损165.1 | 目标179.4 | 买入区184.66~193.89 | 信号:持有", - "new_action": "盈利良好 | 止损166.04 | 目标179.4 | 买入区185.46~194.73 | 信号:持有", - "reason": "技术面重评: 止损165.1→166.04 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.03 弱撑:185.46 弱压:198.66 强压:207", + "date": "2026-07-01 13:24", + "old_action": "盈利良好 | 止损167.65 | 目标187.94 | 买入区174.75~183.49 | 信号:持有", + "new_action": "盈利良好 | 止损168.71 | 目标188.16 | 买入区175.22~183.98 | 信号:持有", + "reason": "技术面重评: 止损167.65→168.71, 止盈187.94→188.16 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.22 弱压:191.42 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:53", - "old_action": "盈利良好 | 止损166.04 | 目标179.4 | 买入区185.46~194.73 | 信号:持有", - "new_action": "盈利良好 | 止损166.02 | 目标179.4 | 买入区185.32~194.59 | 信号:持有", - "reason": "技术面重评: 止损166.04→166.02 | 形态:长影星线/neutral 量价:买卖均衡 强撑:170.96 弱撑:185.32 弱压:198.52 强压:207", + "date": "2026-07-01 13:27", + "old_action": "盈利良好 | 止损168.71 | 目标188.16 | 买入区175.22~183.98 | 信号:持有", + "new_action": "盈利良好 | 止损167.88 | 目标187.81 | 买入区174.45~183.17 | 信号:持有", + "reason": "技术面重评: 止损168.71→167.88, 止盈188.16→187.81 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:174.45 弱压:190.8 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:55", - "old_action": "盈利良好 | 止损166.02 | 目标179.4 | 买入区185.32~194.59 | 信号:持有", - "new_action": "盈利良好 | 止损165.62 | 目标179.4 | 买入区184.8~194.04 | 信号:持有", - "reason": "技术面重评: 止损166.02→165.62 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.7 弱撑:184.8 弱压:198.0 强压:207.64", + "date": "2026-07-01 13:56", + "old_action": "盈利良好 | 止损167.88 | 目标187.81 | 买入区174.45~183.17 | 信号:持有", + "new_action": "盈利良好 | 止损166.59 | 目标187.07 | 买入区172.87~181.51 | 信号:持有", + "reason": "技术面重评: 止损167.88→166.59, 止盈187.81→187.07 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:172.87 弱压:190.8 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:57", - "old_action": "盈利良好 | 止损165.62 | 目标179.4 | 买入区184.8~194.04 | 信号:持有", - "new_action": "盈利良好 | 止损165.84 | 目标179.4 | 买入区185.14~194.4 | 信号:持有", - "reason": "技术面重评: 止损165.62→165.84 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.87 弱撑:185.14 弱压:198.34 强压:207.", + "date": "2026-07-01 13:59", + "old_action": "盈利良好 | 止损166.59 | 目标187.07 | 买入区172.87~181.51 | 信号:持有", + "new_action": "盈利良好 | 止损167.16 | 目标187.44 | 买入区173.66~182.34 | 信号:持有", + "reason": "技术面重评: 止损166.59→167.16, 止盈187.07→187.44 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:173.66 弱压:190.87 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 10:59", - "old_action": "盈利良好 | 止损165.84 | 目标179.4 | 买入区185.14~194.4 | 信号:持有", - "new_action": "盈利良好 | 止损165.57 | 目标179.4 | 买入区185.13~194.39 | 信号:持有", - "reason": "技术面重评: 止损165.84→165.57 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.87 弱撑:185.13 弱压:198.33 强压:207.", + "date": "2026-07-01 14:03", + "old_action": "盈利良好 | 止损167.16 | 目标187.44 | 买入区173.66~182.34 | 信号:持有", + "new_action": "盈利良好 | 止损168.06 | 目标187.72 | 买入区174.25~182.96 | 信号:持有", + "reason": "技术面重评: 止损167.16→168.06, 止盈187.44→187.72 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:174.25 弱压:191.46 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:04", - "old_action": "盈利良好 | 止损165.57 | 目标179.4 | 买入区185.13~194.39 | 信号:持有", - "new_action": "盈利良好 | 止损164.9 | 目标179.4 | 买入区184.79~194.03 | 信号:持有", - "reason": "技术面重评: 止损165.57→164.9 | 形态:十字星/neutral 量价:买卖均衡 强撑:170.7 弱撑:184.79 弱压:197.99 强压:207.6", + "date": "2026-07-01 14:07", + "old_action": "盈利良好 | 止损168.06 | 目标187.72 | 买入区174.25~182.96 | 信号:持有", + "new_action": "盈利良好 | 止损170.71 | 目标188.42 | 买入区175.8~184.59 | 信号:持有", + "reason": "技术面重评: 止损168.06→170.71, 止盈187.72→188.42 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:171.72 弱撑:175.8 弱压:193.01 强压:206", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:07", - "old_action": "盈利良好 | 止损164.9 | 目标179.4 | 买入区184.79~194.03 | 信号:持有", - "new_action": "盈利良好 | 止损167.16 | 目标179.4 | 买入区186.01~195.31 | 信号:持有", - "reason": "技术面重评: 止损164.9→167.16 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.3 弱撑:186.01 弱压:199.21 强压:207.", + "date": "2026-07-01 14:11", + "old_action": "盈利良好 | 止损170.71 | 目标188.42 | 买入区175.8~184.59 | 信号:持有", + "new_action": "盈利良好 | 止损171.16 | 目标188.58 | 买入区176.17~184.98 | 信号:持有", + "reason": "技术面重评: 止损170.71→171.16, 止盈188.42→188.58 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:171.72 弱撑:176.17 弱压:193.38 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:11", - "old_action": "盈利良好 | 止损167.16 | 目标179.4 | 买入区186.01~195.31 | 信号:持有", - "new_action": "盈利良好 | 止损166.91 | 目标179.4 | 买入区185.51~194.79 | 信号:持有", - "reason": "技术面重评: 止损167.16→166.91 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.06 弱撑:185.51 弱压:198.71 强压:207", + "date": "2026-07-01 14:21", + "old_action": "盈利良好 | 止损171.16 | 目标188.58 | 买入区176.17~184.98 | 信号:持有", + "new_action": "盈利良好 | 止损168.76 | 目标188.31 | 买入区175.57~184.35 | 信号:持有", + "reason": "技术面重评: 止损171.16→168.76, 止盈188.58→188.31 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.57 弱压:192.78 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:17", - "old_action": "盈利良好 | 止损166.91 | 目标179.4 | 买入区185.51~194.79 | 信号:持有", - "new_action": "盈利良好 | 止损166.34 | 目标179.4 | 买入区185.6~194.88 | 信号:持有", - "reason": "技术面重评: 止损166.91→166.34 | 形态:长影星线/neutral 量价:买卖均衡 强撑:171.1 弱撑:185.6 弱压:198.8 强压:207.64", + "date": "2026-07-01 14:23", + "old_action": "盈利良好 | 止损168.76 | 目标188.31 | 买入区175.57~184.35 | 信号:持有", + "new_action": "盈利良好 | 止损170.88 | 目标188.53 | 买入区176.03~184.83 | 信号:持有", + "reason": "技术面重评: 止损168.76→170.88, 止盈188.31→188.53 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:171.72 弱撑:176.03 弱压:193.24 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:19", - "old_action": "盈利良好 | 止损166.34 | 目标179.4 | 买入区185.6~194.88 | 信号:持有", - "new_action": "盈利良好 | 止损166.04 | 目标179.4 | 买入区185.35~194.62 | 信号:持有", - "reason": "技术面重评: 止损166.34→166.04 | 形态:长影星线/neutral 量价:买卖均衡 强撑:170.97 弱撑:185.35 弱压:198.55 强压:207", + "date": "2026-07-01 14:25", + "old_action": "盈利良好 | 止损170.88 | 目标188.53 | 买入区176.03~184.83 | 信号:持有", + "new_action": "盈利良好 | 止损170.05 | 目标188.32 | 买入区175.58~184.36 | 信号:持有", + "reason": "技术面重评: 止损170.88→170.05, 止盈188.53→188.32 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.58 弱压:192.79 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:23", - "old_action": "盈利良好 | 止损166.04 | 目标179.4 | 买入区185.35~194.62 | 信号:持有", - "new_action": "盈利良好 | 止损165.05 | 目标179.4 | 买入区184.24~193.45 | 信号:持有", - "reason": "技术面重评: 止损166.04→165.05 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.42 弱撑:184.24 弱压:197.44 强压", + "date": "2026-07-01 14:33", + "old_action": "盈利良好 | 止损170.05 | 目标188.32 | 买入区175.58~184.36 | 信号:持有", + "new_action": "盈利良好 | 止损169.98 | 目标188.18 | 买入区175.26~184.02 | 信号:持有", + "reason": "技术面重评: 止损170.05→169.98, 止盈188.32→188.18 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.26 弱压:192.47 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:27", - "old_action": "盈利良好 | 止损165.05 | 目标179.4 | 买入区184.24~193.45 | 信号:持有", - "new_action": "盈利良好 | 止损163.18 | 目标179.4 | 买入区182.81~191.95 | 信号:持有", - "reason": "技术面重评: 止损165.05→163.18 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.81 弱压:196.01 强压", + "date": "2026-07-01 14:55", + "old_action": "盈利良好 | 止损169.98 | 目标188.18 | 买入区175.26~184.02 | 信号:持有", + "new_action": "盈利良好 | 止损169.95 | 目标188.17 | 买入区175.25~184.01 | 信号:持有", + "reason": "技术面重评: 止损169.98→169.95, 止盈188.18→188.17 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.25 弱压:192.46 强压:2", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:29", - "old_action": "盈利良好 | 止损163.18 | 目标179.4 | 买入区182.81~191.95 | 信号:持有", - "new_action": "盈利良好 | 止损163.01 | 目标179.4 | 买入区182.96~192.11 | 信号:持有", - "reason": "技术面重评: 止损163.18→163.01 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.96 弱压:196.16 强压", + "date": "2026-07-01 14:58", + "old_action": "盈利良好 | 止损169.95 | 目标188.17 | 买入区175.25~184.01 | 信号:持有", + "new_action": "盈利良好 | 止损169.96 | 目标188.19 | 买入区175.29~184.05 | 信号:持有", + "reason": "技术面重评: 止损169.95→169.96, 止盈188.17→188.19 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.29 弱压:192.5 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 11:39", - "old_action": "盈利良好 | 止损163.01 | 目标179.4 | 买入区182.96~192.11 | 信号:持有", - "new_action": "盈利良好 | 止损163.26 | 目标179.4 | 买入区183.21~192.37 | 信号:持有", - "reason": "技术面重评: 止损163.01→163.26 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.9 弱撑:183.21 弱压:196.41 强压:", + "date": "2026-07-01 15:02", + "old_action": "盈利良好 | 止损169.96 | 目标188.19 | 买入区175.29~184.05 | 信号:持有", + "new_action": "盈利良好 | 止损169.99 | 目标188.19 | 买入区175.29~184.05 | 信号:持有", + "reason": "技术面重评: 止损169.96→169.99 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.29 弱压:192.5 强压:20", "trigger": "技术面重评" }, { - "date": "2026-06-29 13:01", - "old_action": "已清仓 | 卖出@189.20", - "new_action": "盈利良好 | 止损163.73 | 目标179.4 | 买入区182.99~192.14 | 信号:持有", - "reason": "技术信号变化: 持有: 止损163.26→163.73 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.99 弱压:196.19 强压", - "trigger": "技术信号变化: 持有" - }, - { - "date": "2026-06-29 13:13", - "old_action": "盈利良好 | 止损163.73 | 目标179.4 | 买入区182.99~192.14 | 信号:持有", - "new_action": "盈利良好 | 止损163.68 | 目标179.4 | 买入区184.11~193.32 | 信号:持有", - "reason": "技术面重评: 止损163.73→163.68 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.36 弱撑:184.11 弱压:197.31 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:17", - "old_action": "盈利良好 | 止损163.68 | 目标179.4 | 买入区184.11~193.32 | 信号:持有", - "new_action": "盈利良好 | 止损164.47 | 目标179.4 | 买入区183.91~193.11 | 信号:持有", - "reason": "技术面重评: 止损163.68→164.47 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.26 弱撑:183.91 弱压:197.11 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:25", - "old_action": "盈利良好 | 止损164.47 | 目标179.4 | 买入区183.91~193.11 | 信号:持有", - "new_action": "盈利良好 | 止损165.93 | 目标179.4 | 买入区184.07~193.27 | 信号:持有", - "reason": "技术面重评: 止损164.47→165.93 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.34 弱撑:184.07 弱压:197.27 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:30", - "old_action": "盈利良好 | 止损165.93 | 目标179.4 | 买入区184.07~193.27 | 信号:持有", - "new_action": "盈利良好 | 止损165.18 | 目标179.4 | 买入区184.19~193.4 | 信号:持有", - "reason": "技术面重评: 止损165.93→165.18 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.4 弱撑:184.19 弱压:197.39 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:33", - "old_action": "盈利良好 | 止损165.18 | 目标179.4 | 买入区184.19~193.4 | 信号:持有", - "new_action": "盈利良好 | 止损163.01 | 目标179.4 | 买入区182.91~192.06 | 信号:持有", - "reason": "技术面重评: 止损165.18→163.01 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.91 弱压:196.11 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:37", - "old_action": "盈利良好 | 止损163.01 | 目标179.4 | 买入区182.91~192.06 | 信号:持有", - "new_action": "盈利良好 | 止损166.18 | 目标179.4 | 买入区182.37~191.49 | 信号:持有", - "reason": "技术面重评: 止损163.01→166.18 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.37 弱压:195.57 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:41", - "old_action": "盈利良好 | 止损166.18 | 目标179.4 | 买入区182.37~191.49 | 信号:持有", - "new_action": "盈利良好 | 止损166.18 | 目标179.4 | 买入区182.59~191.72 | 信号:持有", - "reason": "技术面重评: 策略文字调整", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:45", - "old_action": "盈利良好 | 止损166.18 | 目标179.4 | 买入区182.59~191.72 | 信号:持有", - "new_action": "盈利良好 | 止损166.29 | 目标179.4 | 买入区182.86~192.0 | 信号:持有", - "reason": "技术面重评: 止损166.18→166.29 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.86 弱压:196.06 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:49", - "old_action": "盈利良好 | 止损166.29 | 目标179.4 | 买入区182.86~192.0 | 信号:持有", - "new_action": "盈利良好 | 止损166.43 | 目标179.4 | 买入区183.07~192.22 | 信号:持有", - "reason": "技术面重评: 止损166.29→166.43 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.07 弱压:196.27 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:51", - "old_action": "盈利良好 | 止损166.43 | 目标179.4 | 买入区183.07~192.22 | 信号:持有", - "new_action": "盈利良好 | 止损166.24 | 目标179.4 | 买入区182.77~191.91 | 信号:持有", - "reason": "技术面重评: 止损166.43→166.24 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.77 弱压:195.97 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:52", - "old_action": "盈利良好 | 止损166.24 | 目标179.4 | 买入区182.77~191.91 | 信号:持有", - "new_action": "盈利良好 | 止损166.32 | 目标179.4 | 买入区182.87~192.01 | 信号:持有", - "reason": "技术面重评: 止损166.24→166.32 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.87 弱压:196.07 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:55", - "old_action": "盈利良好 | 止损166.32 | 目标179.4 | 买入区182.87~192.01 | 信号:持有", - "new_action": "盈利良好 | 止损166.27 | 目标179.4 | 买入区183.06~192.21 | 信号:持有", - "reason": "技术面重评: 止损166.32→166.27 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.06 弱压:196.26 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:57", - "old_action": "盈利良好 | 止损166.27 | 目标179.4 | 买入区183.06~192.21 | 信号:持有", - "new_action": "盈利良好 | 止损166.29 | 目标179.4 | 买入区183.04~192.19 | 信号:持有", - "reason": "技术面重评: 止损166.27→166.29 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.04 弱压:196.24 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:59", - "old_action": "盈利良好 | 止损166.29 | 目标179.4 | 买入区183.04~192.19 | 信号:持有", - "new_action": "盈利良好 | 止损166.52 | 目标179.4 | 买入区183.15~192.31 | 信号:持有", - "reason": "技术面重评: 止损166.29→166.52 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.15 弱压:196.35 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:01", - "old_action": "盈利良好 | 止损166.52 | 目标179.4 | 买入区183.15~192.31 | 信号:持有", - "new_action": "盈利良好 | 止损166.37 | 目标179.4 | 买入区183.1~192.25 | 信号:持有", - "reason": "技术面重评: 止损166.52→166.37 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.1 弱压:196.3 强压:2", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:05", - "old_action": "盈利良好 | 止损166.37 | 目标179.4 | 买入区183.1~192.25 | 信号:持有", - "new_action": "盈利良好 | 止损166.1 | 目标179.4 | 买入区182.81~191.95 | 信号:持有", - "reason": "技术面重评: 止损166.37→166.1 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.81 弱压:196.01 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:07", - "old_action": "盈利良好 | 止损166.1 | 目标179.4 | 买入区182.81~191.95 | 信号:持有", - "new_action": "盈利良好 | 止损162.67 | 目标179.4 | 买入区182.45~191.57 | 信号:持有", - "reason": "技术面重评: 止损166.1→162.67 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.45 弱压:195.65 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:11", - "old_action": "盈利良好 | 止损162.67 | 目标179.4 | 买入区182.45~191.57 | 信号:持有", - "new_action": "盈利良好 | 止损162.4 | 目标179.4 | 买入区182.77~191.91 | 信号:持有", - "reason": "技术面重评: 止损162.67→162.4 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.77 弱压:195.97 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:15", - "old_action": "盈利良好 | 止损162.4 | 目标179.4 | 买入区182.77~191.91 | 信号:持有", - "new_action": "盈利良好 | 止损162.36 | 目标179.4 | 买入区182.57~191.7 | 信号:持有", - "reason": "技术面重评: 止损162.4→162.36 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.57 弱压:195.77 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:19", - "old_action": "盈利良好 | 止损162.36 | 目标179.4 | 买入区182.57~191.7 | 信号:持有", - "new_action": "盈利良好 | 止损162.5 | 目标179.4 | 买入区182.58~191.71 | 信号:持有", - "reason": "技术面重评: 止损162.36→162.5 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.58 弱压:195.78 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:32", - "old_action": "盈利良好 | 止损162.5 | 目标179.4 | 买入区182.58~191.71 | 信号:持有", - "new_action": "盈利良好 | 止损162.2 | 目标179.4 | 买入区182.34~191.46 | 信号:持有", - "reason": "技术面重评: 止损162.5→162.2 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.34 弱压:195.54 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:35", - "old_action": "盈利良好 | 止损162.2 | 目标179.4 | 买入区182.34~191.46 | 信号:持有", - "new_action": "盈利良好 | 止损161.85 | 目标179.4 | 买入区182.09~191.19 | 信号:持有", - "reason": "技术面重评: 止损162.2→161.85 | 形态:带上影阴线/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.09 弱压:195.29 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:37", - "old_action": "盈利良好 | 止损161.85 | 目标179.4 | 买入区182.09~191.19 | 信号:持有", - "new_action": "盈利良好 | 止损165.32 | 目标179.4 | 买入区182.23~191.34 | 信号:持有", - "reason": "技术面重评: 止损161.85→165.32 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.23 弱压:195.43 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:39", - "old_action": "盈利良好 | 止损165.32 | 目标179.4 | 买入区182.23~191.34 | 信号:持有", - "new_action": "盈利良好 | 止损165.56 | 目标179.4 | 买入区182.24~191.35 | 信号:持有", - "reason": "技术面重评: 止损165.32→165.56 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.24 弱压:195.44 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:41", - "old_action": "盈利良好 | 止损165.56 | 目标179.4 | 买入区182.24~191.35 | 信号:持有", - "new_action": "盈利良好 | 止损165.35 | 目标179.4 | 买入区182.21~191.32 | 信号:持有", - "reason": "技术面重评: 止损165.56→165.35 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.21 弱压:195.41 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:43", - "old_action": "盈利良好 | 止损165.35 | 目标179.4 | 买入区182.21~191.32 | 信号:持有", - "new_action": "盈利良好 | 止损165.14 | 目标179.4 | 买入区182.08~191.18 | 信号:持有", - "reason": "技术面重评: 止损165.35→165.14 | 形态:带上影阴线/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.08 弱压:195.28 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:45", - "old_action": "盈利良好 | 止损165.14 | 目标179.4 | 买入区182.08~191.18 | 信号:持有", - "new_action": "盈利良好 | 止损165.11 | 目标179.4 | 买入区182.13~191.24 | 信号:持有", - "reason": "技术面重评: 止损165.14→165.11 | 形态:带上影阴线/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.13 弱压:195.33 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:47", - "old_action": "盈利良好 | 止损165.11 | 目标179.4 | 买入区182.13~191.24 | 信号:持有", - "new_action": "盈利良好 | 止损165.48 | 目标179.4 | 买入区182.72~191.86 | 信号:持有", - "reason": "技术面重评: 止损165.11→165.48 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:182.72 弱压:195.92 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:49", - "old_action": "盈利良好 | 止损165.48 | 目标179.4 | 买入区182.72~191.86 | 信号:持有", - "new_action": "盈利良好 | 止损165.98 | 目标179.4 | 买入区183.26~192.42 | 信号:持有", - "reason": "技术面重评: 止损165.48→165.98 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.93 弱撑:183.26 弱压:196.46 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:51", - "old_action": "盈利良好 | 止损165.98 | 目标179.4 | 买入区183.26~192.42 | 信号:持有", - "new_action": "盈利良好 | 止损167.12 | 目标179.4 | 买入区183.59~192.77 | 信号:持有", - "reason": "技术面重评: 止损165.98→167.12 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.09 弱撑:183.59 弱压:196.79 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:53", - "old_action": "盈利良好 | 止损167.12 | 目标179.4 | 买入区183.59~192.77 | 信号:持有", - "new_action": "盈利良好 | 止损167.26 | 目标179.4 | 买入区183.65~192.83 | 信号:持有", - "reason": "技术面重评: 止损167.12→167.26 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.12 弱撑:183.65 弱压:196.85 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:57", - "old_action": "盈利良好 | 止损167.26 | 目标179.4 | 买入区183.65~192.83 | 信号:持有", - "new_action": "盈利良好 | 止损166.39 | 目标179.4 | 买入区183.02~192.17 | 信号:持有", - "reason": "技术面重评: 止损167.26→166.39 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:169.88 弱撑:183.02 弱压:196.22 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 15:01", - "old_action": "盈利良好 | 止损166.39 | 目标179.4 | 买入区183.02~192.17 | 信号:持有", - "new_action": "盈利良好 | 止损167.33 | 目标179.4 | 买入区183.73~192.92 | 信号:持有", - "reason": "技术面重评: 止损166.39→167.33 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.17 弱撑:183.73 弱压:196.93 强压", - "trigger": "技术面重评" - }, - { - "time": "2026-06-29 21:30", - "from": 0, - "to": 100, - "reason": "reconciliation: 股数与券商一致" - }, - { - "date": "2026-06-30 09:18", - "old_action": "盈利良好 | 止损167.33 | 目标207.64 | 买入区183.73~192.92 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损178.18 | 目标0 | 买入区170.43~198.84 | 信号:持有", - "reason": "技术面重评: 止损167.33→178.18 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 09:22", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损178.18 | 目标0 | 买入区170.43~198.84 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损176.89 | 目标0 | 买入区169.2~197.4 | 信号:持有", - "reason": "技术面重评: 止损178.18→176.89 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 09:51", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损176.89 | 目标0 | 买入区169.2~197.4 | 信号:持有", - "new_action": "盈利良好 | 止损181.78 | 目标200.01 | 买入区186.22~195.53 | 信号:持有", - "reason": "技术面重评: 止损176.89→181.78 | 形态:光头光脚阳线/neutral 量价:买卖均衡 强撑:170.46 弱撑:186.22 弱压:197.8 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 09:57", - "old_action": "盈利良好 | 止损181.78 | 目标200.01 | 买入区186.22~195.53 | 信号:持有", - "new_action": "盈利良好 | 止损187.31 | 目标200.01 | 买入区186.3~195.62 | 信号:持有", - "reason": "技术面重评: 止损181.78→187.31 | 形态:光头光脚阳线/neutral 量价:买卖均衡 强撑:170.46 弱撑:186.3 弱压:197.88 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 10:00", - "old_action": "盈利良好 | 止损187.31 | 目标200.01 | 买入区186.3~195.62 | 信号:持有", - "new_action": "盈利良好 | 止损187.45 | 目标200.01 | 买入区186.5~195.83 | 信号:持有", - "reason": "技术面重评: 止损187.31→187.45 | 形态:光头光脚阳线/neutral 量价:买卖均衡 强撑:170.46 弱撑:186.5 弱压:198.08 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 10:11", - "old_action": "盈利良好 | 止损187.45 | 目标200.01 | 买入区186.5~195.83 | 信号:持有", - "new_action": "盈利良好 | 止损186.17 | 目标200.01 | 买入区185.17~194.43 | 信号:持有", - "reason": "技术面重评: 止损187.45→186.17 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:170.46 弱撑:185.17 弱压:196.75 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 10:17", - "old_action": "盈利良好 | 止损186.17 | 目标200.01 | 买入区185.17~194.43 | 信号:持有", - "new_action": "盈利良好 | 止损182.59 | 目标206.01 | 买入区183.49~192.66 | 信号:持有", - "reason": "技术面重评: 止损186.17→182.59, 止盈200.01→206.01 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:183.49 弱压:195.07 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 10:32", - "old_action": "盈利良好 | 止损182.59 | 目标206.01 | 买入区183.49~192.66 | 信号:持有", - "new_action": "盈利良好 | 止损183.7 | 目标206.01 | 买入区184.17~193.38 | 信号:持有", - "reason": "技术面重评: 止损182.59→183.7 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:170.46 弱撑:184.17 弱压:195.75 强压:20", - "trigger": "技术面重评" - }, - { - "date": "2026-06-30 10:57", - "old_action": "盈利良好 | 止损183.7 | 目标206.01 | 买入区184.17~193.38 | 信号:持有", - "new_action": "盈利良好 | 止损183.98 | 目标206.01 | 买入区183.44~192.61 | 信号:持有", - "reason": "技术面重评: 止损183.7→183.98 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:183.44 弱压:195.02 强压", - "trigger": "技术面重评" + "date": "2026-07-01", + "change": "止损上移: 169.99→174.5(股价今日触止盈188.19后回撤至182.55,上移止损保护+18.6%利润)" } - ] + ], + "current": "盈利持有 | 止损174.50 | 止盈188.19" }, { "code": "601318", "name": "中国平安", - "price": 47.51, + "price": 49.53, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标50.56 | 止损46.08 | 买入区46.56~47.87 | 信号:观望", - "stop_loss": 46.08, - "entry_low": 46.56, - "entry_high": 47.87, - "tech_snapshot": "形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:45.38 弱撑:46.99 弱压:48.6 强压:50.56 | MA5=68.06 MA10=69.1 MA20=66.87 MA60=63.21", + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.54~49.65 | 信号:观望", + "stop_loss": 47.74, + "entry_low": 48.54, + "entry_high": 49.65, + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.97 弱撑:47.74 弱压:50.68 强压:52.51 | MA5=68.37 MA10=68.78 MA20=66.54 MA60=62.97", "timing_signal": "观望", - "rr_ratio": 2.13, + "rr_ratio": 1.66, "status": "updated", - "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "note": "⚠️盈亏比偏低(1:1.7),谨慎买入", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "自选策略", "source": "auto", "sector_context": "", @@ -48779,14 +50383,14 @@ "position_advice": "减仓或观望", "time_horizon": "观望", "trigger": { - "stop_loss": 46.18, - "entry_zone": "46.66~48.55", - "take_profit_zone": "0~52.1" + "stop_loss": 47.74, + "entry_zone": "48.54~49.65", + "take_profit_zone": "0~52.51" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 47.51, - "take_profit": 50.56, - "updated_reason": "技术面重评: 止损46.31→46.18 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:43.94 弱撑:47.09 弱压:48.6 强压:52.1", + "last_reassessed_price": 49.62, + "take_profit": 52.51, + "updated_reason": "技术面重评: 策略文字调整", "changelog": [ { "date": "2026-06-24 14:24", @@ -50481,145 +52085,322 @@ "new_action": "盈利持有 | 目标52.1 | 止损46.18 | 买入区46.66~48.55 | 信号:观望", "reason": "技术面重评: 止损46.31→46.18 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:43.94 弱撑:47.09 弱压:48.6 强压:52.1", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标50.56 | 止损46.08 | 买入区46.56~47.87 | 信号:观望", + "new_action": "盈利持有 | 目标50.6 | 止损46.31 | 买入区46.79~48.03 | 信号:观望", + "reason": "技术面重评: 止损46.08→46.31 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:45.42 弱撑:47.08 弱压:48.67 强压:50.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:17", + "old_action": "盈利持有 | 目标50.6 | 止损46.31 | 买入区46.79~48.03 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损45.88 | 买入区46.83~48.75 | 信号:观望", + "reason": "技术面重评: 止损46.31→45.88 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损45.88 | 买入区46.83~48.75 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损45.83 | 买入区46.79~48.69 | 信号:观望", + "reason": "技术面重评: 止损45.88→45.83 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:33", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损45.83 | 买入区46.79~48.69 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.25 | 止损46.32 | 买入区46.8~47.89 | 信号:观望", + "reason": "技术面重评: 止损45.83→46.32 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:45.07 弱撑:47.46 弱压:47.84 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.25 | 止损46.32 | 买入区46.8~47.89 | 信号:观望", + "new_action": "盈利持有 | 目标51.28 | 止损45.95 | 买入区46.42~48.08 | 信号:观望", + "reason": "技术面重评: 止损46.32→45.95 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:43.7 弱撑:47.13 弱压:47.74 强压:51.2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标51.28 | 止损45.95 | 买入区46.42~48.08 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标50.22 | 止损46.28 | 买入区46.76~47.86 | 信号:观望", + "reason": "技术面重评: 止损45.95→46.28 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:45.04 弱撑:47.39 弱压:47.99 强压:5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标50.22 | 止损46.28 | 买入区46.76~47.86 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标50.16 | 止损46.19 | 买入区46.67~47.78 | 信号:观望", + "reason": "技术面重评: 止损46.28→46.19 | 形态:十字星/neutral 量价:主动卖盘占优 强撑:44.98 弱撑:47.29 弱压:47.89 强压:50.16", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标50.16 | 止损46.19 | 买入区46.67~47.78 | 信号:观望", + "new_action": "盈利持有 | 目标51.22 | 止损45.81 | 买入区46.29~47.97 | 信号:观望", + "reason": "技术面重评: 止损46.19→45.81 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:43.66 弱撑:47.01 弱压:47.74 强压:51.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标51.22 | 止损45.81 | 买入区46.29~47.97 | 信号:观望", + "new_action": "盈利持有 | 目标51.21 | 止损45.79 | 买入区46.27~47.96 | 信号:观望", + "reason": "技术面重评: 止损45.81→45.79 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:43.65 弱撑:46.99 弱压:47.74 强压:51.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | 目标51.21 | 止损45.79 | 买入区46.27~47.96 | 信号:观望", + "new_action": "盈利持有 | 目标50.11 | 止损45.82 | 买入区46.3~47.54 | 信号:观望", + "reason": "技术面重评: 止损45.79→45.82 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:44.93 弱撑:47.19 弱压:47.86 强压:5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标50.11 | 止损45.82 | 买入区46.3~47.54 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.18 | 止损46.28 | 买入区46.76~47.84 | 信号:观望", + "reason": "技术面重评: 止损45.82→46.28 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:45.0 弱撑:47.31 弱压:47.98 强压:50", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.18 | 止损46.28 | 买入区46.76~47.84 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标50.23 | 止损46.44 | 买入区46.92~47.96 | 信号:观望", + "reason": "技术面重评: 止损46.28→46.44 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:45.05 弱撑:47.33 弱压:48.08 强压:5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标50.23 | 止损46.44 | 买入区46.92~47.96 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.22 | 止损46.33 | 买入区46.8~47.89 | 信号:观望", + "reason": "技术面重评: 止损46.44→46.33 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:45.04 弱撑:47.32 弱压:48.07 强压:5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.22 | 止损46.33 | 买入区46.8~47.89 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标50.12 | 止损46.05 | 买入区46.52~47.68 | 信号:观望", + "reason": "技术面重评: 止损46.33→46.05 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:44.94 弱撑:47.12 弱压:47.87 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标50.12 | 止损46.05 | 买入区46.52~47.68 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标50.2 | 止损46.07 | 买入区46.55~47.72 | 信号:观望", + "reason": "技术面重评: 止损46.05→46.07 | 形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:45.02 弱撑:47.27 弱压:48.02 强压:5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:09", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标50.2 | 止损46.07 | 买入区46.55~47.72 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.44 | 止损46.54 | 买入区47.02~48.1 | 信号:观望", + "reason": "技术面重评: 止损46.07→46.54 | 形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:45.08 弱撑:47.43 弱压:48.32 强压:50.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标50.44 | 止损46.54 | 买入区47.02~48.1 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.71 | 止损47.17 | 买入区47.66~48.59 | 信号:观望", + "reason": "技术面重评: 止损46.54→47.17 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.53 弱撑:47.58 弱压:49.04 强压:50", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.71 | 止损47.17 | 买入区47.66~48.59 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.95 | 止损47.38 | 买入区47.87~48.81 | 信号:观望", + "reason": "技术面重评: 止损47.17→47.38 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.77 弱撑:47.74 弱压:49.53 强压:50", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.95 | 止损47.38 | 买入区47.87~48.81 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.95 | 止损47.48 | 买入区47.97~48.87 | 信号:观望", + "reason": "技术面重评: 止损47.38→47.48 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.77 弱撑:47.72 弱压:49.52 强压:50", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.95 | 止损47.48 | 买入区47.97~48.87 | 信号:观望", + "new_action": "盈利持有 | 目标52.45 | 止损47.56 | 买入区48.05~49.52 | 信号:观望", + "reason": "技术面重评: 止损47.48→47.56 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.59 弱撑:47.74 弱压:49.85 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利持有 | 目标52.45 | 止损47.56 | 买入区48.05~49.52 | 信号:观望", + "new_action": "盈利持有 | 目标52.48 | 止损47.72 | 买入区48.22~49.62 | 信号:观望", + "reason": "技术面重评: 止损47.56→47.72 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.61 弱撑:47.74 弱压:49.9 强压:52.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | 目标52.48 | 止损47.72 | 买入区48.22~49.62 | 信号:观望", + "new_action": "盈利持有 | 目标52.45 | 止损47.74 | 买入区48.25~49.62 | 信号:观望", + "reason": "技术面重评: 止损47.72→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.59 弱撑:47.74 弱压:49.85 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | 目标52.45 | 止损47.74 | 买入区48.25~49.62 | 信号:观望", + "new_action": "盈利持有 | 目标52.46 | 止损47.69 | 买入区48.19~49.6 | 信号:观望", + "reason": "技术面重评: 止损47.74→47.69 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.6 弱撑:47.74 弱压:49.87 强压:52.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | 目标52.46 | 止损47.69 | 买入区48.19~49.6 | 信号:观望", + "new_action": "盈利持有 | 目标52.51 | 止损47.74 | 买入区48.28~49.65 | 信号:观望", + "reason": "技术面重评: 止损47.69→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.65 弱撑:47.74 弱压:49.99 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | 目标52.43 | 止损47.54 | 买入区48.03~49.5 | 信号:观望", + "new_action": "盈利持有 | 目标52.47 | 止损47.65 | 买入区48.14~49.58 | 信号:观望", + "reason": "技术面重评: 止损47.54→47.65 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.61 弱撑:47.74 弱压:49.89 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利持有 | 目标52.47 | 止损47.65 | 买入区48.14~49.58 | 信号:观望", + "new_action": "盈利持有 | 目标52.51 | 止损47.74 | 买入区48.24~49.65 | 信号:观望", + "reason": "技术面重评: 止损47.65→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.65 弱撑:47.74 弱压:49.98 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "盈利持有 | 目标52.51 | 止损47.74 | 买入区48.24~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.39~49.65 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.39~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.43~49.65 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.43~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标52.51 | 止损47.74 | 买入区48.82~49.65 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标52.51 | 止损47.74 | 买入区48.82~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标52.03 | 止损47.59 | 买入区48.35~49.37 | 信号:观望", + "reason": "技术面重评: 止损47.74→47.59 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.65 弱撑:47.59 弱压:50.49 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标52.03 | 止损47.59 | 买入区48.35~49.37 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.51~49.65 | 信号:观望", + "reason": "技术面重评: 止损47.59→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.97 弱撑:47.74 弱压:50.68 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.63~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标52.51 | 止损47.74 | 买入区48.7~49.65 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:07", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标52.51 | 止损47.74 | 买入区48.7~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.44~49.46 | 信号:观望", + "reason": "技术面重评: 止损47.74→47.71 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.71 弱撑:47.71 弱压:50.61 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.5),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.44~49.46 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.43~49.46 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.43~49.46 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.37~49.46 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.09 | 止损47.71 | 买入区48.37~49.46 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.49~49.65 | 信号:观望", + "reason": "技术面重评: 止损47.71→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.96 弱撑:47.74 弱压:50.65 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.49~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.08 | 止损47.7 | 买入区48.41~49.45 | 信号:观望", + "reason": "技术面重评: 止损47.74→47.7 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.7 弱撑:47.7 弱压:50.6 强压:52.08", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.08 | 止损47.7 | 买入区48.41~49.45 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.08 | 止损47.69 | 买入区48.39~49.45 | 信号:观望", + "reason": "技术面重评: 止损47.7→47.69 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.7 弱撑:47.69 弱压:50.59 强压:52.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标52.08 | 止损47.69 | 买入区48.39~49.45 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.55~49.65 | 信号:观望", + "reason": "技术面重评: 止损47.69→47.74 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:44.97 弱撑:47.74 弱压:50.68 强压:52", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.55~49.65 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标52.51 | 止损47.74 | 买入区48.54~49.65 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } - ], - "strategy_tree": { - "branches": [ - { - "id": "601318_stop_loss", - "condition": { - "price": "<46.08" - }, - "action": { - "type": "sell", - "amount": "all", - "reason": "止损" - }, - "priority": 0, - "rationale": "止损保护本金", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "601318_buy_dip", - "condition": { - "scenario": "weak_consolidation", - "price": "<=47.87", - "price_lower": ">=46.56" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": 46.56, - "reason": "回调支撑买入" - }, - "priority": 1, - "rationale": "价格回调到支撑区,弱势市场低吸", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "601318_breakout_chase", - "condition": { - "scenario": "bullish_recovery", - "price": ">=50.56" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": "market", - "reason": "突破确认追涨" - }, - "priority": 2, - "rationale": "价格突破阻力,确认上升趋势后买入", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "601318_trim", - "condition": { - "scenario": "sharp_decline", - "loss_pct": "<-15%" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "急跌降风险" - }, - "priority": 3, - "rationale": "急跌市场,深套股减半仓减少敞口", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "601318_take_profit", - "condition": { - "price": ">=50.56" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "止盈锁利" - }, - "priority": 4, - "rationale": "达到目标价,减半仓锁定利润", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "601318_hold", - "condition": {}, - "action": { - "type": "hold", - "reason": "无明确信号,继续持有" - }, - "priority": 99, - "rationale": "没有分支匹配时的默认动作", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - } - ] - } + ] }, { "code": "601899", "name": "紫金矿业", - "price": 24.98, + "price": 25.11, "cost": 40.27, "shares": 2400, "avg_price": 40.27, - "action": "深套持有 | 深套持有 | 止损21.6 | 目标24.6 | 买入区22.48~26.23 | 信号:持有", - "stop_loss": 21.6, - "entry_low": 22.48, - "entry_high": 26.23, - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:23.21 弱撑:24.68 弱压:25.79 强压:26.97 | MA5=32.84 MA10=34.55 MA20=35.97 MA60=36.49", + "action": "深套持有 | 深套持有 | 止损23.07 | 目标25.51 | 买入区22.6~26.37 | 信号:持有", + "stop_loss": 23.07, + "entry_low": 22.6, + "entry_high": 26.37, + "tech_snapshot": "形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 | MA5=33.51 MA10=35.08 MA20=36.34 MA60=36.5", "timing_signal": "持有", - "rr_ratio": 0.53, + "rr_ratio": 0.39, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业工业金属下跌-1.5%,适度防御", + "sector_context": "行业工业金属上涨+1.1%,正常", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 21.6, - "entry_zone": "22.48~26.23", - "take_profit_zone": "0~24.6" + "stop_loss": 23.07, + "entry_zone": "22.6~26.37", + "take_profit_zone": "0~25.51" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 25.79, - "take_profit": 24.6, - "updated_reason": "技术面重评: 止损22.32→21.6, 止盈25.55→24.6 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:23.21 弱撑:24.68 弱压:25.79 强压:2", + "take_profit": 25.51, + "updated_reason": "技术面重评: 止损22.61→23.07, 止盈25.5→25.51 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 ", "changelog": [ { "date": "2026-06-18 11:31", @@ -52405,42 +54186,322 @@ "new_action": "深套持有 | 深套持有 | 止损21.6 | 目标24.6 | 买入区22.48~26.23 | 信号:持有", "reason": "技术面重评: 止损22.32→21.6, 止盈25.55→24.6 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:23.21 弱撑:24.68 弱压:25.79 强压:2", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "深套持有 | 深套持有 | 止损21.6 | 目标24.6 | 买入区22.48~26.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.65 | 目标25.6 | 买入区22.63~26.4 | 信号:持有", + "reason": "技术面重评: 止损21.6→22.65, 止盈24.6→25.6 | 形态:锤子线/T字线/neutral 量价:主动买盘占优 强撑:23.4 弱撑:24.81 弱压:25.79 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:18", + "old_action": "深套持有 | 深套持有 | 止损22.65 | 目标25.6 | 买入区22.63~26.4 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.65 | 目标0 | 买入区22.63~26.4 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "深套持有 | 深套持有 | 止损22.65 | 目标0 | 买入区22.63~26.4 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.53 | 目标0 | 买入区22.5~26.25 | 信号:持有", + "reason": "技术面重评: 止损22.65→22.53 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "深套持有 | 深套持有 | 止损22.53 | 目标0 | 买入区22.5~26.25 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.2 | 目标25.58 | 买入区22.17~25.86 | 信号:持有", + "reason": "技术面重评: 止损22.53→22.2 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.72 弱撑:24.5 弱压:25.14 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "深套持有 | 深套持有 | 止损22.2 | 目标25.58 | 买入区22.17~25.86 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.16 | 目标25.58 | 买入区22.14~25.83 | 信号:持有", + "reason": "技术面重评: 止损22.2→22.16 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.71 弱撑:24.49 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "深套持有 | 深套持有 | 止损22.16 | 目标25.58 | 买入区22.14~25.83 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.21 | 目标25.63 | 买入区22.18~25.88 | 信号:持有", + "reason": "技术面重评: 止损22.16→22.21, 止盈25.58→25.63 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:22.74 弱撑:24.57 弱压:25.14 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "深套持有 | 深套持有 | 止损22.21 | 目标25.63 | 买入区22.18~25.88 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.2 | 目标25.59 | 买入区22.18~25.87 | 信号:持有", + "reason": "技术面重评: 止损22.21→22.2, 止盈25.63→25.59 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.72 弱撑:24.5 弱压:25.14 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "深套持有 | 深套持有 | 止损22.2 | 目标25.59 | 买入区22.18~25.87 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.15 | 目标25.53 | 买入区22.13~25.82 | 信号:持有", + "reason": "技术面重评: 止损22.2→22.15, 止盈25.59→25.53 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.67 弱撑:24.38 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "深套持有 | 深套持有 | 止损22.15 | 目标25.53 | 买入区22.13~25.82 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.06 | 目标25.52 | 买入区22.03~25.7 | 信号:持有", + "reason": "技术面重评: 止损22.15→22.06, 止盈25.53→25.52 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.66 弱撑:24.37 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "深套持有 | 深套持有 | 止损22.06 | 目标25.52 | 买入区22.03~25.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.15 | 目标25.5 | 买入区22.13~25.82 | 信号:持有", + "reason": "技术面重评: 止损22.06→22.15, 止盈25.52→25.5 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.64 弱撑:24.34 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损22.15 | 目标25.5 | 买入区22.13~25.82 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.05 | 目标25.53 | 买入区22.02~25.69 | 信号:持有", + "reason": "技术面重评: 止损22.15→22.05, 止盈25.5→25.53 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.66 弱撑:24.38 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "深套持有 | 深套持有 | 止损22.05 | 目标25.53 | 买入区22.02~25.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.19 | 目标25.56 | 买入区22.16~25.85 | 信号:持有", + "reason": "技术面重评: 止损22.05→22.19, 止盈25.53→25.56 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:22.68 弱撑:24.44 弱压:25.14 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "深套持有 | 深套持有 | 止损22.19 | 目标25.56 | 买入区22.16~25.85 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.11 | 目标25.52 | 买入区22.09~25.77 | 信号:持有", + "reason": "技术面重评: 止损22.19→22.11, 止盈25.56→25.52 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.66 弱撑:24.36 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "深套持有 | 深套持有 | 止损22.11 | 目标25.52 | 买入区22.09~25.77 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.07 | 目标25.49 | 买入区22.04~25.71 | 信号:持有", + "reason": "技术面重评: 止损22.11→22.07, 止盈25.52→25.49 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.64 弱撑:24.32 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "深套持有 | 深套持有 | 止损22.07 | 目标25.49 | 买入区22.04~25.71 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.08 | 目标25.49 | 买入区22.06~25.74 | 信号:持有", + "reason": "技术面重评: 止损22.07→22.08 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:22.64 弱撑:24.32 弱压:25.14 强压:26", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "深套持有 | 深套持有 | 止损22.08 | 目标25.49 | 买入区22.06~25.74 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.16 | 目标25.54 | 买入区22.14~25.83 | 信号:持有", + "reason": "技术面重评: 止损22.08→22.16, 止盈25.49→25.54 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:22.66 弱撑:24.39 弱压:25.14 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "深套持有 | 深套持有 | 止损22.16 | 目标25.54 | 买入区22.14~25.83 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.29 | 目标25.59 | 买入区22.27~25.98 | 信号:持有", + "reason": "技术面重评: 止损22.16→22.29, 止盈25.54→25.59 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:22.71 弱撑:24.44 弱压:25.14 强压:2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "深套持有 | 深套持有 | 止损22.29 | 目标25.59 | 买入区22.27~25.98 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.4 | 目标25.29 | 买入区22.37~26.1 | 信号:持有", + "reason": "技术面重评: 止损22.29→22.4, 止盈25.59→25.29 | 形态:锤子线/T字线/neutral 量价:主动买盘占优 强撑:23.19 弱撑:24.58 弱压:25.14 强压:2", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "深套持有 | 深套持有 | 止损22.4 | 目标25.29 | 买入区22.37~26.1 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.67 | 目标25.44 | 买入区22.65~26.43 | 信号:持有", + "reason": "技术面重评: 止损22.4→22.67, 止盈25.29→25.44 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.42 弱撑:24.66 弱压:25.49 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "深套持有 | 深套持有 | 止损22.67 | 目标25.44 | 买入区22.65~26.43 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.65 | 目标25.45 | 买入区22.63~26.4 | 信号:持有", + "reason": "技术面重评: 止损22.67→22.65, 止盈25.44→25.45 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.43 弱撑:24.69 弱压:25.52 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "深套持有 | 深套持有 | 止损22.65 | 目标25.45 | 买入区22.63~26.4 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.74 | 目标25.44 | 买入区22.71~26.49 | 信号:持有", + "reason": "技术面重评: 止损22.65→22.74, 止盈25.45→25.44 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.42 弱撑:24.62 弱压:25.49 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "深套持有 | 深套持有 | 止损22.74 | 目标25.44 | 买入区22.71~26.49 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.77 | 目标25.45 | 买入区22.74~26.53 | 信号:持有", + "reason": "技术面重评: 止损22.74→22.77, 止盈25.44→25.45 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.43 弱撑:24.64 弱压:25.51 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "深套持有 | 深套持有 | 止损22.77 | 目标25.45 | 买入区22.74~26.53 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.67 | 目标25.44 | 买入区22.65~26.43 | 信号:持有", + "reason": "技术面重评: 止损22.77→22.67, 止盈25.45→25.44 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.42 弱撑:24.63 弱压:25.5 强压:26.5", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "深套持有 | 深套持有 | 止损22.67 | 目标25.44 | 买入区22.65~26.43 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.66 | 目标25.43 | 买入区22.63~26.41 | 信号:持有", + "reason": "技术面重评: 止损22.67→22.66, 止盈25.44→25.43 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.41 弱撑:24.61 弱压:25.48 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "深套持有 | 深套持有 | 止损22.66 | 目标25.43 | 买入区22.63~26.41 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.07 | 目标25.43 | 买入区22.59~26.36 | 信号:持有", + "reason": "技术面重评: 止损22.66→23.07 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.41 弱撑:24.62 弱压:25.49 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "深套持有 | 深套持有 | 止损23.07 | 目标25.43 | 买入区22.59~26.36 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.44 | 目标25.63 | 买入区22.96~26.79 | 信号:持有", + "reason": "技术面重评: 止损23.07→23.44, 止盈25.43→25.63 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.62 弱撑:24.77 弱压:25.9 强压:26.7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "深套持有 | 深套持有 | 止损23.44 | 目标25.63 | 买入区22.96~26.79 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.37 | 目标25.61 | 买入区22.88~26.69 | 信号:持有", + "reason": "技术面重评: 止损23.44→23.37, 止盈25.63→25.61 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.6 弱撑:24.74 弱压:25.87 强压:26.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "深套持有 | 深套持有 | 止损23.37 | 目标25.61 | 买入区22.88~26.69 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.41 | 目标25.61 | 买入区22.92~26.74 | 信号:持有", + "reason": "技术面重评: 止损23.37→23.41 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.6 弱撑:24.74 弱压:25.87 强压:26.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "深套持有 | 深套持有 | 止损23.41 | 目标25.61 | 买入区22.92~26.74 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.38 | 目标25.61 | 买入区22.9~26.71 | 信号:持有", + "reason": "技术面重评: 止损23.41→23.38 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.6 弱撑:24.74 弱压:25.87 强压:26.6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "深套持有 | 深套持有 | 止损23.38 | 目标25.61 | 买入区22.9~26.71 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.18 | 目标25.53 | 买入区22.7~26.48 | 信号:持有", + "reason": "技术面重评: 止损23.38→23.18, 止盈25.61→25.53 | 形态:带上影阳线/neutral 量价:主动买盘占优 强撑:23.51 弱撑:24.56 弱压:25.69 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "深套持有 | 深套持有 | 止损23.18 | 目标25.53 | 买入区22.7~26.48 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.17 | 目标25.54 | 买入区22.69~26.47 | 信号:持有", + "reason": "技术面重评: 止损23.18→23.17, 止盈25.53→25.54 | 形态:带下影阳线/neutral 量价:主动买盘占优 强撑:23.52 弱撑:24.58 弱压:25.71 强压:26.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "深套持有 | 深套持有 | 止损23.17 | 目标25.54 | 买入区22.69~26.47 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.69 | 目标25.53 | 买入区22.67~26.45 | 信号:持有", + "reason": "技术面重评: 止损23.17→22.69, 止盈25.54→25.53 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.51 弱撑:24.54 弱压:25.67 强压:26.59", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "深套持有 | 深套持有 | 止损22.69 | 目标25.53 | 买入区22.67~26.45 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.64 | 目标25.51 | 买入区22.62~26.39 | 信号:持有", + "reason": "技术面重评: 止损22.69→22.64, 止盈25.53→25.51 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "深套持有 | 深套持有 | 止损22.64 | 目标25.51 | 买入区22.62~26.39 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.62 | 目标25.51 | 买入区22.59~26.36 | 信号:持有", + "reason": "技术面重评: 止损22.64→22.62 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.52 弱压:25.65 强压:26.57", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "深套持有 | 深套持有 | 止损22.62 | 目标25.51 | 买入区22.59~26.36 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.03 | 目标25.5 | 买入区22.55~26.31 | 信号:持有", + "reason": "技术面重评: 止损22.62→23.03, 止盈25.51→25.5 | 形态:倒T线/射击之星/neutral 量价:主动买盘占优 强撑:23.48 弱撑:24.49 弱压:25.62 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "深套持有 | 深套持有 | 止损23.03 | 目标25.5 | 买入区22.55~26.31 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.07 | 目标25.51 | 买入区22.59~26.36 | 信号:持有", + "reason": "技术面重评: 止损23.03→23.07, 止盈25.5→25.51 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "深套持有 | 深套持有 | 止损23.07 | 目标25.51 | 买入区22.59~26.36 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.04 | 目标25.5 | 买入区22.56~26.32 | 信号:持有", + "reason": "技术面重评: 止损23.07→23.04, 止盈25.51→25.5 | 形态:倒T线/射击之星/neutral 量价:主动买盘占优 强撑:23.48 弱撑:24.48 弱压:25.61 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "深套持有 | 深套持有 | 止损23.04 | 目标25.5 | 买入区22.56~26.32 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.61 | 目标25.51 | 买入区22.58~26.34 | 信号:持有", + "reason": "技术面重评: 止损23.04→22.61, 止盈25.5→25.51 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "深套持有 | 深套持有 | 止损22.61 | 目标25.51 | 买入区22.58~26.34 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损22.61 | 目标25.5 | 买入区22.58~26.34 | 信号:持有", + "reason": "技术面重评: 止盈25.51→25.5 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.48 弱撑:24.5 弱压:25.63 强压:26.56 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "深套持有 | 深套持有 | 止损22.61 | 目标25.5 | 买入区22.58~26.34 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损23.07 | 目标25.51 | 买入区22.6~26.37 | 信号:持有", + "reason": "技术面重评: 止损22.61→23.07, 止盈25.5→25.51 | 形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 ", + "trigger": "技术面重评" } ] }, { "code": "688411", "name": "海博思创", - "price": 281.47, + "price": 262.89, "cost": 266.95, "shares": 200, "avg_price": 266.95, - "action": "盈利良好 | 止损273.03 | 目标303.96 | 买入区278.2~292.11 | 信号:持有", - "stop_loss": 273.03, - "entry_low": 278.2, - "entry_high": 292.11, - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:250.03 弱撑:278.2 弱压:287.77 强压:316.63 | MA5=271.84 MA10=272.79 MA20=269.25 MA60=252.62", + "action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.27~256.48 | 信号:持有", + "stop_loss": 246.94, + "entry_low": 244.27, + "entry_high": 256.48, + "tech_snapshot": "形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.27 弱压:291.2 强压:322.01 | MA5=256.08 MA10=249.18 MA20=246.95 MA60=242.64", "timing_signal": "持有", - "rr_ratio": 4.17, + "rr_ratio": 1.98, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "知微", - "sector_context": "行业光伏设备上涨+2.5%,正常", + "sector_context": "行业光伏设备+0.7%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 273.03, - "entry_zone": "278.2~292.11", - "take_profit_zone": "0~303.96" + "stop_loss": 246.94, + "entry_zone": "244.27~256.48", + "take_profit_zone": "0~309.13" }, "created_at": "2026-06-24 11:06", "last_reassessed_price": 283.6, - "take_profit": 303.96, - "updated_reason": "技术面重评: 止损272.49→273.03, 止盈312.25→303.96 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:250.03 弱撑:278.2 弱压:287.77 强压:", + "take_profit": 309.13, + "updated_reason": "技术面重评: 策略文字调整", "changelog": [ { "date": "2026-06-24 11:06", @@ -54254,42 +56315,322 @@ "new_action": "盈利良好 | 止损273.03 | 目标303.96 | 买入区278.2~292.11 | 信号:持有", "reason": "技术面重评: 止损272.49→273.03, 止盈312.25→303.96 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:250.03 弱撑:278.2 弱压:287.77 强压:", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利良好 | 止损273.03 | 目标303.96 | 买入区278.2~292.11 | 信号:持有", + "new_action": "盈利良好 | 止损282.46 | 目标325.79 | 买入区278.92~292.87 | 信号:持有", + "reason": "价格变动(281.47→291.2): 止损273.03→282.46, 止盈303.96→325.79 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:242.96 弱撑:278.92 弱压:303.43 强压", + "trigger": "价格变动(281.47→291.2)" + }, + { + "date": "2026-07-01 09:18", + "old_action": "盈利良好 | 止损282.46 | 目标325.79 | 买入区278.92~292.87 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损282.27 | 目标0 | 买入区261.9~305.55 | 信号:持有", + "reason": "技术面重评: 止损282.46→282.27 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损282.27 | 目标0 | 买入区261.9~305.55 | 信号:持有", + "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损281.05 | 目标0 | 买入区260.77~304.23 | 信号:持有", + "reason": "技术面重评: 止损282.27→281.05 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损281.05 | 目标0 | 买入区260.77~304.23 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损246.94 | 目标315.56 | 买入区270.69~280.83 | 信号:持有", + "reason": "价格变动(289.74→279.19): 止损281.05→246.94 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:270.69 弱压:291.2 强压:32", + "trigger": "价格变动(289.74→279.19)" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损246.94 | 目标315.56 | 买入区270.69~280.83 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损246.94 | 目标314.32 | 买入区268.1~280.19 | 信号:持有", + "reason": "技术面重评: 止盈315.56→314.32 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:268.1 弱压:291.2 强压:327", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损246.94 | 目标314.32 | 买入区268.1~280.19 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损246.94 | 目标313.05 | 买入区265.45~278.72 | 信号:持有", + "reason": "技术面重评: 止盈314.32→313.05 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:265.45 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损246.94 | 目标313.05 | 买入区265.45~278.72 | 信号:持有", + "new_action": "盈利持有 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损246.94 | 目标310.45 | 买入区260.05~273.05 | 信号:持有", + "reason": "技术面重评: 止盈313.05→310.45 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:260.05 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损246.94 | 目标310.45 | 买入区260.05~273.05 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标302.61 | 买入区243.18~255.34 | 信号:持有", + "reason": "价格变动(270.51→257.9): 止盈310.45→302.61 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:243.18 弱压:291.2 强压:31", + "trigger": "价格变动(270.51→257.9)" + }, + { + "date": "2026-07-01 09:50", + "old_action": "持有观察 | 止损246.94 | 目标302.61 | 买入区243.18~255.34 | 信号:持有", + "new_action": "持有观察 | 止损246.36 | 目标303.69 | 买入区241.03~253.6 | 信号:持有", + "reason": "技术面重评: 止损246.94→246.36, 止盈302.61→303.69 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:241.03 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "持有观察 | 止损246.36 | 目标303.69 | 买入区241.03~253.6 | 信号:持有", + "new_action": "持有观察 | 止损245.92 | 目标303.54 | 买入区240.64~253.6 | 信号:持有", + "reason": "技术面重评: 止损246.36→245.92, 止盈303.69→303.54 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:240.64 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "持有观察 | 止损245.92 | 目标303.54 | 买入区240.64~253.6 | 信号:持有", + "new_action": "持有观察 | 止损233.87 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "reason": "技术面重评: 止损245.92→233.87, 止盈303.54→290.36 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:237.01 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "持有观察 | 止损233.87 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "new_action": "持有观察 | 止损232.68 | 目标289.75 | 买入区235.68~253.6 | 信号:持有", + "reason": "技术面重评: 止损233.87→232.68, 止盈290.36→289.75 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:235.68 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "持有观察 | 止损232.68 | 目标289.75 | 买入区235.68~253.6 | 信号:持有", + "new_action": "持有观察 | 止损234.49 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "reason": "技术面重评: 止损232.68→234.49, 止盈289.75→290.36 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:237.01 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "持有观察 | 止损234.49 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "new_action": "持有观察 | 止损236.62 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "reason": "技术面重评: 止损234.49→236.62 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:237.01 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "持有观察 | 止损236.62 | 目标290.36 | 买入区237.01~253.6 | 信号:持有", + "new_action": "持有观察 | 止损236.12 | 目标291.04 | 买入区238.48~253.6 | 信号:持有", + "reason": "技术面重评: 止损236.62→236.12, 止盈290.36→291.04 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:238.48 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "持有观察 | 止损236.12 | 目标291.04 | 买入区238.48~253.6 | 信号:持有", + "new_action": "持有观察 | 止损237.06 | 目标292.42 | 买入区241.52~253.6 | 信号:持有", + "reason": "技术面重评: 止损236.12→237.06, 止盈291.04→292.42 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:241.52 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "持有观察 | 止损237.06 | 目标292.42 | 买入区241.52~253.6 | 信号:持有", + "new_action": "持有观察 | 止损227.18 | 目标275.72 | 买入区238.51~253.6 | 信号:持有", + "reason": "技术面重评: 止损237.06→227.18, 止盈292.42→275.72 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:238.51 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "持有观察 | 止损227.18 | 目标275.72 | 买入区238.51~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标307.08 | 买入区240.01~253.6 | 信号:持有", + "reason": "技术面重评: 止损227.18→246.94, 止盈275.72→307.08 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:240.01 弱压:291.2 强压:31", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "持有观察 | 止损246.94 | 目标307.08 | 买入区240.01~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标307.08 | 买入区239.99~253.6 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "持有观察 | 止损246.94 | 目标307.08 | 买入区239.99~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标307.66 | 买入区241.21~253.6 | 信号:持有", + "reason": "技术面重评: 止盈307.08→307.66 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:241.21 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "持有观察 | 止损246.94 | 目标307.66 | 买入区241.21~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标307.2 | 买入区240.26~253.6 | 信号:持有", + "reason": "技术面重评: 止盈307.66→307.2 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:240.26 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "持有观察 | 止损246.94 | 目标307.2 | 买入区240.26~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标307.34 | 买入区240.56~253.6 | 信号:持有", + "reason": "技术面重评: 止盈307.2→307.34 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:240.56 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "持有观察 | 止损246.94 | 目标307.34 | 买入区240.56~253.6 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.99 | 买入区243.97~256.17 | 信号:持有", + "reason": "技术面重评: 止盈307.34→308.99 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.97 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "持有观察 | 止损246.94 | 目标308.99 | 买入区243.97~256.17 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.81 | 买入区243.62~255.8 | 信号:持有", + "reason": "技术面重评: 止盈308.99→308.81 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.62 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "持有观察 | 止损246.94 | 目标308.81 | 买入区243.62~255.8 | 信号:持有", + "new_action": "持有观察 | 止损251.88 | 目标309.48 | 买入区245.01~257.26 | 信号:持有", + "reason": "技术面重评: 止损246.94→251.88, 止盈308.81→309.48 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:245.01 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "持有观察 | 止损251.88 | 目标309.48 | 买入区245.01~257.26 | 信号:持有", + "new_action": "持有观察 | 止损251.88 | 目标309.8 | 买入区245.68~257.96 | 信号:持有", + "reason": "技术面重评: 止盈309.48→309.8 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:245.68 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:19", + "old_action": "持有观察 | 止损251.88 | 目标309.8 | 买入区245.68~257.96 | 信号:持有", + "new_action": "持有观察 | 止损251.88 | 目标309.18 | 买入区244.36~256.58 | 信号:持有", + "reason": "技术面重评: 止盈309.8→309.18 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.36 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "持有观察 | 止损251.88 | 目标309.18 | 买入区244.36~256.58 | 信号:持有", + "new_action": "持有观察 | 止损251.88 | 目标309.59 | 买入区245.22~257.48 | 信号:持有", + "reason": "技术面重评: 止盈309.18→309.59 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:245.22 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "持有观察 | 止损251.88 | 目标309.59 | 买入区245.22~257.48 | 信号:持有", + "new_action": "持有观察 | 止损251.88 | 目标309.63 | 买入区245.31~257.58 | 信号:持有", + "reason": "技术面重评: 止盈309.59→309.63 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:245.31 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "持有观察 | 止损251.88 | 目标309.63 | 买入区245.31~257.58 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.14 | 买入区242.2~254.31 | 信号:持有", + "reason": "技术面重评: 止损251.88→246.94, 止盈309.63→308.14 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:242.2 弱压:291.2 强压:320", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "持有观察 | 止损246.94 | 目标308.14 | 买入区242.2~254.31 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.52 | 买入区243.0~255.15 | 信号:持有", + "reason": "技术面重评: 止盈308.14→308.52 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:243.0 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "持有观察 | 止损246.94 | 目标308.52 | 买入区243.0~255.15 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.56 | 买入区243.09~255.24 | 信号:持有", + "reason": "技术面重评: 止盈308.52→308.56 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:232.96 弱撑:243.09 弱压:291.2 强压:32", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "持有观察 | 止损246.94 | 目标308.56 | 买入区243.09~255.24 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.28~256.49 | 信号:持有", + "reason": "技术面重评: 止盈308.56→309.13 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.28 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.28~256.49 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.92 | 买入区243.82~256.01 | 信号:持有", + "reason": "技术面重评: 止盈309.13→308.92 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.82 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "持有观察 | 止损246.94 | 目标308.92 | 买入区243.82~256.01 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.91 | 买入区243.81~256.0 | 信号:持有", + "reason": "技术面重评: 止盈308.92→308.91 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.81 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "持有观察 | 止损246.94 | 目标308.91 | 买入区243.81~256.0 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.82 | 买入区243.63~255.81 | 信号:持有", + "reason": "技术面重评: 止盈308.91→308.82 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.63 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "持有观察 | 止损246.94 | 目标308.82 | 买入区243.63~255.81 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标308.75 | 买入区243.48~255.65 | 信号:持有", + "reason": "技术面重评: 止盈308.82→308.75 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:243.48 弱压:291.2 强压:321", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "持有观察 | 止损246.94 | 目标308.75 | 买入区243.48~255.65 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标309.12 | 买入区244.24~256.45 | 信号:持有", + "reason": "技术面重评: 止盈308.75→309.12 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.24 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "持有观察 | 止损246.94 | 目标309.12 | 买入区244.24~256.45 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.26~256.47 | 信号:持有", + "reason": "技术面重评: 止盈309.12→309.13 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.26 弱压:291.2 强压:322", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.26~256.47 | 信号:持有", + "new_action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.27~256.48 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "688630", "name": "芯碁微装", - "price": 533.52, + "price": 497.27, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标590.14 | 止损516.6 | 买入区522.85~544.19", - "stop_loss": 516.6, - "entry_low": 522.85, - "entry_high": 544.19, - "tech_snapshot": "形态:长影星线/neutral 量价:主动买盘占优 强撑:481.46 弱撑:516.6 弱压:552.72 强压:590.14 | MA5=521.66 MA10=497.61 MA20=439.35 MA60=317.93", + "action": "盈利持有 | 目标609.23 | 止损475.01 | 买入区487.32~507.22", + "stop_loss": 475.01, + "entry_low": 487.32, + "entry_high": 507.22, + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:465.7 弱压:553.25 强压:609.23 | MA5=538.29 MA10=513.4 MA20=457.69 MA60=329.14", "timing_signal": "信号不充分", - "rr_ratio": 3.35, + "rr_ratio": 3.55, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "自选策略", "source": "auto", - "sector_context": "行业专用设备上涨+1.0%,正常", + "sector_context": "行业专用设备上涨+1.3%,正常", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 521.47, - "entry_zone": "526.85~546.62", - "take_profit_zone": "0~590.52" + "stop_loss": 475.01, + "entry_zone": "487.32~507.22", + "take_profit_zone": "0~609.23" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 533.52, - "take_profit": 590.14, - "updated_reason": "技术面重评: 止损526.91→521.47 | 形态:长影星线/neutral 量价:主动买盘占优 强撑:481.84 弱撑:517.36 弱压:553.48 强压:5", + "last_reassessed_price": 497.0, + "take_profit": 609.23, + "updated_reason": "技术面重评: 止损474.97→475.01 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:465.7 弱压:553.25 强压:6", "changelog": [ { "date": "2026-06-24 14:24", @@ -56054,145 +58395,322 @@ "new_action": "盈利持有 | 目标590.52 | 止损521.47 | 买入区526.85~546.62", "reason": "技术面重评: 止损526.91→521.47 | 形态:长影星线/neutral 量价:主动买盘占优 强撑:481.84 弱撑:517.36 弱压:553.48 强压:5", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:01", + "old_action": "盈利持有 | 目标590.14 | 止损516.6 | 买入区522.85~544.19", + "new_action": "盈利持有 | 目标595.43 | 止损532.91 | 买入区538.4~554.48", + "reason": "技术面重评: 止损516.6→532.91 | 形态:锤子线/T字线/neutral 量价:主动买盘占优 强撑:486.75 弱撑:527.18 弱压:563.3 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:18", + "old_action": "盈利持有 | 目标595.43 | 止损532.91 | 买入区538.4~554.48", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损538.35 | 买入区543.9~566.1", + "reason": "技术面重评: 止损532.91→538.35 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "盈利持有 | 目标606.99 | 止损543.68 | 买入区540.92~563.0 | 信号:关注", + "new_action": "盈利持有 | 目标621.63 | 止损549.39 | 买入区546.94~569.26 | 信号:买入", + "reason": "技术信号变化: 买入: 止损543.68→549.39 | 形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:496.29 弱撑:549.39 弱压:573.37 强压", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | 目标621.63 | 止损549.39 | 买入区546.94~569.26 | 信号:买入", + "new_action": "盈利持有 | 目标631.92 | 止损538.19 | 买入区543.27~565.45", + "reason": "技术信号变化: 信号不充分: 止损549.39→538.19 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:483.92 弱撑:538.19 弱压:571.29 ", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标631.92 | 止损538.19 | 买入区543.27~565.45", + "new_action": "盈利持有 | 目标625.87 | 止损526.08 | 买入区533.13~554.89", + "reason": "技术面重评: 止损538.19→526.08 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:477.87 弱撑:526.08 弱压:568.74 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | 目标625.87 | 止损526.08 | 买入区533.13~554.89", + "new_action": "盈利持有 | 目标625.76 | 止损525.87 | 买入区533.79~555.57", + "reason": "技术面重评: 止损526.08→525.87 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:477.76 弱撑:525.87 弱压:568.53 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | 目标625.76 | 止损525.87 | 买入区533.79~555.57", + "new_action": "盈利持有 | 目标627.65 | 止损529.64 | 买入区538.97~560.97", + "reason": "技术面重评: 止损525.87→529.64 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:479.65 弱撑:529.64 弱压:572.3 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标627.65 | 止损529.64 | 买入区538.97~560.97", + "new_action": "盈利持有 | 目标627.23 | 止损528.81 | 买入区535.11~556.95", + "reason": "技术面重评: 止损529.64→528.81 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:479.23 弱撑:528.81 弱压:571.47 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | 目标627.23 | 止损528.81 | 买入区535.11~556.95", + "new_action": "盈利持有 | 目标623.24 | 止损520.81 | 买入区530.24~551.88", + "reason": "技术面重评: 止损528.81→520.81 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:475.24 弱撑:520.81 弱压:563.47 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标623.24 | 止损520.81 | 买入区530.24~551.88", + "new_action": "盈利持有 | 目标620.95 | 止损516.25 | 买入区521.38~542.66", + "reason": "技术面重评: 止损520.81→516.25 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:472.95 弱撑:516.25 弱压:562.91 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利持有 | 目标620.95 | 止损516.25 | 买入区521.38~542.66", + "new_action": "盈利持有 | 目标620.95 | 止损516.25 | 买入区521.85~543.15", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | 目标620.95 | 止损516.25 | 买入区521.85~543.15", + "new_action": "盈利持有 | 目标622.72 | 止损519.57 | 买入区524.93~546.35", + "reason": "技术面重评: 止损516.25→519.57 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:474.72 弱撑:519.78 弱压:566.44 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | 目标623.22 | 止损520.78 | 买入区528.22~549.78", + "new_action": "盈利持有 | 目标623.28 | 止损525.79 | 买入区531.21~552.89", + "reason": "技术面重评: 止损520.78→525.79 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:475.28 弱撑:520.9 弱压:567.56 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | 目标623.28 | 止损525.79 | 买入区531.21~552.89", + "new_action": "盈利持有 | 目标624.55 | 止损525.82 | 买入区531.24~552.92", + "reason": "技术面重评: 止损525.79→525.82 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:476.55 弱撑:523.45 弱压:570.11 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "盈利持有 | 目标624.55 | 止损525.82 | 买入区531.24~552.92", + "new_action": "盈利持有 | 目标624.55 | 止损529.57 | 买入区535.03~556.87", + "reason": "技术面重评: 止损525.82→529.57 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:476.55 弱撑:523.45 弱压:570.11 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "盈利持有 | 目标624.55 | 止损529.57 | 买入区535.03~556.87", + "new_action": "盈利持有 | 目标622.79 | 止损517.86 | 买入区523.2~544.56", + "reason": "技术面重评: 止损529.57→517.86 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:474.79 弱撑:519.92 弱压:566.58 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | 目标622.79 | 止损517.86 | 买入区523.2~544.56", + "new_action": "盈利持有 | 目标621.55 | 止损517.45 | 买入区524.18~545.58", + "reason": "技术面重评: 止损517.86→517.45 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:473.55 弱撑:517.45 弱压:564.11 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 目标621.55 | 止损517.45 | 买入区524.18~545.58", + "new_action": "盈利持有 | 目标619.89 | 止损514.11 | 买入区520.38~541.62", + "reason": "技术面重评: 止损517.45→514.11 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:471.89 弱撑:514.11 弱压:561.77 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | 目标619.89 | 止损514.11 | 买入区520.38~541.62", + "new_action": "盈利持有 | 目标618.22 | 止损510.78 | 买入区518.3~539.46", + "reason": "技术面重评: 止损514.11→510.78 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:470.22 弱撑:510.78 弱压:561.44 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利持有 | 目标618.22 | 止损510.78 | 买入区518.3~539.46", + "new_action": "盈利持有 | 目标614.9 | 止损504.13 | 买入区515.53~536.57", + "reason": "技术面重评: 止损510.78→504.13 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:466.9 弱撑:504.13 弱压:559.76 强压:6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | 目标614.9 | 止损504.13 | 买入区515.53~536.57", + "new_action": "盈利持有 | 目标615.79 | 止损509.18 | 买入区514.43~535.43", + "reason": "技术面重评: 止损504.13→509.18 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:467.79 弱撑:505.91 弱压:562.57 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | 目标615.79 | 止损509.18 | 买入区514.43~535.43", + "new_action": "盈利持有 | 目标617.89 | 止损516.04 | 买入区521.36~542.64", + "reason": "技术面重评: 止损509.18→516.04 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:469.89 弱撑:510.11 弱压:566.77 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | 目标617.89 | 止损516.04 | 买入区521.36~542.64", + "new_action": "盈利持有 | 目标619.88 | 止损520.61 | 买入区525.98~547.44", + "reason": "技术面重评: 止损516.04→520.61 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:471.88 弱撑:514.11 弱压:570.77 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "盈利持有 | 目标619.88 | 止损520.61 | 买入区525.98~547.44", + "new_action": "盈利持有 | 目标615.67 | 止损511.48 | 买入区516.75~537.85", + "reason": "技术面重评: 止损520.61→511.48 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:467.67 弱撑:505.69 弱压:562.35 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "盈利持有 | 目标613.37 | 止损501.08 | 买入区510.7~531.54", + "new_action": "盈利持有 | 目标613.37 | 止损505.49 | 买入区510.7~531.54", + "reason": "技术面重评: 止损501.08→505.49 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:465.37 弱撑:501.08 弱压:559.41 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:20", + "old_action": "盈利持有 | 目标613.37 | 止损505.49 | 买入区510.7~531.54", + "new_action": "盈利持有 | 目标607.08 | 止损495.21 | 买入区500.32~520.74", + "reason": "技术面重评: 止损505.49→495.21 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:459.08 弱撑:488.5 弱压:556.16 强压:6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标607.08 | 止损495.21 | 买入区500.32~520.74", + "new_action": "盈利持有 | 目标609.22 | 止损502.02 | 买入区507.2~527.9", + "reason": "技术面重评: 止损495.21→502.02 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:461.22 弱撑:492.78 弱压:560.44 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标609.22 | 止损502.02 | 买入区507.2~527.9", + "new_action": "盈利持有 | 目标607.23 | 止损498.57 | 买入区504.7~525.3", + "reason": "技术面重评: 止损502.02→498.57 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:459.23 弱撑:488.79 弱压:556.45 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标605.9 | 止损486.14 | 买入区498.86~519.22", + "new_action": "盈利持有 | 目标603.91 | 止损485.35 | 买入区491.11~511.15", + "reason": "技术面重评: 止损486.14→485.35 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:449.59 弱撑:475.83 弱压:552.99 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标603.91 | 止损485.35 | 买入区491.11~511.15", + "new_action": "盈利持有 | 目标605.0 | 止损487.59 | 买入区495.49~515.71", + "reason": "技术面重评: 止损485.35→487.59 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:450.68 弱撑:478.03 弱压:555.19 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标605.0 | 止损487.59 | 买入区495.49~515.71", + "new_action": "盈利持有 | 目标604.88 | 止损487.34 | 买入区495.3~515.52", + "reason": "技术面重评: 止损487.59→487.34 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:450.56 弱撑:477.78 弱压:554.94 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "盈利持有 | 目标604.88 | 止损487.34 | 买入区495.3~515.52", + "new_action": "盈利持有 | 目标605.89 | 止损489.4 | 买入区495.67~515.91", + "reason": "技术面重评: 止损487.34→489.4 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:451.57 弱撑:479.8 弱压:556.96 强压:6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标604.41 | 止损476.85 | 买入区493.8~513.96", + "new_action": "盈利持有 | 目标604.05 | 止损485.63 | 买入区493.24~513.38", + "reason": "技术面重评: 止损476.85→485.63 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:449.73 弱撑:476.11 弱压:553.27 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标604.05 | 止损485.63 | 买入区493.24~513.38", + "new_action": "盈利持有 | 目标605.54 | 止损479.52 | 买入区486.42~506.28", + "reason": "技术面重评: 止损485.63→479.52 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:442.24 弱撑:470.12 弱压:551.77 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | 目标605.54 | 止损479.52 | 买入区486.42~506.28", + "new_action": "盈利持有 | 目标605.27 | 止损478.98 | 买入区488.04~507.96", + "reason": "技术面重评: 止损479.52→478.98 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:441.97 弱撑:469.59 弱压:551.24 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "盈利持有 | 目标605.27 | 止损478.98 | 买入区488.04~507.96", + "new_action": "盈利持有 | 目标606.15 | 止损475.84 | 买入区484.69~504.47", + "reason": "技术面重评: 止损478.98→475.84 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:466.51 弱压:550.57 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标606.81 | 止损467.85 | 买入区487.06~506.94", + "new_action": "盈利持有 | 目标606.85 | 止损477.27 | 买入区486.77~506.63", + "reason": "技术面重评: 止损467.85→477.27 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:467.91 弱压:551.97 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标606.85 | 止损477.27 | 买入区486.77~506.63", + "new_action": "盈利持有 | 目标609.81 | 止损476.19 | 买入区489.02~508.98", + "reason": "技术面重评: 止损477.27→476.19 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:466.85 弱压:554.4 强压:6", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "盈利持有 | 目标609.81 | 止损476.19 | 买入区489.02~508.98", + "new_action": "盈利持有 | 目标609.21 | 止损474.97 | 买入区487.26~507.14", + "reason": "技术面重评: 止损476.19→474.97 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:465.66 弱压:553.21 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | 目标609.21 | 止损474.97 | 买入区487.26~507.14", + "new_action": "盈利持有 | 目标609.23 | 止损475.01 | 买入区487.32~507.22", + "reason": "技术面重评: 止损474.97→475.01 | 形态:带上影阴线/bearish 量价:主动买盘占优 强撑:439.51 弱撑:465.7 弱压:553.25 强压:6", + "trigger": "技术面重评" } - ], - "strategy_tree": { - "branches": [ - { - "id": "688630_stop_loss", - "condition": { - "price": "<516.6" - }, - "action": { - "type": "sell", - "amount": "all", - "reason": "止损" - }, - "priority": 0, - "rationale": "止损保护本金", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "688630_buy_dip", - "condition": { - "scenario": "weak_consolidation", - "price": "<=544.19", - "price_lower": ">=522.85" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": 522.85, - "reason": "回调支撑买入" - }, - "priority": 1, - "rationale": "价格回调到支撑区,弱势市场低吸", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "688630_breakout_chase", - "condition": { - "scenario": "bullish_recovery", - "price": ">=590.14" - }, - "action": { - "type": "buy", - "amount": "normal", - "limit": "market", - "reason": "突破确认追涨" - }, - "priority": 2, - "rationale": "价格突破阻力,确认上升趋势后买入", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "688630_trim", - "condition": { - "scenario": "sharp_decline", - "loss_pct": "<-15%" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "急跌降风险" - }, - "priority": 3, - "rationale": "急跌市场,深套股减半仓减少敞口", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "688630_take_profit", - "condition": { - "price": ">=590.14" - }, - "action": { - "type": "sell", - "amount": "half", - "reason": "止盈锁利" - }, - "priority": 4, - "rationale": "达到目标价,减半仓锁定利润", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - }, - { - "id": "688630_hold", - "condition": {}, - "action": { - "type": "hold", - "reason": "无明确信号,继续持有" - }, - "priority": 99, - "rationale": "没有分支匹配时的默认动作", - "trigger_count": 0, - "success_rate": null, - "last_triggered": null - } - ] - } + ] }, { "code": "688639", "name": "华恒生物", - "price": 15.97, + "price": 16.37, "cost": 21.51, "shares": 2800, "avg_price": 21.51, - "action": "深套持有 | 深套持有 | 止损14.38 | 目标18.35 | 买入区14.37~16.77 | 信号:持有", - "stop_loss": 14.38, - "entry_low": 14.37, - "entry_high": 16.77, - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:13.63 弱撑:15.48 弱压:16.82 强压:19.11 | MA5=32.8 MA10=33.91 MA20=35.99 MA60=34.5", + "action": "深套持有 | 深套持有 | 止损14.96 | 目标18.7 | 买入区14.73~17.19 | 信号:持有", + "stop_loss": 14.96, + "entry_low": 14.73, + "entry_high": 17.19, + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.44 弱撑:15.86 弱压:16.69 强压:18.92 | MA5=32.72 MA10=34.17 MA20=36.22 MA60=34.41", "timing_signal": "持有", - "rr_ratio": 1.31, + "rr_ratio": 0.87, "status": "updated", "note": "深套持有", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业化学制品-0.1%,中性", + "sector_context": "行业化学制品大涨+3.3%,可适度积极", "stock_category": "深套", "position_advice": "不补不割", "time_horizon": "长期", "trigger": { - "stop_loss": 14.38, - "entry_zone": "14.37~16.77", - "take_profit_zone": "0~18.35" + "stop_loss": 14.96, + "entry_zone": "14.73~17.19", + "take_profit_zone": "0~18.7" }, "created_at": "2026-06-18 17:15", "last_reassessed_price": 16.63, - "take_profit": 18.35, - "updated_reason": "技术面重评: 止损13.32→14.38, 止盈16.65→18.35 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:13.63 弱撑:15.48 弱压:16.82 强压:", + "take_profit": 18.7, + "updated_reason": "技术面重评: 止损14.97→14.96, 止盈18.72→18.7 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.44 弱撑:15.86 弱压:16.69 强压:1", "changelog": [ { "date": "2026-06-18 11:31", @@ -57565,42 +60083,322 @@ "new_action": "深套持有 | 深套持有 | 止损14.38 | 目标18.35 | 买入区14.37~16.77 | 信号:持有", "reason": "技术面重评: 止损13.32→14.38, 止盈16.65→18.35 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:13.63 弱撑:15.48 弱压:16.82 强压:", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:02", + "old_action": "深套持有 | 深套持有 | 止损14.38 | 目标18.35 | 买入区14.37~16.77 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.5 | 目标18.39 | 买入区14.53~16.95 | 信号:持有", + "reason": "技术面重评: 止损14.38→14.5, 止盈18.35→18.39 | 形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:13.68 弱撑:15.59 弱压:16.98 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:18", + "old_action": "深套持有 | 深套持有 | 止损14.5 | 目标18.39 | 买入区14.53~16.95 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.65 | 目标0 | 买入区14.63~17.07 | 信号:持有", + "reason": "技术面重评: 止损14.5→14.65 | 形态:unknown/neutral 量价:主动买盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "深套持有 | 深套持有 | 止损14.65 | 目标0 | 买入区14.63~17.07 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.12 | 目标18.05 | 买入区14.36~16.76 | 信号:持有", + "reason": "技术面重评: 止损14.65→14.12 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.32 弱撑:15.85 弱压:16.26 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "深套持有 | 深套持有 | 止损14.12 | 目标18.05 | 买入区14.36~16.76 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.1 | 目标18.03 | 买入区14.38~16.78 | 信号:持有", + "reason": "技术面重评: 止损14.12→14.1, 止盈18.05→18.03 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.3 弱撑:15.82 弱压:16.23 强压:18.7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "深套持有 | 深套持有 | 止损14.1 | 目标18.03 | 买入区14.38~16.78 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.11 | 目标18.04 | 买入区14.43~16.83 | 信号:持有", + "reason": "技术面重评: 止损14.1→14.11, 止盈18.03→18.04 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.31 弱撑:15.83 弱压:16.24 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "深套持有 | 深套持有 | 止损14.11 | 目标18.04 | 买入区14.43~16.83 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.08 | 目标18.01 | 买入区14.34~16.73 | 信号:持有", + "reason": "技术面重评: 止损14.11→14.08, 止盈18.04→18.01 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.28 弱撑:15.77 弱压:16.18 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "深套持有 | 深套持有 | 止损14.08 | 目标18.01 | 买入区14.34~16.73 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.06 | 目标17.99 | 买入区14.32~16.71 | 信号:持有", + "reason": "技术面重评: 止损14.08→14.06, 止盈18.01→17.99 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.26 弱撑:15.75 弱压:16.16 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "深套持有 | 深套持有 | 止损14.06 | 目标17.99 | 买入区14.32~16.71 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.09 | 目标18.02 | 买入区14.36~16.75 | 信号:持有", + "reason": "技术面重评: 止损14.06→14.09, 止盈17.99→18.02 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.29 弱撑:15.79 弱压:16.2 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "深套持有 | 深套持有 | 止损14.09 | 目标18.02 | 买入区14.36~16.75 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.09 | 目标18.02 | 买入区14.36~16.76 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "深套持有 | 深套持有 | 止损14.09 | 目标18.02 | 买入区14.36~16.76 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.37 | 目标18.02 | 买入区14.39~16.79 | 信号:持有", + "reason": "技术面重评: 止损14.09→14.37 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.29 弱撑:15.81 弱压:16.22 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "深套持有 | 深套持有 | 止损14.37 | 目标18.02 | 买入区14.39~16.79 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.34 | 目标17.99 | 买入区14.31~16.7 | 信号:持有", + "reason": "技术面重评: 止损14.37→14.34, 止盈18.02→17.99 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.26 弱撑:15.74 弱压:16.15 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "深套持有 | 深套持有 | 止损14.34 | 目标17.99 | 买入区14.31~16.7 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.29 | 目标17.95 | 买入区14.27~16.64 | 信号:持有", + "reason": "技术面重评: 止损14.34→14.29, 止盈17.99→17.95 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.22 弱撑:15.65 弱压:16.14 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "深套持有 | 深套持有 | 止损14.29 | 目标17.95 | 买入区14.27~16.64 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.23 | 目标17.89 | 买入区14.18~16.55 | 信号:持有", + "reason": "技术面重评: 止损14.29→14.23, 止盈17.95→17.89 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.16 弱撑:15.55 弱压:16.14 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "深套持有 | 深套持有 | 止损14.23 | 目标17.89 | 买入区14.18~16.55 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.25 | 目标17.91 | 买入区14.19~16.56 | 信号:持有", + "reason": "技术面重评: 止损14.23→14.25, 止盈17.89→17.91 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.18 弱撑:15.57 弱压:16.14 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "深套持有 | 深套持有 | 止损14.25 | 目标17.91 | 买入区14.19~16.56 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.2 | 目标17.87 | 买入区14.14~16.5 | 信号:持有", + "reason": "技术面重评: 止损14.25→14.2, 止盈17.91→17.87 | 形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:13.13 弱撑:15.49 弱压:16.14 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "深套持有 | 深套持有 | 止损14.2 | 目标17.87 | 买入区14.14~16.5 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.68 | 目标18.46 | 买入区14.27~16.64 | 信号:持有", + "reason": "技术面重评: 止损14.2→14.68, 止盈17.87→18.46 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.19 弱撑:15.59 弱压:16.18 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "深套持有 | 深套持有 | 止损14.68 | 目标18.46 | 买入区14.27~16.64 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.28 | 目标17.94 | 买入区14.29~16.67 | 信号:持有", + "reason": "技术面重评: 止损14.68→14.28, 止盈18.46→17.94 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.21 弱撑:15.63 弱压:16.22 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "深套持有 | 深套持有 | 止损14.28 | 目标17.94 | 买入区14.29~16.67 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.29 | 目标17.95 | 买入区14.36~16.76 | 信号:持有", + "reason": "技术面重评: 止损14.28→14.29, 止盈17.94→17.95 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.22 弱撑:15.67 弱压:16.26 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "深套持有 | 深套持有 | 止损14.29 | 目标17.95 | 买入区14.36~16.76 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.31 | 目标17.97 | 买入区14.45~16.85 | 信号:持有", + "reason": "技术面重评: 止损14.29→14.31, 止盈17.95→17.97 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.24 弱撑:15.71 弱压:16.3 强压:18.7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "深套持有 | 深套持有 | 止损14.31 | 目标17.97 | 买入区14.45~16.85 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.32 | 目标17.98 | 买入区14.45~16.85 | 信号:持有", + "reason": "技术面重评: 止损14.31→14.32, 止盈17.97→17.98 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.25 弱撑:15.72 弱压:16.31 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "深套持有 | 深套持有 | 止损14.32 | 目标17.98 | 买入区14.45~16.85 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.34 | 目标17.99 | 买入区14.44~16.84 | 信号:持有", + "reason": "技术面重评: 止损14.32→14.34, 止盈17.98→17.99 | 形态:带下影阴线/neutral 量价:主动买盘占优 强撑:13.26 弱撑:15.73 弱压:16.32 强压:18.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "深套持有 | 深套持有 | 止损14.34 | 目标17.99 | 买入区14.44~16.84 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.4 | 目标18.05 | 买入区14.62~17.06 | 信号:持有", + "reason": "技术面重评: 止损14.34→14.4, 止盈17.99→18.05 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.32 弱撑:15.87 弱压:16.46 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "深套持有 | 深套持有 | 止损14.4 | 目标18.05 | 买入区14.62~17.06 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.4 | 目标18.05 | 买入区14.62~17.05 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:03", + "old_action": "深套持有 | 深套持有 | 止损14.4 | 目标18.05 | 买入区14.62~17.05 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.51 | 目标18.14 | 买入区14.7~17.15 | 信号:持有", + "reason": "技术面重评: 止损14.4→14.51, 止盈18.05→18.14 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.42 弱撑:15.91 弱压:16.64 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 12:01", + "old_action": "深套持有 | 深套持有 | 止损14.51 | 目标18.14 | 买入区14.7~17.15 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.71~17.16 | 信号:持有", + "reason": "技术面重评: 止损14.51→14.94, 止盈18.14→18.68 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.42 弱撑:15.85 弱压:16.65 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:20", + "old_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.71~17.16 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.95 | 目标18.69 | 买入区14.72~17.18 | 信号:持有", + "reason": "技术面重评: 止损14.94→14.95, 止盈18.68→18.69 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.43 弱撑:15.87 弱压:16.67 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "深套持有 | 深套持有 | 止损14.95 | 目标18.69 | 买入区14.72~17.18 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.69~17.14 | 信号:持有", + "reason": "技术面重评: 止损14.95→14.94, 止盈18.69→18.68 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.42 弱撑:15.85 弱压:16.65 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.69~17.14 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.72~17.18 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "深套持有 | 深套持有 | 止损14.94 | 目标18.68 | 买入区14.72~17.18 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.92 | 目标18.67 | 买入区14.66~17.1 | 信号:持有", + "reason": "技术面重评: 止损14.94→14.92, 止盈18.68→18.67 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.41 弱撑:15.83 弱压:16.63 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "深套持有 | 深套持有 | 止损14.92 | 目标18.67 | 买入区14.66~17.1 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.95 | 目标18.69 | 买入区14.72~17.18 | 信号:持有", + "reason": "技术面重评: 止损14.92→14.95, 止盈18.67→18.69 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.43 弱撑:15.88 弱压:16.68 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "深套持有 | 深套持有 | 止损14.95 | 目标18.69 | 买入区14.72~17.18 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.54 | 目标18.16 | 买入区14.76~17.22 | 信号:持有", + "reason": "技术面重评: 止损14.95→14.54, 止盈18.69→18.16 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.44 弱撑:15.88 弱压:16.68 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "深套持有 | 深套持有 | 止损14.54 | 目标18.16 | 买入区14.76~17.22 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.77~17.23 | 信号:持有", + "reason": "技术面重评: 止损14.54→14.97, 止盈18.16→18.72 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.45 弱撑:15.92 弱压:16.72 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.77~17.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.8~17.27 | 信号:持有", + "reason": "技术面重评: 止损14.97→14.98, 止盈18.72→18.73 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.46 弱撑:15.93 弱压:16.73 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.8~17.27 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.79~17.25 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.79~17.25 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.8~17.27 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.8~17.27 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.75~17.21 | 信号:持有", + "reason": "技术面重评: 止损14.98→14.97, 止盈18.73→18.72 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.45 弱撑:15.88 弱压:16.71 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.75~17.21 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.78~17.24 | 信号:持有", + "reason": "技术面重评: 止损14.97→14.98, 止盈18.72→18.73 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.46 弱撑:15.91 弱压:16.74 强压:1", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.78~17.24 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.77~17.23 | 信号:持有", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "深套持有 | 深套持有 | 止损14.98 | 目标18.73 | 买入区14.77~17.23 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.76~17.22 | 信号:持有", + "reason": "技术面重评: 止损14.98→14.97, 止盈18.73→18.72 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.45 弱撑:15.87 弱压:16.7 强压:18", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "深套持有 | 深套持有 | 止损14.97 | 目标18.72 | 买入区14.76~17.22 | 信号:持有", + "new_action": "深套持有 | 深套持有 | 止损14.96 | 目标18.7 | 买入区14.73~17.19 | 信号:持有", + "reason": "技术面重评: 止损14.97→14.96, 止盈18.72→18.7 | 形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.44 弱撑:15.86 弱压:16.69 强压:1", + "trigger": "技术面重评" } ] }, { "code": "688795", "name": "摩尔线程-U", - "price": 711.67, + "price": 673.8, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标766.54 | 止损690.32 | 买入区697.44~720.81 | 信号:观望", - "stop_loss": 690.32, - "entry_low": 697.44, - "entry_high": 720.81, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:652.14 弱撑:697.67 弱压:725.34 强压:766.54 | MA5=696.96 MA10=672.84 MA20=648.83 MA60=655.05", + "action": "盈利持有 | 目标747.74 | 止损651.23 | 买入区660.32~687.28 | 信号:观望", + "stop_loss": 651.23, + "entry_low": 660.32, + "entry_high": 687.28, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:627.44 弱撑:651.23 弱压:716.49 强压:747.74 | MA5=696.29 MA10=686.88 MA20=658.28 MA60=659.64", "timing_signal": "观望", - "rr_ratio": 2.57, + "rr_ratio": 3.28, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "自选策略", "source": "auto", - "sector_context": "行业半导体大涨+3.8%,可适度积极", + "sector_context": "行业半导体-0.5%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 690.32, - "entry_zone": "697.44~720.81", - "take_profit_zone": "0~766.54" + "stop_loss": 651.23, + "entry_zone": "660.32~687.28", + "take_profit_zone": "0~747.74" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 718.65, - "take_profit": 766.54, - "updated_reason": "技术面重评: 止损681.91→690.32 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:652.14 弱撑:697.67 弱压:725.34 强压", + "last_reassessed_price": 671.63, + "take_profit": 747.74, + "updated_reason": "技术面重评: 策略文字调整", "changelog": [ { "date": "2026-06-24 14:24", @@ -59351,42 +62149,322 @@ "new_action": "盈利持有 | 目标766.54 | 止损690.32 | 买入区697.44~720.81 | 信号:观望", "reason": "技术面重评: 止损681.91→690.32 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:652.14 弱撑:697.67 弱压:725.34 强压", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:02", + "old_action": "盈利持有 | 目标766.54 | 止损690.32 | 买入区697.44~720.81 | 信号:观望", + "new_action": "盈利持有 | 目标769.86 | 止损695.0 | 买入区702.16~724.94 | 信号:观望", + "reason": "技术面重评: 止损690.32→695.0 | 形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:651.88 弱撑:698.95 弱压:728.41 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:18", + "old_action": "盈利持有 | 目标769.86 | 止损695.0 | 买入区702.16~724.94 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损696.46 | 买入区703.64~732.36 | 信号:观望", + "reason": "技术面重评: 止损695.0→696.46 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损696.46 | 买入区703.64~732.36 | 信号:观望", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损695.0 | 买入区702.16~730.82 | 信号:观望", + "reason": "技术面重评: 止损696.46→695.0 | 形态:unknown/neutral 量价:主动卖盘占优 强撑:None 弱撑:None 弱压:None 强压:None", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损695.0 | 买入区702.16~730.82 | 信号:观望", + "new_action": "盈利持有 | 目标777.27 | 止损698.39 | 买入区705.59~729.94 | 信号:观望", + "reason": "技术面重评: 止损695.0→698.39 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:656.97 弱撑:710.28 弱压:722.33 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | 目标777.27 | 止损698.39 | 买入区705.59~729.94 | 信号:观望", + "new_action": "盈利持有 | 目标773.71 | 止损692.0 | 买入区699.13~724.68 | 信号:观望", + "reason": "技术面重评: 止损698.39→692.0 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:653.41 弱撑:703.17 弱压:719.12 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标773.71 | 止损692.0 | 买入区699.13~724.68 | 信号:观望", + "new_action": "盈利持有 | 目标771.51 | 止损686.76 | 买入区693.84~720.66 | 信号:观望", + "reason": "技术面重评: 止损692.0→686.76 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:651.21 弱撑:698.76 弱压:717.89 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | 目标771.51 | 止损686.76 | 买入区693.84~720.66 | 信号:观望", + "new_action": "盈利持有 | 目标774.41 | 止损687.71 | 买入区694.8~722.39 | 信号:观望", + "reason": "技术面重评: 止损686.76→687.71 | 形态:十字星/neutral 量价:主动卖盘占优 强撑:654.11 弱撑:704.56 弱压:723.69 强压:77", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | 目标774.41 | 止损687.71 | 买入区694.8~722.39 | 信号:观望", + "new_action": "盈利持有 | 目标772.14 | 止损688.72 | 买入区695.82~722.09 | 信号:观望", + "reason": "技术面重评: 止损687.71→688.72 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:651.84 弱撑:700.03 弱压:719.16 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标772.14 | 止损688.72 | 买入区695.82~722.09 | 信号:观望", + "new_action": "盈利持有 | 目标773.07 | 止损686.03 | 买入区693.11~720.85 | 信号:观望", + "reason": "技术面重评: 止损688.72→686.03 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:652.77 弱撑:701.9 弱压:721.03 强", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | 目标773.07 | 止损686.03 | 买入区693.11~720.85 | 信号:观望", + "new_action": "盈利持有 | 目标773.07 | 止损691.51 | 买入区698.64~724.13 | 信号:观望", + "reason": "技术面重评: 止损686.03→691.51 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:652.77 弱撑:701.89 弱压:721.02 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:56", + "old_action": "盈利持有 | 目标773.07 | 止损691.51 | 买入区698.64~724.13 | 信号:观望", + "new_action": "盈利持有 | 目标772.47 | 止损687.82 | 买入区694.91~721.68 | 信号:观望", + "reason": "技术面重评: 止损691.51→687.82 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:652.17 弱撑:700.7 弱压:719.83 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利持有 | 目标772.58 | 止损687.25 | 买入区694.34~721.38 | 信号:观望", + "new_action": "盈利持有 | 目标771.51 | 止损686.89 | 买入区693.97~720.74 | 信号:观望", + "reason": "技术面重评: 止损687.25→686.89 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:651.21 弱撑:698.77 弱压:717.9 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | 目标771.51 | 止损686.89 | 买入区693.97~720.74 | 信号:观望", + "new_action": "盈利持有 | 目标772.64 | 止损685.89 | 买入区692.96~720.59 | 信号:观望", + "reason": "技术面重评: 止损686.89→685.89 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:652.34 弱撑:701.02 弱压:720.15 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | 目标772.64 | 止损685.89 | 买入区692.96~720.59 | 信号:观望", + "new_action": "盈利持有 | 目标773.49 | 止损688.7 | 买入区695.8~722.62 | 信号:观望", + "reason": "技术面重评: 止损685.89→688.7 | 形态:倒T线/射击之星/bearish 量价:主动卖盘占优 强撑:653.19 弱撑:702.74 弱压:721.87 ", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | 目标773.49 | 止损688.7 | 买入区695.8~722.62 | 信号:观望", + "new_action": "盈利持有 | 目标772.43 | 止损689.67 | 买入区696.78~722.77 | 信号:观望", + "reason": "技术面重评: 止损688.7→689.67 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:652.13 弱撑:700.62 弱压:719.75 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "盈利持有 | 目标772.43 | 止损689.67 | 买入区696.78~722.77 | 信号:观望", + "new_action": "盈利持有 | 目标771.62 | 止损684.97 | 买入区692.03~719.63 | 信号:观望", + "reason": "技术面重评: 止损689.67→684.97 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:648.43 弱撑:696.1 弱压:717.05 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "盈利持有 | 目标771.62 | 止损684.97 | 买入区692.03~719.63 | 信号:观望", + "new_action": "盈利持有 | 目标770.99 | 止损685.67 | 买入区692.74~719.8 | 信号:观望", + "reason": "技术面重评: 止损684.97→685.67 | 形态:小阴线/bearish 量价:主动卖盘占优 强撑:650.69 弱撑:697.74 弱压:721.65 强压:77", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | 目标770.99 | 止损685.67 | 买入区692.74~719.8 | 信号:观望", + "new_action": "盈利持有 | 目标769.97 | 止损685.62 | 买入区692.68~719.36 | 信号:观望", + "reason": "技术面重评: 止损685.67→685.62 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:649.67 弱撑:695.68 弱压:719.59 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 目标769.97 | 止损685.62 | 买入区692.68~719.36 | 信号:观望", + "new_action": "盈利持有 | 目标768.41 | 止损680.05 | 买入区687.06~715.1 | 信号:观望", + "reason": "技术面重评: 止损685.62→680.05 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:648.11 弱撑:692.56 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | 目标768.41 | 止损680.05 | 买入区687.06~715.1 | 信号:观望", + "new_action": "盈利持有 | 目标766.14 | 止损679.86 | 买入区686.87~714.37 | 信号:观望", + "reason": "技术面重评: 止损680.05→679.86 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:645.84 弱撑:688.02 弱压:716.96 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利持有 | 目标766.14 | 止损679.86 | 买入区686.87~714.37 | 信号:观望", + "new_action": "盈利持有 | 目标764.8 | 止损676.66 | 买入区683.64~711.54 | 信号:观望", + "reason": "技术面重评: 止损679.86→676.66 | 形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:644.5 弱撑:685.35 弱压:716.49 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | 目标764.8 | 止损676.66 | 买入区683.64~711.54 | 信号:观望", + "new_action": "盈利持有 | 目标762.8 | 止损672.6 | 买入区679.53~707.27 | 信号:观望", + "reason": "技术面重评: 止损676.66→672.6 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:642.5 弱撑:681.35 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | 目标762.8 | 止损672.6 | 买入区679.53~707.27 | 信号:观望", + "new_action": "盈利持有 | 目标765.35 | 止损677.9 | 买入区684.89~712.85 | 信号:观望", + "reason": "技术面重评: 止损672.6→677.9 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:645.05 弱撑:686.46 弱压:718.41 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | 目标765.35 | 止损677.9 | 买入区684.89~712.85 | 信号:观望", + "new_action": "盈利持有 | 目标765.47 | 止损678.5 | 买入区685.49~713.29 | 信号:观望", + "reason": "技术面重评: 止损677.9→678.5 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:645.17 弱撑:686.68 弱压:718.63 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:04", + "old_action": "盈利持有 | 目标765.47 | 止损678.5 | 买入区685.49~713.29 | 信号:观望", + "new_action": "盈利持有 | 目标766.47 | 止损683.75 | 买入区690.8~716.84 | 信号:观望", + "reason": "技术面重评: 止损678.5→683.75 | 形态:带下影阴线/neutral 量价:主动卖盘占优 强撑:646.17 弱撑:688.7 弱压:720.65 强压:7", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:20", + "old_action": "盈利持有 | 目标762.7 | 止损671.93 | 买入区678.86~706.56 | 信号:观望", + "new_action": "盈利持有 | 目标758.8 | 止损667.35 | 买入区674.23~701.75 | 信号:观望", + "reason": "技术面重评: 止损671.93→667.35 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:638.5 弱撑:673.35 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标758.8 | 止损667.35 | 买入区674.23~701.75 | 信号:观望", + "new_action": "盈利持有 | 目标758.65 | 止损666.92 | 买入区673.8~701.3 | 信号:观望", + "reason": "技术面重评: 止损667.35→666.92 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:638.35 弱撑:673.05 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标758.65 | 止损666.92 | 买入区673.8~701.3 | 信号:观望", + "new_action": "盈利持有 | 目标755.98 | 止损662.69 | 买入区669.53~696.85 | 信号:观望", + "reason": "技术面重评: 止损666.92→662.69 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:635.68 弱撑:667.71 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标754.0 | 止损659.6 | 买入区666.4~693.6 | 信号:观望", + "new_action": "盈利持有 | 目标748.85 | 止损650.87 | 买入区657.58~684.42 | 信号:观望", + "reason": "技术面重评: 止损659.6→650.87 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:628.55 弱撑:653.45 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标748.85 | 止损650.87 | 买入区657.58~684.42 | 信号:观望", + "new_action": "盈利持有 | 目标749.85 | 止损653.5 | 买入区660.24~687.18 | 信号:观望", + "reason": "技术面重评: 止损650.87→653.5 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:629.55 弱撑:655.45 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标749.85 | 止损653.5 | 买入区660.24~687.18 | 信号:观望", + "new_action": "盈利持有 | 目标751.18 | 止损658.1 | 买入区665.81~692.99 | 信号:观望", + "reason": "技术面重评: 止损653.5→658.1 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:630.88 弱撑:658.1 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "盈利持有 | 目标751.18 | 止损658.1 | 买入区665.81~692.99 | 信号:观望", + "new_action": "盈利持有 | 目标751.85 | 止损659.46 | 买入区666.74~693.96 | 信号:观望", + "reason": "技术面重评: 止损658.1→659.46 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:631.55 弱撑:659.46 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标751.85 | 止损659.46 | 买入区666.74~693.96 | 信号:观望", + "new_action": "盈利持有 | 目标751.2 | 止损658.16 | 买入区665.43~692.59 | 信号:观望", + "reason": "技术面重评: 止损659.46→658.16 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:630.9 弱撑:658.16 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标751.2 | 止损658.16 | 买入区665.43~692.59 | 信号:观望", + "new_action": "盈利持有 | 目标749.64 | 止损652.06 | 买入区658.79~685.67 | 信号:观望", + "reason": "技术面重评: 止损658.16→652.06 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:629.34 弱撑:655.03 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | 目标749.64 | 止损652.06 | 买入区658.79~685.67 | 信号:观望", + "new_action": "盈利持有 | 目标749.2 | 止损654.15 | 买入区661.5~688.5 | 信号:观望", + "reason": "技术面重评: 止损652.06→654.15 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:628.9 弱撑:654.15 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "盈利持有 | 目标749.2 | 止损654.15 | 买入区661.5~688.5 | 信号:观望", + "new_action": "盈利持有 | 目标749.47 | 止损651.84 | 买入区658.56~685.44 | 信号:观望", + "reason": "技术面重评: 止损654.15→651.84 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:629.17 弱撑:654.68 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标748.68 | 止损651.48 | 买入区658.2~685.06 | 信号:观望", + "new_action": "盈利持有 | 目标748.8 | 止损625.77 | 买入区658.56~685.44 | 信号:观望", + "reason": "技术面重评: 止损651.48→625.77 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:628.5 弱撑:653.35 弱压:716.49 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标748.8 | 止损625.77 | 买入区658.56~685.44 | 信号:观望", + "new_action": "盈利持有 | 目标747.64 | 止损651.03 | 买入区659.72~686.64 | 信号:观望", + "reason": "技术面重评: 止损625.77→651.03 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:627.34 弱撑:651.03 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "盈利持有 | 目标747.64 | 止损651.03 | 买入区659.72~686.64 | 信号:观望", + "new_action": "盈利持有 | 目标747.74 | 止损651.23 | 买入区660.19~687.13 | 信号:观望", + "reason": "技术面重评: 止损651.03→651.23 | 形态:光头光脚阴线/bearish 量价:主动卖盘占优 强撑:627.44 弱撑:651.23 弱压:716.49 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | 目标747.74 | 止损651.23 | 买入区660.19~687.13 | 信号:观望", + "new_action": "盈利持有 | 目标747.74 | 止损651.23 | 买入区660.32~687.28 | 信号:观望", + "reason": "技术面重评: 策略文字调整", + "trigger": "技术面重评" } ] }, { "code": "688802", "name": "沐曦股份-U", - "price": 818.1, + "price": 780.0, "cost": 0, "shares": 0, "avg_price": 0, - "action": "盈利持有 | 目标917.32 | 止损793.56 | 买入区801.74~834.46 | 信号:买入", - "stop_loss": 793.56, - "entry_low": 801.74, - "entry_high": 834.46, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:701.32 弱撑:790.63 弱压:837.68 强压:917.32 | MA5=766.73 MA10=754.37 MA20=727.22 MA60=710.71", - "timing_signal": "买入", - "rr_ratio": 3.61, + "action": "盈利持有 | 目标924.71 | 止损751.49 | 买入区764.4~795.6", + "stop_loss": 751.49, + "entry_low": 764.4, + "entry_high": 795.6, + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.75 弱撑:751.49 弱压:828.3 强压:924.71 | MA5=783.04 MA10=771.48 MA20=743.2 MA60=717.53", + "timing_signal": "信号不充分", + "rr_ratio": 5.08, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "自选策略", "source": "auto", - "sector_context": "行业半导体大涨+3.8%,可适度积极", + "sector_context": "行业半导体-0.5%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 793.56, - "entry_zone": "801.74~834.46", - "take_profit_zone": "0~917.32" + "stop_loss": 751.49, + "entry_zone": "764.4~795.6", + "take_profit_zone": "0~924.71" }, "created_at": "2026-06-24 14:24", - "last_reassessed_price": 817.9, - "take_profit": 917.32, - "updated_reason": "技术面重评: 止损780.05→793.56 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:701.32 弱撑:790.63 弱压:837.68 强压:9", + "last_reassessed_price": 775.99, + "take_profit": 924.71, + "updated_reason": "技术面重评: 止损750.15→751.49 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.75 弱撑:751.49 弱压:828.3 强压:92", "changelog": [ { "date": "2026-06-24 14:24", @@ -61130,1719 +64208,542 @@ "new_action": "盈利持有 | 目标917.32 | 止损793.56 | 买入区801.74~834.46 | 信号:买入", "reason": "技术面重评: 止损780.05→793.56 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:701.32 弱撑:790.63 弱压:837.68 强压:9", "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:02", + "old_action": "盈利持有 | 目标917.32 | 止损793.56 | 买入区801.74~834.46 | 信号:买入", + "new_action": "盈利持有 | 目标932.42 | 止损803.45 | 买入区811.73~844.87 | 信号:买入", + "reason": "技术面重评: 止损793.56→803.45 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:698.42 弱撑:793.55 弱压:849.88 强压:9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:18", + "old_action": "盈利持有 | 目标932.42 | 止损803.45 | 买入区811.73~844.87 | 信号:买入", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损795.41 | 买入区803.61~836.41", + "reason": "技术信号变化: 信号不充分: 止损803.45→795.41 | 形态:unknown/neutral 量价:数据不足 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:21", + "old_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损795.41 | 买入区803.61~836.41", + "new_action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标参考0 | 止损794.43 | 买入区802.62~835.38", + "reason": "技术面重评: 止损795.41→794.43 | 形态:unknown/neutral 量价:数据不足 强撑:None 弱撑:None 弱压:None 强压:None |", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:34", + "old_action": "盈利持有 | 目标949.04 | 止损805.21 | 买入区813.51~846.71 | 信号:关注", + "new_action": "盈利持有 | 目标963.64 | 止损817.71 | 买入区826.14~859.86 | 信号:买入", + "reason": "技术信号变化: 买入: 止损805.21→817.71 | 形态:光头光脚阳线/bullish 量价:数据不足 强撑:711.68 弱撑:828.3 弱压:850.32 强压:96", + "trigger": "技术信号变化: 买入" + }, + { + "date": "2026-07-01 09:38", + "old_action": "盈利持有 | 目标963.64 | 止损817.71 | 买入区826.14~859.86 | 信号:买入", + "new_action": "盈利持有 | 目标953.21 | 止损798.87 | 买入区807.11~840.05 | 信号:关注", + "reason": "技术信号变化: 关注: 止损817.71→798.87 | 形态:带上影阴线/bearish 量价:数据不足 强撑:701.25 弱撑:808.48 弱压:837.46 强压:95", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 09:41", + "old_action": "盈利持有 | 目标953.21 | 止损798.87 | 买入区807.11~840.05 | 信号:关注", + "new_action": "盈利持有 | 目标949.07 | 止损791.39 | 买入区799.55~832.19 | 信号:关注", + "reason": "技术面重评: 止损798.87→791.39 | 形态:带上影阴线/bearish 量价:数据不足 强撑:697.11 弱撑:800.21 弱压:835.89 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:44", + "old_action": "盈利持有 | 目标949.07 | 止损791.39 | 买入区799.55~832.19 | 信号:关注", + "new_action": "盈利持有 | 目标950.8 | 止损790.55 | 买入区798.7~831.3 | 信号:关注", + "reason": "技术面重评: 止损791.39→790.55 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:698.84 弱撑:803.66 弱压:839.34 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:49", + "old_action": "盈利持有 | 目标950.8 | 止损790.55 | 买入区798.7~831.3 | 信号:关注", + "new_action": "盈利持有 | 目标950.41 | 止损794.64 | 买入区802.84~835.6", + "reason": "技术信号变化: 信号不充分: 止损790.55→794.64 | 形态:带上影阴线/bearish 量价:数据不足 强撑:698.45 弱撑:802.89 弱压:838.57 强压:95", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:50", + "old_action": "盈利持有 | 目标950.41 | 止损794.64 | 买入区802.84~835.6", + "new_action": "盈利持有 | 目标950.92 | 止损792.56 | 买入区800.73~833.41 | 信号:关注", + "reason": "技术信号变化: 关注: 止损794.64→792.56 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:698.96 弱撑:803.89 弱压:839.57 强压", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 09:54", + "old_action": "盈利持有 | 目标950.92 | 止损792.56 | 买入区800.73~833.41 | 信号:关注", + "new_action": "盈利持有 | 目标951.41 | 止损796.34 | 买入区804.55~837.39", + "reason": "技术信号变化: 信号不充分: 止损792.56→796.34 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:699.45 弱撑:804.87 弱压:840.55 强压", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 09:57", + "old_action": "盈利持有 | 目标951.41 | 止损796.34 | 买入区804.55~837.39", + "new_action": "盈利持有 | 目标951.07 | 止损799.09 | 买入区807.32~840.28", + "reason": "技术面重评: 止损796.34→799.09 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:699.11 弱撑:804.21 弱压:839.89 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 09:59", + "old_action": "盈利持有 | 目标951.07 | 止损799.09 | 买入区807.32~840.28", + "new_action": "盈利持有 | 目标949.83 | 止损793.48 | 买入区801.66~834.38", + "reason": "技术面重评: 止损799.09→793.48 | 形态:带上影阴线/bearish 量价:数据不足 强撑:697.87 弱撑:801.73 弱压:837.41 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:01", + "old_action": "盈利持有 | 目标949.83 | 止损793.48 | 买入区801.66~834.38", + "new_action": "盈利持有 | 目标951.96 | 止损795.39 | 买入区803.59~836.39 | 信号:关注", + "reason": "技术信号变化: 关注: 止损793.48→795.39 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:700.0 弱撑:805.98 弱压:841.66 强压:", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 10:03", + "old_action": "盈利持有 | 目标951.96 | 止损795.39 | 买入区803.59~836.39 | 信号:关注", + "new_action": "盈利持有 | 目标951.74 | 止损799.96 | 买入区808.21~841.19", + "reason": "技术信号变化: 信号不充分: 止损795.39→799.96 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:699.78 弱撑:805.54 弱压:841.22 强压", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 10:05", + "old_action": "盈利持有 | 目标951.74 | 止损799.96 | 买入区808.21~841.19", + "new_action": "盈利持有 | 目标950.81 | 止损797.52 | 买入区805.75~838.63", + "reason": "技术面重评: 止损799.96→797.52 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:698.85 弱撑:803.68 弱压:839.36 强压", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:10", + "old_action": "盈利持有 | 目标950.81 | 止损797.52 | 买入区805.75~838.63", + "new_action": "盈利持有 | 目标948.18 | 止损791.52 | 买入区799.68~832.32", + "reason": "技术面重评: 止损797.52→791.52 | 形态:带上影阴线/bearish 量价:数据不足 强撑:696.22 弱撑:798.41 弱压:834.39 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:30", + "old_action": "盈利持有 | 目标948.18 | 止损791.52 | 买入区799.68~832.32", + "new_action": "盈利持有 | 目标948.62 | 止损791.03 | 买入区799.19~831.81", + "reason": "技术面重评: 止损791.52→791.03 | 形态:倒T线/射击之星/bearish 量价:数据不足 强撑:696.66 弱撑:799.3 弱压:839.41 强压:", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:34", + "old_action": "盈利持有 | 目标949.24 | 止损793.38 | 买入区801.56~834.28", + "new_action": "盈利持有 | 目标947.46 | 止损790.49 | 买入区798.64~831.24", + "reason": "技术面重评: 止损793.38→790.49 | 形态:带上影阴线/bearish 量价:数据不足 强撑:695.5 弱撑:796.99 弱压:837.1 强压:947.", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:36", + "old_action": "盈利持有 | 目标947.46 | 止损790.49 | 买入区798.64~831.24", + "new_action": "盈利持有 | 目标945.93 | 止损783.76 | 买入区791.84~824.16 | 信号:关注", + "reason": "技术信号变化: 关注: 止损790.49→783.76 | 形态:带上影阴线/bearish 量价:数据不足 强撑:693.97 弱撑:793.92 弱压:834.03 强压:94", + "trigger": "技术信号变化: 关注" + }, + { + "date": "2026-07-01 10:39", + "old_action": "盈利持有 | 目标945.93 | 止损783.76 | 买入区791.84~824.16 | 信号:关注", + "new_action": "盈利持有 | 目标944.86 | 止损779.88 | 买入区787.92~820.08 | 信号:关注", + "reason": "技术面重评: 止损783.76→779.88 | 形态:带上影阴线/bearish 量价:数据不足 强撑:692.9 弱撑:791.78 弱压:835.41 强压:944", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:41", + "old_action": "盈利持有 | 目标944.86 | 止损779.88 | 买入区787.92~820.08 | 信号:关注", + "new_action": "盈利持有 | 目标941.31 | 止损778.91 | 买入区786.94~819.06", + "reason": "技术信号变化: 信号不充分: 止损779.88→778.91 | 形态:带上影阴线/bearish 量价:数据不足 强撑:689.35 弱撑:784.67 弱压:830.65 强压:94", + "trigger": "技术信号变化: 信号不充分" + }, + { + "date": "2026-07-01 10:43", + "old_action": "盈利持有 | 目标941.31 | 止损778.91 | 买入区786.94~819.06", + "new_action": "盈利持有 | 目标940.5 | 止损775.16 | 买入区783.15~815.11", + "reason": "技术面重评: 止损778.91→775.16 | 形态:带上影阴线/bearish 量价:数据不足 强撑:688.54 弱撑:783.07 弱压:832.05 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:51", + "old_action": "盈利持有 | 目标940.5 | 止损775.16 | 买入区783.15~815.11", + "new_action": "盈利持有 | 目标943.97 | 止损782.6 | 买入区790.66~822.94", + "reason": "技术面重评: 止损775.16→782.6 | 形态:带上影阴线/bearish 量价:数据不足 强撑:692.01 弱撑:790.01 弱压:838.99 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 10:53", + "old_action": "盈利持有 | 目标943.97 | 止损782.6 | 买入区790.66~822.94", + "new_action": "盈利持有 | 目标942.97 | 止损782.79 | 买入区790.86~823.14", + "reason": "技术面重评: 止损782.6→782.79 | 形态:带上影阴线/bearish 量价:数据不足 强撑:691.01 弱撑:788.01 弱压:836.99 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 11:04", + "old_action": "盈利持有 | 目标942.97 | 止损782.79 | 买入区790.86~823.14", + "new_action": "盈利持有 | 目标944.59 | 止损792.49 | 买入区800.66~833.34", + "reason": "技术面重评: 止损782.79→792.49 | 形态:带上影阴线/bearish 量价:数据不足 强撑:692.63 弱撑:791.25 弱压:840.23 强压:94", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:20", + "old_action": "盈利持有 | 目标941.31 | 止损778.91 | 买入区786.94~819.06", + "new_action": "盈利持有 | 目标934.12 | 止损770.31 | 买入区778.85~810.63", + "reason": "技术面重评: 止损778.91→770.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:682.16 弱撑:770.31 弱压:830.29 强压:9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:24", + "old_action": "盈利持有 | 目标934.12 | 止损770.31 | 买入区778.85~810.63", + "new_action": "盈利持有 | 目标935.97 | 止损770.98 | 买入区778.92~810.72", + "reason": "技术面重评: 止损770.31→770.98 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:684.01 弱撑:773.99 弱压:833.97 强压:9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:27", + "old_action": "盈利持有 | 目标935.97 | 止损770.98 | 买入区778.92~810.72", + "new_action": "盈利持有 | 目标932.97 | 止损765.31 | 买入区773.2~804.76", + "reason": "技术面重评: 止损770.98→765.31 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:681.01 弱撑:767.99 弱压:828.3 强压:93", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:56", + "old_action": "盈利持有 | 目标929.98 | 止损761.45 | 买入区769.3~800.7", + "new_action": "盈利持有 | 目标922.72 | 止损747.49 | 买入区756.56~787.44", + "reason": "技术面重评: 止损761.45→747.49 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:670.76 弱撑:747.49 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 13:59", + "old_action": "盈利持有 | 目标922.72 | 止损747.49 | 买入区756.56~787.44", + "new_action": "盈利持有 | 目标924.23 | 止损750.53 | 买入区760.97~792.03", + "reason": "技术面重评: 止损747.49→750.53 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.27 弱撑:750.53 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:03", + "old_action": "盈利持有 | 目标924.23 | 止损750.53 | 买入区760.97~792.03", + "new_action": "盈利持有 | 目标926.39 | 止损754.84 | 买入区769.3~800.7", + "reason": "技术面重评: 止损750.53→754.84 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:674.43 弱撑:754.84 弱压:830.6 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:08", + "old_action": "盈利持有 | 目标926.39 | 止损754.84 | 买入区769.3~800.7", + "new_action": "盈利持有 | 目标929.73 | 止损761.52 | 买入区780.08~811.92", + "reason": "技术面重评: 止损754.84→761.52 | 形态:带下影阴线/neutral 量价:数据不足 强撑:677.77 弱撑:761.52 弱压:837.28 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:11", + "old_action": "盈利持有 | 目标929.73 | 止损761.52 | 买入区780.08~811.92", + "new_action": "盈利持有 | 目标927.05 | 止损756.15 | 买入区769.3~800.7", + "reason": "技术面重评: 止损761.52→756.15 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:675.09 弱撑:756.15 弱压:831.91 强压:9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:21", + "old_action": "盈利持有 | 目标927.05 | 止损756.15 | 买入区769.3~800.7", + "new_action": "盈利持有 | 目标925.38 | 止损752.81 | 买入区766.69~797.99", + "reason": "技术面重评: 止损756.15→752.81 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:673.42 弱撑:752.81 弱压:828.57 强压:9", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:23", + "old_action": "盈利持有 | 目标925.38 | 止损752.81 | 买入区766.69~797.99", + "new_action": "盈利持有 | 目标924.93 | 止损751.93 | 买入区766.69~797.99", + "reason": "技术面重评: 止损752.81→751.93 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.97 弱撑:751.93 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:25", + "old_action": "盈利持有 | 目标924.93 | 止损751.93 | 买入区766.69~797.99", + "new_action": "盈利持有 | 目标923.73 | 止损749.53 | 买入区763.42~794.58", + "reason": "技术面重评: 止损751.93→749.53 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:671.77 弱撑:749.53 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:33", + "old_action": "盈利持有 | 目标923.38 | 止损748.81 | 买入区760.47~791.51", + "new_action": "盈利持有 | 目标923.22 | 止损718.55 | 买入区760.88~791.94", + "reason": "技术面重评: 止损748.81→718.55 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:671.26 弱撑:748.49 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:55", + "old_action": "盈利持有 | 目标923.22 | 止损718.55 | 买入区760.88~791.94", + "new_action": "盈利持有 | 目标924.23 | 止损750.53 | 买入区762.24~793.36", + "reason": "技术面重评: 止损718.55→750.53 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.27 弱撑:750.53 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 14:58", + "old_action": "盈利持有 | 目标924.23 | 止损750.53 | 买入区762.24~793.36", + "new_action": "盈利持有 | 目标924.05 | 止损750.15 | 买入区764.4~795.6", + "reason": "技术面重评: 止损750.53→750.15 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.09 弱撑:750.15 弱压:828.3 强压:92", + "trigger": "技术面重评" + }, + { + "date": "2026-07-01 15:02", + "old_action": "盈利持有 | 目标924.05 | 止损750.15 | 买入区764.4~795.6", + "new_action": "盈利持有 | 目标924.71 | 止损751.49 | 买入区764.4~795.6", + "reason": "技术面重评: 止损750.15→751.49 | 形态:光头光脚阴线/bearish 量价:数据不足 强撑:672.75 弱撑:751.49 弱压:828.3 强压:92", + "trigger": "技术面重评" } ] }, { "code": "688981", "name": "中芯国际", - "price": 158.83, + "price": 154.48, "cost": 126.07, - "shares": 300, - "avg_price": 126.07, - "action": "盈利良好 | 止损154.07 | 目标173.58 | 买入区151.0~158.55 | 信号:持有", - "stop_loss": 154.07, - "entry_low": 151.0, - "entry_high": 158.55, - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.56 弱撑:151.0 弱压:163.11 强压:175.54 | MA5=149.97 MA10=143.15 MA20=135.98 MA60=122.6", + "shares": 0, + "avg_price": 0, + "action": "盈利良好 | 止损149.85 | 目标176.42 | 买入区148.9~156.34 | 信号:持有", + "stop_loss": 149.85, + "entry_low": 148.9, + "entry_high": 156.34, + "tech_snapshot": "形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.01 弱撑:148.9 弱压:163.47 强压:183.77 | MA5=154.35 MA10=148.6 MA20=138.49 MA60=124.68", "timing_signal": "持有", - "rr_ratio": 2.13, + "rr_ratio": 5.25, "status": "updated", "note": "", - "timestamp": "2026-06-30 10:57", - "updated_at": "2026-06-30 10:57", + "timestamp": "2026-07-01 15:02", + "updated_at": "2026-07-01 15:02", "type": "持仓策略", "source": "auto", - "sector_context": "行业半导体大涨+3.8%,可适度积极", + "sector_context": "行业半导体-0.5%,中性", "stock_category": "中短线", "position_advice": "中等仓位", "time_horizon": "2~6周", "trigger": { - "stop_loss": 154.07, - "entry_zone": "151.0~158.55", - "take_profit_zone": "0~173.58" + "stop_loss": 149.85, + "entry_zone": "148.9~156.34", + "take_profit_zone": "0~176.42" }, - "created_at": "2026-06-18 23:02", - "last_reassessed_price": 148.76, - "take_profit": 173.58, - "updated_reason": "技术面重评: 止损149.09→154.07, 止盈162.13→173.58 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.56 弱撑:151.0 弱压:163.11 强压:17", + "created_at": "2026-07-01 09:57", + "take_profit": 176.42, + "updated_reason": "技术面重评: 止损149.83→149.85 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.01 弱撑:148.9 弱压:163.47 强压:183", "changelog": [ { - "date": "2026-06-18 23:02", + "date": "2026-07-01 09:57", "old_action": "", - "new_action": "盈利良好 | 止损134.18 | 目标159.66 | 买入区134.18~140.89 | 信号:持有", - "reason": "初始策略创建 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:119.14 弱撑:134.18 弱压:145.93 强压:15", + "new_action": "盈利良好 | 止损160.53 | 目标181.91 | 买入区158.82~166.76 | 信号:持有", + "reason": "初始策略创建 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:138.49 弱撑:158.82 弱压:168.05 强压:1", "trigger": "初始创建" }, { - "date": "2026-06-18 23:36", - "old_action": "盈利良好 | 止损134.18 | 目标159.66 | 买入区134.18~140.89 | 信号:持有", - "new_action": "盈利良好 | 止损132.76 | 目标162.05 | 买入区134.18~140.89 | 信号:持有", - "reason": "技术面重评: 策略文字调整", + "date": "2026-07-01 09:59", + "old_action": "盈利良好 | 止损160.53 | 目标181.91 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损160.98 | 目标181.73 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损160.53→160.98, 止盈181.91→181.73 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:138.3 弱撑:158.82 弱压:167.69 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-19 11:24", - "old_action": "盈利良好 | 止损132.76 | 目标162.05 | 买入区134.18~140.89 | 信号:持有", - "new_action": "盈利良好 | 止损134.18 | 目标164.45 | 买入区134.18~140.89 | 信号:持有", - "reason": "技术面重评: 止损132.76→134.18, 止盈162.05→164.45 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:119.14 弱撑:134.18 弱压:145.93 强压:15", + "date": "2026-07-01 10:01", + "old_action": "盈利良好 | 止损160.98 | 目标181.73 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损159.55 | 目标182.05 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损160.98→159.55, 止盈181.73→182.05 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:138.64 弱撑:158.82 弱压:168.36 强压:1", "trigger": "技术面重评" }, { - "date": "2026-06-19 15:37", - "old_action": "盈利良好 | 止损134.18 | 目标164.45 | 买入区134.18~140.89 | 信号:持有", - "new_action": "盈利良好 | 止损132.76 | 目标164.45 | 买入区134.18~140.89 | 信号:持有", - "reason": "技术面重评: 止损134.18→132.76 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:119.14 弱撑:134.18 弱压:145.93 强压:15", + "date": "2026-07-01 10:03", + "old_action": "盈利良好 | 止损159.55 | 目标182.05 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损161.65 | 目标182.51 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损159.55→161.65, 止盈182.05→182.51 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:138.35 弱撑:158.82 弱压:168.55 强压:1", "trigger": "技术面重评" }, { - "date": "2026-06-22 12:01", - "old_action": "盈利良好 | 止损132.76 | 目标164.45 | 买入区134.18~140.89 | 信号:持有", - "new_action": "盈利良好 | 止损134.66 | 目标167.33 | 买入区139.41~146.38 | 信号:持有", - "reason": "技术面重评: 止损132.76→134.66, 止盈164.45→167.33 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:120.07 弱撑:139.41 弱压:147.41 强压", + "date": "2026-07-01 10:05", + "old_action": "盈利良好 | 止损161.65 | 目标182.51 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损161.01 | 目标182.08 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损161.65→161.01, 止盈182.51→182.08 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:137.91 弱撑:158.82 弱压:167.65 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-23 09:01", - "old_action": "盈利良好 | 止损134.66 | 目标167.33 | 买入区139.41~146.38 | 信号:持有", - "new_action": "盈利良好 | 止损141.22 | 目标168.16 | 买入区140.7~147.73 | 信号:持有", - "reason": "技术信号变化: 大盘中性,行业偏强,高估值,蓝筹,持有: 止损134.66→141.22, 止盈167.33→168.16 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:120.9 弱撑:140.7 弱压:149.06 强压:168.", - "trigger": "技术信号变化: 大盘中性,行业偏强,高估值,蓝筹,持有" - }, - { - "date": "2026-06-23 12:01", - "old_action": "盈利良好 | 止损141.22 | 目标168.16 | 买入区140.7~147.73 | 信号:持有", - "new_action": "盈利良好 | 止损139.7 | 目标168.27 | 买入区140.39~147.41 | 信号:持有", - "reason": "技术信号变化: 大盘中性,行业偏强,高估值,蓝筹,持有: 止损141.22→139.7, 止盈168.16→168.27 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:120.41 弱撑:140.39 弱压:147.98 强压", - "trigger": "技术信号变化: 大盘中性,行业偏强,高估值,蓝筹,持有" - }, - { - "date": "2026-06-24 09:01", - "old_action": "盈利良好 | 止损139.7 | 目标168.27 | 买入区140.39~147.41 | 信号:持有", - "new_action": "盈利良好 | 止损137.45 | 目标160.44 | 买入区138.1~145.0 | 信号:持有", - "reason": "技术信号变化: 大盘中性,行业中性,高估值,蓝筹,持有: 止损139.7→137.45, 止盈168.27→160.44 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:119.27 弱撑:138.1 弱压:146.8 强压:1", - "trigger": "技术信号变化: 大盘中性,行业中性,高估值,蓝筹,持有" - }, - { - "date": "2026-06-24 11:07", - "old_action": "盈利良好 | 止损137.45 | 目标160.44 | 买入区138.1~145.0 | 信号:持有", - "new_action": "盈利良好 | 止损137.58 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "reason": "价格变动(141.7→149.3): 止损137.45→137.58, 止盈160.44→170.04 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.44 弱撑:141.7 弱压:154.82 强压:17", - "trigger": "价格变动(141.7→149.3)" - }, - { - "date": "2026-06-24 11:17", - "old_action": "盈利良好 | 止损137.58 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损138.41 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损137.58→138.41 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.53 弱撑:141.7 弱压:154.99 强压:17", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 11:28", - "old_action": "盈利良好 | 止损138.41 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损140.62 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损138.41→140.62 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:120.27 弱撑:141.7 弱压:157.68 强压:17", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 11:31", - "old_action": "盈利良好 | 止损140.62 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损142.12 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损140.62→142.12 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.75 弱撑:141.7 弱压:158.85 强压:17", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 12:01", - "old_action": "盈利良好 | 止损142.12 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损144.97 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损142.12→144.97 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.75 弱撑:141.7 弱压:158.85 强压:17", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 13:17", - "old_action": "盈利良好 | 止损144.97 | 目标170.04 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损145.31 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损144.97→145.31, 止盈170.04→172.59 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.76 弱撑:141.7 弱压:159.47 强压:17", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 13:30", - "old_action": "盈利良好 | 止损145.31 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损146.05 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损145.31→146.05 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:119.2 弱撑:141.7 弱压:161.05 强压:170", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 14:15", - "old_action": "盈利良好 | 止损146.05 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损139.6 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损146.05→139.6 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:117.71 弱撑:141.7 弱压:158.05 强压:170", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 14:24", - "old_action": "盈利良好 | 止损139.6 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损140.26 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损139.6→140.26 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:117.81 弱撑:141.7 弱压:158.26 强压:170", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 14:41", - "old_action": "盈利良好 | 止损140.26 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损139.64 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损140.26→139.64 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:117.7 弱撑:141.7 弱压:158.03 强压:170.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-24 16:45", - "old_action": "盈利良好 | 止损139.64 | 目标172.59 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | 止损146.61 | 目标177.77 | 买入区141.7~148.78 | 信号:持有", - "reason": "技术面重评: 止损139.64→146.61, 止盈172.59→177.77 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:117.75 弱撑:141.7 弱压:158.15 强压:170", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:17", - "old_action": "盈利良好 | 止损146.61 | 目标177.77 | 买入区141.7~148.78 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损140.99 | 目标0 | 买入区137.7~160.65 | 信号:持有", - "reason": "技术面重评: 止损146.61→140.99 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损140.99 | 目标0 | 买入区137.7~160.65 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损141.91 | 目标0 | 买入区138.6~161.7 | 信号:持有", - "reason": "技术面重评: 止损140.99→141.91 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:21", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损141.91 | 目标0 | 买入区138.6~161.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.72 | 目标0 | 买入区139.38~162.61 | 信号:持有", - "reason": "技术面重评: 止损141.91→142.72 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:33", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.72 | 目标0 | 买入区139.38~162.61 | 信号:持有", - "new_action": "盈利良好 | 止损142.69 | 目标184.57 | 买入区150.65~158.18 | 信号:持有", - "reason": "技术面重评: 止损142.72→142.69 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:121.22 弱撑:150.65 弱压:153.41 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:35", - "old_action": "盈利良好 | 止损142.69 | 目标184.57 | 买入区150.65~158.18 | 信号:持有", - "new_action": "盈利良好 | 止损143.02 | 目标184.57 | 买入区151.43~159.0 | 信号:持有", - "reason": "技术面重评: 止损142.69→143.02 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.43 弱压:154.73 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:37", - "old_action": "盈利良好 | 止损143.02 | 目标184.57 | 买入区151.43~159.0 | 信号:持有", - "new_action": "盈利良好 | 止损144.8 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损143.02→144.8 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.36 弱撑:151.53 弱压:155.67 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:39", - "old_action": "盈利良好 | 止损144.8 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.19 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损144.8→146.19 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:122.09 弱撑:151.53 弱压:157.13 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:41", - "old_action": "盈利良好 | 止损146.19 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损145.09 | 目标184.57 | 买入区151.21~158.77 | 信号:持有", - "reason": "技术面重评: 止损146.19→145.09 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.63 弱撑:151.21 弱压:156.21 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:44", - "old_action": "盈利良好 | 止损145.09 | 目标184.57 | 买入区151.21~158.77 | 信号:持有", - "new_action": "盈利良好 | 止损145.35 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.09→145.35 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.97 弱撑:151.53 弱压:156.89 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:47", - "old_action": "盈利良好 | 止损145.35 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损145.64 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.35→145.64 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:122.01 弱撑:151.53 弱压:156.98 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:49", - "old_action": "盈利良好 | 止损145.64 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.29 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.64→146.29 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:122.35 弱撑:151.53 弱压:157.66 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 09:51", - "old_action": "盈利良好 | 止损146.29 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.98 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.29→146.98 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:122.24 弱撑:151.53 弱压:158.69 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:07", - "old_action": "盈利良好 | 止损146.98 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.76 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.98→146.76 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.61 弱撑:151.53 弱压:158.99 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:09", - "old_action": "盈利良好 | 止损146.76 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.6 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.76→146.6 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.32 弱撑:151.53 弱压:158.4 强压:181", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:11", - "old_action": "盈利良好 | 止损146.6 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.48 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.6→146.48 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.51 弱撑:151.53 弱压:158.77 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:17", - "old_action": "盈利良好 | 止损146.48 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.48→149.92 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.97 弱撑:151.53 弱压:159.71 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:23", - "old_action": "盈利良好 | 止损149.92 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.3 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.92→149.3 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.26 弱撑:151.53 弱压:158.78 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:25", - "old_action": "盈利良好 | 止损149.3 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.04 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.3→149.04 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:158.63 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:27", - "old_action": "盈利良好 | 止损149.04 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损145.44 | 目标184.57 | 买入区151.45~159.02 | 信号:持有", - "reason": "技术面重评: 止损149.04→145.44 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.45 弱压:158.45 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:31", - "old_action": "盈利良好 | 止损145.44 | 目标184.57 | 买入区151.45~159.02 | 信号:持有", - "new_action": "盈利良好 | 止损145.91 | 目标184.57 | 买入区151.24~158.8 | 信号:持有", - "reason": "技术面重评: 止损145.44→145.91 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.24 弱压:158.24 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:37", - "old_action": "盈利良好 | 止损145.91 | 目标184.57 | 买入区151.24~158.8 | 信号:持有", - "new_action": "盈利良好 | 止损146.78 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.91→146.78 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.31 弱撑:151.53 弱压:158.87 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:41", - "old_action": "盈利良好 | 止损146.78 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损144.72 | 目标184.57 | 买入区150.49~158.01 | 信号:持有", - "reason": "技术面重评: 止损146.78→144.72 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:121.22 弱撑:150.49 弱压:157.49 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:43", - "old_action": "盈利良好 | 止损144.72 | 目标184.57 | 买入区150.49~158.01 | 信号:持有", - "new_action": "盈利良好 | 止损144.28 | 目标184.57 | 买入区150.58~158.11 | 信号:持有", - "reason": "技术面重评: 止损144.72→144.28 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:121.22 弱撑:150.58 弱压:157.58 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:45", - "old_action": "盈利良好 | 止损144.28 | 目标184.57 | 买入区150.58~158.11 | 信号:持有", - "new_action": "盈利良好 | 止损144.78 | 目标184.57 | 买入区150.53~158.06 | 信号:持有", - "reason": "技术面重评: 止损144.28→144.78 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:121.22 弱撑:150.53 弱压:157.53 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:49", - "old_action": "盈利良好 | 止损144.78 | 目标184.57 | 买入区150.53~158.06 | 信号:持有", - "new_action": "盈利良好 | 止损145.76 | 目标184.57 | 买入区151.17~158.73 | 信号:持有", - "reason": "技术面重评: 止损144.78→145.76 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.17 弱压:158.17 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:52", - "old_action": "盈利良好 | 止损145.76 | 目标184.57 | 买入区151.17~158.73 | 信号:持有", - "new_action": "盈利良好 | 止损145.47 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.76→145.47 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:158.7 强压:181", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:55", - "old_action": "盈利良好 | 止损145.47 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.28 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.47→146.28 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.37 弱撑:151.53 弱压:158.99 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 10:56", - "old_action": "盈利良好 | 止损146.28 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.98 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.28→146.98 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.79 弱撑:151.53 弱压:161.09 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 11:27", - "old_action": "盈利良好 | 止损146.98 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.98→149.92 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.82 弱撑:151.53 弱压:161.21 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 12:07", - "old_action": "盈利良好 | 止损149.92 | 目标184.57 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止盈184.57→187.3 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.64 弱撑:151.53 弱压:160.87 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:03", - "old_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.98 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.92→146.98 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.42 弱撑:151.53 弱压:160.42 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:26", - "old_action": "盈利良好 | 止损146.98 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.98→149.92 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.73 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:47", - "old_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.63 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.92→149.63 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.51 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:49", - "old_action": "盈利良好 | 止损149.63 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.63→149.92 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.61 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:53", - "old_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.73 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.92→149.73 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.38 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:57", - "old_action": "盈利良好 | 止损149.73 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损148.8 | 目标187.3 | 买入区151.05~158.6 | 信号:持有", - "reason": "技术面重评: 止损149.73→148.8 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.05 弱压:158.71 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 13:59", - "old_action": "盈利良好 | 止损148.8 | 目标187.3 | 买入区151.05~158.6 | 信号:持有", - "new_action": "盈利良好 | 止损148.6 | 目标187.3 | 买入区150.99~158.54 | 信号:持有", - "reason": "技术面重评: 止损148.8→148.6 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:150.99 弱压:158.65 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:04", - "old_action": "盈利良好 | 止损148.6 | 目标187.3 | 买入区150.99~158.54 | 信号:持有", - "new_action": "盈利良好 | 止损148.66 | 目标187.3 | 买入区151.11~158.67 | 信号:持有", - "reason": "技术面重评: 止损148.6→148.66 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.11 弱压:158.77 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:05", - "old_action": "盈利良好 | 止损148.66 | 目标187.3 | 买入区151.11~158.67 | 信号:持有", - "new_action": "盈利良好 | 止损148.98 | 目标187.3 | 买入区151.33~158.9 | 信号:持有", - "reason": "技术面重评: 止损148.66→148.98 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.33 弱压:158.99 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:07", - "old_action": "盈利良好 | 止损148.98 | 目标187.3 | 买入区151.33~158.9 | 信号:持有", - "new_action": "盈利良好 | 止损146.43 | 目标187.3 | 买入区151.45~159.02 | 信号:持有", - "reason": "技术面重评: 止损148.98→146.43 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.45 弱压:159.11 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:08", - "old_action": "盈利良好 | 止损146.43 | 目标187.3 | 买入区151.45~159.02 | 信号:持有", - "new_action": "盈利良好 | 止损146.25 | 目标187.3 | 买入区151.5~159.08 | 信号:持有", - "reason": "技术面重评: 止损146.43→146.25 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.5 弱压:159.16 强压:181", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:10", - "old_action": "盈利良好 | 止损146.25 | 目标187.3 | 买入区151.5~159.08 | 信号:持有", - "new_action": "盈利良好 | 止损146.4 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.25→146.4 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.35 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:12", - "old_action": "盈利良好 | 止损146.4 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.67 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.4→146.67 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.19 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:14", - "old_action": "盈利良好 | 止损146.67 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.54 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.67→146.54 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.34 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:17", - "old_action": "盈利良好 | 止损146.54 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损146.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.54→146.92 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.37 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:25", - "old_action": "盈利良好 | 止损146.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.53 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损146.92→149.53 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.24 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 14:44", - "old_action": "盈利良好 | 止损149.53 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.72 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.53→149.72 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:159.48 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-25 16:17", - "old_action": "盈利良好 | 止损149.72 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损149.72→149.92 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:121.22 弱撑:151.53 弱压:160.01 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:11", - "old_action": "盈利良好 | 止损149.92 | 目标187.3 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.55 | 目标0 | 买入区141.17~164.7 | 信号:持有", - "reason": "技术面重评: 止损149.92→144.55 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:17", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.55 | 目标0 | 买入区141.17~164.7 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.31 | 目标0 | 买入区140.94~164.43 | 信号:持有", - "reason": "技术面重评: 止损144.55→144.31 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.31 | 目标0 | 买入区140.94~164.43 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.46 | 目标0 | 买入区141.09~164.61 | 信号:持有", - "reason": "技术面重评: 止损144.31→144.46 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:27", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损144.46 | 目标0 | 买入区141.09~164.61 | 信号:持有", - "new_action": "盈利良好 | 止损138.83 | 目标183.95 | 买入区153.7~161.38 | 信号:持有", - "reason": "技术面重评: 止损144.46→138.83 | 形态:平盘/neutral 量价:买卖均衡 强撑:125.49 弱撑:153.7 弱压:156.86 强压:187.99", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:30", - "old_action": "盈利良好 | 止损138.83 | 目标183.95 | 买入区153.7~161.38 | 信号:持有", - "new_action": "盈利良好 | 止损138.83 | 目标183.93 | 买入区153.57~161.25 | 信号:持有", - "reason": "技术面重评: 止盈183.95→183.93 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:153.57 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:33", - "old_action": "盈利良好 | 止损138.83 | 目标183.93 | 买入区153.57~161.25 | 信号:持有", - "new_action": "盈利良好 | 止损138.94 | 目标183.62 | 买入区152.7~160.34 | 信号:持有", - "reason": "技术面重评: 止损138.83→138.94, 止盈183.93→183.62 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:152.7 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:36", - "old_action": "盈利良好 | 止损138.94 | 目标183.62 | 买入区152.7~160.34 | 信号:持有", - "new_action": "盈利良好 | 止损138.66 | 目标171.3 | 买入区152.91~160.56 | 信号:持有", - "reason": "技术面重评: 止损138.94→138.66, 止盈183.62→171.3 | 形态:锤子线/T字线/neutral 量价:买卖均衡 强撑:125.49 弱撑:152.91 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:39", - "old_action": "盈利良好 | 止损138.66 | 目标171.3 | 买入区152.91~160.56 | 信号:持有", - "new_action": "盈利良好 | 止损139.83 | 目标171.66 | 买入区153.54~161.22 | 信号:持有", - "reason": "技术面重评: 止损138.66→139.83, 止盈171.3→171.66 | 形态:带下影阳线/neutral 量价:买卖均衡 强撑:125.49 弱撑:153.54 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:40", - "old_action": "盈利良好 | 止损139.83 | 目标171.66 | 买入区153.54~161.22 | 信号:持有", - "new_action": "盈利良好 | 止损139.33 | 目标171.66 | 买入区153.26~160.92 | 信号:持有", - "reason": "技术面重评: 止损139.83→139.33 | 形态:带下影阳线/neutral 量价:买卖均衡 强撑:125.49 弱撑:153.26 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:45", - "old_action": "盈利良好 | 止损139.33 | 目标171.66 | 买入区153.26~160.92 | 信号:持有", - "new_action": "盈利良好 | 止损145.77 | 目标180.7 | 买入区152.87~160.51 | 信号:持有", - "reason": "技术面重评: 止损139.33→145.77, 止盈171.66→180.7 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:125.49 弱撑:152.87 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:47", - "old_action": "盈利良好 | 止损145.77 | 目标180.7 | 买入区152.87~160.51 | 信号:持有", - "new_action": "盈利良好 | 止损145.37 | 目标180.7 | 买入区152.3~159.92 | 信号:持有", - "reason": "技术面重评: 止损145.77→145.37 | 形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:125.49 弱撑:152.3 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:49", - "old_action": "盈利良好 | 止损145.37 | 目标180.7 | 买入区152.3~159.92 | 信号:持有", - "new_action": "盈利良好 | 止损144.19 | 目标180.64 | 买入区151.53~159.11 | 信号:持有", - "reason": "技术面重评: 止损145.37→144.19, 止盈180.7→180.64 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:151.53 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:51", - "old_action": "盈利良好 | 止损144.19 | 目标180.64 | 买入区151.53~159.11 | 信号:持有", - "new_action": "盈利良好 | 止损142.76 | 目标179.93 | 买入区150.06~157.56 | 信号:持有", - "reason": "技术面重评: 止损144.19→142.76, 止盈180.64→179.93 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:150.06 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 09:53", - "old_action": "盈利良好 | 止损142.76 | 目标179.93 | 买入区150.06~157.56 | 信号:持有", - "new_action": "盈利良好 | 止损142.53 | 目标179.67 | 买入区149.53~157.01 | 信号:持有", - "reason": "技术面重评: 止损142.76→142.53, 止盈179.93→179.67 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.53 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:01", - "old_action": "盈利良好 | 止损142.53 | 目标179.67 | 买入区149.53~157.01 | 信号:持有", - "new_action": "盈利良好 | 止损143.77 | 目标179.99 | 买入区150.18~157.69 | 信号:持有", - "reason": "技术面重评: 止损142.53→143.77, 止盈179.67→179.99 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:150.18 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:03", - "old_action": "盈利良好 | 止损143.77 | 目标179.99 | 买入区150.18~157.69 | 信号:持有", - "new_action": "盈利良好 | 止损143.5 | 目标179.8 | 买入区149.77~157.26 | 信号:持有", - "reason": "技术面重评: 止损143.77→143.5, 止盈179.99→179.8 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.77 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:05", - "old_action": "盈利良好 | 止损143.5 | 目标179.8 | 买入区149.77~157.26 | 信号:持有", - "new_action": "盈利良好 | 止损142.62 | 目标179.6 | 买入区149.37~156.84 | 信号:持有", - "reason": "技术面重评: 止损143.5→142.62, 止盈179.8→179.6 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.37 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:07", - "old_action": "盈利良好 | 止损142.62 | 目标179.6 | 买入区149.37~156.84 | 信号:持有", - "new_action": "盈利良好 | 止损143.0 | 目标179.87 | 买入区149.91~157.41 | 信号:持有", - "reason": "技术面重评: 止损142.62→143.0, 止盈179.6→179.87 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.91 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:09", - "old_action": "盈利良好 | 止损143.0 | 目标179.87 | 买入区149.91~157.41 | 信号:持有", - "new_action": "盈利良好 | 止损143.58 | 目标179.97 | 买入区150.14~157.65 | 信号:持有", - "reason": "技术面重评: 止损143.0→143.58, 止盈179.87→179.97 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:150.14 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:11", - "old_action": "盈利良好 | 止损143.58 | 目标179.97 | 买入区150.14~157.65 | 信号:持有", - "new_action": "盈利良好 | 止损143.3 | 目标179.73 | 买入区149.63~157.11 | 信号:持有", - "reason": "技术面重评: 止损143.58→143.3, 止盈179.97→179.73 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.63 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:13", - "old_action": "盈利良好 | 止损143.3 | 目标179.73 | 买入区149.63~157.11 | 信号:持有", - "new_action": "盈利良好 | 止损142.8 | 目标179.78 | 买入区149.74~157.23 | 信号:持有", - "reason": "技术面重评: 止损143.3→142.8, 止盈179.73→179.78 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.74 弱压:156.86 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:17", - "old_action": "盈利良好 | 止损142.8 | 目标179.78 | 买入区149.74~157.23 | 信号:持有", - "new_action": "盈利良好 | 止损142.24 | 目标179.6 | 买入区149.36~156.83 | 信号:持有", - "reason": "技术面重评: 止损142.8→142.24, 止盈179.78→179.6 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.36 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:19", - "old_action": "盈利良好 | 止损142.24 | 目标179.6 | 买入区149.36~156.83 | 信号:持有", - "new_action": "盈利良好 | 止损143.07 | 目标179.67 | 买入区149.51~156.99 | 信号:持有", - "reason": "技术面重评: 止损142.24→143.07, 止盈179.6→179.67 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:149.51 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:27", - "old_action": "盈利良好 | 止损143.07 | 目标179.67 | 买入区149.51~156.99 | 信号:持有", - "new_action": "盈利良好 | 止损141.79 | 目标179.05 | 买入区148.23~155.64 | 信号:持有", - "reason": "技术面重评: 止损143.07→141.79, 止盈179.67→179.05 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:148.23 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:28", - "old_action": "盈利良好 | 止损141.79 | 目标179.05 | 买入区148.23~155.64 | 信号:持有", - "new_action": "盈利良好 | 止损141.23 | 目标178.92 | 买入区147.93~155.33 | 信号:持有", - "reason": "技术面重评: 止损141.79→141.23, 止盈179.05→178.92 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:147.93 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:39", - "old_action": "盈利良好 | 止损141.23 | 目标178.92 | 买入区147.93~155.33 | 信号:持有", - "new_action": "盈利良好 | 止损141.21 | 目标178.66 | 买入区147.4~154.77 | 信号:持有", - "reason": "技术面重评: 止损141.23→141.21, 止盈178.92→178.66 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:147.4 弱压:156.86 强压:186", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:41", - "old_action": "盈利良好 | 止损141.21 | 目标178.66 | 买入区147.4~154.77 | 信号:持有", - "new_action": "盈利良好 | 止损141.07 | 目标178.51 | 买入区147.1~154.46 | 信号:持有", - "reason": "技术面重评: 止损141.21→141.07, 止盈178.66→178.51 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:147.1 弱压:156.86 强压:185", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:44", - "old_action": "盈利良好 | 止损141.07 | 目标178.51 | 买入区147.1~154.46 | 信号:持有", - "new_action": "盈利良好 | 止损140.87 | 目标178.53 | 买入区147.14~154.5 | 信号:持有", - "reason": "技术面重评: 止损141.07→140.87, 止盈178.51→178.53 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:147.14 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:45", - "old_action": "盈利良好 | 止损140.87 | 目标178.53 | 买入区147.14~154.5 | 信号:持有", - "new_action": "盈利良好 | 止损140.73 | 目标178.55 | 买入区147.17~154.53 | 信号:持有", - "reason": "技术面重评: 止损140.87→140.73, 止盈178.53→178.55 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:147.17 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:53", - "old_action": "盈利良好 | 止损140.73 | 目标178.55 | 买入区147.17~154.53 | 信号:持有", - "new_action": "盈利良好 | 止损139.33 | 目标177.55 | 买入区145.09~152.34 | 信号:持有", - "reason": "技术面重评: 止损140.73→139.33, 止盈178.55→177.55 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:145.09 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:55", - "old_action": "盈利良好 | 止损139.33 | 目标177.55 | 买入区145.09~152.34 | 信号:持有", - "new_action": "盈利良好 | 止损138.76 | 目标177.13 | 买入区144.23~151.44 | 信号:持有", - "reason": "技术面重评: 止损139.33→138.76, 止盈177.55→177.13 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.23 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:57", - "old_action": "盈利良好 | 止损138.76 | 目标177.13 | 买入区144.23~151.44 | 信号:持有", - "new_action": "盈利良好 | 止损138.31 | 目标176.88 | 买入区143.69~150.87 | 信号:持有", - "reason": "技术面重评: 止损138.76→138.31, 止盈177.13→176.88 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:143.69 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 10:59", - "old_action": "盈利良好 | 止损138.31 | 目标176.88 | 买入区143.69~150.87 | 信号:持有", - "new_action": "盈利良好 | 止损138.71 | 目标177.05 | 买入区144.06~151.26 | 信号:持有", - "reason": "技术面重评: 止损138.31→138.71, 止盈176.88→177.05 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.06 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:01", - "old_action": "盈利良好 | 止损138.71 | 目标177.05 | 买入区144.06~151.26 | 信号:持有", - "new_action": "盈利良好 | 止损139.4 | 目标177.16 | 买入区144.29~151.5 | 信号:持有", - "reason": "技术面重评: 止损138.71→139.4, 止盈177.05→177.16 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.29 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:03", - "old_action": "盈利良好 | 止损139.4 | 目标177.16 | 买入区144.29~151.5 | 信号:持有", - "new_action": "盈利良好 | 止损139.81 | 目标177.27 | 买入区144.53~151.76 | 信号:持有", - "reason": "技术面重评: 止损139.4→139.81, 止盈177.16→177.27 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.53 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:05", - "old_action": "盈利良好 | 止损139.81 | 目标177.27 | 买入区144.53~151.76 | 信号:持有", - "new_action": "盈利良好 | 止损139.14 | 目标177.17 | 买入区144.3~151.52 | 信号:持有", - "reason": "技术面重评: 止损139.81→139.14, 止盈177.27→177.17 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.3 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:09", - "old_action": "盈利良好 | 止损139.14 | 目标177.17 | 买入区144.3~151.52 | 信号:持有", - "new_action": "盈利良好 | 止损138.69 | 目标177.17 | 买入区144.3~151.52 | 信号:持有", - "reason": "技术面重评: 止损139.14→138.69 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.3 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:11", - "old_action": "盈利良好 | 止损138.69 | 目标177.17 | 买入区144.3~151.52 | 信号:持有", - "new_action": "盈利良好 | 止损139.43 | 目标176.95 | 买入区143.84~151.03 | 信号:持有", - "reason": "技术面重评: 止损138.69→139.43, 止盈177.17→176.95 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:143.84 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:29", - "old_action": "盈利良好 | 止损139.43 | 目标176.95 | 买入区143.84~151.03 | 信号:持有", - "new_action": "盈利良好 | 止损139.24 | 目标177.14 | 买入区144.23~151.44 | 信号:持有", - "reason": "技术面重评: 止损139.43→139.24, 止盈176.95→177.14 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.23 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:31", - "old_action": "盈利良好 | 止损139.24 | 目标177.14 | 买入区144.23~151.44 | 信号:持有", - "new_action": "盈利良好 | 止损139.18 | 目标177.12 | 买入区144.21~151.42 | 信号:持有", - "reason": "技术面重评: 止损139.24→139.18, 止盈177.14→177.12 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.21 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 11:33", - "old_action": "盈利良好 | 止损139.18 | 目标177.12 | 买入区144.21~151.42 | 信号:持有", - "new_action": "盈利良好 | 止损133.61 | 目标168.26 | 买入区144.21~151.42 | 信号:持有", - "reason": "技术面重评: 止损139.18→133.61, 止盈177.12→168.26 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.21 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:17", - "old_action": "盈利良好 | 止损133.61 | 目标168.26 | 买入区144.21~151.42 | 信号:持有", - "new_action": "盈利良好 | 止损134.59 | 目标168.54 | 买入区144.8~152.04 | 信号:持有", - "reason": "技术面重评: 止损133.61→134.59, 止盈168.26→168.54 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.8 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:19", - "old_action": "盈利良好 | 止损134.59 | 目标168.54 | 买入区144.8~152.04 | 信号:持有", - "new_action": "盈利良好 | 止损133.74 | 目标168.36 | 买入区144.4~151.62 | 信号:持有", - "reason": "技术面重评: 止损134.59→133.74, 止盈168.54→168.36 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.4 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:21", - "old_action": "盈利良好 | 止损133.74 | 目标168.36 | 买入区144.4~151.62 | 信号:持有", - "new_action": "盈利良好 | 止损134.39 | 目标168.62 | 买入区145.01~152.26 | 信号:持有", - "reason": "技术面重评: 止损133.74→134.39, 止盈168.36→168.62 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:145.01 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:23", - "old_action": "盈利良好 | 止损134.39 | 目标168.62 | 买入区145.01~152.26 | 信号:持有", - "new_action": "盈利良好 | 止损140.3 | 目标177.42 | 买入区144.83~152.07 | 信号:持有", - "reason": "技术面重评: 止损134.39→140.3, 止盈168.62→177.42 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.83 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:24", - "old_action": "盈利良好 | 止损140.3 | 目标177.42 | 买入区144.83~152.07 | 信号:持有", - "new_action": "盈利良好 | 止损140.18 | 目标177.34 | 买入区144.66~151.89 | 信号:持有", - "reason": "技术面重评: 止损140.3→140.18, 止盈177.42→177.34 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.66 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:26", - "old_action": "盈利良好 | 止损140.18 | 目标177.34 | 买入区144.66~151.89 | 信号:持有", - "new_action": "盈利良好 | 止损139.16 | 目标177.37 | 买入区144.73~151.97 | 信号:持有", - "reason": "技术面重评: 止损140.18→139.16, 止盈177.34→177.37 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.73 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:30", - "old_action": "盈利良好 | 止损139.16 | 目标177.37 | 买入区144.73~151.97 | 信号:持有", - "new_action": "盈利良好 | 止损138.75 | 目标177.11 | 买入区144.17~151.38 | 信号:持有", - "reason": "技术面重评: 止损139.16→138.75, 止盈177.37→177.11 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.17 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:32", - "old_action": "盈利良好 | 止损138.75 | 目标177.11 | 买入区144.17~151.38 | 信号:持有", - "new_action": "盈利良好 | 止损139.56 | 目标177.29 | 买入区144.56~151.79 | 信号:持有", - "reason": "技术面重评: 止损138.75→139.56, 止盈177.11→177.29 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.56 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:35", - "old_action": "盈利良好 | 止损139.56 | 目标177.29 | 买入区144.56~151.79 | 信号:持有", - "new_action": "盈利良好 | 止损140.65 | 目标177.48 | 买入区144.97~152.22 | 信号:持有", - "reason": "技术面重评: 止损139.56→140.65, 止盈177.29→177.48 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.97 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:41", - "old_action": "盈利良好 | 止损140.65 | 目标177.48 | 买入区144.97~152.22 | 信号:持有", - "new_action": "盈利良好 | 止损140.92 | 目标177.65 | 买入区145.29~152.55 | 信号:持有", - "reason": "技术面重评: 止损140.65→140.92, 止盈177.48→177.65 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.29 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:43", - "old_action": "盈利良好 | 止损140.92 | 目标177.65 | 买入区145.29~152.55 | 信号:持有", - "new_action": "盈利良好 | 止损140.52 | 目标177.81 | 买入区145.63~152.91 | 信号:持有", - "reason": "技术面重评: 止损140.92→140.52, 止盈177.65→177.81 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.63 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:45", - "old_action": "盈利良好 | 止损140.52 | 目标177.81 | 买入区145.63~152.91 | 信号:持有", - "new_action": "盈利良好 | 止损141.6 | 目标178.02 | 买入区146.07~153.37 | 信号:持有", - "reason": "技术面重评: 止损140.52→141.6, 止盈177.81→178.02 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:146.07 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:47", - "old_action": "盈利良好 | 止损141.6 | 目标178.02 | 买入区146.07~153.37 | 信号:持有", - "new_action": "盈利良好 | 止损141.22 | 目标177.93 | 买入区145.88~153.17 | 信号:持有", - "reason": "技术面重评: 止损141.6→141.22, 止盈178.02→177.93 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.88 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:49", - "old_action": "盈利良好 | 止损141.22 | 目标177.93 | 买入区145.88~153.17 | 信号:持有", - "new_action": "盈利良好 | 止损142.4 | 目标178.18 | 买入区146.39~153.71 | 信号:持有", - "reason": "技术面重评: 止损141.22→142.4, 止盈177.93→178.18 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.39 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:53", - "old_action": "盈利良好 | 止损142.4 | 目标178.18 | 买入区146.39~153.71 | 信号:持有", - "new_action": "盈利良好 | 止损142.63 | 目标178.22 | 买入区146.51~153.84 | 信号:持有", - "reason": "技术面重评: 止损142.4→142.63, 止盈178.18→178.22 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.51 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:57", - "old_action": "盈利良好 | 止损142.63 | 目标178.22 | 买入区146.51~153.84 | 信号:持有", - "new_action": "盈利良好 | 止损142.82 | 目标178.25 | 买入区146.55~153.88 | 信号:持有", - "reason": "技术面重评: 止损142.63→142.82, 止盈178.22→178.25 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.55 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 13:59", - "old_action": "盈利良好 | 止损142.82 | 目标178.25 | 买入区146.55~153.88 | 信号:持有", - "new_action": "盈利良好 | 止损142.47 | 目标178.15 | 买入区146.33~153.65 | 信号:持有", - "reason": "技术面重评: 止损142.82→142.47, 止盈178.25→178.15 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.33 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:01", - "old_action": "盈利良好 | 止损142.47 | 目标178.15 | 买入区146.33~153.65 | 信号:持有", - "new_action": "盈利良好 | 止损142.08 | 目标178.01 | 买入区146.06~153.36 | 信号:持有", - "reason": "技术面重评: 止损142.47→142.08, 止盈178.15→178.01 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:146.06 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:07", - "old_action": "盈利良好 | 止损142.08 | 目标178.01 | 买入区146.06~153.36 | 信号:持有", - "new_action": "盈利良好 | 止损142.54 | 目标178.2 | 买入区146.46~153.78 | 信号:持有", - "reason": "技术面重评: 止损142.08→142.54, 止盈178.01→178.2 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.46 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:09", - "old_action": "盈利良好 | 止损142.54 | 目标178.2 | 买入区146.46~153.78 | 信号:持有", - "new_action": "盈利良好 | 止损141.97 | 目标178.19 | 买入区146.42~153.74 | 信号:持有", - "reason": "技术面重评: 止损142.54→141.97, 止盈178.2→178.19 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.42 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:14", - "old_action": "盈利良好 | 止损141.97 | 目标178.19 | 买入区146.42~153.74 | 信号:持有", - "new_action": "盈利良好 | 止损141.6 | 目标177.78 | 买入区145.59~152.87 | 信号:持有", - "reason": "技术面重评: 止损141.97→141.6, 止盈178.19→177.78 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.59 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:17", - "old_action": "盈利良好 | 止损141.6 | 目标177.78 | 买入区145.59~152.87 | 信号:持有", - "new_action": "盈利良好 | 止损140.83 | 目标177.81 | 买入区145.65~152.93 | 信号:持有", - "reason": "技术面重评: 止损141.6→140.83, 止盈177.78→177.81 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.65 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:25", - "old_action": "盈利良好 | 止损140.83 | 目标177.81 | 买入区145.65~152.93 | 信号:持有", - "new_action": "盈利良好 | 止损141.58 | 目标178.11 | 买入区146.27~153.58 | 信号:持有", - "reason": "技术面重评: 止损140.83→141.58, 止盈177.81→178.11 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:125.49 弱撑:146.27 弱压:156.86 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:27", - "old_action": "盈利良好 | 止损141.58 | 目标178.11 | 买入区146.27~153.58 | 信号:持有", - "new_action": "盈利良好 | 止损141.75 | 目标178.01 | 买入区146.06~153.36 | 信号:持有", - "reason": "技术面重评: 止损141.58→141.75, 止盈178.11→178.01 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:146.06 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:33", - "old_action": "盈利良好 | 止损141.75 | 目标178.01 | 买入区146.06~153.36 | 信号:持有", - "new_action": "盈利良好 | 止损140.59 | 目标177.58 | 买入区145.15~152.41 | 信号:持有", - "reason": "技术面重评: 止损141.75→140.59, 止盈178.01→177.58 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:145.15 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:35", - "old_action": "盈利良好 | 止损140.59 | 目标177.58 | 买入区145.15~152.41 | 信号:持有", - "new_action": "盈利良好 | 止损140.42 | 目标177.57 | 买入区145.13~152.39 | 信号:持有", - "reason": "技术面重评: 止损140.59→140.42, 止盈177.58→177.57 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:145.13 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:39", - "old_action": "盈利良好 | 止损140.42 | 目标177.57 | 买入区145.13~152.39 | 信号:持有", - "new_action": "盈利良好 | 止损141.13 | 目标177.78 | 买入区145.59~152.87 | 信号:持有", - "reason": "技术面重评: 止损140.42→141.13, 止盈177.57→177.78 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.59 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:43", - "old_action": "盈利良好 | 止损141.13 | 目标177.78 | 买入区145.59~152.87 | 信号:持有", - "new_action": "盈利良好 | 止损140.76 | 目标177.67 | 买入区145.34~152.61 | 信号:持有", - "reason": "技术面重评: 止损141.13→140.76, 止盈177.78→177.67 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.34 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:45", - "old_action": "盈利良好 | 止损140.76 | 目标177.67 | 买入区145.34~152.61 | 信号:持有", - "new_action": "盈利良好 | 止损141.03 | 目标177.69 | 买入区145.37~152.64 | 信号:持有", - "reason": "技术面重评: 止损140.76→141.03, 止盈177.67→177.69 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.37 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:47", - "old_action": "盈利良好 | 止损141.03 | 目标177.69 | 买入区145.37~152.64 | 信号:持有", - "new_action": "盈利良好 | 止损140.77 | 目标177.75 | 买入区145.53~152.81 | 信号:持有", - "reason": "技术面重评: 止损141.03→140.77, 止盈177.69→177.75 | 形态:带下影阴线/neutral 量价:买卖均衡 强撑:125.49 弱撑:145.53 弱压:156.86 强压:18", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:53", - "old_action": "盈利良好 | 止损140.77 | 目标177.75 | 买入区145.53~152.81 | 信号:持有", - "new_action": "盈利良好 | 止损140.17 | 目标177.44 | 买入区144.87~152.11 | 信号:持有", - "reason": "技术面重评: 止损140.77→140.17, 止盈177.75→177.44 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.87 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 14:59", - "old_action": "盈利良好 | 止损140.17 | 目标177.44 | 买入区144.87~152.11 | 信号:持有", - "new_action": "盈利良好 | 止损139.98 | 目标177.4 | 买入区144.77~152.01 | 信号:持有", - "reason": "技术面重评: 止损140.17→139.98, 止盈177.44→177.4 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.77 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 15:01", - "old_action": "盈利良好 | 止损139.98 | 目标177.4 | 买入区144.77~152.01 | 信号:持有", - "new_action": "盈利良好 | 止损139.97 | 目标177.39 | 买入区144.77~152.01 | 信号:持有", - "reason": "技术面重评: 止损139.98→139.97, 止盈177.4→177.39 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:125.49 弱撑:144.77 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 22:42", - "old_action": "盈利良好 | 止损139.97 | 目标177.39 | 买入区144.77~152.01 | 信号:持有", - "new_action": "盈利良好 | 止损139.97 | 目标153.8 | 买入区144.77~152.01 | 信号:持有", - "reason": "技术面重评: 止盈177.39→153.8 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:140.77 弱撑:144.77 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-26 22:48", - "old_action": "盈利良好 | 止损144.3 | 目标160.21 | 买入区144.77~152.01 | 信号:持有", - "new_action": "盈利良好 | 止损139.97 | 目标153.8 | 买入区144.77~152.01 | 信号:持有", - "reason": "技术面重评: 止损144.3→139.97, 止盈160.21→153.8 | 形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:140.77 弱撑:144.77 弱压:156.86 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:17", - "old_action": "盈利良好 | 止损139.97 | 目标153.8 | 买入区144.77~152.01 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损139.25 | 目标0 | 买入区133.2~155.4 | 信号:持有", - "reason": "技术面重评: 止损139.97→139.25 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:19", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损139.25 | 目标0 | 买入区133.2~155.4 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损139.96 | 目标0 | 买入区133.88~156.19 | 信号:持有", - "reason": "技术面重评: 止损139.25→139.96 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:28", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损139.96 | 目标0 | 买入区133.88~156.19 | 信号:持有", - "new_action": "盈利良好 | 止损139.07 | 目标153.24 | 买入区147.8~151.5 | 信号:持有", - "reason": "技术面重评: 止损139.96→139.07 | 形态:平盘/neutral 量价:买卖均衡 强撑:135.98 弱撑:147.8 弱压:148.76 强压:159.62", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:33", - "old_action": "盈利良好 | 止损139.07 | 目标153.24 | 买入区147.8~151.5 | 信号:持有", - "new_action": "盈利良好 | 止损142.59 | 目标153.77 | 买入区147.09~152.11 | 信号:持有", - "reason": "技术面重评: 止损139.07→142.59, 止盈153.24→153.77 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:136.51 弱撑:147.09 弱压:149.19 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:35", - "old_action": "盈利良好 | 止损142.59 | 目标153.77 | 买入区147.09~152.11 | 信号:持有", - "new_action": "盈利良好 | 止损141.57 | 目标153.93 | 买入区147.33~151.67 | 信号:持有", - "reason": "技术面重评: 止损142.59→141.57, 止盈153.77→153.93 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:136.59 弱撑:147.33 弱压:149.53 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:36", - "old_action": "盈利良好 | 止损141.57 | 目标153.93 | 买入区147.33~151.67 | 信号:持有", - "new_action": "盈利良好 | 止损143.27 | 目标152.5 | 买入区148.27~151.78 | 信号:持有", - "reason": "技术面重评: 止损141.57→143.27, 止盈153.93→152.5 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:139.41 弱撑:148.27 弱压:150.87 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:38", - "old_action": "盈利良好 | 止损143.27 | 目标152.5 | 买入区148.27~151.78 | 信号:持有", - "new_action": "盈利良好 | 止损144.96 | 目标155.84 | 买入区148.55~154.38 | 信号:持有", - "reason": "技术面重评: 止损143.27→144.96, 止盈152.5→155.84 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.66 弱撑:148.55 弱压:152.59 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:40", - "old_action": "盈利良好 | 止损144.96 | 目标155.84 | 买入区148.55~154.38 | 信号:持有", - "new_action": "盈利良好 | 止损144.62 | 目标155.77 | 买入区148.45~154.17 | 信号:持有", - "reason": "技术面重评: 止损144.96→144.62, 止盈155.84→155.77 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.62 弱撑:148.45 弱压:152.49 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:42", - "old_action": "盈利良好 | 止损144.62 | 目标155.77 | 买入区148.45~154.17 | 信号:持有", - "new_action": "盈利良好 | 止损145.4 | 目标153.69 | 买入区148.76~153.48 | 信号:持有", - "reason": "技术面重评: 止损144.62→145.4, 止盈155.77→153.69 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:140.65 弱撑:148.76 弱压:153.35 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:44", - "old_action": "盈利良好 | 止损145.4 | 目标153.69 | 买入区148.76~153.48 | 信号:持有", - "new_action": "盈利良好 | 止损145.97 | 目标154.03 | 买入区148.76~153.94 | 信号:持有", - "reason": "技术面重评: 止损145.4→145.97, 止盈153.69→154.03 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:141.01 弱撑:148.76 弱压:154.06 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:46", - "old_action": "盈利良好 | 止损145.97 | 目标154.03 | 买入区148.76~153.94 | 信号:持有", - "new_action": "盈利良好 | 止损146.67 | 目标154.2 | 买入区148.76~154.39 | 信号:持有", - "reason": "技术面重评: 止损145.97→146.67, 止盈154.03→154.2 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:141.19 弱撑:148.76 弱压:154.41 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:49", - "old_action": "盈利良好 | 止损146.67 | 目标154.2 | 买入区148.76~154.39 | 信号:持有", - "new_action": "盈利良好 | 止损145.74 | 目标153.97 | 买入区148.35~153.8 | 信号:持有", - "reason": "技术面重评: 止损146.67→145.74, 止盈154.2→153.97 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:140.95 弱撑:148.35 弱压:153.94 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:50", - "old_action": "盈利良好 | 止损145.74 | 目标153.97 | 买入区148.35~153.8 | 信号:持有", - "new_action": "盈利良好 | 止损145.63 | 目标154.08 | 买入区148.57~153.8 | 信号:持有", - "reason": "技术面重评: 止损145.74→145.63, 止盈153.97→154.08 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:141.06 弱撑:148.57 弱压:154.16 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:53", - "old_action": "盈利良好 | 止损145.63 | 目标154.08 | 买入区148.57~153.8 | 信号:持有", - "new_action": "盈利良好 | 止损145.35 | 目标153.89 | 买入区148.18~153.56 | 信号:持有", - "reason": "技术面重评: 止损145.63→145.35, 止盈154.08→153.89 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:140.86 弱撑:148.18 弱压:153.77 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:55", - "old_action": "盈利良好 | 止损145.35 | 目标153.89 | 买入区148.18~153.56 | 信号:持有", - "new_action": "盈利良好 | 止损145.14 | 目标153.82 | 买入区148.03~153.42 | 信号:持有", - "reason": "技术面重评: 止损145.35→145.14, 止盈153.89→153.82 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:140.79 弱撑:148.03 弱压:153.62 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:57", - "old_action": "盈利良好 | 止损145.14 | 目标153.82 | 买入区148.03~153.42 | 信号:持有", - "new_action": "盈利良好 | 止损143.96 | 目标153.41 | 买入区147.17~152.61 | 信号:持有", - "reason": "技术面重评: 止损145.14→143.96, 止盈153.82→153.41 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:140.36 弱撑:147.17 弱压:152.76 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 09:59", - "old_action": "盈利良好 | 止损143.96 | 目标153.41 | 买入区147.17~152.61 | 信号:持有", - "new_action": "盈利良好 | 止损143.95 | 目标153.58 | 买入区147.53~152.69 | 信号:持有", - "reason": "技术面重评: 止损143.96→143.95, 止盈153.41→153.58 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:140.54 弱撑:147.53 弱压:153.12 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:01", - "old_action": "盈利良好 | 止损143.95 | 目标153.58 | 买入区147.53~152.69 | 信号:持有", - "new_action": "盈利良好 | 止损141.2 | 目标153.41 | 买入区147.18~152.69 | 信号:持有", - "reason": "技术面重评: 止损143.95→141.2, 止盈153.58→153.41 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:140.36 弱撑:147.18 弱压:152.77 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:03", - "old_action": "盈利良好 | 止损141.2 | 目标153.41 | 买入区147.18~152.69 | 信号:持有", - "new_action": "盈利良好 | 止损139.77 | 目标154.71 | 买入区145.71~152.62 | 信号:持有", - "reason": "技术面重评: 止损141.2→139.77, 止盈153.41→154.71 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:137.54 弱撑:145.71 弱压:151.3 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:05", - "old_action": "盈利良好 | 止损139.77 | 目标154.71 | 买入区145.71~152.62 | 信号:持有", - "new_action": "盈利良好 | 止损138.78 | 目标154.26 | 买入区144.87~151.88 | 信号:持有", - "reason": "技术面重评: 止损139.77→138.78, 止盈154.71→154.26 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:137.17 弱撑:144.87 弱压:151.06 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:07", - "old_action": "盈利良好 | 止损138.78 | 目标154.26 | 买入区144.87~151.88 | 信号:持有", - "new_action": "盈利良好 | 止损138.36 | 目标154.26 | 买入区144.87~151.66 | 信号:持有", - "reason": "技术面重评: 止损138.78→138.36 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:137.17 弱撑:144.87 弱压:151.06 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:09", - "old_action": "盈利良好 | 止损138.36 | 目标154.26 | 买入区144.87~151.66 | 信号:持有", - "new_action": "盈利良好 | 止损136.49 | 目标152.81 | 买入区142.18~149.29 | 信号:持有", - "reason": "技术面重评: 止损138.36→136.49, 止盈154.26→152.81 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:135.98 弱撑:142.18 弱压:150.41 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:12", - "old_action": "盈利良好 | 止损136.49 | 目标152.81 | 买入区142.18~149.29 | 信号:持有", - "new_action": "盈利良好 | 止损136.28 | 目标152.85 | 买入区141.31~148.38 | 信号:持有", - "reason": "技术面重评: 止损136.49→136.28, 止盈152.81→152.85 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:135.08 弱撑:141.31 弱压:150.15 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:15", - "old_action": "盈利良好 | 止损136.28 | 目标152.85 | 买入区141.31~148.38 | 信号:持有", - "new_action": "盈利良好 | 止损135.43 | 目标153.17 | 买入区141.46~148.53 | 信号:持有", - "reason": "技术面重评: 止损136.28→135.43, 止盈152.85→153.17 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:134.91 弱撑:141.46 弱压:150.55 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:17", - "old_action": "盈利良好 | 止损135.43 | 目标153.17 | 买入区141.46~148.53 | 信号:持有", - "new_action": "盈利良好 | 止损136.2 | 目标153.17 | 买入区140.7~147.73 | 信号:持有", - "reason": "技术面重评: 止损135.43→136.2 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:134.13 弱撑:140.7 弱压:150.18 强压:159", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:19", - "old_action": "盈利良好 | 止损136.2 | 目标153.17 | 买入区140.7~147.73 | 信号:持有", - "new_action": "盈利良好 | 止损134.67 | 目标153.27 | 买入区139.34~146.31 | 信号:持有", - "reason": "技术面重评: 止损136.2→134.67, 止盈153.17→153.27 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.66 弱撑:139.34 弱压:149.61 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:20", - "old_action": "盈利良好 | 止损134.67 | 目标153.27 | 买入区139.34~146.31 | 信号:持有", - "new_action": "盈利良好 | 止损133.97 | 目标153.62 | 买入区138.85~145.79 | 信号:持有", - "reason": "技术面重评: 止损134.67→133.97, 止盈153.27→153.62 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:131.82 弱撑:138.85 弱压:149.72 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:23", - "old_action": "盈利良好 | 止损133.97 | 目标153.62 | 买入区138.85~145.79 | 信号:持有", - "new_action": "盈利良好 | 止损133.88 | 目标153.72 | 买入区139.06~146.01 | 信号:持有", - "reason": "技术面重评: 止损133.97→133.88, 止盈153.62→153.72 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:131.93 弱撑:139.06 弱压:149.93 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:25", - "old_action": "盈利良好 | 止损133.88 | 目标153.72 | 买入区139.06~146.01 | 信号:持有", - "new_action": "盈利良好 | 止损134.54 | 目标153.92 | 买入区139.46~146.43 | 信号:持有", - "reason": "技术面重评: 止损133.88→134.54, 止盈153.72→153.92 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.13 弱撑:139.46 弱压:150.33 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:27", - "old_action": "盈利良好 | 止损134.54 | 目标153.92 | 买入区139.46~146.43 | 信号:持有", - "new_action": "盈利良好 | 止损135.77 | 目标154.12 | 买入区139.89~146.88 | 信号:持有", - "reason": "技术面重评: 止损134.54→135.77, 止盈153.92→154.12 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.34 弱撑:139.89 弱压:150.76 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:29", - "old_action": "盈利良好 | 止损135.77 | 目标154.12 | 买入区139.89~146.88 | 信号:持有", - "new_action": "盈利良好 | 止损135.77 | 目标154.24 | 买入区140.15~147.16 | 信号:持有", - "reason": "技术面重评: 止盈154.12→154.24 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:132.47 弱撑:140.15 弱压:151.02 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:31", - "old_action": "盈利良好 | 止损135.77 | 目标154.24 | 买入区140.15~147.16 | 信号:持有", - "new_action": "盈利良好 | 止损138.69 | 目标153.96 | 买入区139.56~146.54 | 信号:持有", - "reason": "技术面重评: 止损135.77→138.69, 止盈154.24→153.96 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.17 弱撑:139.56 弱压:150.43 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:33", - "old_action": "盈利良好 | 止损138.69 | 目标153.96 | 买入区139.56~146.54 | 信号:持有", - "new_action": "盈利良好 | 止损138.52 | 目标153.9 | 买入区139.42~146.39 | 信号:持有", - "reason": "技术面重评: 止损138.69→138.52, 止盈153.96→153.9 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.11 弱撑:139.42 弱压:150.29 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:35", - "old_action": "盈利良好 | 止损138.52 | 目标153.9 | 买入区139.42~146.39 | 信号:持有", - "new_action": "盈利良好 | 止损136.46 | 目标153.48 | 买入区138.34~145.26 | 信号:持有", - "reason": "技术面重评: 止损138.52→136.46, 止盈153.9→153.48 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:131.44 弱撑:138.34 弱压:149.33 强压:15", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:37", - "old_action": "盈利良好 | 止损136.46 | 目标153.48 | 买入区138.34~145.26 | 信号:持有", - "new_action": "盈利良好 | 止损135.88 | 目标153.76 | 买入区137.54~144.42 | 信号:持有", - "reason": "技术面重评: 止损136.46→135.88, 止盈153.48→153.76 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.37 弱撑:137.54 弱压:149.21 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:40", - "old_action": "盈利良好 | 止损135.88 | 目标153.76 | 买入区137.54~144.42 | 信号:持有", - "new_action": "盈利良好 | 止损136.93 | 目标154.44 | 买入区138.34~145.26 | 信号:持有", - "reason": "技术面重评: 止损135.88→136.93, 止盈153.76→154.44 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.44 弱撑:138.34 弱压:150.33 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:45", - "old_action": "盈利良好 | 止损136.93 | 目标154.44 | 买入区138.34~145.26 | 信号:持有", - "new_action": "盈利良好 | 止损135.01 | 目标154.63 | 买入区138.72~145.66 | 信号:持有", - "reason": "技术面重评: 止损136.93→135.01, 止盈154.44→154.63 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.63 弱撑:138.72 弱压:150.71 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:47", - "old_action": "盈利良好 | 止损135.01 | 目标154.63 | 买入区138.72~145.66 | 信号:持有", - "new_action": "盈利良好 | 止损135.45 | 目标154.68 | 买入区138.84~145.78 | 信号:持有", - "reason": "技术面重评: 止损135.01→135.45, 止盈154.63→154.68 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.69 弱撑:138.84 弱压:150.83 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:49", - "old_action": "盈利良好 | 止损135.45 | 目标154.68 | 买入区138.84~145.78 | 信号:持有", - "new_action": "盈利良好 | 止损135.26 | 目标154.76 | 买入区138.99~145.94 | 信号:持有", - "reason": "技术面重评: 止损135.45→135.26, 止盈154.68→154.76 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.77 弱撑:138.99 弱压:150.98 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:51", - "old_action": "盈利良好 | 止损135.26 | 目标154.76 | 买入区138.99~145.94 | 信号:持有", - "new_action": "盈利良好 | 止损135.79 | 目标154.89 | 买入区139.25~146.21 | 信号:持有", - "reason": "技术面重评: 止损135.26→135.79, 止盈154.76→154.89 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:130.9 弱撑:139.25 弱压:151.24 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:53", - "old_action": "盈利良好 | 止损135.79 | 目标154.89 | 买入区139.25~146.21 | 信号:持有", - "new_action": "盈利良好 | 止损135.67 | 目标154.7 | 买入区138.87~145.81 | 信号:持有", - "reason": "技术面重评: 止损135.79→135.67, 止盈154.89→154.7 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.71 弱撑:138.87 弱压:150.86 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:55", - "old_action": "盈利良好 | 止损135.67 | 目标154.7 | 买入区138.87~145.81 | 信号:持有", - "new_action": "盈利良好 | 止损135.51 | 目标154.78 | 买入区139.02~145.97 | 信号:持有", - "reason": "技术面重评: 止损135.67→135.51, 止盈154.7→154.78 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:130.79 弱撑:139.02 弱压:151.01 强压:16", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:57", - "old_action": "盈利良好 | 止损135.51 | 目标154.78 | 买入区139.02~145.97 | 信号:持有", - "new_action": "盈利良好 | 止损135.96 | 目标155.04 | 买入区139.57~146.55 | 信号:持有", - "reason": "技术面重评: 止损135.51→135.96, 止盈154.78→155.04 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.06 弱撑:139.57 弱压:151.56 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 10:59", - "old_action": "盈利良好 | 止损135.96 | 目标155.04 | 买入区139.57~146.55 | 信号:持有", - "new_action": "盈利良好 | 止损136.61 | 目标155.21 | 买入区139.93~146.93 | 信号:持有", - "reason": "技术面重评: 止损135.96→136.61, 止盈155.04→155.21 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.24 弱撑:139.93 弱压:151.92 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:04", - "old_action": "盈利良好 | 止损136.61 | 目标155.21 | 买入区139.93~146.93 | 信号:持有", - "new_action": "盈利良好 | 止损137.37 | 目标155.51 | 买入区140.56~147.59 | 信号:持有", - "reason": "技术面重评: 止损136.61→137.37, 止盈155.21→155.51 | 形态:长影星线/neutral 量价:买卖均衡 强撑:131.55 弱撑:140.56 弱压:152.55 强压:161", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:08", - "old_action": "盈利良好 | 止损137.37 | 目标155.51 | 买入区140.56~147.59 | 信号:持有", - "new_action": "盈利良好 | 止损138.27 | 目标155.58 | 买入区140.68~147.71 | 信号:持有", - "reason": "技术面重评: 止损137.37→138.27, 止盈155.51→155.58 | 形态:长影星线/neutral 量价:买卖均衡 强撑:131.62 弱撑:140.68 弱压:152.67 强压:162", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:11", - "old_action": "盈利良好 | 止损138.27 | 目标155.58 | 买入区140.68~147.71 | 信号:持有", - "new_action": "盈利良好 | 止损138.03 | 目标155.4 | 买入区140.34~147.36 | 信号:持有", - "reason": "技术面重评: 止损138.27→138.03, 止盈155.58→155.4 | 形态:长影星线/neutral 量价:买卖均衡 强撑:131.44 弱撑:140.34 弱压:152.33 强压:161", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:17", - "old_action": "盈利良好 | 止损138.03 | 目标155.4 | 买入区140.34~147.36 | 信号:持有", - "new_action": "盈利良好 | 止损138.75 | 目标155.84 | 买入区141.24~148.3 | 信号:持有", - "reason": "技术面重评: 止损138.03→138.75, 止盈155.4→155.84 | 形态:十字星/neutral 量价:买卖均衡 强撑:131.89 弱撑:141.24 弱压:153.23 强压:162.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:19", - "old_action": "盈利良好 | 止损138.75 | 目标155.84 | 买入区141.24~148.3 | 信号:持有", - "new_action": "盈利良好 | 止损138.31 | 目标155.84 | 买入区141.24~148.3 | 信号:持有", - "reason": "技术面重评: 止损138.75→138.31 | 形态:十字星/neutral 量价:买卖均衡 强撑:131.89 弱撑:141.24 弱压:153.23 强压:162.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:23", - "old_action": "盈利良好 | 止损138.31 | 目标155.84 | 买入区141.24~148.3 | 信号:持有", - "new_action": "盈利良好 | 止损137.58 | 目标155.28 | 买入区140.06~147.06 | 信号:持有", - "reason": "技术面重评: 止损138.31→137.58, 止盈155.84→155.28 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.31 弱撑:140.06 弱压:152.05 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:27", - "old_action": "盈利良好 | 止损137.58 | 目标155.28 | 买入区140.06~147.06 | 信号:持有", - "new_action": "盈利良好 | 止损136.15 | 目标154.91 | 买入区139.28~146.24 | 信号:持有", - "reason": "技术面重评: 止损137.58→136.15, 止盈155.28→154.91 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:130.92 弱撑:139.28 弱压:151.27 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:29", - "old_action": "盈利良好 | 止损136.15 | 目标154.91 | 买入区139.28~146.24 | 信号:持有", - "new_action": "盈利良好 | 止损136.1 | 目标155.09 | 买入区139.67~146.65 | 信号:持有", - "reason": "技术面重评: 止损136.15→136.1, 止盈154.91→155.09 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.11 弱撑:139.67 弱压:151.66 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 11:39", - "old_action": "盈利良好 | 止损136.1 | 目标155.09 | 买入区139.67~146.65 | 信号:持有", - "new_action": "盈利良好 | 止损136.53 | 目标155.12 | 买入区139.74~146.73 | 信号:持有", - "reason": "技术面重评: 止损136.1→136.53, 止盈155.09→155.12 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.14 弱撑:139.74 弱压:151.73 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:01", - "old_action": "盈利良好 | 止损136.53 | 目标155.12 | 买入区139.74~146.73 | 信号:持有", - "new_action": "盈利良好 | 止损136.43 | 目标155.16 | 买入区139.8~146.79 | 信号:持有", - "reason": "技术面重评: 止损136.53→136.43, 止盈155.12→155.16 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.18 弱撑:139.8 弱压:151.79 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:14", - "old_action": "盈利良好 | 止损136.43 | 目标155.16 | 买入区139.8~146.79 | 信号:持有", - "new_action": "盈利良好 | 止损136.06 | 目标155.02 | 买入区139.54~146.52 | 信号:持有", - "reason": "技术面重评: 止损136.43→136.06, 止盈155.16→155.02 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.04 弱撑:139.54 弱压:151.53 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:18", - "old_action": "盈利良好 | 止损136.06 | 目标155.02 | 买入区139.54~146.52 | 信号:持有", - "new_action": "盈利良好 | 止损136.88 | 目标155.26 | 买入区140.04~147.04 | 信号:持有", - "reason": "技术面重评: 止损136.06→136.88, 止盈155.02→155.26 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:131.29 弱撑:140.04 弱压:152.03 强压", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:26", - "old_action": "盈利良好 | 止损136.88 | 目标155.26 | 买入区140.04~147.04 | 信号:持有", - "new_action": "盈利良好 | 止损137.9 | 目标155.68 | 买入区140.9~147.95 | 信号:持有", - "reason": "技术面重评: 止损136.88→137.9, 止盈155.26→155.68 | 形态:长影星线/neutral 量价:买卖均衡 强撑:131.73 弱撑:140.9 弱压:152.89 强压:162.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:30", - "old_action": "盈利良好 | 止损137.9 | 目标155.68 | 买入区140.9~147.95 | 信号:持有", - "new_action": "盈利良好 | 止损138.63 | 目标155.76 | 买入区141.08~148.13 | 信号:持有", - "reason": "技术面重评: 止损137.9→138.63, 止盈155.68→155.76 | 形态:长影星线/neutral 量价:买卖均衡 强撑:131.81 弱撑:141.08 弱压:153.07 强压:162", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:33", - "old_action": "盈利良好 | 止损138.63 | 目标155.76 | 买入区141.08~148.13 | 信号:持有", - "new_action": "盈利良好 | 止损138.64 | 目标155.87 | 买入区141.3~148.37 | 信号:持有", - "reason": "技术面重评: 止损138.63→138.64, 止盈155.76→155.87 | 形态:十字星/neutral 量价:买卖均衡 强撑:131.92 弱撑:141.3 弱压:153.29 强压:162.3", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:38", - "old_action": "盈利良好 | 止损138.64 | 目标155.87 | 买入区141.3~148.37 | 信号:持有", - "new_action": "盈利良好 | 止损142.29 | 目标156.14 | 买入区141.86~148.95 | 信号:持有", - "reason": "技术面重评: 止损138.64→142.29, 止盈155.87→156.14 | 形态:十字星/neutral 量价:买卖均衡 强撑:132.21 弱撑:141.86 弱压:153.85 强压:162.", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:42", - "old_action": "盈利良好 | 止损142.29 | 目标156.14 | 买入区141.86~148.95 | 信号:持有", - "new_action": "盈利良好 | 止损143.82 | 目标156.65 | 买入区142.94~150.09 | 信号:持有", - "reason": "技术面重评: 止损142.29→143.82, 止盈156.14→156.65 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.74 弱撑:142.94 弱压:154.93 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:46", - "old_action": "盈利良好 | 止损143.82 | 目标156.65 | 买入区142.94~150.09 | 信号:持有", - "new_action": "盈利良好 | 止损144.69 | 目标156.82 | 买入区143.28~150.44 | 信号:持有", - "reason": "技术面重评: 止损143.82→144.69, 止盈156.65→156.82 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.91 弱撑:143.28 弱压:155.27 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:49", - "old_action": "盈利良好 | 止损144.69 | 目标156.82 | 买入区143.28~150.44 | 信号:持有", - "new_action": "盈利良好 | 止损144.89 | 目标156.95 | 买入区143.55~150.73 | 信号:持有", - "reason": "技术面重评: 止损144.69→144.89, 止盈156.82→156.95 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.05 弱撑:143.55 弱压:155.54 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:51", - "old_action": "盈利良好 | 止损144.89 | 目标156.95 | 买入区143.55~150.73 | 信号:持有", - "new_action": "盈利良好 | 止损144.41 | 目标156.93 | 买入区143.51~150.69 | 信号:持有", - "reason": "技术面重评: 止损144.89→144.41, 止盈156.95→156.93 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.03 弱撑:143.51 弱压:155.5 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:53", - "old_action": "盈利良好 | 止损144.41 | 目标156.93 | 买入区143.51~150.69 | 信号:持有", - "new_action": "盈利良好 | 止损144.8 | 目标156.93 | 买入区143.52~150.7 | 信号:持有", - "reason": "技术面重评: 止损144.41→144.8 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.03 弱撑:143.52 弱压:155.51 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:55", - "old_action": "盈利良好 | 止损144.8 | 目标156.93 | 买入区143.52~150.7 | 信号:持有", - "new_action": "盈利良好 | 止损145.03 | 目标156.84 | 买入区143.34~150.51 | 信号:持有", - "reason": "技术面重评: 止损144.8→145.03, 止盈156.93→156.84 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.94 弱撑:143.34 弱压:155.33 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:57", - "old_action": "盈利良好 | 止损145.03 | 目标156.84 | 买入区143.34~150.51 | 信号:持有", - "new_action": "盈利良好 | 止损144.17 | 目标156.73 | 买入区143.08~150.23 | 信号:持有", - "reason": "技术面重评: 止损145.03→144.17, 止盈156.84→156.73 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.82 弱撑:143.08 弱压:155.07 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 13:59", - "old_action": "盈利良好 | 止损144.17 | 目标156.73 | 买入区143.08~150.23 | 信号:持有", - "new_action": "盈利良好 | 止损144.55 | 目标156.91 | 买入区143.46~150.63 | 信号:持有", - "reason": "技术面重评: 止损144.17→144.55, 止盈156.73→156.91 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.01 弱撑:143.46 弱压:155.45 强压:", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:02", - "old_action": "盈利良好 | 止损144.55 | 目标156.91 | 买入区143.46~150.63 | 信号:持有", - "new_action": "盈利良好 | 止损145.17 | 目标157.16 | 买入区144.0~151.2 | 信号:持有", - "reason": "技术面重评: 止损144.55→145.17, 止盈156.91→157.16 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:133.27 弱撑:144.0 弱压:155.99 强压:163", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:05", - "old_action": "盈利良好 | 止损145.17 | 目标157.16 | 买入区144.0~151.2 | 信号:持有", - "new_action": "盈利良好 | 止损144.57 | 目标156.88 | 买入区143.41~150.58 | 信号:持有", - "reason": "技术面重评: 止损145.17→144.57, 止盈157.16→156.88 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.98 弱撑:143.41 弱压:155.4 强压:1", - "trigger": "技术面重评" - }, - { - "date": "2026-06-29 14:07", - "old_action": "盈利良好 | 止损144.57 | 目标156.88 | 买入区143.41~150.58 | 信号:持有", - "new_action": "盈利良好 | 止损140.68 | 目标156.45 | 买入区142.51~149.64 | 信号:持有", - "reason": "技术面重评: 止损144.57→140.68, 止盈156.88→156.45 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.53 弱撑:142.51 弱压:154.5 强压:1", + "date": "2026-07-01 10:10", + "old_action": "盈利良好 | 止损161.01 | 目标182.08 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损159.92 | 目标181.74 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损161.01→159.92, 止盈182.08→181.74 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:137.55 弱撑:158.82 弱压:166.93 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:11", - "old_action": "盈利良好 | 止损140.68 | 目标156.45 | 买入区142.51~149.64 | 信号:持有", - "new_action": "盈利良好 | 止损140.62 | 目标156.39 | 买入区142.4~149.52 | 信号:持有", - "reason": "技术面重评: 止损140.68→140.62, 止盈156.45→156.39 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.47 弱撑:142.4 弱压:154.39 强压:1", + "date": "2026-07-01 10:30", + "old_action": "盈利良好 | 止损159.92 | 目标181.74 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损156.95 | 目标181.38 | 买入区158.82~166.76 | 信号:持有", + "reason": "技术面重评: 止损159.92→156.95, 止盈181.74→181.38 | 形态:带上影阳线/neutral 量价:买卖均衡 强撑:137.18 弱撑:158.82 弱压:166.21 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:15", - "old_action": "盈利良好 | 止损140.62 | 目标156.39 | 买入区142.4~149.52 | 信号:持有", - "new_action": "盈利良好 | 止损140.17 | 目标156.38 | 买入区142.36~149.48 | 信号:持有", - "reason": "技术面重评: 止损140.62→140.17, 止盈156.39→156.38 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.46 弱撑:142.36 弱压:154.35 强压:", + "date": "2026-07-01 10:34", + "old_action": "盈利良好 | 止损156.95 | 目标181.38 | 买入区158.82~166.76 | 信号:持有", + "new_action": "盈利良好 | 止损156.81 | 目标186.32 | 买入区158.22~166.13 | 信号:持有", + "reason": "技术面重评: 止损156.95→156.81, 止盈181.38→186.32 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:136.67 弱撑:158.22 弱压:165.18 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:19", - "old_action": "盈利良好 | 止损140.17 | 目标156.38 | 买入区142.36~149.48 | 信号:持有", - "new_action": "盈利良好 | 止损140.3 | 目标156.38 | 买入区142.37~149.49 | 信号:持有", - "reason": "技术面重评: 止损140.17→140.3 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.46 弱撑:142.37 弱压:154.36 强压:", + "date": "2026-07-01 10:36", + "old_action": "盈利良好 | 止损156.81 | 目标186.32 | 买入区158.22~166.13 | 信号:持有", + "new_action": "盈利良好 | 止损154.28 | 目标185.07 | 买入区155.7~163.48 | 信号:持有", + "reason": "技术面重评: 止损156.81→154.28, 止盈186.32→185.07 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:135.41 弱撑:155.7 弱压:164.09 强压:", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:33", - "old_action": "盈利良好 | 止损140.3 | 目标156.38 | 买入区142.37~149.49 | 信号:持有", - "new_action": "盈利良好 | 止损140.81 | 目标156.58 | 买入区142.77~149.91 | 信号:持有", - "reason": "技术面重评: 止损140.3→140.81, 止盈156.38→156.58 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.66 弱撑:142.77 弱压:154.76 强压:", + "date": "2026-07-01 10:39", + "old_action": "盈利良好 | 止损154.28 | 目标185.07 | 买入区155.7~163.48 | 信号:持有", + "new_action": "盈利良好 | 止损153.96 | 目标184.9 | 买入区155.35~163.12 | 信号:持有", + "reason": "技术面重评: 止损154.28→153.96, 止盈185.07→184.9 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:135.23 弱撑:155.35 弱压:164.23 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:35", - "old_action": "盈利良好 | 止损140.81 | 目标156.58 | 买入区142.77~149.91 | 信号:持有", - "new_action": "盈利良好 | 止损139.93 | 目标156.29 | 买入区142.18~149.29 | 信号:持有", - "reason": "技术面重评: 止损140.81→139.93, 止盈156.58→156.29 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.36 弱撑:142.18 弱压:154.17 强压:", + "date": "2026-07-01 10:41", + "old_action": "盈利良好 | 止损153.96 | 目标184.9 | 买入区155.35~163.12 | 信号:持有", + "new_action": "盈利良好 | 止损153.36 | 目标184.04 | 买入区153.63~161.31 | 信号:持有", + "reason": "技术面重评: 止损153.96→153.36, 止盈184.9→184.04 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:134.37 弱撑:153.63 弱压:163.6 强压:186", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:37", - "old_action": "盈利良好 | 止损139.93 | 目标156.29 | 买入区142.18~149.29 | 信号:持有", - "new_action": "盈利良好 | 止损143.41 | 目标156.47 | 买入区142.55~149.68 | 信号:持有", - "reason": "技术面重评: 止损139.93→143.41, 止盈156.29→156.47 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.55 弱撑:142.55 弱压:154.54 强压:", + "date": "2026-07-01 10:43", + "old_action": "盈利良好 | 止损153.36 | 目标184.04 | 买入区153.63~161.31 | 信号:持有", + "new_action": "盈利良好 | 止损152.1 | 目标178.43 | 买入区153.09~160.74 | 信号:持有", + "reason": "技术面重评: 止损153.36→152.1, 止盈184.04→178.43 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:134.1 弱撑:153.09 弱压:163.71 强压:185", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:39", - "old_action": "盈利良好 | 止损143.41 | 目标156.47 | 买入区142.55~149.68 | 信号:持有", - "new_action": "盈利良好 | 止损144.06 | 目标156.65 | 买入区142.94~150.09 | 信号:持有", - "reason": "技术面重评: 止损143.41→144.06, 止盈156.47→156.65 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.74 弱撑:142.94 弱压:154.93 强压:", + "date": "2026-07-01 10:51", + "old_action": "盈利良好 | 止损152.1 | 目标178.43 | 买入区153.09~160.74 | 信号:持有", + "new_action": "盈利良好 | 止损154.47 | 目标179.15 | 买入区154.59~162.32 | 信号:持有", + "reason": "技术面重评: 止损152.1→154.47, 止盈178.43→179.15 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:134.85 弱撑:154.59 弱压:165.21 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:41", - "old_action": "盈利良好 | 止损144.06 | 目标156.65 | 买入区142.94~150.09 | 信号:持有", - "new_action": "盈利良好 | 止损143.71 | 目标156.6 | 买入区142.84~149.98 | 信号:持有", - "reason": "技术面重评: 止损144.06→143.71, 止盈156.65→156.6 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.69 弱撑:142.84 弱压:154.83 强压:", + "date": "2026-07-01 10:53", + "old_action": "盈利良好 | 止损154.47 | 目标179.15 | 买入区154.59~162.32 | 信号:持有", + "new_action": "盈利良好 | 止损154.15 | 目标179.07 | 买入区154.43~162.15 | 信号:持有", + "reason": "技术面重评: 止损154.47→154.15, 止盈179.15→179.07 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:134.77 弱撑:154.43 弱压:165.05 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:43", - "old_action": "盈利良好 | 止损143.71 | 目标156.6 | 买入区142.84~149.98 | 信号:持有", - "new_action": "盈利良好 | 止损143.88 | 目标156.56 | 买入区142.74~149.88 | 信号:持有", - "reason": "技术面重评: 止损143.71→143.88, 止盈156.6→156.56 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.64 弱撑:142.74 弱压:154.73 强压:", + "date": "2026-07-01 11:04", + "old_action": "盈利良好 | 止损154.15 | 目标179.07 | 买入区154.43~162.15 | 信号:持有", + "new_action": "盈利良好 | 止损155.61 | 目标179.29 | 买入区154.88~162.62 | 信号:持有", + "reason": "技术面重评: 止损154.15→155.61, 止盈179.07→179.29 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:135.0 弱撑:154.88 弱压:165.5 强压:1", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:45", - "old_action": "盈利良好 | 止损143.88 | 目标156.56 | 买入区142.74~149.88 | 信号:持有", - "new_action": "盈利良好 | 止损143.47 | 目标156.51 | 买入区142.64~149.77 | 信号:持有", - "reason": "技术面重评: 止损143.88→143.47, 止盈156.56→156.51 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.59 弱撑:142.64 弱压:154.63 强压:", + "date": "2026-07-01 12:01", + "old_action": "盈利良好 | 止损155.61 | 目标179.29 | 买入区154.88~162.62 | 信号:持有", + "new_action": "盈利良好 | 止损153.62 | 目标178.92 | 买入区154.13~161.84 | 信号:持有", + "reason": "技术面重评: 止损155.61→153.62, 止盈179.29→178.92 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:134.62 弱撑:154.13 弱压:164.75 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:47", - "old_action": "盈利良好 | 止损143.47 | 目标156.51 | 买入区142.64~149.77 | 信号:持有", - "new_action": "盈利良好 | 止损143.92 | 目标156.64 | 买入区142.92~150.07 | 信号:持有", - "reason": "技术面重评: 止损143.47→143.92, 止盈156.51→156.64 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.73 弱撑:142.92 弱压:154.91 强压:", + "date": "2026-07-01 13:20", + "old_action": "盈利良好 | 止损153.62 | 目标178.92 | 买入区154.13~161.84 | 信号:持有", + "new_action": "盈利良好 | 止损151.26 | 目标177.83 | 买入区151.83~159.42 | 信号:持有", + "reason": "技术面重评: 止损153.62→151.26, 止盈178.92→177.83 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:133.48 弱撑:151.83 弱压:163.83 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:49", - "old_action": "盈利良好 | 止损143.92 | 目标156.64 | 买入区142.92~150.07 | 信号:持有", - "new_action": "盈利良好 | 止损144.04 | 目标156.68 | 买入区143.0~150.15 | 信号:持有", - "reason": "技术面重评: 止损143.92→144.04, 止盈156.64→156.68 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.77 弱撑:143.0 弱压:154.99 强压:1", + "date": "2026-07-01 13:24", + "old_action": "盈利良好 | 止损151.26 | 目标177.83 | 买入区151.83~159.42 | 信号:持有", + "new_action": "盈利良好 | 止损152.46 | 目标177.97 | 买入区152.15~159.76 | 信号:持有", + "reason": "技术面重评: 止损151.26→152.46, 止盈177.83→177.97 | 形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:133.63 弱撑:152.15 弱压:164.15 强压", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:51", - "old_action": "盈利良好 | 止损144.04 | 目标156.68 | 买入区143.0~150.15 | 信号:持有", - "new_action": "盈利良好 | 止损144.2 | 目标156.84 | 买入区143.33~150.5 | 信号:持有", - "reason": "技术面重评: 止损144.04→144.2, 止盈156.68→156.84 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:132.94 弱撑:143.33 弱压:155.32 强压:", + "date": "2026-07-01 13:27", + "old_action": "盈利良好 | 止损152.46 | 目标177.97 | 买入区152.15~159.76 | 信号:持有", + "new_action": "盈利良好 | 止损150.72 | 目标177.42 | 买入区150.99~158.54 | 信号:持有", + "reason": "技术面重评: 止损152.46→150.72, 止盈177.97→177.42 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:133.05 弱撑:150.99 弱压:162.99 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:54", - "old_action": "盈利良好 | 止损144.2 | 目标156.84 | 买入区143.33~150.5 | 信号:持有", - "new_action": "盈利良好 | 止损144.42 | 目标156.94 | 买入区143.53~150.71 | 信号:持有", - "reason": "技术面重评: 止损144.2→144.42, 止盈156.84→156.94 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.04 弱撑:143.53 弱压:155.52 强压:", + "date": "2026-07-01 13:56", + "old_action": "盈利良好 | 止损150.72 | 目标177.42 | 买入区150.99~158.54 | 信号:持有", + "new_action": "盈利良好 | 止损148.92 | 目标176.58 | 买入区149.24~156.7 | 信号:持有", + "reason": "技术面重评: 止损150.72→148.92, 止盈177.42→176.58 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.18 弱撑:149.24 弱压:162.72 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 14:58", - "old_action": "盈利良好 | 止损144.42 | 目标156.94 | 买入区143.53~150.71 | 信号:持有", - "new_action": "盈利良好 | 止损144.96 | 目标157.01 | 买入区143.66~150.84 | 信号:持有", - "reason": "技术面重评: 止损144.42→144.96, 止盈156.94→157.01 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.11 弱撑:143.66 弱压:155.65 强压:", + "date": "2026-07-01 13:59", + "old_action": "盈利良好 | 止损148.92 | 目标176.58 | 买入区149.24~156.7 | 信号:持有", + "new_action": "盈利良好 | 止损149.55 | 目标176.69 | 买入区149.45~156.92 | 信号:持有", + "reason": "技术面重评: 止损148.92→149.55, 止盈176.58→176.69 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.29 弱撑:149.45 弱压:162.93 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-29 15:02", - "old_action": "盈利良好 | 止损144.96 | 目标157.01 | 买入区143.66~150.84 | 信号:持有", - "new_action": "盈利良好 | 止损145.01 | 目标157.01 | 买入区143.67~150.85 | 信号:持有", - "reason": "技术面重评: 止损144.96→145.01 | 形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:133.11 弱撑:143.67 弱压:155.66 强压:", + "date": "2026-07-01 14:03", + "old_action": "盈利良好 | 止损149.55 | 目标176.69 | 买入区149.45~156.92 | 信号:持有", + "new_action": "盈利良好 | 止损150.76 | 目标177.0 | 买入区150.12~157.63 | 信号:持有", + "reason": "技术面重评: 止损149.55→150.76, 止盈176.69→177.0 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.62 弱撑:150.12 弱压:163.6 强压:184", "trigger": "技术面重评" }, { - "date": "2026-06-30 09:18", - "old_action": "盈利良好 | 止损145.01 | 目标157.01 | 买入区143.67~150.85 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.24 | 目标0 | 买入区136.06~158.74 | 信号:持有", - "reason": "技术面重评: 止损145.01→142.24 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "date": "2026-07-01 14:08", + "old_action": "盈利良好 | 止损150.76 | 目标177.0 | 买入区150.12~157.63 | 信号:持有", + "new_action": "盈利良好 | 止损150.65 | 目标176.96 | 买入区150.02~157.52 | 信号:持有", + "reason": "技术面重评: 止损150.76→150.65, 止盈177.0→176.96 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.57 弱撑:150.02 弱压:163.5 强压:184", "trigger": "技术面重评" }, { - "date": "2026-06-30 09:22", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.24 | 目标0 | 买入区136.06~158.74 | 信号:持有", - "new_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.61 | 目标0 | 买入区136.41~159.15 | 信号:持有", - "reason": "技术面重评: 止损142.24→142.61 | 形态:unknown/neutral 量价:买卖均衡 强撑:None 弱撑:None 弱压:None 强压:None |", + "date": "2026-07-01 14:11", + "old_action": "盈利良好 | 止损150.65 | 目标176.96 | 买入区150.02~157.52 | 信号:持有", + "new_action": "盈利良好 | 止损149.58 | 目标176.73 | 买入区149.54~157.02 | 信号:持有", + "reason": "技术面重评: 止损150.65→149.58, 止盈176.96→176.73 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.33 弱撑:149.54 弱压:163.02 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-30 09:51", - "old_action": "盈利良好 | ⚠️盈亏比极低,关注 | 止损142.61 | 目标0 | 买入区136.41~159.15 | 信号:持有", - "new_action": "盈利良好 | 止损146.94 | 目标161.48 | 买入区150.62~158.15 | 信号:持有", - "reason": "技术面重评: 止损142.61→146.94 | 形态:小阳线/bullish 量价:买卖均衡 强撑:137.77 弱撑:150.62 弱压:155.98 强压:168.", + "date": "2026-07-01 14:21", + "old_action": "盈利良好 | 止损149.58 | 目标176.73 | 买入区149.54~157.02 | 信号:持有", + "new_action": "盈利良好 | 止损148.9 | 目标176.61 | 买入区149.31~156.78 | 信号:持有", + "reason": "技术面重评: 止损149.58→148.9, 止盈176.73→176.61 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.21 弱撑:149.31 弱压:162.79 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-30 09:57", - "old_action": "盈利良好 | 止损146.94 | 目标161.48 | 买入区150.62~158.15 | 信号:持有", - "new_action": "盈利良好 | 止损149.32 | 目标161.44 | 买入区150.55~158.08 | 信号:持有", - "reason": "技术面重评: 止损146.94→149.32, 止盈161.48→161.44 | 形态:小阳线/bullish 量价:买卖均衡 强撑:137.73 弱撑:150.55 弱压:155.91 强压:168.", + "date": "2026-07-01 14:23", + "old_action": "盈利良好 | 止损148.9 | 目标176.61 | 买入区149.31~156.78 | 信号:持有", + "new_action": "盈利良好 | 止损149.39 | 目标176.52 | 买入区149.09~156.54 | 信号:持有", + "reason": "技术面重评: 止损148.9→149.39, 止盈176.61→176.52 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.11 弱撑:149.09 弱压:162.57 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-30 10:00", - "old_action": "盈利良好 | 止损149.32 | 目标161.44 | 买入区150.55~158.08 | 信号:持有", - "new_action": "盈利良好 | 止损148.5 | 目标161.83 | 买入区151.0~158.53 | 信号:持有", - "reason": "技术面重评: 止损149.32→148.5, 止盈161.44→161.83 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:138.13 弱撑:151.0 弱压:156.7 强压:168.", + "date": "2026-07-01 14:25", + "old_action": "盈利良好 | 止损149.39 | 目标176.52 | 买入区149.09~156.54 | 信号:持有", + "new_action": "盈利良好 | 止损148.52 | 目标176.19 | 买入区148.42~155.84 | 信号:持有", + "reason": "技术面重评: 止损149.39→148.52, 止盈176.52→176.19 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:131.77 弱撑:148.42 弱压:162.28 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-30 10:11", - "old_action": "盈利良好 | 止损148.5 | 目标161.83 | 买入区151.0~158.53 | 信号:持有", - "new_action": "盈利良好 | 止损150.84 | 目标162.27 | 买入区151.0~158.55 | 信号:持有", - "reason": "技术面重评: 止损148.5→150.84, 止盈161.83→162.27 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:138.59 弱撑:151.0 弱压:157.61 强压:169", + "date": "2026-07-01 14:33", + "old_action": "盈利良好 | 止损148.52 | 目标176.19 | 买入区148.42~155.84 | 信号:持有", + "new_action": "盈利良好 | 止损142.61 | 目标167.41 | 买入区148.49~155.91 | 信号:持有", + "reason": "技术面重评: 止损148.52→142.61, 止盈176.19→167.41 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:131.8 弱撑:148.49 弱压:162.67 强压:183", "trigger": "技术面重评" }, { - "date": "2026-06-30 10:17", - "old_action": "盈利良好 | 止损150.84 | 目标162.27 | 买入区151.0~158.55 | 信号:持有", - "new_action": "盈利良好 | 止损148.37 | 目标161.92 | 买入区150.89~158.43 | 信号:持有", - "reason": "技术面重评: 止损150.84→148.37, 止盈162.27→161.92 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:138.23 弱撑:150.89 弱压:156.89 强压:16", + "date": "2026-07-01 14:55", + "old_action": "盈利良好 | 止损142.61 | 目标167.41 | 买入区148.49~155.91 | 信号:持有", + "new_action": "盈利良好 | 止损150.23 | 目标176.46 | 买入区148.99~156.44 | 信号:持有", + "reason": "技术面重评: 止损142.61→150.23, 止盈167.41→176.46 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.05 弱撑:148.99 弱压:163.56 强压:18", "trigger": "技术面重评" }, { - "date": "2026-06-30 10:32", - "old_action": "盈利良好 | 止损148.37 | 目标161.92 | 买入区150.89~158.43 | 信号:持有", - "new_action": "盈利良好 | 止损149.09 | 目标162.13 | 买入区151.0~158.55 | 信号:持有", - "reason": "技术面重评: 止损148.37→149.09, 止盈161.92→162.13 | 形态:带下影阳线/bullish 量价:买卖均衡 强撑:138.45 弱撑:151.0 弱压:157.33 强压:168", + "date": "2026-07-01 14:58", + "old_action": "盈利良好 | 止损150.23 | 目标176.46 | 买入区148.99~156.44 | 信号:持有", + "new_action": "盈利良好 | 止损149.83 | 目标176.42 | 买入区148.9~156.34 | 信号:持有", + "reason": "技术面重评: 止损150.23→149.83, 止盈176.46→176.42 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.01 弱撑:148.9 弱压:163.47 强压:183", "trigger": "技术面重评" }, { - "date": "2026-06-30 10:57", - "old_action": "盈利良好 | 止损149.09 | 目标162.13 | 买入区151.0~158.55 | 信号:持有", - "new_action": "盈利良好 | 止损154.07 | 目标173.58 | 买入区151.0~158.55 | 信号:持有", - "reason": "技术面重评: 止损149.09→154.07, 止盈162.13→173.58 | 形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.56 弱撑:151.0 弱压:163.11 强压:17", + "date": "2026-07-01 15:02", + "old_action": "盈利良好 | 止损149.83 | 目标176.42 | 买入区148.9~156.34 | 信号:持有", + "new_action": "盈利良好 | 止损149.85 | 目标176.42 | 买入区148.9~156.34 | 信号:持有", + "reason": "技术面重评: 止损149.83→149.85 | 形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.01 弱撑:148.9 弱压:163.47 强压:183", "trigger": "技术面重评" } ] } ], - "total": 38, - "regenerated_at": "2026-06-30 11:01" + "total": 39, + "regenerated_at": "2026-07-01 21:11" } \ No newline at end of file diff --git a/data/multi_tf_cache.json b/data/multi_tf_cache.json index f14d31d..1948753 100644 --- a/data/multi_tf_cache.json +++ b/data/multi_tf_cache.json @@ -1,14 +1,6 @@ { "688981": { "daily": [ - { - "date": "2025-12-25", - "open": 123.0, - "close": 123.08, - "high": 125.99, - "low": 122.66, - "volume": 47180958.0 - }, { "date": "2025-12-26", "open": 122.58, @@ -960,6 +952,22 @@ "high": 152.99, "low": 141.0, "volume": 102740101.0 + }, + { + "date": "2026-06-30", + "open": 152.05, + "close": 158.82, + "high": 160.66, + "low": 150.0, + "volume": 106679541.0 + }, + { + "date": "2026-07-01", + "open": 160.19, + "close": 156.31, + "high": 166.88, + "low": 154.88, + "volume": 86603771.0 } ], "weekly": [ @@ -1254,18 +1262,10 @@ "volume": 1763719144.0 } ], - "updated_at": 1782788269.1065302 + "updated_at": 1782889351.0422254 }, "00700": { "daily": [ - { - "date": "2025-12-30", - "open": 598.5, - "close": 600.0, - "high": 601.0, - "low": 594.0, - "volume": 13582535.0 - }, { "date": "2025-12-31", "open": 597.5, @@ -2217,6 +2217,14 @@ "high": 432.0, "low": 415.0, "volume": 33066070.0 + }, + { + "date": "2026-06-30", + "open": 421.2, + "close": 429.8, + "high": 435.6, + "low": 418.4, + "volume": 38994409.0 } ], "weekly": [ @@ -2511,18 +2519,10 @@ "volume": 667412728.0 } ], - "updated_at": 1782788199.0984986 + "updated_at": 1782889274.2332723 }, "000657": { "daily": [ - { - "date": "2025-12-25", - "open": 28.89, - "close": 28.82, - "high": 29.35, - "low": 28.48, - "volume": 857757.0 - }, { "date": "2025-12-26", "open": 28.93, @@ -3474,6 +3474,22 @@ "high": 101.5, "low": 91.68, "volume": 1015100.0 + }, + { + "date": "2026-06-30", + "open": 94.0, + "close": 95.72, + "high": 97.3, + "low": 92.52, + "volume": 775556.0 + }, + { + "date": "2026-07-01", + "open": 98.61, + "close": 96.1, + "high": 101.33, + "low": 94.6, + "volume": 595089.0 } ], "weekly": [ @@ -3768,26 +3784,10 @@ "volume": 20396773.0 } ], - "updated_at": 1782788191.0967052 + "updated_at": 1782889245.542468 }, "000700": { "daily": [ - { - "date": "2025-12-24", - "open": 10.243, - "close": 10.143, - "high": 10.253, - "low": 10.083, - "volume": 403815.0 - }, - { - "date": "2025-12-25", - "open": 10.143, - "close": 10.923, - "high": 11.163, - "low": 10.083, - "volume": 908415.0 - }, { "date": "2025-12-26", "open": 10.773, @@ -4731,6 +4731,30 @@ "high": 15.28, "low": 13.78, "volume": 1159165.0 + }, + { + "date": "2026-06-29", + "open": 14.19, + "close": 13.86, + "high": 14.57, + "low": 13.4, + "volume": 864239.0 + }, + { + "date": "2026-06-30", + "open": 14.32, + "close": 14.76, + "high": 15.07, + "low": 13.95, + "volume": 760272.0 + }, + { + "date": "2026-07-01", + "open": 14.51, + "close": 15.54, + "high": 16.06, + "low": 14.51, + "volume": 662306.0 } ], "weekly": [ @@ -5025,18 +5049,10 @@ "volume": 17181401.0 } ], - "updated_at": 1782788196.0110023 + "updated_at": 1782889253.7708344 }, "000711": { "daily": [ - { - "date": "2025-12-15", - "open": 1.71, - "close": 1.7, - "high": 1.71, - "low": 1.69, - "volume": 220634.0 - }, { "date": "2025-12-16", "open": 1.69, @@ -5988,6 +6004,22 @@ "high": 4.47, "low": 4.32, "volume": 424662.0 + }, + { + "date": "2026-06-30", + "open": 4.1, + "close": 4.54, + "high": 4.54, + "low": 4.1, + "volume": 750398.0 + }, + { + "date": "2026-07-01", + "open": 4.77, + "close": 4.77, + "high": 4.77, + "low": 4.77, + "volume": 57897.0 } ], "weekly": [ @@ -6282,18 +6314,10 @@ "volume": 15999462.0 } ], - "updated_at": 1782788196.4666977 + "updated_at": 1782889262.7282238 }, "001309": { "daily": [ - { - "date": "2025-12-25", - "open": 217.6, - "close": 216.87, - "high": 231.62, - "low": 215.6, - "volume": 209875.0 - }, { "date": "2025-12-26", "open": 212.61, @@ -7245,6 +7269,22 @@ "high": 978.0, "low": 886.66, "volume": 171300.0 + }, + { + "date": "2026-06-30", + "open": 935.0, + "close": 942.9, + "high": 957.99, + "low": 898.0, + "volume": 131073.0 + }, + { + "date": "2026-07-01", + "open": 945.0, + "close": 920.0, + "high": 976.0, + "low": 903.61, + "volume": 104563.0 } ], "weekly": [ @@ -7539,18 +7579,10 @@ "volume": 2760837.0 } ], - "updated_at": 1782788197.6898565 + "updated_at": 1782889267.7586625 }, "002594": { "daily": [ - { - "date": "2025-12-25", - "open": 94.43, - "close": 94.84, - "high": 95.23, - "low": 94.12, - "volume": 182202.0 - }, { "date": "2025-12-26", "open": 95.28, @@ -8502,6 +8534,22 @@ "high": 80.95, "low": 77.6, "volume": 523707.0 + }, + { + "date": "2026-06-30", + "open": 79.58, + "close": 79.7, + "high": 80.55, + "low": 78.58, + "volume": 382043.0 + }, + { + "date": "2026-07-01", + "open": 79.9, + "close": 80.93, + "high": 81.28, + "low": 78.55, + "volume": 344412.0 } ], "weekly": [ @@ -8796,18 +8844,10 @@ "volume": 7929446.0 } ], - "updated_at": 1782788198.0428555 + "updated_at": 1782889270.6076102 }, "00968": { "daily": [ - { - "date": "2025-12-30", - "open": 3.03, - "close": 3.02, - "high": 3.06, - "low": 2.97, - "volume": 37880762.0 - }, { "date": "2025-12-31", "open": 3.02, @@ -9759,6 +9799,14 @@ "high": 2.06, "low": 2.0, "volume": 49476305.0 + }, + { + "date": "2026-06-30", + "open": 2.03, + "close": 2.06, + "high": 2.08, + "low": 2.01, + "volume": 71971668.0 } ], "weekly": [ @@ -10053,18 +10101,10 @@ "volume": 1303595711.0 } ], - "updated_at": 1782788204.7796798 + "updated_at": 1782889277.6090698 }, "00981": { "daily": [ - { - "date": "2025-12-30", - "open": 71.5, - "close": 72.5, - "high": 73.15, - "low": 70.45, - "volume": 93554254.0 - }, { "date": "2025-12-31", "open": 72.9, @@ -11016,6 +11056,14 @@ "high": 85.8, "low": 79.35, "volume": 124513219.0 + }, + { + "date": "2026-06-30", + "open": 84.6, + "close": 89.4, + "high": 91.55, + "low": 84.25, + "volume": 176623921.0 } ], "weekly": [ @@ -11310,18 +11358,10 @@ "volume": 2495083345.0 } ], - "updated_at": 1782788205.3573887 + "updated_at": 1782889279.181283 }, "01070": { "daily": [ - { - "date": "2025-12-30", - "open": 10.25, - "close": 10.31, - "high": 10.4, - "low": 10.12, - "volume": 2379000.0 - }, { "date": "2025-12-31", "open": 10.33, @@ -12273,6 +12313,14 @@ "high": 12.97, "low": 12.41, "volume": 5733644.0 + }, + { + "date": "2026-06-30", + "open": 12.93, + "close": 12.89, + "high": 13.22, + "low": 12.59, + "volume": 6064840.0 } ], "weekly": [ @@ -12567,18 +12615,10 @@ "volume": 148906925.0 } ], - "updated_at": 1782788206.6730776 + "updated_at": 1782889279.5851026 }, "01088": { "daily": [ - { - "date": "2025-12-30", - "open": 38.88, - "close": 39.1, - "high": 39.34, - "low": 38.7, - "volume": 9969096.0 - }, { "date": "2025-12-31", "open": 39.1, @@ -13530,6 +13570,14 @@ "high": 41.48, "low": 40.18, "volume": 16064016.0 + }, + { + "date": "2026-06-30", + "open": 41.36, + "close": 40.12, + "high": 41.48, + "low": 39.74, + "volume": 25661296.0 } ], "weekly": [ @@ -13824,18 +13872,10 @@ "volume": 289696739.0 } ], - "updated_at": 1782788210.2618449 + "updated_at": 1782889279.9710276 }, "01211": { "daily": [ - { - "date": "2025-12-30", - "open": 97.35, - "close": 97.6, - "high": 98.45, - "low": 96.95, - "volume": 14917046.0 - }, { "date": "2025-12-31", "open": 97.6, @@ -14787,6 +14827,14 @@ "high": 74.6, "low": 72.45, "volume": 24806182.0 + }, + { + "date": "2026-06-30", + "open": 72.55, + "close": 72.45, + "high": 74.1, + "low": 71.4, + "volume": 28317739.0 } ], "weekly": [ @@ -15081,18 +15129,10 @@ "volume": 520224640.0 } ], - "updated_at": 1782788213.828828 + "updated_at": 1782889280.39479 }, "01478": { "daily": [ - { - "date": "2025-12-30", - "open": 8.27, - "close": 8.45, - "high": 8.61, - "low": 8.27, - "volume": 5189000.0 - }, { "date": "2025-12-31", "open": 8.65, @@ -16044,6 +16084,14 @@ "high": 6.95, "low": 6.74, "volume": 5045134.0 + }, + { + "date": "2026-06-30", + "open": 7.16, + "close": 6.86, + "high": 7.16, + "low": 6.76, + "volume": 4646000.0 } ], "weekly": [ @@ -16338,18 +16386,10 @@ "volume": 157832102.0 } ], - "updated_at": 1782788214.2935507 + "updated_at": 1782889281.8063862 }, "01888": { "daily": [ - { - "date": "2025-12-30", - "open": 13.32, - "close": 13.36, - "high": 13.48, - "low": 13.01, - "volume": 16626886.0 - }, { "date": "2025-12-31", "open": 13.36, @@ -17301,6 +17341,14 @@ "high": 102.4, "low": 89.05, "volume": 71922441.0 + }, + { + "date": "2026-06-30", + "open": 96.3, + "close": 99.15, + "high": 102.5, + "low": 94.5, + "volume": 60457405.0 } ], "weekly": [ @@ -17595,18 +17643,10 @@ "volume": 1684251408.0 } ], - "updated_at": 1782788214.7168338 + "updated_at": 1782889285.8118398 }, "02202": { "daily": [ - { - "date": "2025-12-30", - "open": 3.37, - "close": 3.31, - "high": 3.38, - "low": 3.28, - "volume": 32078766.0 - }, { "date": "2025-12-31", "open": 3.35, @@ -18558,6 +18598,14 @@ "high": 2.28, "low": 2.16, "volume": 22750076.0 + }, + { + "date": "2026-06-30", + "open": 2.23, + "close": 2.12, + "high": 2.23, + "low": 2.1, + "volume": 41074714.0 } ], "weekly": [ @@ -18852,18 +18900,10 @@ "volume": 424242411.0 } ], - "updated_at": 1782788219.111031 + "updated_at": 1782889288.351551 }, "02318": { "daily": [ - { - "date": "2025-12-30", - "open": 66.4, - "close": 65.95, - "high": 66.4, - "low": 65.25, - "volume": 27332239.0 - }, { "date": "2025-12-31", "open": 65.6, @@ -19815,6 +19855,14 @@ "high": 52.45, "low": 50.35, "volume": 43912077.0 + }, + { + "date": "2026-06-30", + "open": 52.45, + "close": 51.05, + "high": 52.6, + "low": 50.75, + "volume": 43974461.0 } ], "weekly": [ @@ -20109,18 +20157,10 @@ "volume": 828520533.0 } ], - "updated_at": 1782788221.3819754 + "updated_at": 1782889290.4692743 }, "02359": { "daily": [ - { - "date": "2025-12-30", - "open": 100.0, - "close": 99.95, - "high": 100.8, - "low": 98.7, - "volume": 3134227.0 - }, { "date": "2025-12-31", "open": 99.95, @@ -21072,6 +21112,14 @@ "high": 154.6, "low": 144.4, "volume": 13203157.0 + }, + { + "date": "2026-06-30", + "open": 152.5, + "close": 153.7, + "high": 158.4, + "low": 151.7, + "volume": 8413568.0 } ], "weekly": [ @@ -21366,18 +21414,10 @@ "volume": 133091756.0 } ], - "updated_at": 1782788223.7279296 + "updated_at": 1782889292.6383328 }, "02388": { "daily": [ - { - "date": "2025-12-30", - "open": 39.44, - "close": 39.72, - "high": 39.84, - "low": 39.3, - "volume": 9418162.0 - }, { "date": "2025-12-31", "open": 39.82, @@ -22329,6 +22369,14 @@ "high": 44.4, "low": 43.38, "volume": 18551296.0 + }, + { + "date": "2026-06-30", + "open": 43.6, + "close": 42.38, + "high": 43.6, + "low": 41.82, + "volume": 28434556.0 } ], "weekly": [ @@ -22623,18 +22671,10 @@ "volume": 279136126.0 } ], - "updated_at": 1782788230.1837027 + "updated_at": 1782889295.5296695 }, "02628": { "daily": [ - { - "date": "2025-12-30", - "open": 28.2, - "close": 27.94, - "high": 28.2, - "low": 27.52, - "volume": 35033201.0 - }, { "date": "2025-12-31", "open": 27.88, @@ -23586,6 +23626,14 @@ "high": 28.28, "low": 26.94, "volume": 44946286.0 + }, + { + "date": "2026-06-30", + "open": 26.9, + "close": 26.66, + "high": 27.18, + "low": 26.32, + "volume": 45376024.0 } ], "weekly": [ @@ -23880,18 +23928,10 @@ "volume": 906095931.0 } ], - "updated_at": 1782788231.6128683 + "updated_at": 1782889298.1466982 }, "06160": { "daily": [ - { - "date": "2025-12-30", - "open": 184.0, - "close": 182.6, - "high": 185.2, - "low": 179.0, - "volume": 3079164.0 - }, { "date": "2025-12-31", "open": 180.3, @@ -24843,6 +24883,14 @@ "high": 177.0, "low": 165.5, "volume": 7213063.0 + }, + { + "date": "2026-06-30", + "open": 173.4, + "close": 170.4, + "high": 176.2, + "low": 168.0, + "volume": 7132024.0 } ], "weekly": [ @@ -25137,18 +25185,10 @@ "volume": 109763254.0 } ], - "updated_at": 1782788236.3164809 + "updated_at": 1782889299.9682934 }, "06869": { "daily": [ - { - "date": "2025-12-30", - "open": 52.5, - "close": 51.95, - "high": 56.25, - "low": 51.7, - "volume": 20849178.0 - }, { "date": "2025-12-31", "open": 52.5, @@ -26100,6 +26140,14 @@ "high": 256.6, "low": 227.2, "volume": 21884160.0 + }, + { + "date": "2026-06-30", + "open": 253.0, + "close": 255.4, + "high": 260.0, + "low": 245.6, + "volume": 19662798.0 } ], "weekly": [ @@ -26394,18 +26442,10 @@ "volume": 447131411.0 } ], - "updated_at": 1782788237.8034499 + "updated_at": 1782889302.4875224 }, "09868": { "daily": [ - { - "date": "2025-12-30", - "open": 79.0, - "close": 80.1, - "high": 80.85, - "low": 78.1, - "volume": 10683318.0 - }, { "date": "2025-12-31", "open": 81.85, @@ -27357,6 +27397,14 @@ "high": 49.14, "low": 46.22, "volume": 19243364.0 + }, + { + "date": "2026-06-30", + "open": 49.5, + "close": 50.65, + "high": 50.95, + "low": 48.58, + "volume": 26788580.0 } ], "weekly": [ @@ -27651,18 +27699,10 @@ "volume": 343118048.0 } ], - "updated_at": 1782788238.3040824 + "updated_at": 1782889304.9321487 }, "09988": { "daily": [ - { - "date": "2025-12-30", - "open": 143.3, - "close": 144.5, - "high": 145.7, - "low": 143.2, - "volume": 60201594.0 - }, { "date": "2025-12-31", "open": 143.7, @@ -28614,6 +28654,14 @@ "high": 95.45, "low": 91.15, "volume": 123324036.0 + }, + { + "date": "2026-06-30", + "open": 93.0, + "close": 92.85, + "high": 93.95, + "low": 91.3, + "volume": 89897596.0 } ], "weekly": [ @@ -28908,18 +28956,10 @@ "volume": 1922973839.0 } ], - "updated_at": 1782788243.5837634 + "updated_at": 1782889308.6946065 }, "300035": { "daily": [ - { - "date": "2025-12-25", - "open": 21.36, - "close": 21.92, - "high": 22.02, - "low": 21.28, - "volume": 302590.0 - }, { "date": "2025-12-26", "open": 22.07, @@ -29871,6 +29911,22 @@ "high": 14.31, "low": 13.74, "volume": 203996.0 + }, + { + "date": "2026-06-30", + "open": 14.2, + "close": 14.42, + "high": 14.59, + "low": 14.1, + "volume": 166464.0 + }, + { + "date": "2026-07-01", + "open": 14.52, + "close": 14.53, + "high": 14.66, + "low": 14.07, + "volume": 141930.0 } ], "weekly": [ @@ -30165,18 +30221,10 @@ "volume": 4400429.0 } ], - "updated_at": 1782788247.7258425 + "updated_at": 1782889310.7422438 }, "300124": { "daily": [ - { - "date": "2025-12-25", - "open": 72.0, - "close": 73.17, - "high": 73.37, - "low": 72.0, - "volume": 258917.0 - }, { "date": "2025-12-26", "open": 73.18, @@ -31128,6 +31176,22 @@ "high": 65.97, "low": 62.01, "volume": 482978.0 + }, + { + "date": "2026-06-30", + "open": 66.53, + "close": 66.33, + "high": 67.28, + "low": 64.39, + "volume": 423349.0 + }, + { + "date": "2026-07-01", + "open": 66.4, + "close": 67.97, + "high": 69.38, + "low": 65.74, + "volume": 355333.0 } ], "weekly": [ @@ -31422,18 +31486,10 @@ "volume": 8009597.0 } ], - "updated_at": 1782788248.1081443 + "updated_at": 1782889314.3625877 }, "300308": { "daily": [ - { - "date": "2025-12-25", - "open": 644.0, - "close": 638.8, - "high": 657.8, - "low": 617.41, - "volume": 259387.0 - }, { "date": "2025-12-26", "open": 627.3, @@ -32385,6 +32441,22 @@ "high": 1264.21, "low": 1169.49, "volume": 352899.0 + }, + { + "date": "2026-06-30", + "open": 1223.01, + "close": 1270.0, + "high": 1295.6, + "low": 1218.21, + "volume": 276783.0 + }, + { + "date": "2026-07-01", + "open": 1263.5, + "close": 1245.2, + "high": 1315.57, + "low": 1230.0, + "volume": 188921.0 } ], "weekly": [ @@ -32679,18 +32751,10 @@ "volume": 5855170.0 } ], - "updated_at": 1782788248.6043768 + "updated_at": 1782889316.5950124 }, "300548": { "daily": [ - { - "date": "2025-12-25", - "open": 155.09, - "close": 147.89, - "high": 157.66, - "low": 146.25, - "volume": 287938.0 - }, { "date": "2025-12-26", "open": 145.5, @@ -33642,6 +33706,22 @@ "high": 268.96, "low": 243.58, "volume": 142255.0 + }, + { + "date": "2026-06-30", + "open": 255.0, + "close": 278.0, + "high": 280.9, + "low": 255.0, + "volume": 177718.0 + }, + { + "date": "2026-07-01", + "open": 275.0, + "close": 258.8, + "high": 279.98, + "low": 257.54, + "volume": 116917.0 } ], "weekly": [ @@ -33936,18 +34016,10 @@ "volume": 4122818.0 } ], - "updated_at": 1782788249.3720946 + "updated_at": 1782889319.1615071 }, "300750": { "daily": [ - { - "date": "2025-12-25", - "open": 367.304, - "close": 366.104, - "high": 367.304, - "low": 362.214, - "volume": 203431.0 - }, { "date": "2025-12-26", "open": 366.054, @@ -34899,6 +34971,22 @@ "high": 396.0, "low": 378.2, "volume": 425259.0 + }, + { + "date": "2026-06-30", + "open": 392.49, + "close": 393.01, + "high": 402.36, + "low": 390.0, + "volume": 270383.0 + }, + { + "date": "2026-07-01", + "open": 390.0, + "close": 386.45, + "high": 391.0, + "low": 370.0, + "volume": 365380.0 } ], "weekly": [ @@ -35193,18 +35281,10 @@ "volume": 6795828.0 } ], - "updated_at": 1782788249.73727 + "updated_at": 1782889321.2054503 }, "518880": { "daily": [ - { - "date": "2025-12-25", - "open": 9.571, - "close": 9.566, - "high": 9.58, - "low": 9.539, - "volume": 4311576.0 - }, { "date": "2025-12-26", "open": 9.67, @@ -36156,6 +36236,22 @@ "high": 8.479, "low": 8.404, "volume": 3398349.0 + }, + { + "date": "2026-06-30", + "open": 8.262, + "close": 8.378, + "high": 8.389, + "low": 8.224, + "volume": 4192779.0 + }, + { + "date": "2026-07-01", + "open": 8.28, + "close": 8.28, + "high": 8.3, + "low": 8.26, + "volume": 1736467.0 } ], "weekly": [ @@ -36450,18 +36546,10 @@ "volume": 74216427.0 } ], - "updated_at": 1782788252.0660741 + "updated_at": 1782889325.8321283 }, "600519": { "daily": [ - { - "date": "2025-12-25", - "open": 1376.976, - "close": 1386.146, - "high": 1391.456, - "low": 1373.356, - "volume": 23386.0 - }, { "date": "2025-12-26", "open": 1386.146, @@ -37413,6 +37501,22 @@ "high": 1215.0, "low": 1151.01, "volume": 66878.0 + }, + { + "date": "2026-06-30", + "open": 1187.0, + "close": 1185.49, + "high": 1195.67, + "low": 1176.0, + "volume": 39608.0 + }, + { + "date": "2026-07-01", + "open": 1180.1, + "close": 1192.01, + "high": 1194.98, + "low": 1166.33, + "volume": 28185.0 } ], "weekly": [ @@ -37707,18 +37811,10 @@ "volume": 810206.0 } ], - "updated_at": 1782788258.4423447 + "updated_at": 1782889328.6444957 }, "600563": { "daily": [ - { - "date": "2025-12-25", - "open": 102.58, - "close": 103.16, - "high": 103.68, - "low": 102.51, - "volume": 19549.0 - }, { "date": "2025-12-26", "open": 102.71, @@ -38670,6 +38766,22 @@ "high": 198.8, "low": 185.6, "volume": 169242.0 + }, + { + "date": "2026-06-30", + "open": 186.0, + "close": 190.8, + "high": 195.68, + "low": 184.1, + "volume": 131285.0 + }, + { + "date": "2026-07-01", + "open": 192.2, + "close": 180.72, + "high": 195.2, + "low": 179.0, + "volume": 107924.0 } ], "weekly": [ @@ -38964,18 +39076,10 @@ "volume": 2390925.0 } ], - "updated_at": 1782788259.0087843 + "updated_at": 1782889331.2415133 }, "601318": { "daily": [ - { - "date": "2025-12-25", - "open": 67.25, - "close": 69.05, - "high": 70.23, - "low": 67.23, - "volume": 777898.0 - }, { "date": "2025-12-26", "open": 68.69, @@ -39927,6 +40031,22 @@ "high": 48.87, "low": 46.9, "volume": 1089609.0 + }, + { + "date": "2026-06-30", + "open": 48.3, + "close": 47.74, + "high": 48.94, + "low": 47.35, + "volume": 949813.0 + }, + { + "date": "2026-07-01", + "open": 47.6, + "close": 49.4, + "high": 49.45, + "low": 47.19, + "volume": 902764.0 } ], "weekly": [ @@ -40221,18 +40341,10 @@ "volume": 19118626.0 } ], - "updated_at": 1782788260.8103404 + "updated_at": 1782889334.251739 }, "601899": { "daily": [ - { - "date": "2025-12-25", - "open": 31.61, - "close": 31.65, - "high": 31.76, - "low": 31.45, - "volume": 1274567.0 - }, { "date": "2025-12-26", "open": 32.22, @@ -41184,6 +41296,22 @@ "high": 25.96, "low": 24.98, "volume": 3232927.0 + }, + { + "date": "2026-06-30", + "open": 25.05, + "close": 25.14, + "high": 25.26, + "low": 24.7, + "volume": 3107057.0 + }, + { + "date": "2026-07-01", + "open": 24.85, + "close": 25.47, + "high": 25.55, + "low": 24.42, + "volume": 2536935.0 } ], "weekly": [ @@ -41478,18 +41606,10 @@ "volume": 65544402.0 } ], - "updated_at": 1782788263.3321202 + "updated_at": 1782889336.2089329 }, "688411": { "daily": [ - { - "date": "2025-12-25", - "open": 272.41, - "close": 263.19, - "high": 272.41, - "low": 259.51, - "volume": 3348791.0 - }, { "date": "2025-12-26", "open": 263.21, @@ -42441,6 +42561,22 @@ "high": 288.49, "low": 260.12, "volume": 8470055.0 + }, + { + "date": "2026-06-30", + "open": 284.02, + "close": 291.2, + "high": 303.39, + "low": 278.88, + "volume": 7491878.0 + }, + { + "date": "2026-07-01", + "open": 289.74, + "close": 263.03, + "high": 290.33, + "low": 248.68, + "volume": 10085842.0 } ], "weekly": [ @@ -42735,18 +42871,10 @@ "volume": 122696229.0 } ], - "updated_at": 1782788263.6162174 + "updated_at": 1782889338.1852093 }, "688630": { "daily": [ - { - "date": "2025-12-25", - "open": 137.48, - "close": 135.62, - "high": 139.18, - "low": 134.5, - "volume": 3925116.0 - }, { "date": "2025-12-26", "open": 134.3, @@ -43698,6 +43826,22 @@ "high": 558.0, "low": 503.66, "volume": 6403258.0 + }, + { + "date": "2026-06-30", + "open": 539.0, + "close": 549.39, + "high": 555.0, + "low": 518.88, + "volume": 4537548.0 + }, + { + "date": "2026-07-01", + "open": 550.0, + "close": 510.53, + "high": 577.66, + "low": 510.0, + "volume": 4651377.0 } ], "weekly": [ @@ -43992,18 +44136,10 @@ "volume": 132048197.0 } ], - "updated_at": 1782788264.2166195 + "updated_at": 1782889340.0443535 }, "688639": { "daily": [ - { - "date": "2025-12-25", - "open": 34.52, - "close": 33.57, - "high": 35.16, - "low": 32.82, - "volume": 8210728.0 - }, { "date": "2025-12-26", "open": 33.58, @@ -44955,6 +45091,22 @@ "high": 16.95, "low": 15.65, "volume": 28192651.0 + }, + { + "date": "2026-06-30", + "open": 16.33, + "close": 16.14, + "high": 17.26, + "low": 15.87, + "volume": 16452096.0 + }, + { + "date": "2026-07-01", + "open": 16.26, + "close": 16.37, + "high": 16.47, + "low": 15.67, + "volume": 8585910.0 } ], "weekly": [ @@ -45249,18 +45401,10 @@ "volume": 124114989.0 } ], - "updated_at": 1782788265.4287102 + "updated_at": 1782889342.4196506 }, "688795": { "daily": [ - { - "date": "2025-12-25", - "open": 630.02, - "close": 628.86, - "high": 647.1, - "low": 623.45, - "volume": 4480407.0 - }, { "date": "2025-12-26", "open": 618.96, @@ -46212,6 +46356,22 @@ "high": 708.2, "low": 665.0, "volume": 3511958.0 + }, + { + "date": "2026-06-30", + "open": 700.0, + "close": 716.49, + "high": 722.79, + "low": 693.33, + "volume": 3193008.0 + }, + { + "date": "2026-07-01", + "open": 714.82, + "close": 689.0, + "high": 723.95, + "low": 683.0, + "volume": 2545693.0 } ], "weekly": [ @@ -46466,18 +46626,10 @@ "volume": 57135746.0 } ], - "updated_at": 1782788265.7453396 + "updated_at": 1782889344.4226563 }, "688802": { "daily": [ - { - "date": "2025-12-25", - "open": 620.18, - "close": 642.94, - "high": 665.72, - "low": 605.0, - "volume": 4327957.0 - }, { "date": "2025-12-26", "open": 628.01, @@ -47429,6 +47581,22 @@ "high": 798.98, "low": 720.0, "volume": 3449367.0 + }, + { + "date": "2026-06-30", + "open": 787.0, + "close": 828.3, + "high": 837.0, + "low": 780.95, + "volume": 2697271.0 + }, + { + "date": "2026-07-01", + "open": 828.0, + "close": 792.45, + "high": 845.98, + "low": 786.0, + "volume": 1693806.0 } ], "weekly": [ @@ -47683,6 +47851,1279 @@ "volume": 44794504.0 } ], - "updated_at": 1782788266.7040112 + "updated_at": 1782889347.889297 + }, + "301308": { + "daily": [ + { + "date": "2025-12-26", + "open": 253.519, + "close": 265.899, + "high": 272.459, + "low": 252.689, + "volume": 198896.0 + }, + { + "date": "2025-12-29", + "open": 261.639, + "close": 257.869, + "high": 275.189, + "low": 254.559, + "volume": 169157.0 + }, + { + "date": "2025-12-30", + "open": 254.129, + "close": 253.759, + "high": 267.909, + "low": 251.509, + "volume": 130845.0 + }, + { + "date": "2025-12-31", + "open": 254.989, + "close": 243.849, + "high": 256.009, + "low": 242.999, + "volume": 116256.0 + }, + { + "date": "2026-01-05", + "open": 254.699, + "close": 282.369, + "high": 282.509, + "low": 254.279, + "volume": 282555.0 + }, + { + "date": "2026-01-06", + "open": 279.759, + "close": 286.659, + "high": 294.539, + "low": 272.289, + "volume": 241475.0 + }, + { + "date": "2026-01-07", + "open": 319.059, + "close": 291.959, + "high": 325.169, + "low": 287.889, + "volume": 277521.0 + }, + { + "date": "2026-01-08", + "open": 289.039, + "close": 282.909, + "high": 296.559, + "low": 281.669, + "volume": 157439.0 + }, + { + "date": "2026-01-09", + "open": 275.419, + "close": 276.559, + "high": 279.499, + "low": 270.809, + "volume": 141703.0 + }, + { + "date": "2026-01-12", + "open": 285.009, + "close": 284.329, + "high": 287.009, + "low": 272.539, + "volume": 182141.0 + }, + { + "date": "2026-01-13", + "open": 280.209, + "close": 275.499, + "high": 288.709, + "low": 273.329, + "volume": 130259.0 + }, + { + "date": "2026-01-14", + "open": 286.019, + "close": 283.759, + "high": 294.669, + "low": 276.439, + "volume": 207204.0 + }, + { + "date": "2026-01-15", + "open": 276.769, + "close": 310.509, + "high": 319.889, + "low": 275.909, + "volume": 248242.0 + }, + { + "date": "2026-01-16", + "open": 311.889, + "close": 352.489, + "high": 365.009, + "low": 305.919, + "volume": 295031.0 + }, + { + "date": "2026-01-19", + "open": 342.519, + "close": 335.259, + "high": 348.509, + "low": 333.079, + "volume": 230808.0 + }, + { + "date": "2026-01-20", + "open": 322.149, + "close": 340.999, + "high": 347.209, + "low": 322.149, + "volume": 220838.0 + }, + { + "date": "2026-01-21", + "open": 339.509, + "close": 345.629, + "high": 354.819, + "low": 335.889, + "volume": 184686.0 + }, + { + "date": "2026-01-22", + "open": 364.009, + "close": 360.819, + "high": 376.009, + "low": 337.009, + "volume": 233948.0 + }, + { + "date": "2026-01-23", + "open": 351.209, + "close": 373.009, + "high": 374.249, + "low": 346.889, + "volume": 207143.0 + }, + { + "date": "2026-01-26", + "open": 367.009, + "close": 359.509, + "high": 378.999, + "low": 355.229, + "volume": 157136.0 + }, + { + "date": "2026-01-27", + "open": 350.039, + "close": 367.459, + "high": 368.889, + "low": 339.019, + "volume": 175505.0 + }, + { + "date": "2026-01-28", + "open": 367.009, + "close": 370.209, + "high": 376.899, + "low": 363.219, + "volume": 161075.0 + }, + { + "date": "2026-01-29", + "open": 371.209, + "close": 357.809, + "high": 388.009, + "low": 356.549, + "volume": 174843.0 + }, + { + "date": "2026-01-30", + "open": 347.009, + "close": 335.009, + "high": 357.749, + "low": 329.809, + "volume": 227515.0 + }, + { + "date": "2026-02-02", + "open": 323.929, + "close": 298.809, + "high": 323.929, + "low": 298.009, + "volume": 207002.0 + }, + { + "date": "2026-02-03", + "open": 310.009, + "close": 305.039, + "high": 313.009, + "low": 298.819, + "volume": 158737.0 + }, + { + "date": "2026-02-04", + "open": 299.139, + "close": 301.009, + "high": 304.809, + "low": 294.219, + "volume": 112624.0 + }, + { + "date": "2026-02-05", + "open": 289.009, + "close": 291.729, + "high": 294.899, + "low": 287.889, + "volume": 95542.0 + }, + { + "date": "2026-02-06", + "open": 287.889, + "close": 287.009, + "high": 291.469, + "low": 284.009, + "volume": 78990.0 + }, + { + "date": "2026-02-09", + "open": 291.409, + "close": 292.959, + "high": 294.009, + "low": 286.029, + "volume": 111445.0 + }, + { + "date": "2026-02-10", + "open": 290.939, + "close": 287.379, + "high": 293.399, + "low": 286.159, + "volume": 79968.0 + }, + { + "date": "2026-02-11", + "open": 283.009, + "close": 283.149, + "high": 287.569, + "low": 281.019, + "volume": 62635.0 + }, + { + "date": "2026-02-12", + "open": 288.759, + "close": 291.719, + "high": 292.069, + "low": 284.809, + "volume": 120811.0 + }, + { + "date": "2026-02-13", + "open": 288.799, + "close": 302.699, + "high": 311.599, + "low": 286.039, + "volume": 160732.0 + }, + { + "date": "2026-02-24", + "open": 303.479, + "close": 307.509, + "high": 312.209, + "low": 300.919, + "volume": 122548.0 + }, + { + "date": "2026-02-25", + "open": 300.859, + "close": 296.759, + "high": 301.009, + "low": 292.359, + "volume": 105052.0 + }, + { + "date": "2026-02-26", + "open": 296.009, + "close": 298.819, + "high": 303.009, + "low": 289.009, + "volume": 110641.0 + }, + { + "date": "2026-02-27", + "open": 293.009, + "close": 290.709, + "high": 293.429, + "low": 288.099, + "volume": 79979.0 + }, + { + "date": "2026-03-02", + "open": 280.009, + "close": 281.989, + "high": 287.879, + "low": 279.189, + "volume": 85271.0 + }, + { + "date": "2026-03-03", + "open": 281.029, + "close": 261.909, + "high": 284.009, + "low": 261.909, + "volume": 121192.0 + }, + { + "date": "2026-03-04", + "open": 279.159, + "close": 300.999, + "high": 305.759, + "low": 279.159, + "volume": 268447.0 + }, + { + "date": "2026-03-05", + "open": 307.029, + "close": 295.309, + "high": 309.859, + "low": 294.239, + "volume": 215079.0 + }, + { + "date": "2026-03-06", + "open": 293.829, + "close": 305.009, + "high": 310.959, + "low": 292.959, + "volume": 170814.0 + }, + { + "date": "2026-03-09", + "open": 296.989, + "close": 329.129, + "high": 329.259, + "low": 296.509, + "volume": 245495.0 + }, + { + "date": "2026-03-10", + "open": 336.009, + "close": 332.519, + "high": 339.449, + "low": 323.689, + "volume": 218075.0 + }, + { + "date": "2026-03-11", + "open": 332.009, + "close": 323.599, + "high": 332.889, + "low": 322.029, + "volume": 164854.0 + }, + { + "date": "2026-03-12", + "open": 322.509, + "close": 318.009, + "high": 330.209, + "low": 314.019, + "volume": 125112.0 + }, + { + "date": "2026-03-13", + "open": 317.009, + "close": 325.179, + "high": 336.009, + "low": 315.039, + "volume": 185629.0 + }, + { + "date": "2026-03-16", + "open": 325.009, + "close": 345.809, + "high": 354.999, + "low": 321.009, + "volume": 218770.0 + }, + { + "date": "2026-03-17", + "open": 342.009, + "close": 330.909, + "high": 344.279, + "low": 329.509, + "volume": 153734.0 + }, + { + "date": "2026-03-18", + "open": 341.009, + "close": 358.309, + "high": 364.009, + "low": 339.029, + "volume": 242904.0 + }, + { + "date": "2026-03-19", + "open": 347.009, + "close": 355.509, + "high": 367.599, + "low": 341.569, + "volume": 212698.0 + }, + { + "date": "2026-03-20", + "open": 348.859, + "close": 329.109, + "high": 350.499, + "low": 327.009, + "volume": 218210.0 + }, + { + "date": "2026-03-23", + "open": 309.009, + "close": 305.209, + "high": 322.889, + "low": 304.009, + "volume": 147699.0 + }, + { + "date": "2026-03-24", + "open": 309.009, + "close": 322.509, + "high": 324.879, + "low": 290.409, + "volume": 170982.0 + }, + { + "date": "2026-03-25", + "open": 321.889, + "close": 337.169, + "high": 348.959, + "low": 319.009, + "volume": 184208.0 + }, + { + "date": "2026-03-26", + "open": 324.129, + "close": 326.009, + "high": 333.589, + "low": 317.109, + "volume": 142297.0 + }, + { + "date": "2026-03-27", + "open": 309.009, + "close": 319.039, + "high": 326.139, + "low": 307.029, + "volume": 119604.0 + }, + { + "date": "2026-03-30", + "open": 309.249, + "close": 314.009, + "high": 328.809, + "low": 309.189, + "volume": 126714.0 + }, + { + "date": "2026-03-31", + "open": 301.009, + "close": 296.089, + "high": 303.989, + "low": 290.009, + "volume": 150635.0 + }, + { + "date": "2026-04-01", + "open": 318.009, + "close": 298.119, + "high": 322.009, + "low": 294.099, + "volume": 193446.0 + }, + { + "date": "2026-04-02", + "open": 299.409, + "close": 288.449, + "high": 304.019, + "low": 288.009, + "volume": 117211.0 + }, + { + "date": "2026-04-03", + "open": 290.509, + "close": 284.579, + "high": 293.689, + "low": 284.089, + "volume": 83677.0 + }, + { + "date": "2026-04-07", + "open": 289.829, + "close": 296.509, + "high": 300.339, + "low": 287.149, + "volume": 115131.0 + }, + { + "date": "2026-04-08", + "open": 317.119, + "close": 322.929, + "high": 322.959, + "low": 305.699, + "volume": 167878.0 + }, + { + "date": "2026-04-09", + "open": 315.759, + "close": 324.509, + "high": 330.069, + "low": 314.009, + "volume": 142436.0 + }, + { + "date": "2026-04-10", + "open": 332.009, + "close": 340.309, + "high": 346.699, + "low": 329.809, + "volume": 190471.0 + }, + { + "date": "2026-04-13", + "open": 339.169, + "close": 353.509, + "high": 355.999, + "low": 337.609, + "volume": 187119.0 + }, + { + "date": "2026-04-14", + "open": 356.919, + "close": 380.519, + "high": 392.869, + "low": 354.009, + "volume": 241660.0 + }, + { + "date": "2026-04-15", + "open": 386.009, + "close": 370.579, + "high": 386.519, + "low": 367.559, + "volume": 192022.0 + }, + { + "date": "2026-04-16", + "open": 355.009, + "close": 371.069, + "high": 374.189, + "low": 355.009, + "volume": 154402.0 + }, + { + "date": "2026-04-17", + "open": 365.009, + "close": 369.529, + "high": 372.739, + "low": 357.009, + "volume": 140091.0 + }, + { + "date": "2026-04-20", + "open": 368.009, + "close": 374.219, + "high": 384.789, + "low": 366.009, + "volume": 141627.0 + }, + { + "date": "2026-04-21", + "open": 377.009, + "close": 374.969, + "high": 378.809, + "low": 362.339, + "volume": 107650.0 + }, + { + "date": "2026-04-22", + "open": 377.229, + "close": 381.749, + "high": 382.299, + "low": 372.009, + "volume": 118444.0 + }, + { + "date": "2026-04-23", + "open": 390.059, + "close": 357.199, + "high": 392.009, + "low": 357.029, + "volume": 187202.0 + }, + { + "date": "2026-04-24", + "open": 358.019, + "close": 372.199, + "high": 381.609, + "low": 352.039, + "volume": 164982.0 + }, + { + "date": "2026-04-27", + "open": 373.939, + "close": 392.469, + "high": 398.889, + "low": 368.109, + "volume": 189548.0 + }, + { + "date": "2026-04-28", + "open": 398.999, + "close": 380.709, + "high": 410.029, + "low": 380.509, + "volume": 263435.0 + }, + { + "date": "2026-04-29", + "open": 380.109, + "close": 413.309, + "high": 415.309, + "low": 379.019, + "volume": 231871.0 + }, + { + "date": "2026-04-30", + "open": 409.009, + "close": 400.129, + "high": 413.009, + "low": 395.009, + "volume": 189013.0 + }, + { + "date": "2026-05-06", + "open": 431.009, + "close": 480.349, + "high": 480.349, + "low": 425.129, + "volume": 263417.0 + }, + { + "date": "2026-05-07", + "open": 489.009, + "close": 482.339, + "high": 507.589, + "low": 479.779, + "volume": 308884.0 + }, + { + "date": "2026-05-08", + "open": 473.649, + "close": 478.999, + "high": 484.009, + "low": 471.679, + "volume": 191975.0 + }, + { + "date": "2026-05-11", + "open": 527.009, + "close": 555.669, + "high": 563.959, + "low": 514.009, + "volume": 269581.0 + }, + { + "date": "2026-05-12", + "open": 546.179, + "close": 560.649, + "high": 571.169, + "low": 536.479, + "volume": 229992.0 + }, + { + "date": "2026-05-13", + "open": 551.009, + "close": 610.909, + "high": 614.889, + "low": 537.009, + "volume": 258994.0 + }, + { + "date": "2026-05-14", + "open": 604.799, + "close": 598.009, + "high": 637.509, + "low": 598.009, + "volume": 245142.0 + }, + { + "date": "2026-05-15", + "open": 595.989, + "close": 589.529, + "high": 607.009, + "low": 564.009, + "volume": 235802.0 + }, + { + "date": "2026-05-18", + "open": 585.009, + "close": 591.229, + "high": 616.009, + "low": 579.009, + "volume": 231617.0 + }, + { + "date": "2026-05-19", + "open": 568.949, + "close": 561.439, + "high": 571.009, + "low": 540.709, + "volume": 206100.0 + }, + { + "date": "2026-05-20", + "open": 555.819, + "close": 570.509, + "high": 576.119, + "low": 555.819, + "volume": 158427.0 + }, + { + "date": "2026-05-21", + "open": 582.409, + "close": 538.009, + "high": 584.009, + "low": 535.689, + "volume": 185749.0 + }, + { + "date": "2026-05-22", + "open": 550.009, + "close": 548.509, + "high": 564.009, + "low": 535.809, + "volume": 156034.0 + }, + { + "date": "2026-05-25", + "open": 546.009, + "close": 564.509, + "high": 565.669, + "low": 537.519, + "volume": 182409.0 + }, + { + "date": "2026-05-26", + "open": 556.209, + "close": 537.959, + "high": 556.949, + "low": 526.019, + "volume": 171889.0 + }, + { + "date": "2026-05-27", + "open": 564.169, + "close": 550.599, + "high": 584.999, + "low": 545.009, + "volume": 252005.0 + }, + { + "date": "2026-05-28", + "open": 540.009, + "close": 547.019, + "high": 562.009, + "low": 531.099, + "volume": 150232.0 + }, + { + "date": "2026-05-29", + "open": 553.709, + "close": 550.299, + "high": 572.429, + "low": 530.509, + "volume": 176777.0 + }, + { + "date": "2026-06-01", + "open": 561.319, + "close": 504.809, + "high": 562.799, + "low": 503.009, + "volume": 175348.0 + }, + { + "date": "2026-06-02", + "open": 505.83, + "close": 519.5, + "high": 529.66, + "low": 495.71, + "volume": 158027.0 + }, + { + "date": "2026-06-03", + "open": 518.79, + "close": 532.51, + "high": 555.95, + "low": 517.72, + "volume": 187728.0 + }, + { + "date": "2026-06-04", + "open": 528.0, + "close": 568.48, + "high": 580.0, + "low": 525.0, + "volume": 241807.0 + }, + { + "date": "2026-06-05", + "open": 540.01, + "close": 520.01, + "high": 545.1, + "low": 520.0, + "volume": 213782.0 + }, + { + "date": "2026-06-08", + "open": 470.0, + "close": 485.06, + "high": 496.44, + "low": 470.0, + "volume": 140413.0 + }, + { + "date": "2026-06-09", + "open": 500.03, + "close": 514.65, + "high": 517.7, + "low": 497.0, + "volume": 121553.0 + }, + { + "date": "2026-06-10", + "open": 506.88, + "close": 507.0, + "high": 523.58, + "low": 500.05, + "volume": 106837.0 + }, + { + "date": "2026-06-11", + "open": 506.99, + "close": 514.8, + "high": 517.88, + "low": 498.0, + "volume": 111787.0 + }, + { + "date": "2026-06-12", + "open": 545.0, + "close": 514.89, + "high": 552.56, + "low": 514.89, + "volume": 227530.0 + }, + { + "date": "2026-06-15", + "open": 529.03, + "close": 529.23, + "high": 532.0, + "low": 501.28, + "volume": 162392.0 + }, + { + "date": "2026-06-16", + "open": 536.04, + "close": 540.23, + "high": 548.25, + "low": 524.0, + "volume": 165428.0 + }, + { + "date": "2026-06-17", + "open": 525.07, + "close": 571.68, + "high": 586.66, + "low": 520.53, + "volume": 259485.0 + }, + { + "date": "2026-06-18", + "open": 563.3, + "close": 577.79, + "high": 598.38, + "low": 560.0, + "volume": 234411.0 + }, + { + "date": "2026-06-22", + "open": 590.0, + "close": 616.16, + "high": 617.0, + "low": 583.17, + "volume": 235979.0 + }, + { + "date": "2026-06-23", + "open": 610.0, + "close": 596.01, + "high": 639.83, + "low": 590.1, + "volume": 218251.0 + }, + { + "date": "2026-06-24", + "open": 581.56, + "close": 619.98, + "high": 619.99, + "low": 579.0, + "volume": 205105.0 + }, + { + "date": "2026-06-25", + "open": 655.0, + "close": 677.3, + "high": 688.8, + "low": 640.0, + "volume": 269707.0 + }, + { + "date": "2026-06-26", + "open": 656.0, + "close": 679.6, + "high": 690.5, + "low": 650.0, + "volume": 247581.0 + }, + { + "date": "2026-06-29", + "open": 667.0, + "close": 723.1, + "high": 723.5, + "low": 656.01, + "volume": 230668.0 + }, + { + "date": "2026-06-30", + "open": 705.0, + "close": 703.8, + "high": 715.0, + "low": 681.13, + "volume": 165307.0 + }, + { + "date": "2026-07-01", + "open": 708.66, + "close": 692.7, + "high": 749.88, + "low": 675.0, + "volume": 155173.0 + } + ], + "weekly": [ + { + "date": "2026-01-16", + "open": 285.009, + "close": 352.489, + "high": 365.009, + "low": 272.539, + "volume": 1062877.0 + }, + { + "date": "2026-01-23", + "open": 342.519, + "close": 373.009, + "high": 376.009, + "low": 322.149, + "volume": 1077423.0 + }, + { + "date": "2026-01-30", + "open": 367.009, + "close": 335.009, + "high": 388.009, + "low": 329.809, + "volume": 896074.0 + }, + { + "date": "2026-02-06", + "open": 323.929, + "close": 287.009, + "high": 323.929, + "low": 284.009, + "volume": 652895.0 + }, + { + "date": "2026-02-13", + "open": 291.409, + "close": 302.699, + "high": 311.599, + "low": 281.019, + "volume": 535591.0 + }, + { + "date": "2026-02-27", + "open": 303.479, + "close": 290.709, + "high": 312.209, + "low": 288.099, + "volume": 418220.0 + }, + { + "date": "2026-03-06", + "open": 280.009, + "close": 305.009, + "high": 310.959, + "low": 261.909, + "volume": 860803.0 + }, + { + "date": "2026-03-13", + "open": 296.989, + "close": 325.179, + "high": 339.449, + "low": 296.509, + "volume": 939165.0 + }, + { + "date": "2026-03-20", + "open": 325.009, + "close": 329.109, + "high": 367.599, + "low": 321.009, + "volume": 1046316.0 + }, + { + "date": "2026-03-27", + "open": 309.009, + "close": 319.039, + "high": 348.959, + "low": 290.409, + "volume": 764790.0 + }, + { + "date": "2026-04-03", + "open": 309.249, + "close": 284.579, + "high": 328.809, + "low": 284.089, + "volume": 671683.0 + }, + { + "date": "2026-04-10", + "open": 289.829, + "close": 340.309, + "high": 346.699, + "low": 287.149, + "volume": 615916.0 + }, + { + "date": "2026-04-17", + "open": 339.169, + "close": 369.529, + "high": 392.869, + "low": 337.609, + "volume": 915294.0 + }, + { + "date": "2026-04-24", + "open": 368.009, + "close": 372.199, + "high": 392.009, + "low": 352.039, + "volume": 719905.0 + }, + { + "date": "2026-04-30", + "open": 373.939, + "close": 400.129, + "high": 415.309, + "low": 368.109, + "volume": 873867.0 + }, + { + "date": "2026-05-08", + "open": 431.009, + "close": 478.999, + "high": 507.589, + "low": 425.129, + "volume": 764276.0 + }, + { + "date": "2026-05-15", + "open": 527.009, + "close": 589.529, + "high": 637.509, + "low": 514.009, + "volume": 1239511.0 + }, + { + "date": "2026-05-22", + "open": 585.009, + "close": 548.509, + "high": 616.009, + "low": 535.689, + "volume": 937927.0 + }, + { + "date": "2026-05-29", + "open": 546.009, + "close": 550.299, + "high": 584.999, + "low": 526.019, + "volume": 933312.0 + }, + { + "date": "2026-06-05", + "open": 561.319, + "close": 520.01, + "high": 580.0, + "low": 495.71, + "volume": 976692.0 + }, + { + "date": "2026-06-12", + "open": 470.0, + "close": 514.89, + "high": 552.56, + "low": 470.0, + "volume": 708120.0 + }, + { + "date": "2026-06-18", + "open": 529.03, + "close": 577.79, + "high": 598.38, + "low": 501.28, + "volume": 821716.0 + }, + { + "date": "2026-06-26", + "open": 590.0, + "close": 679.6, + "high": 690.5, + "low": 579.0, + "volume": 1176623.0 + }, + { + "date": "2026-07-01", + "open": 667.0, + "close": 692.7, + "high": 749.88, + "low": 656.01, + "volume": 551148.0 + } + ], + "monthly": [ + { + "date": "2025-07-31", + "open": 86.999, + "close": 88.289, + "high": 92.669, + "low": 78.809, + "volume": 1572528.0 + }, + { + "date": "2025-08-29", + "open": 87.519, + "close": 94.469, + "high": 104.509, + "low": 85.809, + "volume": 2012022.0 + }, + { + "date": "2025-09-30", + "open": 97.519, + "close": 177.039, + "high": 177.039, + "low": 84.389, + "volume": 3908351.0 + }, + { + "date": "2025-10-31", + "open": 190.869, + "close": 260.319, + "high": 307.009, + "low": 162.589, + "volume": 4196250.0 + }, + { + "date": "2025-11-28", + "open": 255.029, + "close": 248.199, + "high": 330.509, + "low": 227.839, + "volume": 4026650.0 + }, + { + "date": "2025-12-31", + "open": 248.929, + "close": 243.849, + "high": 281.399, + "low": 231.229, + "volume": 3478821.0 + }, + { + "date": "2026-01-30", + "open": 254.699, + "close": 335.009, + "high": 388.009, + "low": 254.279, + "volume": 4137067.0 + }, + { + "date": "2026-02-27", + "open": 323.929, + "close": 290.709, + "high": 323.929, + "low": 281.019, + "volume": 1606706.0 + }, + { + "date": "2026-03-31", + "open": 280.009, + "close": 296.089, + "high": 367.599, + "low": 261.909, + "volume": 3888423.0 + }, + { + "date": "2026-04-30", + "open": 318.009, + "close": 400.129, + "high": 415.309, + "low": 284.089, + "volume": 3519316.0 + }, + { + "date": "2026-05-29", + "open": 431.009, + "close": 550.299, + "high": 637.509, + "low": 425.129, + "volume": 3875026.0 + }, + { + "date": "2026-06-30", + "open": 561.319, + "close": 703.8, + "high": 723.5, + "low": 470.0, + "volume": 4079126.0 + }, + { + "date": "2026-07-01", + "open": 708.66, + "close": 692.7, + "high": 749.88, + "low": 675.0, + "volume": 155173.0 + } + ], + "updated_at": 1782889323.6712773 } } \ No newline at end of file diff --git a/data/portfolio.json b/data/portfolio.json index 6d51167..8e7a8f1 100644 --- a/data/portfolio.json +++ b/data/portfolio.json @@ -7,33 +7,33 @@ "cost": 1316.53, "position_pct": 15.27, "is_active": 1, - "stop_loss": 1196.55, - "take_profit": 1328.37, - "entry_low": 1220.0, - "entry_high": 1256.27, + "stop_loss": 1169.0, + "take_profit": 1339.19, + "entry_low": 1182.26, + "entry_high": 1248.91, "action": null, "strategy_updated": null, "analysis": { - "stop_loss": 1196.55, - "take_profit": 1328.37, - "entry_low": 1220.0, - "entry_high": 1256.27, - "action": "持有观察 | ⚠️盈亏比偏低(1:0.8),不建议加仓 | 止损1196.55 | 目标1328.37 | 买入区1220.0~1256.27 | 信号:持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:1128.82 弱撑:1220.0 弱压:1294.32 强压:1383.72 | MA5=1283.9 MA10=1293.89 MA20=1237.53 MA60=1001.87", - "multi_tf_context": "多周期看多 | MA20=1237.53 | MA60=1001.87 | 长撑:日弱支撑=1113.9 | 长压:日强阻=1416.88", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 1169.0, + "take_profit": 1339.19, + "entry_low": 1182.26, + "entry_high": 1248.91, + "action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损1169.0 | 目标1339.19 | 买入区1182.26~1248.91 | 信号:持有", + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动买盘占优 强撑:1102.83 弱撑:1182.26 弱压:1289.83 强压:1394.99 | MA5=1262.5 MA10=1296.1 MA20=1247.2 MA60=1024.3", + "multi_tf_context": "多周期看多 | MA20=1247.2 | MA60=1024.3 | 长撑:日弱支撑=1122.0 | 长压:日强阻=1416.88", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 0.78, - "action_note": "⚠️盈亏比偏低(1:0.8),不建议加仓", + "rr_ratio": 1.43, + "action_note": "⚠️盈亏比偏低(1:1.4),不建议加仓", "timing_signal": "持有" }, "trigger": { - "stop_loss": 1196.55, - "entry_zone": "1220.0~1256.27", - "take_profit_zone": "0~1328.37" + "stop_loss": 1169.0, + "entry_zone": "1182.26~1248.91", + "take_profit_zone": "0~1339.19" }, - "price": 1273.99, - "change_pct": 4.43 + "price": 1223.17, + "change_pct": -3.69 }, { "code": "06869", @@ -42,33 +42,33 @@ "cost": 263.72, "position_pct": 13.47, "is_active": 1, - "stop_loss": 216.0, - "take_profit": 309.76, + "stop_loss": 205.71, + "take_profit": 300.74, "entry_low": 239.4, "entry_high": 251.37, "action": null, "strategy_updated": null, "analysis": { - "stop_loss": 216.0, - "take_profit": 309.76, + "stop_loss": 205.71, + "take_profit": 300.74, "entry_low": 239.4, "entry_high": 251.37, - "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损216.0 | 目标309.76 | 买入区239.4~251.37 | 信号:持有", - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:313.27 | MA5=260.68 MA10=251.16 MA20=244.02 MA60=230.35", - "multi_tf_context": "多周期看多 | MA20=244.02 | MA60=230.35 | 长撑:日弱支撑=209.2 | 长压:日强阻=305.0", - "reassessed_at": "2026-06-30 10:57", + "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损205.71 | 目标300.74 | 买入区239.4~251.37 | 信号:持有", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:194.07 弱撑:239.4 弱压:261.73 强压:313.27 | MA5=258.84 MA10=252.78 MA20=246.28 MA60=231.33", + "multi_tf_context": "多周期看多 | MA20=246.28 | MA60=231.33 | 长撑:MA20=246.28 | 长压:日强阻=305.0", + "reassessed_at": "2026-07-01 15:01", "status": "updated", "rr_ratio": 0.94, "action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓", "timing_signal": "持有" }, "trigger": { - "stop_loss": 216.0, + "stop_loss": 205.71, "entry_zone": "239.4~251.37", - "take_profit_zone": "0~309.76" + "take_profit_zone": "0~300.74" }, - "price": 219.43, - "change_pct": 5.6 + "price": 221.69, + "change_pct": 6.68 }, { "code": "01478", @@ -77,33 +77,33 @@ "cost": 13.47, "position_pct": 7.97, "is_active": 1, - "stop_loss": 6.52, - "take_profit": 7.44, - "entry_low": 6.2, - "entry_high": 7.23, + "stop_loss": 6.18, + "take_profit": 7.2, + "entry_low": 6.17, + "entry_high": 7.2, "action": "深套持有 | 深套持有 | 止损7.33 | 目标10.39 | 买入区7.88~9.19 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 6.52, - "take_profit": 7.44, - "entry_low": 6.2, - "entry_high": 7.23, - "action": "深套持有 | 深套持有 | 止损6.52 | 目标7.44 | 买入区6.2~7.23 | 信号:持有", - "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.38 弱撑:6.75 弱压:7.1 强压:7.52 | MA5=8.83 MA10=8.99 MA20=9.38 MA60=8.89", - "multi_tf_context": "震荡/无明显方向 | MA20=9.38 | MA60=8.89 | 长撑:日弱支撑=6.74 | 长压:日强阻=10.5", - "reassessed_at": "2026-06-30 10:56", + "stop_loss": 6.18, + "take_profit": 7.2, + "entry_low": 6.17, + "entry_high": 7.2, + "action": "深套持有 | 深套持有 | 止损6.18 | 目标7.2 | 买入区6.17~7.2 | 信号:持有", + "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:6.36 弱撑:6.69 弱压:7.09 强压:7.5 | MA5=8.98 MA10=9.17 MA20=9.44 MA60=8.88", + "multi_tf_context": "震荡/无明显方向 | MA20=9.44 | MA60=8.88 | 长撑:日强支撑=6.6 | 长压:日强阻=10.5", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 0.61, + "rr_ratio": 0.62, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 6.52, - "entry_zone": "6.2~7.23", - "take_profit_zone": "0~7.44" + "stop_loss": 6.18, + "entry_zone": "6.17~7.2", + "take_profit_zone": "0~7.2" }, - "price": 6.0, - "change_pct": 0.14 + "price": 5.95, + "change_pct": -0.58 }, { "code": "601899", @@ -112,33 +112,33 @@ "cost": 39.89, "position_pct": 7.34, "is_active": 1, - "stop_loss": 21.6, - "take_profit": 24.6, - "entry_low": 22.48, - "entry_high": 26.23, + "stop_loss": 23.07, + "take_profit": 25.51, + "entry_low": 22.6, + "entry_high": 26.37, "action": "深套持有 | 深套持有 | 止损24.48 | 目标34.47 | 买入区26.72~31.17 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 21.6, - "take_profit": 24.6, - "entry_low": 22.48, - "entry_high": 26.23, - "action": "深套持有 | 深套持有 | 止损21.6 | 目标24.6 | 买入区22.48~26.23 | 信号:持有", - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:23.21 弱撑:24.68 弱压:25.79 强压:26.97 | MA5=32.84 MA10=34.55 MA20=35.97 MA60=36.49", - "multi_tf_context": "震荡/无明显方向 | MA20=35.97 | MA60=36.49 | 长撑:日弱支撑=24.98 | 长压:周强阻=35.62", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 23.07, + "take_profit": 25.51, + "entry_low": 22.6, + "entry_high": 26.37, + "action": "深套持有 | 深套持有 | 止损23.07 | 目标25.51 | 买入区22.6~26.37 | 信号:持有", + "tech_snapshot": "形态:小阳线/neutral 量价:主动买盘占优 强撑:23.49 弱撑:24.5 弱压:25.63 强压:26.57 | MA5=33.51 MA10=35.08 MA20=36.34 MA60=36.5", + "multi_tf_context": "震荡/无明显方向 | MA20=36.34 | MA60=36.5 | 长撑:日弱支撑=24.7 | 长压:周强阻=35.62", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 0.53, + "rr_ratio": 0.39, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 21.6, - "entry_zone": "22.48~26.23", - "take_profit_zone": "0~24.6" + "stop_loss": 23.07, + "entry_zone": "22.6~26.37", + "take_profit_zone": "0~25.51" }, - "price": 24.97, - "change_pct": -3.18 + "price": 25.11, + "change_pct": -0.12 }, { "code": "688411", @@ -147,33 +147,33 @@ "cost": 266.95, "position_pct": 6.31, "is_active": 1, - "stop_loss": 273.03, - "take_profit": 303.96, - "entry_low": 278.2, - "entry_high": 292.11, + "stop_loss": 246.94, + "take_profit": 309.13, + "entry_low": 244.27, + "entry_high": 256.48, "action": "盈利良好 | 止损253.82 | 目标316.5 | 买入区273.21~286.87 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 273.03, - "take_profit": 303.96, - "entry_low": 278.2, - "entry_high": 292.11, - "action": "盈利良好 | 止损273.03 | 目标303.96 | 买入区278.2~292.11 | 信号:持有", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:250.03 弱撑:278.2 弱压:287.77 强压:316.63 | MA5=271.84 MA10=272.79 MA20=269.25 MA60=252.62", - "multi_tf_context": "震荡/无明显方向 | MA20=269.25 | MA60=252.62 | 长撑:MA20=269.25 | 长压:日强阻=307.58", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 246.94, + "take_profit": 309.13, + "entry_low": 244.27, + "entry_high": 256.48, + "action": "持有观察 | 止损246.94 | 目标309.13 | 买入区244.27~256.48 | 信号:持有", + "tech_snapshot": "形态:带下影阴线/neutral 量价:买卖均衡 强撑:232.96 弱撑:244.27 弱压:291.2 强压:322.01 | MA5=256.08 MA10=249.18 MA20=246.95 MA60=242.64", + "multi_tf_context": "震荡/无明显方向 | MA20=246.95 | MA60=242.64 | 长撑:MA20=246.95 | 长压:周强阻=307.58", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 4.17, + "rr_ratio": 1.98, "action_note": "", "timing_signal": "持有" }, "trigger": { - "stop_loss": 273.03, - "entry_zone": "278.2~292.11", - "take_profit_zone": "0~303.96" + "stop_loss": 246.94, + "entry_zone": "244.27~256.48", + "take_profit_zone": "0~309.13" }, - "price": 283.06, - "change_pct": -1.03 + "price": 262.89, + "change_pct": -9.72 }, { "code": "688981", @@ -182,33 +182,33 @@ "cost": 126.07, "position_pct": 5.44, "is_active": 1, - "stop_loss": 154.07, - "take_profit": 173.58, - "entry_low": 151.0, - "entry_high": 158.55, + "stop_loss": 149.85, + "take_profit": 176.42, + "entry_low": 148.9, + "entry_high": 156.34, "action": "盈利良好 | 止损132.76 | 目标164.45 | 买入区134.18~140.89 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 154.07, - "take_profit": 173.58, - "entry_low": 151.0, - "entry_high": 158.55, - "action": "盈利良好 | 止损154.07 | 目标173.58 | 买入区151.0~158.55 | 信号:持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:买卖均衡 强撑:137.56 弱撑:151.0 弱压:163.11 强压:175.54 | MA5=149.97 MA10=143.15 MA20=135.98 MA60=122.6", - "multi_tf_context": "震荡/无明显方向 | MA20=135.98 | MA60=122.6 | 长撑:MA20=135.98 | 长压:周强阻=159.05", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 149.85, + "take_profit": 176.42, + "entry_low": 148.9, + "entry_high": 156.34, + "action": "盈利良好 | 止损149.85 | 目标176.42 | 买入区148.9~156.34 | 信号:持有", + "tech_snapshot": "形态:带上影阴线/bearish 量价:买卖均衡 强撑:132.01 弱撑:148.9 弱压:163.47 强压:183.77 | MA5=154.35 MA10=148.6 MA20=138.49 MA60=124.68", + "multi_tf_context": "震荡/无明显方向 | MA20=138.49 | MA60=124.68 | 长撑:MA20=138.49 | 长压:日强阻=166.88", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 2.13, + "rr_ratio": 5.25, "action_note": "", "timing_signal": "持有" }, "trigger": { - "stop_loss": 154.07, - "entry_zone": "151.0~158.55", - "take_profit_zone": "0~173.58" + "stop_loss": 149.85, + "entry_zone": "148.9~156.34", + "take_profit_zone": "0~176.42" }, - "price": 160.04, - "change_pct": 5.99 + "price": 154.48, + "change_pct": -2.73 }, { "code": "01888", @@ -217,33 +217,33 @@ "cost": 88.23, "position_pct": 5.28, "is_active": 1, - "stop_loss": 97.39, - "take_profit": 111.71, - "entry_low": 96.3, - "entry_high": 101.11, + "stop_loss": 92.33, + "take_profit": 103.21, + "entry_low": 94.93, + "entry_high": 99.68, "action": "盈利持有 | 短炒强趋势持 | 止损86.34 | 目标141.9 | 买入区85.82~90.11 | 信号:强趋势持", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 97.39, - "take_profit": 111.71, - "entry_low": 96.3, - "entry_high": 101.11, - "action": "盈利良好 | 止损97.39 | 目标111.71 | 买入区96.3~101.11 | 信号:持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:84.08 弱撑:96.3 弱压:102.57 强压:112.98 | MA5=95.97 MA10=91.83 MA20=74.34 MA60=48.8", - "multi_tf_context": "多周期看多 | MA20=74.34 | MA60=48.8 | 长撑:MA20=74.34 | 长压:日强阻=107.2", - "reassessed_at": "2026-06-30 10:56", + "stop_loss": 92.33, + "take_profit": 103.21, + "entry_low": 94.93, + "entry_high": 99.68, + "action": "盈利良好 | 止损92.33 | 目标103.21 | 买入区94.93~99.68 | 信号:持有", + "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:84.27 弱撑:94.93 弱压:102.93 强压:113.17 | MA5=98.35 MA10=93.72 MA20=76.92 MA60=50.12", + "multi_tf_context": "多周期看多 | MA20=76.92 | MA60=50.12 | 长撑:MA20=76.92 | 长压:日强阻=107.2", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 3.07, + "rr_ratio": 3.32, "action_note": "", "timing_signal": "持有" }, "trigger": { - "stop_loss": 97.39, - "entry_zone": "96.3~101.11", - "take_profit_zone": "0~111.71" + "stop_loss": 92.33, + "entry_zone": "94.93~99.68", + "take_profit_zone": "0~103.21" }, - "price": 86.97, - "change_pct": 4.05 + "price": 86.06, + "change_pct": 2.96 }, { "code": "688639", @@ -252,33 +252,33 @@ "cost": 21.51, "position_pct": 5.25, "is_active": 1, - "stop_loss": 14.38, - "take_profit": 18.35, - "entry_low": 14.37, - "entry_high": 16.77, + "stop_loss": 14.96, + "take_profit": 18.7, + "entry_low": 14.73, + "entry_high": 17.19, "action": null, "strategy_updated": null, "analysis": { - "stop_loss": 14.38, - "take_profit": 18.35, - "entry_low": 14.37, - "entry_high": 16.77, - "action": "深套持有 | 深套持有 | 止损14.38 | 目标18.35 | 买入区14.37~16.77 | 信号:持有", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:主动买盘占优 强撑:13.63 弱撑:15.48 弱压:16.82 强压:19.11 | MA5=32.8 MA10=33.91 MA20=35.99 MA60=34.5", - "multi_tf_context": "多周期看多 | MA20=35.99 | MA60=34.5 | 长撑:日弱支撑=15.65 | 长压:月强阻=43.44", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 14.96, + "take_profit": 18.7, + "entry_low": 14.73, + "entry_high": 17.19, + "action": "深套持有 | 深套持有 | 止损14.96 | 目标18.7 | 买入区14.73~17.19 | 信号:持有", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:13.44 弱撑:15.86 弱压:16.69 强压:18.92 | MA5=32.72 MA10=34.17 MA20=36.22 MA60=34.41", + "multi_tf_context": "多周期看多 | MA20=36.22 | MA60=34.41 | 长撑:日弱支撑=15.65 | 长压:日强阻=22.62", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 1.31, + "rr_ratio": 0.87, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 14.38, - "entry_zone": "14.37~16.77", - "take_profit_zone": "0~18.35" + "stop_loss": 14.96, + "entry_zone": "14.73~17.19", + "take_profit_zone": "0~18.7" }, - "price": 15.94, - "change_pct": -4.15 + "price": 16.37, + "change_pct": 1.43 }, { "code": "300750", @@ -287,33 +287,33 @@ "cost": 401.78, "position_pct": 4.64, "is_active": 1, - "stop_loss": 379.27, - "take_profit": 409.12, - "entry_low": 386.75, - "entry_high": 394.56, + "stop_loss": 362.31, + "take_profit": 404.56, + "entry_low": 372.23, + "entry_high": 381.61, "action": "持有观察 | 止损345.04 | 目标414.6 | 买入区384.35~397.12 | 信号:弱势持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 379.27, - "take_profit": 409.12, - "entry_low": 386.75, - "entry_high": 394.56, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损379.27 | 目标409.12 | 买入区386.75~394.56 | 信号:弱势持有", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:买卖均衡 强撑:362.95 弱撑:386.75 弱压:399.11 强压:426.17 | MA5=392.63 MA10=396.43 MA20=400.7 MA60=414.36", - "multi_tf_context": "震荡/无明显方向 | MA20=400.7 | MA60=414.36 | 长撑:日弱支撑=380.03 | 长压:周强阻=468.75", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 362.31, + "take_profit": 404.56, + "entry_low": 372.23, + "entry_high": 381.61, + "action": "持有观察 | ⚠️盈亏比偏低(1:0.9),不建议加仓 | 止损362.31 | 目标404.56 | 买入区372.23~381.61 | 信号:持有", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:买卖均衡 强撑:341.8 弱撑:372.23 弱压:393.23 强压:421.42 | MA5=390.94 MA10=394.21 MA20=396.97 MA60=414.12", + "multi_tf_context": "震荡/无明显方向 | MA20=396.97 | MA60=414.12 | 长撑:日弱支撑=378.2 | 长压:周强阻=468.75", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 1.25, - "action_note": "⚠️盈亏比偏低(1:1.3),不建议加仓", - "timing_signal": "弱势持有" + "rr_ratio": 0.89, + "action_note": "⚠️盈亏比偏低(1:0.9),不建议加仓", + "timing_signal": "持有" }, "trigger": { - "stop_loss": 379.27, - "entry_zone": "386.75~394.56", - "take_profit_zone": "0~409.12" + "stop_loss": 362.31, + "entry_zone": "372.23~381.61", + "take_profit_zone": "0~404.56" }, - "price": 392.8, - "change_pct": 0.11 + "price": 383.84, + "change_pct": -2.33 }, { "code": "01211", @@ -322,33 +322,33 @@ "cost": 104.87, "position_pct": 4.62, "is_active": 1, - "stop_loss": 62.36, - "take_profit": 71.43, - "entry_low": 64.89, - "entry_high": 75.7, + "stop_loss": 66.58, + "take_profit": 73.73, + "entry_low": 65.2, + "entry_high": 76.07, "action": "深套持有 | 深套持有 | 止损63.99 | 目标87.07 | 买入区72.77~84.89 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 62.36, - "take_profit": 71.43, - "entry_low": 64.89, - "entry_high": 75.7, - "action": "深套持有 | 深套持有 | 止损62.36 | 目标71.43 | 买入区64.89~75.7 | 信号:持有", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:66.78 弱撑:71.0 弱压:73.7 强压:78.32 | MA5=97.34 MA10=96.41 MA20=97.65 MA60=98.08", - "multi_tf_context": "多周期看多 | MA20=97.65 | MA60=98.08 | 长撑:日弱支撑=72.45 | 长压:日强阻=97.15", - "reassessed_at": "2026-06-30 10:56", + "stop_loss": 66.58, + "take_profit": 73.73, + "entry_low": 65.2, + "entry_high": 76.07, + "action": "深套持有 | 深套持有 | 止损66.58 | 目标73.73 | 买入区65.2~76.07 | 信号:持有", + "tech_snapshot": "形态:十字星/neutral 量价:数据不足 强撑:68.5 弱撑:71.2 弱压:73.9 强压:76.8 | MA5=96.88 MA10=96.41 MA20=97.91 MA60=98.22", + "multi_tf_context": "多周期看多 | MA20=97.91 | MA60=98.22 | 长撑:日弱支撑=72.2 | 长压:日强阻=97.15", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 0.57, + "rr_ratio": 0.4, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 62.36, - "entry_zone": "64.89~75.7", - "take_profit_zone": "0~71.43" + "stop_loss": 66.58, + "entry_zone": "65.2~76.07", + "take_profit_zone": "0~73.73" }, - "price": 62.63, - "change_pct": -1.03 + "price": 62.89, + "change_pct": -0.62 }, { "code": "02202", @@ -357,68 +357,68 @@ "cost": 4.67, "position_pct": 4.6, "is_active": 1, - "stop_loss": 1.9, + "stop_loss": 1.95, "take_profit": 2.31, - "entry_low": 1.9, - "entry_high": 2.22, + "entry_low": 1.91, + "entry_high": 2.23, "action": "深套持有 | 深套持有 | 止损2.0 | 目标2.85 | 买入区2.18~2.54 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 1.9, + "stop_loss": 1.95, "take_profit": 2.31, - "entry_low": 1.9, - "entry_high": 2.22, - "action": "深套持有 | 深套持有 | 止损1.9 | 目标2.31 | 买入区1.9~2.22 | 信号:持有", - "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | MA5=3.36 MA10=3.39 MA20=3.47 MA60=3.52", - "multi_tf_context": "多周期看多 | MA20=3.47 | MA60=3.52 | 长撑:日强支撑=2.16 | 长压:日强阻=2.85", - "reassessed_at": "2026-06-30 10:57", + "entry_low": 1.91, + "entry_high": 2.23, + "action": "深套持有 | 深套持有 | 止损1.95 | 目标2.31 | 买入区1.91~2.23 | 信号:持有", + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:1.89 弱撑:2.07 弱压:2.21 强压:2.41 | MA5=3.37 MA10=3.39 MA20=3.5 MA60=3.52", + "multi_tf_context": "多周期看多 | MA20=3.5 | MA60=3.52 | 长撑:日强支撑=2.1 | 长压:日强阻=2.85", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 0.94, + "rr_ratio": 0.91, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 1.9, - "entry_zone": "1.9~2.22", + "stop_loss": 1.95, + "entry_zone": "1.91~2.23", "take_profit_zone": "0~2.31" }, - "price": 1.83, - "change_pct": -4.52 + "price": 1.84, + "change_pct": -4.07 }, { "code": "00700", - "name": "腾讯控股", + "name": "腾讯", "shares": 100, - "cost": 443.13, - "position_pct": 4.41, + "cost": null, + "position_pct": null, "is_active": 1, - "stop_loss": 408.18, - "take_profit": 439.59, - "entry_low": 416.13, - "entry_high": 423.07, + "stop_loss": 416.91, + "take_profit": 434.43, + "entry_low": 421.2, + "entry_high": 429.72, "action": "持有观察 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损387.49 | 目标496.33 | 买入区435.13~440.67 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 408.18, - "take_profit": 439.59, - "entry_low": 416.13, - "entry_high": 423.07, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损408.18 | 目标439.59 | 买入区416.13~423.07 | 信号:持有", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:388.22 弱撑:416.13 弱压:427.73 强压:457.91 | MA5=615.8 MA10=618.1 MA20=613.3 MA60=563.41", - "multi_tf_context": "多周期看多 | MA20=613.3 | MA60=563.41 | 长撑:日强支撑=411.0 | 长压:周强阻=526.5", - "reassessed_at": "2026-06-30 10:56", - "status": "updated", - "rr_ratio": 1.14, - "action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓", - "timing_signal": "持有" + "stop_loss": 416.91, + "take_profit": 434.43, + "entry_low": 421.2, + "entry_high": 429.72, + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 损414.51 | 盈452.53 | 买421.2~429.72", + "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:403.33 弱撑:420.2 弱压:437.47 强压:452.53 | MA5=620.7 MA10=621.4 MA20=614.35 MA60=561.43", + "multi_tf_context": "多周期看多 | MA20=614.35 | MA60=561.43 | 长撑:日弱支撑=412.6 | 长压:周强阻=526.5", + "reassessed_at": "2026-07-01 15:01", + "status": "review", + "rr_ratio": 1.49, + "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "timing_signal": "信号不充分" }, "trigger": { - "stop_loss": 408.18, - "entry_zone": "416.13~423.07", - "take_profit_zone": "0~439.59" + "stop_loss": 416.91, + "entry_zone": "421.2~429.72", + "take_profit_zone": "0~434.43" }, - "price": 365.25, - "change_pct": 0.14 + "price": 373.07, + "change_pct": 2.28 }, { "code": "00981", @@ -428,32 +428,32 @@ "position_pct": 4.2, "is_active": 1, "stop_loss": 86.72, - "take_profit": 97.27, + "take_profit": 96.86, "entry_low": 84.8, "entry_high": 89.04, "action": "盈利持有 | ⚠️盈亏比偏低(1:1.0),不建议加仓 | 止损67.69 | 目标87.26 | 买入区73.68~76.57 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { "stop_loss": 86.72, - "take_profit": 97.27, + "take_profit": 96.86, "entry_low": 84.8, "entry_high": 89.04, - "action": "盈利良好 | 止损86.72 | 目标97.27 | 买入区84.8~89.04 | 信号:持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:77.18 弱撑:84.8 弱压:91.32 强压:98.38 | MA5=82.69 MA10=79.53 MA20=78.08 MA60=70.8", - "multi_tf_context": "震荡/无明显方向 | MA20=78.08 | MA60=70.8 | 长撑:MA20=78.08 | 长压:周强阻=93.0", - "reassessed_at": "2026-06-30 10:56", + "action": "盈利良好 | 止损86.72 | 目标96.86 | 买入区84.8~89.04 | 信号:持有", + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:75.9 弱撑:84.8 弱压:92.55 强压:100.9 | MA5=85.0 MA10=80.8 MA20=78.58 MA60=71.43", + "multi_tf_context": "震荡/无明显方向 | MA20=78.58 | MA60=71.43 | 长撑:MA20=78.58 | 长压:周强阻=93.0", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 2.01, + "rr_ratio": 2.57, "action_note": "", "timing_signal": "持有" }, "trigger": { "stop_loss": 86.72, "entry_zone": "84.8~89.04", - "take_profit_zone": "0~97.27" + "take_profit_zone": "0~96.86" }, - "price": 78.99, - "change_pct": 7.31 + "price": 77.6, + "change_pct": 5.42 }, { "code": "300548", @@ -462,33 +462,33 @@ "cost": 231.46, "position_pct": 3.2, "is_active": 1, - "stop_loss": 265.76, - "take_profit": 300.43, - "entry_low": 253.19, - "entry_high": 265.85, + "stop_loss": 246.38, + "take_profit": 291.58, + "entry_low": 241.67, + "entry_high": 253.75, "action": "盈利良好 | 短炒强趋势持 | 止损251.24 | 目标413.9 | 买入区269.8~283.29 | 信号:强趋势持", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 265.76, - "take_profit": 300.43, - "entry_low": 253.19, - "entry_high": 265.85, - "action": "盈利良好 | 止损265.76 | 目标300.43 | 买入区253.19~265.85 | 信号:持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动买盘占优 强撑:224.93 弱撑:253.19 弱压:280.65 强压:303.83 | MA5=273.2 MA10=276.81 MA20=252.3 MA60=243.4", - "multi_tf_context": "多周期看多 | MA20=252.3 | MA60=243.4 | 长撑:MA60=243.4 | 长压:日强阻=309.98", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 246.38, + "take_profit": 291.58, + "entry_low": 241.67, + "entry_high": 253.75, + "action": "盈利良好 | 止损246.38 | 目标291.58 | 买入区241.67~253.75 | 信号:持有", + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:主动买盘占优 强撑:222.4 弱撑:241.67 弱压:278.0 强压:303.73 | MA5=266.91 MA10=275.27 MA20=256.44 MA60=247.14", + "multi_tf_context": "多周期看多 | MA20=256.44 | MA60=247.14 | 长撑:MA60=247.14 | 长压:日强阻=309.98", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 2.18, + "rr_ratio": 4.03, "action_note": "", "timing_signal": "持有" }, "trigger": { - "stop_loss": 265.76, - "entry_zone": "253.19~265.85", - "take_profit_zone": "0~300.43" + "stop_loss": 246.38, + "entry_zone": "241.67~253.75", + "take_profit_zone": "0~291.58" }, - "price": 275.91, - "change_pct": 8.97 + "price": 254.0, + "change_pct": -8.63 }, { "code": "518880", @@ -497,33 +497,33 @@ "cost": 12.19, "position_pct": 2.45, "is_active": 1, - "stop_loss": 7.12, - "take_profit": 8.12, - "entry_low": 7.42, - "entry_high": 8.65, + "stop_loss": 7.45, + "take_profit": 8.58, + "entry_low": 7.44, + "entry_high": 8.68, "action": "深套持有 | 深套持有 | 止损7.05 | 目标9.17 | 买入区8.02~9.35 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 7.12, - "take_profit": 8.12, - "entry_low": 7.42, - "entry_high": 8.65, - "action": "深套持有 | 深套持有 | 止损7.12 | 目标8.12 | 买入区7.42~8.65 | 信号:持有", - "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:7.6 弱撑:8.22 弱压:8.45 强压:8.91 | MA5=9.49 MA10=9.51 MA20=9.79 MA60=10.33", - "multi_tf_context": "震荡/无明显方向 | MA20=9.79 | MA60=10.33 | 长撑:日强支撑=8.27 | 长压:周强阻=10.15", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 7.45, + "take_profit": 8.58, + "entry_low": 7.44, + "entry_high": 8.68, + "action": "深套持有 | 深套持有 | 止损7.45 | 目标8.58 | 买入区7.44~8.68 | 信号:持有", + "tech_snapshot": "形态:小阴线/bearish 量价:数据不足 强撑:7.61 弱撑:8.25 弱压:8.38 强压:8.94 | MA5=9.47 MA10=9.53 MA20=9.86 MA60=10.33", + "multi_tf_context": "震荡/无明显方向 | MA20=9.86 | MA60=10.33 | 长撑:日弱支撑=8.26 | 长压:周强阻=10.15", + "reassessed_at": "2026-07-01 15:02", "status": "updated", "rr_ratio": 0.54, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 7.12, - "entry_zone": "7.42~8.65", - "take_profit_zone": "0~8.12" + "stop_loss": 7.45, + "entry_zone": "7.44~8.68", + "take_profit_zone": "0~8.58" }, - "price": 8.25, - "change_pct": -2.33 + "price": 8.27, + "change_pct": -1.28 }, { "code": "300035", @@ -532,33 +532,33 @@ "cost": 22.29, "position_pct": 2.42, "is_active": 1, - "stop_loss": 13.21, - "take_profit": 15.05, - "entry_low": 12.94, - "entry_high": 15.1, + "stop_loss": 13.01, + "take_profit": 15.14, + "entry_low": 13.0, + "entry_high": 15.16, "action": "深套持有 | 深套持有 | 止损13.74 | 目标19.0 | 买入区15.63~18.24 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 13.21, - "take_profit": 15.05, - "entry_low": 12.94, - "entry_high": 15.1, - "action": "深套持有 | 深套持有 | 止损13.21 | 目标15.05 | 买入区12.94~15.1 | 信号:持有", - "tech_snapshot": "形态:带下影阳线/bullish 量价:主动卖盘占优 强撑:12.92 弱撑:14.17 弱压:14.5 强压:15.68 | MA5=21.55 MA10=21.83 MA20=22.11 MA60=21.46", - "multi_tf_context": "震荡/无明显方向 | MA20=22.11 | MA60=21.46 | 长撑:日强支撑=13.74 | 长压:日强阻=18.23", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 13.01, + "take_profit": 15.14, + "entry_low": 13.0, + "entry_high": 15.16, + "action": "深套持有 | 深套持有 | 止损13.01 | 目标15.14 | 买入区13.0~15.16 | 信号:持有", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动卖盘占优 强撑:13.01 弱撑:14.12 弱压:14.71 强压:15.77 | MA5=21.52 MA10=21.86 MA20=22.15 MA60=21.45", + "multi_tf_context": "震荡/无明显方向 | MA20=22.15 | MA60=21.45 | 长撑:日弱支撑=14.07 | 长压:日强阻=18.23", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 0.6, + "rr_ratio": 0.61, "action_note": "深套持有", "timing_signal": "持有" }, "trigger": { - "stop_loss": 13.21, - "entry_zone": "12.94~15.1", - "take_profit_zone": "0~15.05" + "stop_loss": 13.01, + "entry_zone": "13.0~15.16", + "take_profit_zone": "0~15.14" }, - "price": 14.24, - "change_pct": 0.35 + "price": 14.44, + "change_pct": 0.14 }, { "code": "000700", @@ -578,12 +578,12 @@ "take_profit": 15.54, "entry_low": 13.32, "entry_high": 14.09, - "action": "持有观察 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", - "tech_snapshot": "形态:带下影阳线/bullish 量价:主动买盘占优 强撑:12.56 弱撑:13.86 弱压:14.93 强压:15.25 | MA5=14.54 MA10=15.05 MA20=15.38 MA60=13.59", - "multi_tf_context": "多周期看多 | MA20=15.38 | MA60=13.59 | 长撑:日弱支撑=13.78 | 长压:日强阻=18.66", - "reassessed_at": "2026-06-30 10:56", + "action": "盈利持有 | ⚠️盈亏比极低,关注 | 止损13.91 | 目标15.54 | 买入区13.32~14.09 | 信号:持有", + "tech_snapshot": "形态:带上影阳线/neutral 量价:主动买盘占优 强撑:13.28 弱撑:14.55 弱压:16.1 强压:16.24 | MA5=14.44 MA10=14.83 MA20=15.44 MA60=13.73", + "multi_tf_context": "多周期看多 | MA20=15.44 | MA60=13.73 | 长撑:日弱支撑=13.78 | 长压:日强阻=18.66", + "reassessed_at": "2026-07-01 15:00", "status": "manual", - "rr_ratio": 1.43, + "rr_ratio": 0.14, "action_note": "⚠️盈亏比极低,关注", "timing_signal": "持有" }, @@ -592,8 +592,8 @@ "entry_zone": "13.32~14.09", "take_profit_zone": "0~15.54" }, - "price": 14.67, - "change_pct": 5.84 + "price": 15.34, + "change_pct": 3.93 }, { "code": "600563", @@ -602,33 +602,33 @@ "cost": 147.18, "position_pct": 2.3, "is_active": 1, - "stop_loss": 183.98, - "take_profit": 206.01, - "entry_low": 183.44, - "entry_high": 192.61, + "stop_loss": 169.99, + "take_profit": 188.19, + "entry_low": 175.29, + "entry_high": 184.05, "action": "盈利良好 | 止损161.41 | 目标192.67 | 买入区165.51~173.79 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 183.98, - "take_profit": 206.01, - "entry_low": 183.44, - "entry_high": 192.61, - "action": "盈利良好 | 止损183.98 | 目标206.01 | 买入区183.44~192.61 | 信号:持有", - "tech_snapshot": "形态:倒T线/射击之星/neutral 量价:买卖均衡 强撑:170.46 弱撑:183.44 弱压:195.02 强压:208.34 | MA5=181.89 MA10=174.62 MA20=165.95 MA60=142.47", - "multi_tf_context": "多周期看多 | MA20=165.95 | MA60=142.47 | 长撑:MA20=165.95 | 长压:日强阻=198.8", - "reassessed_at": "2026-06-30 10:57", + "stop_loss": 169.99, + "take_profit": 188.19, + "entry_low": 175.29, + "entry_high": 184.05, + "action": "盈利良好 | 止损169.99 | 目标188.19 | 买入区175.29~184.05 | 信号:持有", + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:买卖均衡 强撑:171.72 弱撑:175.29 弱压:192.5 强压:206.35 | MA5=187.94 MA10=179.22 MA20=168.75 MA60=144.49", + "multi_tf_context": "多周期看多 | MA20=168.75 | MA60=144.49 | 长撑:MA20=168.75 | 长压:日强阻=198.8", + "reassessed_at": "2026-07-01 15:02", "status": "updated", - "rr_ratio": 3.0, + "rr_ratio": 3.28, "action_note": "", "timing_signal": "持有" }, "trigger": { - "stop_loss": 183.98, - "entry_zone": "183.44~192.61", - "take_profit_zone": "0~206.01" + "stop_loss": 169.99, + "entry_zone": "175.29~184.05", + "take_profit_zone": "0~188.19" }, - "price": 189.6, - "change_pct": 0.11 + "price": 182.55, + "change_pct": -4.32 }, { "code": "01088", @@ -637,41 +637,41 @@ "cost": 45.89, "position_pct": 2.14, "is_active": 1, - "stop_loss": 37.77, - "take_profit": 40.33, - "entry_low": 40.09, - "entry_high": 40.79, + "stop_loss": 38.92, + "take_profit": 41.97, + "entry_low": 39.41, + "entry_high": 40.45, "action": "持有观察 | ⚠️盈亏比偏低(1:1.3),不建议加仓 | 止损35.09 | 目标42.9 | 买入区41.66~42.8 | 信号:持有", "strategy_updated": "2026-06-19 16:01", "analysis": { - "stop_loss": 37.77, - "take_profit": 40.33, - "entry_low": 40.09, - "entry_high": 40.79, - "action": "持有观察 | ⚠️盈亏比偏低(1:1.1),不建议加仓 | 止损37.77 | 目标40.33 | 买入区40.09~40.79 | 信号:持有", - "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:37.36 弱撑:40.09 弱压:41.25 强压:44.22 | MA5=41.25 MA10=42.05 MA20=44.1 MA60=45.26", - "multi_tf_context": "震荡/无明显方向 | MA20=44.1 | MA60=45.26 | 长撑:日弱支撑=40.18 | 长压:月强阻=49.62", - "reassessed_at": "2026-06-30 10:56", + "stop_loss": 38.92, + "take_profit": 41.97, + "entry_low": 39.41, + "entry_high": 40.45, + "action": "持有观察 | ⚠️盈亏比偏低(1:1.4),不建议加仓 | 止损38.92 | 目标41.97 | 买入区39.41~40.45 | 信号:持有", + "tech_snapshot": "形态:光头光脚阴线/bearish 量价:数据不足 强撑:38.44 弱撑:39.41 弱压:41.15 强压:42.45 | MA5=40.86 MA10=41.76 MA20=43.74 MA60=45.14", + "multi_tf_context": "震荡/无明显方向 | MA20=43.74 | MA60=45.14 | 长撑:日弱支撑=40.0 | 长压:月强阻=49.62", + "reassessed_at": "2026-07-01 15:01", "status": "updated", - "rr_ratio": 1.14, - "action_note": "⚠️盈亏比偏低(1:1.1),不建议加仓", + "rr_ratio": 1.39, + "action_note": "⚠️盈亏比偏低(1:1.4),不建议加仓", "timing_signal": "持有" }, "trigger": { - "stop_loss": 37.77, - "entry_zone": "40.09~40.79", - "take_profit_zone": "0~40.33" + "stop_loss": 38.92, + "entry_zone": "39.41~40.45", + "take_profit_zone": "0~41.97" }, - "price": 35.03, - "change_pct": -1.8 + "price": 34.82, + "change_pct": -2.38 } ], "cash": 92678.85, "total_market_value": 835552.6, - "total_assets": 1001212.25, + "total_assets": 989902.25, "total_pl": 0, - "position_pct": 86.8, - "updated_at": "2026-06-30 11:12", + "position_pct": 86.65, + "updated_at": "2026-07-01 16:58", "source": "/home/hmo/stocks/holding.xls", "frozen_cash": 39481.4, "available_cash": 92678.85, @@ -689,7 +689,7 @@ "timestamp": "2026-06-29 10:43" } ], - "total_mv": 869052.0, + "total_mv": 857742.0, "note": "cash fixed from screenshot 6/29, prices=CNY", "currency": "CNY", "last_verified_at": "2026-06-29 22:28", diff --git a/data/price_events.json b/data/price_events.json index e7c5204..8a82688 100644 --- a/data/price_events.json +++ b/data/price_events.json @@ -6069,6 +6069,436 @@ "event_label": "止盈区间", "timestamp": "2026-06-30T10:18:38.494999", "date": "2026-06-30" + }, + { + "code": "300308", + "name": "中际旭创", + "event_type": "entry_zone", + "price": 1270.0, + "trigger_value": "1143.0~1333.5", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:20:45.529208", + "date": "2026-07-01" + }, + { + "code": "300548", + "name": "长芯博创", + "event_type": "entry_zone", + "price": 276.0, + "trigger_value": "249.3~290.85", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:20:45.631399", + "date": "2026-07-01" + }, + { + "code": "688981", + "name": "中芯国际", + "event_type": "entry_zone", + "price": 160.49, + "trigger_value": "144.17~168.2", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:20:45.733567", + "date": "2026-07-01" + }, + { + "code": "000711", + "name": "ST京蓝", + "event_type": "entry_zone", + "price": 4.77, + "trigger_value": "4.67~4.87", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:33:00.220937", + "date": "2026-07-01" + }, + { + "code": "688411", + "name": "海博思创", + "event_type": "stop_loss", + "price": 279.34, + "trigger_value": "281.05", + "event_label": "", + "timestamp": "2026-07-01T09:33:00.905869", + "date": "2026-07-01" + }, + { + "code": "688630", + "name": "芯碁微装", + "event_type": "entry_zone", + "price": 558.89, + "trigger_value": "540.92~563.0", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:33:01.200367", + "date": "2026-07-01" + }, + { + "code": "518880", + "name": "黄金ETF华安", + "event_type": "entry_zone", + "price": 8.28, + "trigger_value": "0~8.35", + "event_label": "止盈区间", + "timestamp": "2026-07-01T09:36:59.902311", + "date": "2026-07-01" + }, + { + "code": "300308", + "name": "中际旭创", + "event_type": "entry_zone", + "price": 1290.21, + "trigger_value": "1270.0~1290.91", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:41:29.194522", + "date": "2026-07-01" + }, + { + "code": "300548", + "name": "长芯博创", + "event_type": "entry_zone", + "price": 271.32, + "trigger_value": "269.55~283.03", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:41:29.425760", + "date": "2026-07-01" + }, + { + "code": "688411", + "name": "海博思创", + "event_type": "entry_zone", + "price": 253.98, + "trigger_value": "243.18~255.34", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:50:24.758260", + "date": "2026-07-01" + }, + { + "code": "000657", + "name": "中钨高新", + "event_type": "entry_zone", + "price": 99.01, + "trigger_value": "97.13~99.55", + "event_label": "买入区间", + "timestamp": "2026-07-01T09:58:34.447320", + "date": "2026-07-01" + }, + { + "code": "300308", + "name": "中际旭创", + "event_type": "entry_zone", + "price": 1291.05, + "trigger_value": "1266.82~1291.19", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:00:36.066200", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 47.77, + "trigger_value": "46.92~47.96", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:00:36.642072", + "date": "2026-07-01" + }, + { + "code": "300308", + "name": "中际旭创", + "event_type": "entry_zone", + "price": 1287.45, + "trigger_value": "1265.42~1290.5", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:04:37.888547", + "date": "2026-07-01" + }, + { + "code": "688411", + "name": "海博思创", + "event_type": "entry_zone", + "price": 253.0, + "trigger_value": "237.01~253.6", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:04:38.073740", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 47.96, + "trigger_value": "47.02~48.1", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:12:55.481245", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 48.06, + "trigger_value": "47.02~48.1", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:24:59.420752", + "date": "2026-07-01" + }, + { + "code": "000657", + "name": "中钨高新", + "event_type": "entry_zone", + "price": 96.66, + "trigger_value": "94.29~98.13", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:33:07.556432", + "date": "2026-07-01" + }, + { + "code": "600519", + "name": "贵州茅台", + "event_type": "entry_zone", + "price": 1183.54, + "trigger_value": "1157.94~1184.47", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:33:07.873475", + "date": "2026-07-01" + }, + { + "code": "688630", + "name": "芯碁微装", + "event_type": "entry_zone", + "price": 534.66, + "trigger_value": "523.2~544.56", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:33:08.083328", + "date": "2026-07-01" + }, + { + "code": "300035", + "name": "中科电气", + "event_type": "entry_zone", + "price": 14.24, + "trigger_value": "0~15.02", + "event_label": "止盈区间", + "timestamp": "2026-07-01T10:36:15.248928", + "date": "2026-07-01" + }, + { + "code": "518880", + "name": "黄金ETF华安", + "event_type": "entry_zone", + "price": 8.29, + "trigger_value": "0~8.35", + "event_label": "止盈区间", + "timestamp": "2026-07-01T10:36:15.349307", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 79.52, + "trigger_value": "78.17~80.03", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:38:11.668684", + "date": "2026-07-01" + }, + { + "code": "600519", + "name": "贵州茅台", + "event_type": "entry_zone", + "price": 1187.05, + "trigger_value": "1164.19~1192.47", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:38:11.871799", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 49.19, + "trigger_value": "48.05~49.52", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:40:14.655488", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 79.99, + "trigger_value": "78.44~80.22", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:42:18.469287", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 80.26, + "trigger_value": "78.75~80.45", + "event_label": "买入区间", + "timestamp": "2026-07-01T10:52:35.409682", + "date": "2026-07-01" + }, + { + "code": "601899", + "name": "紫金矿业", + "event_type": "entry_zone", + "price": 25.37, + "trigger_value": "0~25.43", + "event_label": "止盈区间", + "timestamp": "2026-07-01T11:22:27.718695", + "date": "2026-07-01" + }, + { + "code": "601899", + "name": "紫金矿业", + "event_type": "entry_zone", + "price": 25.51, + "trigger_value": "0~25.63", + "event_label": "止盈区间", + "timestamp": "2026-07-01T12:02:22.275660", + "date": "2026-07-01" + }, + { + "code": "301308", + "name": "江波龙", + "event_type": "entry_zone", + "price": 691.82, + "trigger_value": "674.42~701.94", + "event_label": "买入区间", + "timestamp": "2026-07-01T13:22:58.880566", + "date": "2026-07-01" + }, + { + "code": "688630", + "name": "芯碁微装", + "event_type": "entry_zone", + "price": 516.7, + "trigger_value": "500.32~520.74", + "event_label": "买入区间", + "timestamp": "2026-07-01T13:22:59.265488", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 81.16, + "trigger_value": "79.36~81.83", + "event_label": "买入区间", + "timestamp": "2026-07-01T13:26:57.034189", + "date": "2026-07-01" + }, + { + "code": "300750", + "name": "宁德时代", + "event_type": "entry_zone", + "price": 382.57, + "trigger_value": "374.4~382.7", + "event_label": "买入区间", + "timestamp": "2026-07-01T13:54:41.626818", + "date": "2026-07-01" + }, + { + "code": "301308", + "name": "江波龙", + "event_type": "entry_zone", + "price": 676.94, + "trigger_value": "653.97~680.67", + "event_label": "买入区间", + "timestamp": "2026-07-01T13:58:46.749719", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 80.38, + "trigger_value": "78.86~80.6", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:00:55.362630", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 49.56, + "trigger_value": "48.51~49.65", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:00:55.500782", + "date": "2026-07-01" + }, + { + "code": "600563", + "name": "法拉电子", + "event_type": "entry_zone", + "price": 183.88, + "trigger_value": "175.8~184.59", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:11:12.256767", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 49.42, + "trigger_value": "48.44~49.46", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:11:13.654145", + "date": "2026-07-01" + }, + { + "code": "300750", + "name": "宁德时代", + "event_type": "entry_zone", + "price": 381.03, + "trigger_value": "371.27~381.14", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:20:18.302650", + "date": "2026-07-01" + }, + { + "code": "002594", + "name": "比亚迪", + "event_type": "entry_zone", + "price": 80.61, + "trigger_value": "79.16~80.82", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:24:24.455970", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 49.4, + "trigger_value": "48.49~49.65", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:24:24.654723", + "date": "2026-07-01" + }, + { + "code": "001309", + "name": "德明利", + "event_type": "entry_zone", + "price": 895.99, + "trigger_value": "877.1~912.9", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:32:34.555973", + "date": "2026-07-01" + }, + { + "code": "601318", + "name": "中国平安", + "event_type": "entry_zone", + "price": 49.57, + "trigger_value": "48.55~49.65", + "event_label": "买入区间", + "timestamp": "2026-07-01T14:56:50.994484", + "date": "2026-07-01" } ] } \ No newline at end of file diff --git a/data/price_history.json b/data/price_history.json index ff276d0..0eb5798 100644 --- a/data/price_history.json +++ b/data/price_history.json @@ -17,6 +17,12 @@ "high": 828.0, "low": 780.95, "close": 819.0 + }, + { + "date": "2026-07-01", + "high": 845.98, + "low": 770.22, + "close": 780.0 } ], "000657": [ @@ -37,6 +43,12 @@ "high": 101.5, "low": 91.68, "close": 96.0 + }, + { + "date": "2026-07-01", + "high": 101.33, + "low": 92.52, + "close": 95.94 } ], "000700": [ @@ -57,6 +69,12 @@ "high": 14.79, "low": 13.4, "close": 14.58 + }, + { + "date": "2026-07-01", + "high": 16.06, + "low": 13.95, + "close": 15.34 } ], "000711": [ @@ -77,6 +95,12 @@ "high": 4.47, "low": 4.1, "close": 4.1 + }, + { + "date": "2026-07-01", + "high": 4.77, + "low": 4.1, + "close": 4.77 } ], "001309": [ @@ -97,6 +121,12 @@ "high": 978.0, "low": 886.66, "close": 928.51 + }, + { + "date": "2026-07-01", + "high": 976.0, + "low": 880.0, + "close": 893.22 } ], "002594": [ @@ -117,6 +147,12 @@ "high": 80.95, "low": 77.6, "close": 78.93 + }, + { + "date": "2026-07-01", + "high": 81.65, + "low": 78.55, + "close": 80.66 } ], "00700": [ @@ -137,6 +173,12 @@ "high": 432.0, "low": 415.0, "close": 420.8 + }, + { + "date": "2026-07-01", + "high": 435.6, + "low": 418.4, + "close": 429.8 } ], "00968": [ @@ -157,6 +199,12 @@ "high": 2.07, "low": 2.0, "close": 2.05 + }, + { + "date": "2026-07-01", + "high": 2.08, + "low": 2.01, + "close": 2.06 } ], "00981": [ @@ -177,6 +225,12 @@ "high": 89.65, "low": 79.35, "close": 89.45 + }, + { + "date": "2026-07-01", + "high": 91.55, + "low": 84.25, + "close": 89.4 } ], "01070": [ @@ -197,6 +251,12 @@ "high": 13.22, "low": 12.41, "close": 12.97 + }, + { + "date": "2026-07-01", + "high": 13.22, + "low": 12.59, + "close": 12.89 } ], "01088": [ @@ -217,6 +277,12 @@ "high": 41.48, "low": 40.18, "close": 40.56 + }, + { + "date": "2026-07-01", + "high": 41.48, + "low": 39.74, + "close": 40.12 } ], "01211": [ @@ -237,6 +303,12 @@ "high": 74.6, "low": 71.4, "close": 72.15 + }, + { + "date": "2026-07-01", + "high": 74.1, + "low": 71.4, + "close": 72.45 } ], "01478": [ @@ -257,6 +329,12 @@ "high": 7.16, "low": 6.74, "close": 6.89 + }, + { + "date": "2026-07-01", + "high": 7.16, + "low": 6.76, + "close": 6.86 } ], "01888": [ @@ -277,6 +355,12 @@ "high": 102.4, "low": 89.05, "close": 100.5 + }, + { + "date": "2026-07-01", + "high": 102.5, + "low": 94.5, + "close": 99.15 } ], "02202": [ @@ -297,6 +381,12 @@ "high": 2.28, "low": 2.1, "close": 2.12 + }, + { + "date": "2026-07-01", + "high": 2.23, + "low": 2.1, + "close": 2.12 } ], "02318": [ @@ -317,6 +407,12 @@ "high": 52.6, "low": 50.35, "close": 51.3 + }, + { + "date": "2026-07-01", + "high": 52.6, + "low": 50.75, + "close": 51.05 } ], "02359": [ @@ -337,6 +433,12 @@ "high": 158.4, "low": 144.4, "close": 156.4 + }, + { + "date": "2026-07-01", + "high": 158.4, + "low": 151.7, + "close": 153.7 } ], "02388": [ @@ -357,6 +459,12 @@ "high": 44.4, "low": 42.08, "close": 42.12 + }, + { + "date": "2026-07-01", + "high": 43.6, + "low": 41.82, + "close": 42.38 } ], "02628": [ @@ -377,6 +485,12 @@ "high": 28.28, "low": 26.46, "close": 26.54 + }, + { + "date": "2026-07-01", + "high": 27.18, + "low": 26.32, + "close": 26.66 } ], "06160": [ @@ -397,6 +511,12 @@ "high": 177.0, "low": 165.5, "close": 168.6 + }, + { + "date": "2026-07-01", + "high": 176.2, + "low": 168.0, + "close": 170.4 } ], "06869": [ @@ -417,6 +537,12 @@ "high": 259.6, "low": 227.2, "close": 255.8 + }, + { + "date": "2026-07-01", + "high": 260.0, + "low": 245.6, + "close": 255.4 } ], "09868": [ @@ -437,6 +563,12 @@ "high": 50.2, "low": 46.22, "close": 49.2 + }, + { + "date": "2026-07-01", + "high": 50.95, + "low": 48.58, + "close": 50.65 } ], "09988": [ @@ -457,6 +589,12 @@ "high": 95.45, "low": 91.15, "close": 92.3 + }, + { + "date": "2026-07-01", + "high": 93.95, + "low": 91.3, + "close": 92.85 } ], "300035": [ @@ -477,6 +615,12 @@ "high": 14.43, "low": 13.74, "close": 14.37 + }, + { + "date": "2026-07-01", + "high": 14.66, + "low": 14.07, + "close": 14.44 } ], "300124": [ @@ -497,6 +641,12 @@ "high": 67.18, "low": 62.01, "close": 65.89 + }, + { + "date": "2026-07-01", + "high": 69.38, + "low": 64.39, + "close": 68.2 } ], "300308": [ @@ -517,6 +667,12 @@ "high": 1280.0, "low": 1169.49, "close": 1270.59 + }, + { + "date": "2026-07-01", + "high": 1315.57, + "low": 1208.0, + "close": 1223.17 } ], "300548": [ @@ -537,6 +693,12 @@ "high": 275.0, "low": 243.58, "close": 273.48 + }, + { + "date": "2026-07-01", + "high": 280.9, + "low": 248.5, + "close": 254.0 } ], "300750": [ @@ -557,6 +719,12 @@ "high": 402.36, "low": 378.2, "close": 391.31 + }, + { + "date": "2026-07-01", + "high": 402.36, + "low": 370.0, + "close": 383.84 } ], "518880": [ @@ -577,6 +745,12 @@ "high": 8.479, "low": 8.224, "close": 8.241 + }, + { + "date": "2026-07-01", + "high": 8.389, + "low": 8.224, + "close": 8.271 } ], "600519": [ @@ -597,6 +771,12 @@ "high": 1215.0, "low": 1151.01, "close": 1178.0 + }, + { + "date": "2026-07-01", + "high": 1196.8, + "low": 1166.33, + "close": 1193.01 } ], "600563": [ @@ -617,6 +797,12 @@ "high": 198.8, "low": 184.1, "close": 188.9 + }, + { + "date": "2026-07-01", + "high": 195.68, + "low": 177.99, + "close": 182.55 } ], "601318": [ @@ -637,6 +823,12 @@ "high": 48.94, "low": 46.9, "close": 47.51 + }, + { + "date": "2026-07-01", + "high": 50.09, + "low": 47.19, + "close": 49.53 } ], "601899": [ @@ -657,6 +849,12 @@ "high": 25.96, "low": 24.7, "close": 24.95 + }, + { + "date": "2026-07-01", + "high": 25.55, + "low": 24.42, + "close": 25.11 } ], "688411": [ @@ -677,6 +875,12 @@ "high": 288.49, "low": 260.12, "close": 282.65 + }, + { + "date": "2026-07-01", + "high": 303.39, + "low": 248.68, + "close": 262.89 } ], "688630": [ @@ -697,6 +901,12 @@ "high": 558.0, "low": 503.66, "close": 533.52 + }, + { + "date": "2026-07-01", + "high": 577.66, + "low": 490.11, + "close": 497.27 } ], "688639": [ @@ -717,6 +927,12 @@ "high": 17.26, "low": 15.65, "close": 15.93 + }, + { + "date": "2026-07-01", + "high": 17.26, + "low": 15.67, + "close": 16.37 } ], "688795": [ @@ -737,6 +953,12 @@ "high": 721.0, "low": 665.0, "close": 713.68 + }, + { + "date": "2026-07-01", + "high": 723.95, + "low": 665.02, + "close": 673.8 } ], "688981": [ @@ -757,6 +979,12 @@ "high": 159.99, "low": 150.0, "close": 159.67 + }, + { + "date": "2026-07-01", + "high": 166.88, + "low": 150.0, + "close": 154.48 } ], "002015": [ @@ -766,5 +994,13 @@ "low": 17.33, "close": 17.62 } + ], + "301308": [ + { + "date": "2026-07-01", + "high": 749.88, + "low": 653.84, + "close": 667.84 + } ] } \ No newline at end of file diff --git a/data/stocks/000700.json b/data/stocks/000700.json index 2ab55e2..d19b32b 100644 --- a/data/stocks/000700.json +++ b/data/stocks/000700.json @@ -16,11 +16,21 @@ "content": "• 模塑科技(000700) 13.86(-2.3%) 止损14.54已破", "report_id": "cron_99c06255590a_2026-06-30_08-40-17" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-30T08:55:46.708460", "content": "- 模塑科技000700 13.86 | 买入区13.33~14.09 **(仍在区内,但已破止损)**", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-15T08:55:17.014788", "content": "- 模塑科技(000700) ¥14.4,买入区14.11~14.49 ✅ 在区间内,RR:2.02", diff --git a/data/stocks/00700.json b/data/stocks/00700.json index d3504fe..90fbe2d 100644 --- a/data/stocks/00700.json +++ b/data/stocks/00700.json @@ -126,6 +126,11 @@ "content": "• 模塑科技(000700) 13.86(-2.3%) 止损14.54已破", "report_id": "cron_99c06255590a_2026-06-30_08-40-17" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T11:55:44.093905", "content": "❌ 反例:腾讯00700,底仓100股(3.59%),浮盈+4.79%。看到\"距止盈470仅0.77%\"就建议触及减仓清仓 —— 机械执行,未考虑底仓属性+浮盈幅度。", @@ -991,6 +996,16 @@ "content": "- 模塑科技000700 13.86 | 买入区13.33~14.09 **(仍在区内,但已破止损)**", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**港股(恒指-0.63%):** 中芯国际H(00981) 89.40+5.42%浮盈+17%持有 | 腾讯控股(00700) 429.80+2.28%浮亏-3%距止损3.4% | 丘钛科技(014", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-08T08:55:37.165829", "content": "| **腾讯控股(00700)** | 453.20 | 追踪止盈459.8已触发 | 关注445支撑,跌破450可接回 |", diff --git a/data/stocks/00981.json b/data/stocks/00981.json index be058bb..ce57a39 100644 --- a/data/stocks/00981.json +++ b/data/stocks/00981.json @@ -61,6 +61,11 @@ "content": "**中芯国际H(00981)** 现价86.0距TP87.26仅1.5%,接近止盈", "report_id": "cron_99c06255590a_2026-06-26_08-43-03" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.836964", "content": "• 中芯国际H(00981) ¥82.20 +3.46% — 高于买入区72-75", @@ -150,6 +155,11 @@ "time": "2026-06-30T08:55:46.708460", "content": "**A股概览:** 上周五系统大跌(-2.26%/-3.44%)后弱反弹,科创50领涨+4.61%带动半导体板块。中芯国际A(688981) +19.8%浮盈距目标+4.1%、中芯H(00981) +", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" + }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**港股(恒指-0.63%):** 中芯国际H(00981) 89.40+5.42%浮盈+17%持有 | 腾讯控股(00700) 429.80+2.28%浮亏-3%距止损3.4% | 丘钛科技(014", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" } ] } \ No newline at end of file diff --git a/data/stocks/01211.json b/data/stocks/01211.json index 1b6d204..8c0af4d 100644 --- a/data/stocks/01211.json +++ b/data/stocks/01211.json @@ -51,6 +51,11 @@ "content": "• **比亚迪(01211) HK$86.55 (-18.56%)** — 买入区84.83~85.77,距现价-2%,接近可加仓区间", "report_id": "cron_99c06255590a_2026-06-15_08-41-00" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-12T08:55:34.669098", "content": "港股:比亚迪H 01211(6.05%)-2.13%成本95.9浮亏-12.1%策略区间内;万科02202(6.02%)+1.15%策略区间内;中银香港02388(5.46%)+1.12%浮盈+6.9", diff --git a/data/stocks/01478.json b/data/stocks/01478.json index e3c9b6f..b68e70f 100644 --- a/data/stocks/01478.json +++ b/data/stocks/01478.json @@ -61,6 +61,11 @@ "content": "**丘钛科技(01478)** 现价7.20(-4.1%) | 仓位6.37% | **已跌破止损7.33**,深套-47%但止损纪律必须执行", "report_id": "cron_99c06255590a_2026-06-26_08-43-03" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "**丘钛科技(01478)** 现价6.86(-0.58%) | 仓位7.97% | 止损7.33", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.834592", "content": "| 丘钛科技(01478) | 10.12 | -1.17% | 9.19% | 深套持有,止损9.0 |", diff --git a/data/stocks/01888.json b/data/stocks/01888.json index 84812e1..c73793d 100644 --- a/data/stocks/01888.json +++ b/data/stocks/01888.json @@ -61,6 +61,11 @@ "content": "**建滔积层板(01888)** — 昨振幅近10元(87.6→97.4→93.55收盘),电子元件强势但波动极大,仓位5.8%持有,注意追踪止盈。", "report_id": "cron_99c06255590a_2026-06-25_08-33-37" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T14:55:53.464779", "content": "| 建滔积层板(01888) | 49.48 | +4.30% | 42-44 | 🔴 远超买入区 |", @@ -156,6 +161,11 @@ "content": "- 建滔01888 96.7 | 买入区89.6~94.08 **(已超出)**", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**① 建滔积层板(01888)** — 距止损2.1%!", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-29T08:55:56.391301", "content": "**③ 建滔积层板(01888)持有判断正确**", diff --git a/data/stocks/02202.json b/data/stocks/02202.json index 08f47e4..a6a84ec 100644 --- a/data/stocks/02202.json +++ b/data/stocks/02202.json @@ -56,6 +56,11 @@ "content": "**万科企业(02202) 现价2.20** | 浮亏-52.9%最大亏损股,止损2.0距9%,港股地产持续阴跌,关注2元心理关口。", "report_id": "cron_99c06255590a_2026-06-29_08-37-43" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.834592", "content": "| 万科企业(02202) | 2.76 | -0.72% | 3.39% | 深套持有,止损2.5 |", diff --git a/data/stocks/06869.json b/data/stocks/06869.json index 3cea759..9464616 100644 --- a/data/stocks/06869.json +++ b/data/stocks/06869.json @@ -16,6 +16,11 @@ "content": "- **长飞光纤光缆(06869)** 仓位11.3%第二重,浮亏-5.0%,止损209距较远", "report_id": "cron_99c06255590a_2026-06-29_08-37-43" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T13:56:05.495125", "content": "🔺**长飞光纤(06869)** | 231.00 +9.90% | 买入区210~220已超出,等回调再入3%", @@ -66,6 +71,11 @@ "content": "{\"type\": \"价格监控\", \"time\": \"15:54\", \"triggers\": [\"📌 (06869) 238.6 → 离开加仓区间240.0~255.0", "report_id": "cron_d39e265198ad_2026-06-05_15-54-37" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**② 长飞光纤光缆(06869)** — 距止损2.4%!", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-15T08:55:17.014788", "content": "10. 门槛过高无法操作的股票(如长飞光纤06869 500股≈12万HKD)不推送操作建议", diff --git a/data/stocks/300035.json b/data/stocks/300035.json index b66eb0d..fc255b7 100644 --- a/data/stocks/300035.json +++ b/data/stocks/300035.json @@ -516,6 +516,11 @@ "content": "**A股概览:** 上周五系统大跌(-2.26%/-3.44%)后弱反弹,科创50领涨+4.61%带动半导体板块。中芯国际A(688981) +19.8%浮盈距目标+4.1%、中芯H(00981) +", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-29T08:55:56.391301", "content": "- **中科电气(300035)** — 现价14.19,止损13.74(距3.2%)。新能电池板块本周-4.29%,中科电气持续走弱。", diff --git a/data/stocks/300548.json b/data/stocks/300548.json index fc66f2b..ad12bce 100644 --- a/data/stocks/300548.json +++ b/data/stocks/300548.json @@ -51,6 +51,11 @@ "content": "• 博创科技(300548) 253.2(-3.4%) 浮盈+9%但放量回调,止损251需盯", "report_id": "cron_99c06255590a_2026-06-30_08-40-17" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T13:56:05.495125", "content": "🔺**博创科技(300548)** | 236.72 +7.92% | 买入区230~235已确认站上,等回调建仓2%", diff --git a/data/stocks/300750.json b/data/stocks/300750.json index f7aadcf..ed92fbf 100644 --- a/data/stocks/300750.json +++ b/data/stocks/300750.json @@ -56,6 +56,11 @@ "content": "- **宁德时代(300750)** 现价381低于买入区384~397,可等回踩买入区下沿384", "report_id": "cron_99c06255590a_2026-06-29_08-37-43" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.834592", "content": "| 宁德时代(300750) | 427.84 | +1.84% | 4.04% | 持有,止损400止盈460 |", @@ -531,6 +536,11 @@ "content": "**A股概览:** 上周五系统大跌(-2.26%/-3.44%)后弱反弹,科创50领涨+4.61%带动半导体板块。中芯国际A(688981) +19.8%浮盈距目标+4.1%、中芯H(00981) +", "report_id": "cron_d42f2ce3b479_2026-06-29_20-08-09" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-29T08:55:56.391301", "content": "- **宁德时代(300750)** — 现价381.00,止损345.04(距9%)。电池板块下周压力可能持续。", diff --git a/data/stocks/518880.json b/data/stocks/518880.json index 547e19e..171b853 100644 --- a/data/stocks/518880.json +++ b/data/stocks/518880.json @@ -56,6 +56,11 @@ "content": "**黄金ETF(518880)** — 贵金属板块暴跌预警,深套30%但仓位仅2.5%,暂持有不动。", "report_id": "cron_99c06255590a_2026-06-25_08-33-37" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.834592", "content": "| 黄金ETF(518880) | 9.323 | -0.22% | 2.14% | 深套持有,止损9.0 |", diff --git a/data/stocks/600563.json b/data/stocks/600563.json index 50f50c5..0fd3842 100644 --- a/data/stocks/600563.json +++ b/data/stocks/600563.json @@ -86,6 +86,11 @@ "content": "• 法拉电子(600563) 168.19 — 盈利+8.2%,稳健持有", "report_id": "cron_99c06255590a_2026-06-22_08-37-35" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "长飞光纤光缆(06869) 255.40+6.68%放量大涨,持有等站上成本263.72;腾讯(00700) 429.80+2.28%,买入区435-440依然可加;中芯H(00981) 89.40+", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-02T12:55:54.834592", "content": "| 法拉电子(600563) | 159.76 | +3.47% | 3.0% | 持有,止损153止盈170 |", @@ -616,6 +621,11 @@ "content": "**法拉电子(600563)** 距止损5%!弱撑157.3,跌破160执行止损", "report_id": "cron_d42f2ce3b479_2026-06-16_20-02-32" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-08T08:55:37.165829", "content": "3. **决策跟踪验证缺失** — 个股提及频次高(688411 218次、600563 137次)但缺少\"建议→执行→结果\"的闭环验证,导致策略复用率低。", diff --git a/data/stocks/601899.json b/data/stocks/601899.json index 42f932f..d865776 100644 --- a/data/stocks/601899.json +++ b/data/stocks/601899.json @@ -566,6 +566,11 @@ "content": "**紫金矿业(601899) 25.92(-6.26%) | 距止损-20.8%!** 成本40.27浮亏-35.6%,资源板块连续重挫,贵金属/工业金属全线杀跌。建议:24.5设观察线,破则减半仓。", "report_id": "cron_d42f2ce3b479_2026-06-25_20-10-53" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-22T08:55:38.754230", "content": "| **紫金矿业(601899)** | 成本$40.27,止盈$34.47已低于成本,仓位6.98%第二大 | 策略可能需要重新评估——止盈低于成本价,逻辑错误 |", diff --git a/data/stocks/688411.json b/data/stocks/688411.json index 9218db3..d146627 100644 --- a/data/stocks/688411.json +++ b/data/stocks/688411.json @@ -821,6 +821,11 @@ "content": "**海博思创(688411) 275.89(+3.64%) | 仓位5.17%→若加仓~7.6%**", "report_id": "cron_d42f2ce3b479_2026-06-25_20-10-53" }, + { + "time": "2026-07-01T08:55:24.130605", + "content": "**A股(上证+0.50%):** 海博思创(688411) 291.20+1.82%浮盈+9%RR3.92持有 | 宁德时代(300750) 393.01+0.17%弱势持有距止损3% | 法拉电子", + "report_id": "cron_d42f2ce3b479_2026-06-30_20-25-27" + }, { "time": "2026-06-08T08:55:37.165829", "content": "2. **海博思创(688411) 追踪止盈失守未补救** — 高点305.53回落5%约290的追踪止盈被击穿(6/4 收274.90),但未在285~290反弹位减仓,浮盈从+24.76%缩窄至+", diff --git a/data/stocks/688639.json b/data/stocks/688639.json index e520a14..330d2d1 100644 --- a/data/stocks/688639.json +++ b/data/stocks/688639.json @@ -41,6 +41,11 @@ "content": "• 华恒生物(688639) 16.63(+6.3%) 止损20已破但昨放量反弹,观察能否站回18", "report_id": "cron_99c06255590a_2026-06-30_08-40-17" }, + { + "time": "2026-07-01T08:55:24.051390", + "content": "**华恒生物(688639)** 现价16.14(-2.95%) | 仓位5.25% | 止损20.03", + "report_id": "cron_99c06255590a_2026-07-01_08-39-42" + }, { "time": "2026-06-01T14:55:20.378304", "content": "• 华恒生物(688639) 23.58 | +0.47% → 🤝持有,接近止损23.18", diff --git a/data/strategy_staleness_report.json b/data/strategy_staleness_report.json index 82a92b0..e7116b5 100644 --- a/data/strategy_staleness_report.json +++ b/data/strategy_staleness_report.json @@ -1,19 +1,19 @@ { - "checked_at": "2026-06-30T09:00:45", + "checked_at": "2026-07-01T09:00:21", "total_active": 54, - "flagged_count": 8, + "flagged_count": 14, "flagged": [ { "code": "000657", "name": "中钨高新", - "price": 95.57, + "price": 95.99, "flags": [ - "现价95.57在买入区94~97(是否可买需结合timing_signal判断)" + "现价95.99在买入区94~98(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:10", - "entry_zone": "94~97", - "current": "盈利持有 | 目标109.46 | 止损91.0 | 买入区93.66~97.48", + "last_update": "2026-06-30 10:56", + "entry_zone": "94~98", + "current": "盈利持有 | 目标105.13 | 止损93.58 | 买入区94.07~97.91", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true @@ -21,14 +21,14 @@ { "code": "000711", "name": "ST京蓝", - "price": 4.32, + "price": 4.1, "flags": [ - "现价4.32在买入区4~4(是否可买需结合timing_signal判断)" + "现价4.10在买入区4~4(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:10", + "last_update": "2026-06-30 10:56", "entry_zone": "4~4", - "current": "盈利持有 | 目标4.75 | 止损3.82 | 买入区4.23~4.41 | 信号:观望", + "current": "盈利持有 | 目标4.54 | 止损3.98 | 买入区4.02~4.18 | 信号:观望", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true @@ -36,14 +36,44 @@ { "code": "002594", "name": "比亚迪", - "price": 79.64, + "price": 78.94, "flags": [ - "现价79.64在买入区78~80(是否可买需结合timing_signal判断)" + "现价78.94在买入区77~80(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:11", - "entry_zone": "78~80", - "current": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标83.6 | 止损76.48 | 买入区78.05~79.79 | 信号:观望", + "last_update": "2026-06-30 10:56", + "entry_zone": "77~80", + "current": "盈利持有 | 目标85.2 | 止损73.51 | 买入区77.36~80.02 | 信号:观望", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "00968", + "name": "信义光能", + "price": 2.04, + "flags": [ + "现价2.04在买入区2~2(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:56", + "entry_zone": "2~2", + "current": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标2.23 | 止损1.92 | 买入区2.0~2.04 | 信号:关注", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "02359", + "name": "药明康德", + "price": 156.2, + "flags": [ + "现价156.20在买入区153~159(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:57", + "entry_zone": "153~159", + "current": "盈利持有 | 目标170.5 | 止损144.56 | 买入区153.08~158.55 | 信号:买入", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true @@ -51,14 +81,14 @@ { "code": "02388", "name": "中银香港", - "price": 43.68, + "price": 42.18, "flags": [ - "现价43.68在买入区43~44(是否可买需结合timing_signal判断)" + "现价42.18在买入区41~43(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:11", - "entry_zone": "43~44", - "current": "盈利持有 | 目标47.32 | 止损42.37 | 买入区42.81~44.35 | 信号:关注", + "last_update": "2026-06-30 10:57", + "entry_zone": "41~43", + "current": "盈利持有 | 目标46.82 | 止损39.27 | 买入区41.34~43.02 | 信号:关注", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true @@ -66,44 +96,44 @@ { "code": "02628", "name": "中国人寿", - "price": 27.8, + "price": 26.52, "flags": [ - "现价27.80在买入区27~28(是否可买需结合timing_signal判断)" + "现价26.52在买入区26~27(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:11", - "entry_zone": "27~28", - "current": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标29.52 | 止损26.97 | 买入区27.24~27.9", + "last_update": "2026-06-30 10:57", + "entry_zone": "26~27", + "current": "盈利持有 | 目标28.85 | 止损24.51 | 买入区25.99~26.86 | 信号:关注", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true }, { - "code": "09868", - "name": "小鹏汽车-W", - "price": 47.5, + "code": "06160", + "name": "百济神州", + "price": 168.7, "flags": [ - "现价47.50在买入区47~48(是否可买需结合timing_signal判断)" + "现价168.70在买入区165~171(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:11", - "entry_zone": "47~48", - "current": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 止损参考45.44 | 买入区46.98~47.89", - "updated_by": "manual", + "last_update": "2026-06-30 10:57", + "entry_zone": "165~171", + "current": "盈利持有 | 目标183.23 | 止损162.12 | 买入区165.33~170.56 | 信号:关注", + "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true }, { "code": "300124", "name": "汇川技术", - "price": 65.23, + "price": 65.89, "flags": [ - "现价65.23在买入区64~65(是否可买需结合timing_signal判断)" + "现价65.89在买入区65~67(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:11", - "entry_zone": "64~65", - "current": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标69.14 | 止损62.21 | 买入区63.93~65.36 | 信号:观望", + "last_update": "2026-06-30 10:57", + "entry_zone": "65~67", + "current": "盈利持有 | 目标70.99 | 止损63.91 | 买入区64.57~66.74 | 信号:观望", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true @@ -111,27 +141,87 @@ { "code": "600519", "name": "贵州茅台", - "price": 1194.96, + "price": 1179.45, "flags": [ - "现价1194.96在买入区1171~1196(是否可买需结合timing_signal判断)" + "现价1179.45在买入区1156~1185(是否可买需结合timing_signal判断)" ], "age_days": 0, - "last_update": "2026-06-29 15:12", - "entry_zone": "1171~1196", - "current": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标1250.98 | 止损1158.98 | 买入区1171.06~1195.78", + "last_update": "2026-06-30 10:57", + "entry_zone": "1156~1185", + "current": "盈利持有 | ⚠️盈亏比偏低(1:1.9),谨慎买入 | 目标1246.52 | 止损1144.07 | 买入区1155.86~1185.05 | 信号:关注", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "601318", + "name": "中国平安", + "price": 47.51, + "flags": [ + "现价47.51在买入区47~48(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:57", + "entry_zone": "47~48", + "current": "盈利持有 | 目标50.56 | 止损46.08 | 买入区46.56~47.87 | 信号:观望", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "688630", + "name": "芯碁微装", + "price": 533.52, + "flags": [ + "现价533.52在买入区523~544(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:57", + "entry_zone": "523~544", + "current": "盈利持有 | 目标590.14 | 止损516.6 | 买入区522.85~544.19", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "688795", + "name": "摩尔线程-U", + "price": 711.67, + "flags": [ + "现价711.67在买入区697~721(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:57", + "entry_zone": "697~721", + "current": "盈利持有 | 目标766.54 | 止损690.32 | 买入区697.44~720.81 | 信号:观望", + "updated_by": "auto", + "updated_reason": "自动生成", + "is_watchlist": true + }, + { + "code": "688802", + "name": "沐曦股份-U", + "price": 818.1, + "flags": [ + "现价818.10在买入区802~834(是否可买需结合timing_signal判断)" + ], + "age_days": 0, + "last_update": "2026-06-30 10:57", + "entry_zone": "802~834", + "current": "盈利持有 | 目标917.32 | 止损793.56 | 买入区801.74~834.46 | 信号:买入", "updated_by": "auto", "updated_reason": "自动生成", "is_watchlist": true } ], "portfolio": { - "position_pct": 90.02, + "position_pct": 86.8, "cash": 92678.85, "weak_position_pct": 28.6, "all_weak_pct": 40.7, "signals": [ - "[PORTFOLIO_FULL] 总仓位90.02%(现金92679元),买入建议受限" + "[PORTFOLIO_FULL] 总仓位86.8%(现金92679元),买入建议受限" ] }, - "summary": "扫描54个策略,8个需关注" + "summary": "扫描54个策略,14个需关注" } \ No newline at end of file diff --git a/data/watchlist.json.bak2 b/data/watchlist.json.bak2 index b26f7e4..31b5bcd 100644 --- a/data/watchlist.json.bak2 +++ b/data/watchlist.json.bak2 @@ -4,63 +4,61 @@ "code": "02388", "name": "中银香港", "added_at": "2026-06-21 02:51:30", - "stop_loss": 42.49, - "take_profit": 47.36, - "entry_low": 42.92, - "entry_high": 44.44, + "stop_loss": 39.47, + "take_profit": 47.08, + "entry_low": 41.53, + "entry_high": 43.23, "action": null, "analysis": { - "stop_loss": 42.49, - "take_profit": 47.36, - "entry_low": 42.92, - "entry_high": 44.44, - "action": "盈利持有 | 目标47.36 | 止损42.49 | 买入区42.92~44.44 | 信号:关注", - "tech_snapshot": "形态:带下影阴线/neutral 量价:数据不足 强撑:40.35 弱撑:43.31 弱压:44.33 强压:47.36 | MA5=45.8 MA10=47.04 MA20=47.33 MA60=45.85", - "multi_tf_context": "多周期看多 | MA20=47.33 | MA60=45.85 | 长撑:日强支撑=43.38 | 长压:日强阻=49.36", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 39.47, + "take_profit": 47.08, + "entry_low": 41.53, + "entry_high": 43.23, + "action": "盈利持有 | 目标47.08 | 止损39.47 | 买入区41.53~43.23 | 信号:关注", + "tech_snapshot": "形态:带下影阴线/neutral 量价:数据不足 强撑:38.12 弱撑:41.6 弱压:43.6 强压:47.08 | MA5=44.88 MA10=46.42 MA20=47.03 MA60=45.88", + "multi_tf_context": "多周期看多 | MA20=47.03 | MA60=45.88 | 长撑:日强支撑=41.82 | 长压:日强阻=49.36", + "reassessed_at": "2026-07-01 09:01", "status": "updated", - "rr_ratio": 2.72, + "rr_ratio": 3.7, "action_note": "", "timing_signal": "关注" }, "trigger": { - "stop_loss": 42.49, - "entry_zone": "42.92~44.44", - "take_profit_zone": "0~47.36" + "stop_loss": 39.47, + "entry_zone": "41.53~43.23", + "take_profit_zone": "0~47.08" }, - "price": 37.84, - "change_pct": -1.59 + "currency": "CNY" }, { "code": "002594", "name": "比亚迪", "added_at": "2026-06-21 02:51:30", - "stop_loss": 77.25, - "take_profit": 83.6, - "entry_low": 78.05, - "entry_high": 79.79, + "stop_loss": 77.31, + "take_profit": 85.52, + "entry_low": 78.11, + "entry_high": 80.59, "action": null, "analysis": { - "stop_loss": 77.25, - "take_profit": 83.6, - "entry_low": 78.05, - "entry_high": 79.79, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.7),谨慎买入 | 目标83.6 | 止损77.25 | 买入区78.05~79.79 | 信号:观望", - "tech_snapshot": "形态:带上影阳线/neutral 量价:主动卖盘占优 强撑:75.2 弱撑:77.84 弱压:81.19 强压:83.6 | MA5=97.85 MA10=97.95 MA20=96.9 MA60=96.07", - "multi_tf_context": "震荡/无明显方向 | MA20=96.9 | MA60=96.07 | 长撑:日强支撑=77.6 | 长压:周强阻=105.97", - "reassessed_at": "2026-06-29 16:20", + "stop_loss": 77.31, + "take_profit": 85.52, + "entry_low": 78.11, + "entry_high": 80.59, + "action": "盈利持有 | 目标85.52 | 止损77.31 | 买入区78.11~80.59 | 信号:观望", + "tech_snapshot": "形态:长影星线/neutral 量价:主动卖盘占优 强撑:73.7 弱撑:78.67 弱压:80.64 强压:85.52 | MA5=99.16 MA10=98.47 MA20=96.75 MA60=96.44", + "multi_tf_context": "震荡/无明显方向 | MA20=96.75 | MA60=96.44 | 长撑:日强支撑=77.6 | 长压:周强阻=105.97", + "reassessed_at": "2026-07-01 09:00", "status": "updated", - "rr_ratio": 1.66, - "action_note": "⚠️盈亏比偏低(1:1.7),谨慎买入", + "rr_ratio": 2.44, + "action_note": "", "timing_signal": "观望" }, "trigger": { - "stop_loss": 77.25, - "entry_zone": "78.05~79.79", - "take_profit_zone": "0~83.6" + "stop_loss": 77.31, + "entry_zone": "78.11~80.59", + "take_profit_zone": "0~85.52" }, - "price": 79.64, - "change_pct": 1.84 + "currency": "CNY" }, { "code": "09868", @@ -76,177 +74,171 @@ "take_profit": 51.57, "entry_low": 46.98, "entry_high": 47.89, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 止损参考45.44 | 买入区46.98~47.89", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:43.81 弱撑:45.58 弱压:49.05 强压:51.45 | MA5=79.1 MA10=79.12 MA20=79.16 MA60=73.45", - "multi_tf_context": "震荡/无明显方向 | MA20=79.16 | MA60=73.45 | 长撑:日弱支撑=46.22 | 长压:月强阻=84.6", - "reassessed_at": "2026-06-29 16:21", + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 止损参考45.44 | 买入区46.98~47.89 | 信号:弱势持有", + "tech_snapshot": "形态:带下影阳线/bullish 量价:数据不足 强撑:44.43 弱撑:47.4 弱压:51.54 强压:55.69 | MA5=78.84 MA10=79.64 MA20=78.58 MA60=73.08", + "multi_tf_context": "震荡/无明显方向 | MA20=78.58 | MA60=73.08 | 长撑:日弱支撑=46.22 | 长压:月强阻=84.6", + "reassessed_at": "2026-07-01 09:01", "status": "manual", - "rr_ratio": 1.92, + "rr_ratio": 0.18, "action_note": "⚠️盈亏比偏低(1:1.6),谨慎买入", - "timing_signal": "neutral" + "timing_signal": "弱势持有" }, "trigger": { "stop_loss": 45.44, "entry_zone": "46.98~47.89", "take_profit_zone": "0~51.57" }, - "price": 41.14, - "change_pct": 3.99 + "currency": "CNY" }, { "code": "688795", "name": "摩尔线程-U", "added_at": "2026-06-21 02:51:30", - "stop_loss": 682.08, - "take_profit": 748.38, - "entry_low": 689.12, - "entry_high": 703.01, + "stop_loss": 695.0, + "take_profit": 769.86, + "entry_low": 702.16, + "entry_high": 724.94, "action": null, "analysis": { - "stop_loss": 682.08, - "take_profit": 748.38, - "entry_low": 689.12, - "entry_high": 703.01, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标748.38 | 止损682.08 | 买入区689.12~703.01 | 信号:观望", - "tech_snapshot": "形态:光头光脚阳线/neutral 量价:主动卖盘占优 强撑:635.87 弱撑:672.77 弱压:719.25 强压:748.38 | MA5=696.96 MA10=672.84 MA20=648.83 MA60=655.05", - "multi_tf_context": "震荡/无明显方向 | MA20=648.83 | MA60=655.05 | 长撑:MA20=648.83 | 长压:周强阻=755.51", - "reassessed_at": "2026-06-29 16:22", - "status": "review", - "rr_ratio": 1.49, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "stop_loss": 695.0, + "take_profit": 769.86, + "entry_low": 702.16, + "entry_high": 724.94, + "action": "盈利持有 | 目标769.86 | 止损695.0 | 买入区702.16~724.94 | 信号:观望", + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:651.88 弱撑:698.95 弱压:728.41 强压:769.86 | MA5=699.45 MA10=681.68 MA20=654.65 MA60=657.69", + "multi_tf_context": "震荡/无明显方向 | MA20=654.65 | MA60=657.69 | 长撑:MA20=654.65 | 长压:周强阻=755.51", + "reassessed_at": "2026-07-01 09:02", + "status": "updated", + "rr_ratio": 2.48, + "action_note": "", "timing_signal": "观望" }, "trigger": { - "stop_loss": 682.08, - "entry_zone": "689.12~703.01", - "take_profit_zone": "0~748.38" + "stop_loss": 695.0, + "entry_zone": "702.16~724.94", + "take_profit_zone": "0~769.86" }, - "price": 703.18, - "change_pct": 4.52 + "currency": "CNY" }, { "code": "688802", "name": "沐曦股份-U", "added_at": "2026-06-21 02:51:30", - "stop_loss": 745.01, - "take_profit": 849.82, - "entry_low": 777.68, - "entry_high": 778.17, + "stop_loss": 803.45, + "take_profit": 932.42, + "entry_low": 811.73, + "entry_high": 844.87, "action": null, "analysis": { - "stop_loss": 745.01, - "take_profit": 849.82, - "entry_low": 777.68, - "entry_high": 778.17, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标849.82 | 止损745.01 | 买入区777.68~778.17", - "tech_snapshot": "形态:光头光脚阳线/neutral 量价:数据不足 强撑:691.86 弱撑:730.4 弱压:821.69 强压:849.82 | MA5=766.73 MA10=754.37 MA20=727.22 MA60=710.71", - "multi_tf_context": "震荡/无明显方向 | MA20=727.22 | MA60=710.71 | 长撑:MA20=727.22 | 长压:周强阻=850.0", - "reassessed_at": "2026-06-29 16:22", - "status": "review", - "rr_ratio": 0.89, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", - "timing_signal": "信号不充分" + "stop_loss": 803.45, + "take_profit": 932.42, + "entry_low": 811.73, + "entry_high": 844.87, + "action": "盈利持有 | 目标932.42 | 止损803.45 | 买入区811.73~844.87 | 信号:买入", + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:698.42 弱撑:793.55 弱压:849.88 强压:932.42 | MA5=778.59 MA10=765.11 MA20=736.75 MA60=714.48", + "multi_tf_context": "震荡/无明显方向 | MA20=736.75 | MA60=714.48 | 长撑:MA20=736.75 | 长压:周强阻=850.0", + "reassessed_at": "2026-07-01 09:02", + "status": "updated", + "rr_ratio": 3.0, + "action_note": "", + "timing_signal": "买入" }, "trigger": { - "stop_loss": 745.01, - "entry_zone": "777.68~778.17", - "take_profit_zone": "0~849.82" + "stop_loss": 803.45, + "entry_zone": "811.73~844.87", + "take_profit_zone": "0~932.42" }, - "price": 793.55, - "change_pct": 8.65 + "currency": "CNY" }, { "code": "02359", "name": "药明康德", "added_at": "2026-06-21 02:51:30", - "stop_loss": 147.73, - "take_profit": 161.43, - "entry_low": 149.25, - "entry_high": 151.81, + "stop_loss": 142.47, + "take_profit": 169.6, + "entry_low": 150.63, + "entry_high": 156.77, "action": null, "analysis": { - "stop_loss": 147.73, - "take_profit": 161.43, - "entry_low": 149.25, - "entry_high": 151.81, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标161.43 | 止损147.73 | 买入区149.25~151.81 | 信号:买入", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:139.03 弱撑:145.4 弱压:156.07 强压:161.43 | MA5=143.16 MA10=134.93 MA20=129.48 MA60=129.42", - "multi_tf_context": "震荡/无明显方向 | MA20=129.48 | MA60=129.42 | 长撑:MA20=129.48 | 长压:日强阻=154.6", - "reassessed_at": "2026-06-29 16:21", - "status": "review", - "rr_ratio": 1.32, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", - "timing_signal": "信号不充分" + "stop_loss": 142.47, + "take_profit": 169.6, + "entry_low": 150.63, + "entry_high": 156.77, + "action": "盈利持有 | 目标169.6 | 止损142.47 | 买入区150.63~156.77 | 信号:关注", + "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:139.6 弱撑:150.8 弱压:157.5 强压:169.6 | MA5=147.74 MA10=137.78 MA20=130.76 MA60=130.08", + "multi_tf_context": "震荡/无明显方向 | MA20=130.76 | MA60=130.08 | 长撑:MA20=130.76 | 长压:日强阻=158.4", + "reassessed_at": "2026-07-01 09:01", + "status": "updated", + "rr_ratio": 3.01, + "action_note": "", + "timing_signal": "关注" }, "trigger": { - "stop_loss": 147.73, - "entry_zone": "149.25~151.81", - "take_profit_zone": "0~161.43" + "stop_loss": 142.47, + "entry_zone": "150.63~156.77", + "take_profit_zone": "0~169.6" }, - "price": 132.72, - "change_pct": 5.16 + "currency": "CNY" }, { "code": "02628", "name": "中国人寿", "added_at": "2026-06-21 02:51:30", - "stop_loss": 26.99, - "take_profit": 29.54, - "entry_low": 27.26, - "entry_high": 27.92, + "stop_loss": 24.7, + "take_profit": 28.96, + "entry_low": 26.13, + "entry_high": 27.02, "action": null, "analysis": { - "stop_loss": 26.99, - "take_profit": 29.54, - "entry_low": 27.26, - "entry_high": 27.92, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标29.54 | 止损26.99 | 买入区27.26~27.92", - "tech_snapshot": "形态:带上影阳线/neutral 量价:数据不足 强撑:25.82 弱撑:26.92 弱压:28.42 强压:29.54 | MA5=28.42 MA10=29.95 MA20=31.14 MA60=31.23", - "multi_tf_context": "震荡/无明显方向 | MA20=31.14 | MA60=31.23 | 长撑:日弱支撑=26.94 | 长压:月强阻=36.16", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 24.7, + "take_profit": 28.96, + "entry_low": 26.13, + "entry_high": 27.02, + "action": "盈利持有 | 目标28.96 | 止损24.7 | 买入区26.13~27.02 | 信号:关注", + "tech_snapshot": "形态:小阴线/bearish 量价:数据不足 强撑:24.48 弱撑:26.26 弱压:27.12 强压:28.96 | MA5=29.79 MA10=30.92 MA20=31.8 MA60=31.12", + "multi_tf_context": "震荡/无明显方向 | MA20=31.8 | MA60=31.12 | 长撑:日强支撑=26.32 | 长压:月强阻=36.16", + "reassessed_at": "2026-07-01 09:01", "status": "updated", - "rr_ratio": 1.76, - "action_note": "⚠️盈亏比偏低(1:1.8),谨慎买入", - "timing_signal": "信号不充分" + "rr_ratio": 2.47, + "action_note": "", + "timing_signal": "关注" }, "trigger": { - "stop_loss": 26.99, - "entry_zone": "27.26~27.92", - "take_profit_zone": "0~29.54" + "stop_loss": 24.7, + "entry_zone": "26.13~27.02", + "take_profit_zone": "0~28.96" }, - "price": 23.99, - "change_pct": 2.67 + "currency": "CNY" }, { "code": "00968", "name": "信义光能", "added_at": "2026-06-21 02:51:30", - "stop_loss": 1.92, - "take_profit": 2.13, - "entry_low": 2.0, - "entry_high": 2.0, + "stop_loss": 1.94, + "take_profit": 2.21, + "entry_low": 2.02, + "entry_high": 2.05, "action": null, "analysis": { - "stop_loss": 1.92, - "take_profit": 2.13, - "entry_low": 2.0, - "entry_high": 2.0, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.13 | 止损1.92 | 买入区2.0~2.0", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:1.91 弱撑:1.99 弱压:2.05 强压:2.13 | MA5=3.03 MA10=3.11 MA20=3.18 MA60=3.33", - "multi_tf_context": "震荡/无明显方向 | MA20=3.18 | MA60=3.33 | 长撑:日弱支撑=1.94 | 长压:日强阻=2.74", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 1.94, + "take_profit": 2.21, + "entry_low": 2.02, + "entry_high": 2.05, + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标2.21 | 止损1.94 | 买入区2.02~2.05 | 信号:弱势持有", + "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:1.89 弱撑:2.02 弱压:2.09 强压:2.21 | MA5=3.11 MA10=3.14 MA20=3.22 MA60=3.33", + "multi_tf_context": "震荡/无明显方向 | MA20=3.22 | MA60=3.33 | 长撑:日弱支撑=1.94 | 长压:日强阻=2.73", + "reassessed_at": "2026-07-01 09:00", "status": "review", - "rr_ratio": 0.75, + "rr_ratio": 1.25, "action_note": "⚠️盈亏比不足1:1.5,不建议买入", - "timing_signal": "信号不充分" + "timing_signal": "弱势持有" }, "trigger": { - "stop_loss": 1.92, - "entry_zone": "2.0~2.0", - "take_profit_zone": "0~2.13" + "stop_loss": 1.94, + "entry_zone": "2.02~2.05", + "take_profit_zone": "0~2.21" }, - "price": 1.76, - "change_pct": 1.5 + "currency": "CNY" }, { "code": "02318", @@ -262,115 +254,111 @@ "take_profit": 53.76, "entry_low": 50.08, "entry_high": 51.12, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:弱势持有", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:数据不足 强撑:48.96 弱撑:50.55 弱压:52.75 强压:54.14 | MA5=66.58 MA10=68.47 MA20=68.47 MA60=67.52", - "multi_tf_context": "震荡/无明显方向 | MA20=68.47 | MA60=67.52 | 长撑:日弱支撑=50.35 | 长压:周强阻=66.5", - "reassessed_at": "2026-06-29 16:21", + "action": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 止损参考49.36 | 买入区50.08~51.12 | 信号:关注", + "tech_snapshot": "形态:光头光脚阴线/neutral 量价:数据不足 强撑:48.87 弱撑:50.33 弱压:52.18 强压:54.07 | MA5=68.73 MA10=69.1 MA20=68.89 MA60=67.28", + "multi_tf_context": "震荡/无明显方向 | MA20=68.89 | MA60=67.28 | 长撑:日强支撑=50.0 | 长压:周强阻=66.5", + "reassessed_at": "2026-07-01 09:01", "status": "manual", - "rr_ratio": 0.67, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", - "timing_signal": "弱势持有" + "rr_ratio": 1.6, + "action_note": "⚠️盈亏比偏低(1:2.0),谨慎买入", + "timing_signal": "关注" }, "trigger": { "stop_loss": 49.36, "entry_zone": "50.08~51.12", "take_profit_zone": "0~53.76" }, - "price": 45.05, - "change_pct": 2.67 + "currency": "CNY" }, { "code": "300124", "name": "汇川技术", "added_at": "2026-06-21 02:51:30", - "stop_loss": 60.33, - "take_profit": 69.14, - "entry_low": 63.93, - "entry_high": 65.36, + "stop_loss": 64.34, + "take_profit": 71.31, + "entry_low": 65.0, + "entry_high": 67.13, "action": null, "analysis": { - "stop_loss": 60.33, - "take_profit": 69.14, - "entry_low": 63.93, - "entry_high": 65.36, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标69.14 | 止损60.33 | 买入区63.93~65.36 | 信号:观望", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:59.66 弱撑:62.84 弱压:66.8 强压:69.14 | MA5=73.35 MA10=75.2 MA20=77.15 MA60=73.84", - "multi_tf_context": "震荡/无明显方向 | MA20=77.15 | MA60=73.84 | 长撑:日弱支撑=63.13 | 长压:周强阻=83.55", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 64.34, + "take_profit": 71.31, + "entry_low": 65.0, + "entry_high": 67.13, + "action": "盈利持有 | 目标71.31 | 止损64.34 | 买入区65.0~67.13 | 信号:观望", + "tech_snapshot": "形态:锤子线/T字线/neutral 量价:主动卖盘占优 强撑:60.69 弱撑:64.72 弱压:67.61 强压:71.31 | MA5=74.88 MA10=76.52 MA20=77.68 MA60=73.65", + "multi_tf_context": "震荡/无明显方向 | MA20=77.68 | MA60=73.65 | 长撑:日弱支撑=63.13 | 长压:周强阻=83.55", + "reassessed_at": "2026-07-01 09:01", "status": "updated", - "rr_ratio": 1.64, - "action_note": "⚠️盈亏比偏低(1:1.6),谨慎买入", + "rr_ratio": 2.5, + "action_note": "", "timing_signal": "观望" }, "trigger": { - "stop_loss": 60.33, - "entry_zone": "63.93~65.36", - "take_profit_zone": "0~69.14" + "stop_loss": 64.34, + "entry_zone": "65.0~67.13", + "take_profit_zone": "0~71.31" }, - "price": 65.23, - "change_pct": 3.08 + "currency": "CNY" }, { "code": "01070", "name": "TCL电子", "added_at": "2026-06-21 02:51:30", - "stop_loss": 11.08, - "take_profit": 13.83, - "entry_low": 12.74, - "entry_high": 12.76, + "stop_loss": 12.5, + "take_profit": 13.72, + "entry_low": 12.63, + "entry_high": 12.77, "action": null, "analysis": { - "stop_loss": 11.08, - "take_profit": 13.83, - "entry_low": 12.74, - "entry_high": 12.76, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.83 | 止损11.08 | 买入区12.74~12.76 | 信号:弱势持有", - "tech_snapshot": "形态:带下影阳线/bullish 量价:数据不足 强撑:11.75 弱撑:12.61 弱压:13.18 强压:13.83 | MA5=12.9 MA10=13.46 MA20=13.74 MA60=14.32", - "multi_tf_context": "多周期分化 | MA20=13.74 | MA60=14.32 | 长撑:日弱支撑=12.41 | 长压:周强阻=16.19", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 12.5, + "take_profit": 13.72, + "entry_low": 12.63, + "entry_high": 12.77, + "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标13.72 | 止损12.5 | 买入区12.63~12.77", + "tech_snapshot": "形态:长影星线/neutral 量价:数据不足 强撑:12.08 弱撑:12.58 弱压:13.21 强压:13.72 | MA5=12.84 MA10=13.3 MA20=13.67 MA60=14.33", + "multi_tf_context": "多周期分化 | MA20=13.67 | MA60=14.33 | 长撑:日弱支撑=12.41 | 长压:周强阻=16.19", + "reassessed_at": "2026-07-01 09:00", "status": "review", - "rr_ratio": 0.86, + "rr_ratio": 1.09, "action_note": "⚠️盈亏比不足1:1.5,不建议买入", - "timing_signal": "弱势持有" + "timing_signal": "信号不充分" }, "trigger": { - "stop_loss": 11.08, - "entry_zone": "12.74~12.76", - "take_profit_zone": "0~13.83" + "stop_loss": 12.5, + "entry_zone": "12.63~12.77", + "take_profit_zone": "0~13.72" }, - "price": 11.22, - "change_pct": 2.54 + "currency": "CNY" }, { "code": "09988", "name": "阿里巴巴-W", "added_at": "2026-06-21 02:51:30", - "stop_loss": 87.26, - "take_profit": 99.77, - "entry_low": 90.26, - "entry_high": 92.26, + "stop_loss": 89.74, + "take_profit": 100.64, + "entry_low": 90.99, + "entry_high": 93.04, "action": null, "analysis": { - "stop_loss": 87.26, - "take_profit": 99.77, - "entry_low": 90.26, - "entry_high": 92.26, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标99.77 | 止损87.26 | 买入区90.26~92.26", - "tech_snapshot": "形态:倒T线/射击之星/bearish 量价:数据不足 强撑:86.17 弱撑:89.5 弱压:94.78 强压:99.77 | MA5=146.48 MA10=147.25 MA20=155.7 MA60=148.36", - "multi_tf_context": "震荡/无明显方向 | MA20=155.7 | MA60=148.36 | 长撑:日强支撑=88.65 | 长压:月强阻=174.2", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 89.74, + "take_profit": 100.64, + "entry_low": 90.99, + "entry_high": 93.04, + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标100.64 | 止损89.74 | 买入区90.99~93.04 | 信号:弱势持有", + "tech_snapshot": "形态:锤子线/T字线/bullish 量价:数据不足 强撑:84.76 弱撑:91.45 弱压:94.1 强压:100.64 | MA5=148.26 MA10=151.36 MA20=158.48 MA60=147.61", + "multi_tf_context": "震荡/无明显方向 | MA20=158.48 | MA60=147.61 | 长撑:日强支撑=88.65 | 长压:月强阻=174.2", + "reassessed_at": "2026-07-01 09:01", "status": "updated", - "rr_ratio": 1.58, + "rr_ratio": 1.6, "action_note": "⚠️盈亏比偏低(1:1.6),谨慎买入", - "timing_signal": "信号不充分" + "timing_signal": "弱势持有" }, "trigger": { - "stop_loss": 87.26, - "entry_zone": "90.26~92.26", - "take_profit_zone": "0~99.77" + "stop_loss": 89.74, + "entry_zone": "90.99~93.04", + "take_profit_zone": "0~100.64" }, - "price": 80.72, - "change_pct": 3.91 + "currency": "CNY" }, { "code": "001309", @@ -386,13 +374,13 @@ "take_profit": 1153.26, "entry_low": 873.18, "entry_high": 908.82, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 止损参考810.0 | 买入区873.18~908.82", - "tech_snapshot": "形态:带下影阳线/neutral 量价:主动买盘占优 强撑:855.9 弱撑:911.77 弱压:1003.11 强压:1046.1 | MA5=875.4 MA10=783.32 MA20=702.92 MA60=602.86", - "multi_tf_context": "多周期看多 | MA20=702.92 | MA60=602.86 | 长撑:MA20=702.92 | 长压:日强阻=980.0", - "reassessed_at": "2026-06-29 16:20", + "action": "盈利持有 | 止损参考810.0 | 买入区873.18~908.82", + "tech_snapshot": "形态:锤子线/T字线/neutral 量价:主动买盘占优 强撑:873.0 弱撑:907.94 弱压:970.0 强压:1040.65 | MA5=912.98 MA10=813.43 MA20=720.19 MA60=612.25", + "multi_tf_context": "多周期看多 | MA20=720.19 | MA60=612.25 | 长撑:MA20=720.19 | 长压:日强阻=980.0", + "reassessed_at": "2026-07-01 09:00", "status": "manual", - "rr_ratio": 1.15, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "rr_ratio": 1.58, + "action_note": "", "timing_signal": "neutral" }, "trigger": { @@ -400,195 +388,187 @@ "entry_zone": "873.18~908.82", "take_profit_zone": "0~1153.26" }, - "price": 970.0, - "change_pct": 2.0 + "currency": "CNY" }, { "code": "06160", "name": "百济神州", "added_at": "2026-06-21 02:51:30", - "stop_loss": 169.75, - "take_profit": 186.5, - "entry_low": 171.5, - "entry_high": 174.14, + "stop_loss": 164.16, + "take_profit": 183.83, + "entry_low": 166.99, + "entry_high": 172.03, "action": null, "analysis": { - "stop_loss": 169.75, - "take_profit": 186.5, - "entry_low": 171.5, - "entry_high": 174.14, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标186.5 | 止损169.75 | 买入区171.5~174.14 | 信号:买入", - "tech_snapshot": "形态:带下影阳线/bullish 量价:数据不足 强撑:158.5 弱撑:165.9 弱压:179.5 强压:186.5 | MA5=184.9 MA10=191.56 MA20=196.94 MA60=193.6", - "multi_tf_context": "震荡/无明显方向 | MA20=196.94 | MA60=193.6 | 长撑:日弱支撑=154.5 | 长压:月强阻=222.0", - "reassessed_at": "2026-06-29 16:21", - "status": "review", - "rr_ratio": 1.26, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "stop_loss": 164.16, + "take_profit": 183.83, + "entry_low": 166.99, + "entry_high": 172.03, + "action": "盈利持有 | 目标183.83 | 止损164.16 | 买入区166.99~172.03", + "tech_snapshot": "形态:带上影阴线/bearish 量价:数据不足 强撑:159.23 弱撑:166.87 弱压:175.07 强压:183.83 | MA5=189.84 MA10=195.82 MA20=199.25 MA60=193.25", + "multi_tf_context": "震荡/无明显方向 | MA20=199.25 | MA60=193.25 | 长撑:日弱支撑=154.5 | 长压:月强阻=222.0", + "reassessed_at": "2026-07-01 09:01", + "status": "updated", + "rr_ratio": 2.15, + "action_note": "", "timing_signal": "信号不充分" }, "trigger": { - "stop_loss": 169.75, - "entry_zone": "171.5~174.14", - "take_profit_zone": "0~186.5" + "stop_loss": 164.16, + "entry_zone": "166.99~172.03", + "take_profit_zone": "0~183.83" }, - "price": 151.47, - "change_pct": 5.18 + "currency": "CNY" }, { "code": "000711", "name": "ST京蓝", "added_at": "2026-06-21 02:51:30", - "stop_loss": 4.19, - "take_profit": 4.75, - "entry_low": 4.23, - "entry_high": 4.41, + "stop_loss": 4.25, + "take_profit": 4.99, + "entry_low": 4.45, + "entry_high": 4.55, "action": null, "analysis": { - "stop_loss": 4.19, - "take_profit": 4.75, - "entry_low": 4.23, - "entry_high": 4.41, - "action": "盈利持有 | 目标4.75 | 止损4.19 | 买入区4.23~4.41 | 信号:观望", - "tech_snapshot": "形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:3.99 弱撑:4.27 弱压:4.55 强压:4.75 | MA5=4.76 MA10=5.12 MA20=5.45 MA60=5.1", - "multi_tf_context": "震荡/无明显方向 | MA20=5.45 | MA60=5.1 | 长压:周强阻=6.89", - "reassessed_at": "2026-06-29 16:20", + "stop_loss": 4.25, + "take_profit": 4.99, + "entry_low": 4.45, + "entry_high": 4.55, + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标4.99 | 止损4.25 | 买入区4.45~4.55 | 信号:观望", + "tech_snapshot": "形态:光头光脚阳线/neutral 量价:主动卖盘占优 强撑:4.1 弱撑:4.25 弱压:4.69 强压:4.99 | MA5=4.65 MA10=5.0 MA20=5.38 MA60=5.11", + "multi_tf_context": "震荡/无明显方向 | MA20=5.38 | MA60=5.11 | 长撑:日弱支撑=4.32 | 长压:日弱阻=6.28", + "reassessed_at": "2026-07-01 09:00", "status": "updated", - "rr_ratio": 3.31, - "action_note": "", + "rr_ratio": 1.55, + "action_note": "⚠️盈亏比偏低(1:1.6),谨慎买入", "timing_signal": "观望" }, "trigger": { - "stop_loss": 4.19, - "entry_zone": "4.23~4.41", - "take_profit_zone": "0~4.75" + "stop_loss": 4.25, + "entry_zone": "4.45~4.55", + "take_profit_zone": "0~4.99" }, - "price": 4.32, - "change_pct": -5.05 + "currency": "CNY" }, { "code": "688630", "name": "芯碁微装", "added_at": "2026-06-21 02:51:30", - "stop_loss": 515.15, - "take_profit": 590.92, - "entry_low": 537.11, - "entry_high": 545.46, + "stop_loss": 532.91, + "take_profit": 595.43, + "entry_low": 538.4, + "entry_high": 554.48, "action": null, "analysis": { - "stop_loss": 515.15, - "take_profit": 590.92, - "entry_low": 537.11, - "entry_high": 545.46, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标590.92 | 止损515.15 | 买入区537.11~545.46 | 信号:买入", - "tech_snapshot": "形态:锤子线/T字线/bullish 量价:主动买盘占优 强撑:482.24 弱撑:515.15 弱压:569.49 强压:590.92 | MA5=521.66 MA10=497.61 MA20=439.35 MA60=317.93", - "multi_tf_context": "多周期看多 | MA20=439.35 | MA60=317.93 | 长撑:MA20=439.35 | 长压:日强阻=563.89", - "reassessed_at": "2026-06-29 16:21", - "status": "review", - "rr_ratio": 1.3, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "stop_loss": 532.91, + "take_profit": 595.43, + "entry_low": 538.4, + "entry_high": 554.48, + "action": "盈利持有 | 目标595.43 | 止损532.91 | 买入区538.4~554.48", + "tech_snapshot": "形态:锤子线/T字线/neutral 量价:主动买盘占优 强撑:486.75 弱撑:527.18 弱压:563.3 强压:595.43 | MA5=538.96 MA10=508.73 MA20=449.83 MA60=323.87", + "multi_tf_context": "多周期看多 | MA20=449.83 | MA60=323.87 | 长撑:MA20=449.83 | 长压:日强阻=563.89", + "reassessed_at": "2026-07-01 09:01", + "status": "updated", + "rr_ratio": 2.07, + "action_note": "", "timing_signal": "信号不充分" }, "trigger": { - "stop_loss": 515.15, - "entry_zone": "537.11~545.46", - "take_profit_zone": "0~590.92" + "stop_loss": 532.91, + "entry_zone": "538.4~554.48", + "take_profit_zone": "0~595.43" }, - "price": 548.07, - "change_pct": 3.81 + "currency": "CNY" }, { "code": "000657", "name": "中钨高新", "added_at": "2026-06-20T15:44:00", - "stop_loss": 91.0, - "take_profit": 109.46, - "entry_low": 93.66, - "entry_high": 97.48, + "stop_loss": 93.06, + "take_profit": 105.13, + "entry_low": 93.81, + "entry_high": 97.63, "action": null, "analysis": { - "stop_loss": 91.0, - "take_profit": 109.46, - "entry_low": 93.66, - "entry_high": 97.48, - "action": "盈利持有 | 目标109.46 | 止损91.0 | 买入区93.66~97.48", - "tech_snapshot": "形态:小阴线/bearish 量价:主动买盘占优 强撑:89.56 弱撑:91.0 弱压:100.82 强压:109.46 | MA5=100.67 MA10=97.91 MA20=84.67 MA60=65.7", - "multi_tf_context": "多周期看多 | MA20=84.67 | MA60=65.7 | 长撑:MA20=84.67 | 长压:日强阻=113.99", - "reassessed_at": "2026-06-29 16:20", + "stop_loss": 93.06, + "take_profit": 105.13, + "entry_low": 93.81, + "entry_high": 97.63, + "action": "盈利持有 | 目标105.13 | 止损93.06 | 买入区93.81~97.63", + "tech_snapshot": "形态:带上影阳线/neutral 量价:主动买盘占优 强撑:86.01 弱撑:93.06 弱压:97.84 强压:105.13 | MA5=99.31 MA10=98.79 MA20=86.3 MA60=66.5", + "multi_tf_context": "多周期看多 | MA20=86.3 | MA60=66.5 | 长撑:MA20=86.3 | 长压:日强阻=113.99", + "reassessed_at": "2026-07-01 09:00", "status": "updated", - "rr_ratio": 3.04, + "rr_ratio": 3.54, "action_note": "", "timing_signal": "信号不充分" }, "trigger": { - "stop_loss": 91.0, - "entry_zone": "93.66~97.48", - "take_profit_zone": "0~109.46" + "stop_loss": 93.06, + "entry_zone": "93.81~97.63", + "take_profit_zone": "0~105.13" }, - "price": 95.57, - "change_pct": -3.96 + "currency": "CNY" }, { "code": "600519", "name": "贵州茅台", "added_at": "2026-06-22 09:22:26", - "stop_loss": 1158.98, - "take_profit": 1250.98, - "entry_low": 1171.06, - "entry_high": 1195.78, + "stop_loss": 1149.93, + "take_profit": 1249.71, + "entry_low": 1161.78, + "entry_high": 1189.84, "action": null, "analysis": { - "stop_loss": 1158.98, - "take_profit": 1250.98, - "entry_low": 1171.06, - "entry_high": 1195.78, - "action": "盈利持有 | ⚠️盈亏比偏低(1:1.6),谨慎买入 | 目标1250.98 | 止损1158.98 | 买入区1171.06~1195.78", - "tech_snapshot": "形态:带上影阳线/neutral 量价:主动买盘占优 强撑:1123.0 弱撑:1158.98 弱压:1222.97 强压:1250.98 | MA5=1376.16 MA10=1380.75 MA20=1369.51 MA60=1396.07", - "multi_tf_context": "多周期看多 | MA20=1369.51 | MA60=1396.07 | 长撑:日弱支撑=1168.1 | 长压:月强阻=1539.98", - "reassessed_at": "2026-06-29 16:21", + "stop_loss": 1149.93, + "take_profit": 1249.71, + "entry_low": 1161.78, + "entry_high": 1189.84, + "action": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标1249.71 | 止损1149.93 | 买入区1161.78~1189.84 | 信号:关注", + "tech_snapshot": "形态:长影星线/neutral 量价:主动买盘占优 强撑:1121.73 弱撑:1175.77 弱压:1195.44 强压:1249.71 | MA5=1373.78 MA10=1383.48 MA20=1362.71 MA60=1396.98", + "multi_tf_context": "多周期看多 | MA20=1362.71 | MA60=1396.98 | 长撑:日强支撑=1151.01 | 长压:月强阻=1539.98", + "reassessed_at": "2026-07-01 09:01", "status": "updated", - "rr_ratio": 1.56, - "action_note": "⚠️盈亏比偏低(1:1.6),谨慎买入", - "timing_signal": "信号不充分" + "rr_ratio": 1.81, + "action_note": "⚠️盈亏比偏低(1:1.8),谨慎买入", + "timing_signal": "关注" }, "trigger": { - "stop_loss": 1158.98, - "entry_zone": "1171.06~1195.78", - "take_profit_zone": "0~1250.98" + "stop_loss": 1149.93, + "entry_zone": "1161.78~1189.84", + "take_profit_zone": "0~1249.71" }, - "price": 1194.96, - "change_pct": 2.25 + "currency": "CNY" }, { "code": "601318", "name": "中国平安", "added_at": "2026-06-22 11:48:54", - "stop_loss": 47.14, - "take_profit": 50.71, - "entry_low": 47.63, - "entry_high": 48.57, + "stop_loss": 46.31, + "take_profit": 50.6, + "entry_low": 46.79, + "entry_high": 48.03, "action": null, "analysis": { - "stop_loss": 47.14, - "take_profit": 50.71, - "entry_low": 47.63, - "entry_high": 48.57, - "action": "盈利持有 | ⚠️盈亏比不足1:1.5,不建议买入 | 目标50.71 | 止损47.14 | 买入区47.63~48.57 | 信号:观望", - "tech_snapshot": "形态:光头光脚阳线/bullish 量价:主动卖盘占优 强撑:45.53 弱撑:47.23 弱压:49.35 强压:50.71 | MA5=68.18 MA10=69.11 MA20=67.13 MA60=63.42", - "multi_tf_context": "震荡/无明显方向 | MA20=67.13 | MA60=63.42 | 长撑:日弱支撑=47.2 | 长压:周强阻=59.36", - "reassessed_at": "2026-06-29 16:21", - "status": "review", - "rr_ratio": 1.45, - "action_note": "⚠️盈亏比不足1:1.5,不建议买入", + "stop_loss": 46.31, + "take_profit": 50.6, + "entry_low": 46.79, + "entry_high": 48.03, + "action": "盈利持有 | 目标50.6 | 止损46.31 | 买入区46.79~48.03 | 信号:观望", + "tech_snapshot": "形态:带上影阴线/bearish 量价:主动卖盘占优 强撑:45.42 弱撑:47.08 弱压:48.67 强压:50.6 | MA5=68.37 MA10=68.78 MA20=66.54 MA60=62.97", + "multi_tf_context": "多周期看多 | MA20=66.54 | MA60=62.97 | 长撑:日弱支撑=47.2 | 长压:周强阻=59.36", + "reassessed_at": "2026-07-01 09:01", + "status": "updated", + "rr_ratio": 2.0, + "action_note": "", "timing_signal": "观望" }, "trigger": { - "stop_loss": 47.14, - "entry_zone": "47.63~48.57", - "take_profit_zone": "0~50.71" + "stop_loss": 46.31, + "entry_zone": "46.79~48.03", + "take_profit_zone": "0~50.6" }, - "price": 48.6, - "change_pct": 2.9 + "currency": "CNY" } - ], - "updated_at": "2026-06-29T16:24:33.590887" + ] } \ No newline at end of file diff --git a/data/xiaoguo_insights.json b/data/xiaoguo_insights.json index 7de3d3c..3f15ba3 100644 --- a/data/xiaoguo_insights.json +++ b/data/xiaoguo_insights.json @@ -1,115 +1,178 @@ { - "timestamp": "2026-06-26 16:07", + "timestamp": "2026-07-01 16:14", "analyses": [ + { + "name": "中际旭创", + "code": "300308", + "price": 1223.17, + "sentiment": "negative", + "confidence": 0.59, + "brief": "中际旭创成交额超200亿元。数据宝统计,截至11:12,中际旭创成交额200.1...", + "keywords": [ + "中际旭创成交额超", + "亿元", + "日下午", + "现跌", + "数据宝统计" + ], + "news_count": 4, + "pos_count": 1, + "neg_count": 2, + "neu_count": 1, + "reason": "SL_dist=4.4% TP_dist=9.5%", + "priority": 1 + }, + { + "name": "丘钛科技", + "code": "01478", + "price": 5.95, + "sentiment": "positive", + "confidence": 0.57, + "brief": "丘钛科技5月手机摄像头模组销售数量增长39.4%。丘钛科技5月手机摄像头模组销售...", + "keywords": [ + "汇顶科技", + "丘钛科技是公司的供应商之一", + "证券日报网讯", + "汇顶科技在互动平台回答投资者提问时表示", + "丘钛科技" + ], + "news_count": 5, + "pos_count": 3, + "neg_count": 0, + "neu_count": 2, + "reason": "SL_dist=3.9% TP_dist=21.0%", + "priority": 1 + }, { "name": "紫金矿业", "code": "601899", - "price": 25.1, - "sentiment": "negative", - "confidence": 0.59, + "price": 25.11, + "sentiment": "neutral", + "confidence": 0.6, "brief": "紫金矿业成交额超上一日全天。数据宝统计,截至14:10,紫金矿业成交额116.5...", "keywords": [ - "易控智驾通过港交所聆讯", - "紫金矿业", - "宁德时代", - "郑州高新基金参投", - "紫金矿业成交额超上一日全天" + "滴滴出行", + "紫金矿业入股航天科技公司宇石空间", + "企查查", + "显示", + "易控智驾通过港交所聆讯" ], - "news_count": 5, + "news_count": 4, "pos_count": 0, - "neg_count": 2, + "neg_count": 1, "neu_count": 3, - "reason": "SL_dist=19.6% TP_dist=3.3%", + "reason": "SL_dist=8.1% TP_dist=1.6%", "priority": 1 }, { - "name": "中银香港", - "code": "02388", - "price": 45.48, - "sentiment": "neutral", - "confidence": 0.56, - "brief": "中银香港携泰国子行首批接入人民银行“数币达”平台。中银香港副总裁邢桂伟表示:“中...", - "keywords": [ - "中银香港携泰国子行首批接入人民银行", - "数币达", - "平台", - "中银香港副总裁邢桂伟表示", - "中银香港陈卫全" - ], - "news_count": 5, - "pos_count": 1, - "neg_count": 0, - "neu_count": 4, - "reason": "SL_dist=10.6% TP_dist=0.3%", - "priority": 1 - }, - { - "name": "宁德时代", - "code": "300750", - "price": 381.0, - "sentiment": "negative", - "confidence": 0.6, - "brief": "宁德时代成交额超150亿元。数据宝统计,截至14:16,宁德时代成交额151.1...", - "keywords": [ - "股宁德时代盘中跌", - "现报", - "宁德时代成交额超", - "亿元", - "数据宝统计" - ], - "news_count": 5, - "pos_count": 1, - "neg_count": 2, - "neu_count": 2, - "reason": "SL_dist=13.4% TP_dist=3.9%", - "priority": 1 - }, - { - "name": "腾讯控股", - "code": "00700", - "price": 411.8, + "name": "中芯国际", + "code": "688981", + "price": 154.48, "sentiment": "positive", - "confidence": 0.56, - "brief": "100家港股公司回购腾讯控股回购5.01亿港元。本次回购5.01亿港元的腾讯控股...", + "confidence": 0.58, + "brief": "南向资金今日净买入约59亿港元中芯国际获净买入目前。中芯国际、建滔积层板分别获净...", "keywords": [ - "家港股公司回购腾讯控股回购", - "亿港元", - "本次回购", - "亿港元的腾讯控股", - "腾讯控股午后涨超" + "中芯国际成交额超", + "亿元", + "数据宝统计", + "截至", + "中芯国际成交额超上一日全天" ], "news_count": 5, "pos_count": 2, "neg_count": 0, "neu_count": 3, - "reason": "SL_dist=19.8% TP_dist=0.8%", + "reason": "SL_dist=3.0% TP_dist=14.2%", + "priority": 1 + }, + { + "name": "长芯博创", + "code": "300548", + "price": 254.0, + "sentiment": "positive", + "confidence": 0.62, + "brief": "长芯博创龙虎榜数据(6月15日)。长芯博创今日涨停,全天换手率9.65%,成交额...", + "keywords": [ + "长芯博创", + "收购控股子公司少数股东股份实施完成", + "公告称", + "公司已完成收购控股子公司长芯盛", + "长芯博创成交额创上市以来新高" + ], + "news_count": 5, + "pos_count": 4, + "neg_count": 0, + "neu_count": 1, + "reason": "SL_dist=3.0% TP_dist=14.8%", + "priority": 1 + }, + { + "name": "黄金ETF华安", + "code": "518880", + "price": 8.27, + "sentiment": "positive", + "confidence": 0.61, + "brief": "ETF融资榜|黄金ETF华安(518880)融资净买入558.22万元,居可比基...", + "keywords": [ + "融资榜", + "黄金", + "华安", + "融资净买入", + "融券榜" + ], + "news_count": 5, + "pos_count": 4, + "neg_count": 0, + "neu_count": 1, + "reason": "SL_dist=9.9% TP_dist=3.7%", + "priority": 1 + }, + { + "name": "中科电气", + "code": "300035", + "price": 14.44, + "sentiment": "neutral", + "confidence": 0.56, + "brief": "中科电气终止三大锂电负极项目涉及年产能33万吨。对于此次项目终止事宜,中科电气方...", + "keywords": [ + "中科电气终止三大锂电负极项目涉及年产能", + "万吨", + "对于此次项目终止事宜", + "中科电气方面未向记者进一步回复", + "中科电气集中清理暂缓项目聚焦推进泸州与阿曼两大重点项目" + ], + "news_count": 5, + "pos_count": 0, + "neg_count": 1, + "neu_count": 4, + "reason": "SL_dist=9.9% TP_dist=4.8%", "priority": 1 }, { "name": "模塑科技", "code": "000700", - "price": 14.13, - "sentiment": "negative", - "confidence": 0.57, + "price": 15.34, + "sentiment": "neutral", + "confidence": 0.56, "brief": "模塑科技:基于商业保密要求,公司不便透露与客户的具体合作信息。证券日报网讯6月1...", "keywords": [ - "机器人概念逆势拉升模塑科技", - "祥鑫科技双双涨停", - "机器人概念盘中逆势拉升", - "模塑科技涨停", - "模塑科技" + "模塑科技", + "关于控股股东部分股权解除质押的公告", + "证券日报网讯", + "模塑科技发布公告称", + "机器人概念逆势拉升模塑科技" ], "news_count": 5, "pos_count": 1, - "neg_count": 2, - "neu_count": 2, - "reason": "SL_dist=1.6% TP_dist=20.3%", + "neg_count": 0, + "neu_count": 4, + "reason": "SL_dist=9.3% TP_dist=1.3%", "priority": 1 }, { "name": "法拉电子", "code": "600563", - "price": 188.76, + "price": 182.55, "sentiment": "neutral", "confidence": 0.55, "brief": "法拉电子:2025年年度权益分派实施公告。证券日报网讯6月4日,法拉电子发布20...", @@ -124,91 +187,28 @@ "pos_count": 0, "neg_count": 0, "neu_count": 5, - "reason": "SL_dist=9.7% TP_dist=1.0%", + "reason": "SL_dist=6.9% TP_dist=3.1%", "priority": 1 }, - { - "name": "中国神华", - "code": "01088", - "price": 40.6, - "sentiment": "positive", - "confidence": 0.56, - "brief": "中国神华:5月商品煤产量同比下降4.1%。南财智讯6月17日电,中国神华公告,5...", - "keywords": [ - "中国神华", - "向财务公司增资", - "亿元", - "公告称", - "国家能源集团财务公司股东中国神华参与公司增资获董事会批准公司增资合计" - ], - "news_count": 5, - "pos_count": 2, - "neg_count": 0, - "neu_count": 3, - "reason": "SL_dist=18.5% TP_dist=1.7%", - "priority": 1 - }, - { - "name": "中际旭创", - "code": "300308", - "price": 1253.89, - "sentiment": "negative", - "confidence": 0.62, - "brief": "中际旭创成交额超100亿元。数据宝统计,截至09:48,中际旭创成交额102.3...", - "keywords": [ - "中际旭创成交额超", - "亿元", - "数据宝统计", - "截至", - "中际旭创成交额达" - ], - "news_count": 5, - "pos_count": 0, - "neg_count": 4, - "neu_count": 1, - "reason": "涨跌幅-5.25%", - "priority": 2 - }, { "name": "长飞光纤光缆", "code": "06869", - "price": 250.6, + "price": 221.69, "sentiment": "negative", "confidence": 0.58, - "brief": "港股光通信股走弱长飞光纤光缆跌超8%。截至发稿,长飞光纤光缆(06869.HK)...", + "brief": "港股评级汇总:野村维持对长飞光纤光缆买入评级。财联社6月29日讯以下为各家机构对...", "keywords": [ - "港股光通信股走弱长飞光纤光缆跌超", + "港股光通信股走强长飞光纤光缆涨超", "截至发稿", "长飞光纤光缆", - "舜宇光学科技", - "港股人工智能股震荡走低长飞光纤光缆跌超" + "海光芯正", + "日将派发股息" ], "news_count": 5, - "pos_count": 0, - "neg_count": 5, - "neu_count": 0, - "reason": "涨跌幅-12.87%", - "priority": 2 - }, - { - "name": "丘钛科技", - "code": "01478", - "price": 6.84, - "sentiment": "positive", - "confidence": 0.57, - "brief": "丘钛科技5月手机摄像头模组销售数量增长39.4%。丘钛科技5月手机摄像头模组销售...", - "keywords": [ - "丘钛科技", - "月手机摄像头模组销售数量增长", - "月摄像头模组与激光雷达销量同比增", - "发布公告", - "公司摄像头模组与激光雷达销售数量合计" - ], - "news_count": 5, - "pos_count": 3, - "neg_count": 0, + "pos_count": 1, + "neg_count": 2, "neu_count": 2, - "reason": "涨跌幅-5.00%", + "reason": "涨跌幅+6.68%", "priority": 2 } ], diff --git a/data_freshness.py b/data_freshness.py index a72d93c..0d6eb1d 100644 --- a/data_freshness.py +++ b/data_freshness.py @@ -19,6 +19,7 @@ import json, os from datetime import datetime, timedelta +from mo_data import read_portfolio, read_decisions, read_watchlist LIVE_PRICES_PATH = "/home/hmo/web-dashboard/data/live_prices.json" PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" @@ -61,7 +62,7 @@ def check_fresh(): # fallback: portfolio.json if os.path.exists(PORTFOLIO_PATH): try: - pf = json.load(open(PORTFOLIO_PATH)) + pf = mo_data.read_portfolio() pf_time = pf.get("updated_at", "") if not pf_time: return False, "portfolio.json updated_at 为空" diff --git a/docs/analyst-knowledge-log.md b/docs/analyst-knowledge-log.md index 3ba566a..3948147 100644 --- a/docs/analyst-knowledge-log.md +++ b/docs/analyst-knowledge-log.md @@ -40,3 +40,57 @@ - 修复:portfolio.json用 shares*price 重新求和(858,542)+ 现金73,758 = 总资产932,300 - 文件:portfolio.json, import_holding_xls.py(去掉港股double-conversion + 去硬编码现金默认) - 经验:Dad的现金=截图现金,holding文件没有现金行。券商最新市值已经含汇率换算。 + +## 2026-07-01 + +### 修复 +- [BUGFIX] macro_signal_consumer 修正覆盖信号仍导致level=high + - 问题:LLM深度分析修正了采集器误报(写"修正覆盖"),但INSERT时保留了宏观-WATCH_HIGH sentiment。consumer聚合所有未处理信号时取最高级别→level=high,即使修正内容说"实际是MEDIUM" + - 表现:state.json level=high但实际风险是MEDIUM。盘中自检持续产生"HIGH" TODO误报 + - 修复:consumer新增_effective_level()函数,检测"修正覆盖"摘要后取修正后的实际级别(HIGH→MEDIUM,零风险→INFO),不再只依赖sentiment字段 + - 文件:macro_signal_consumer.py → 聚合段新增_effective_level()逻辑 + - 配套:清理了state.json(恢复MEDIUM),关闭了残留TODO #39/#40 +- [DOC] macro-risk-scanner SKILL.md修正原则补充 + - 修正时必须同时更新overall_sentiment为修正后的级别(不再保留HIGH) + - 修正后的INSERT使用正确sentiment(如宏观-WATCH_MEDIUM) + - 新增SQL示例展示错误vs正确做法 + - 文件:SKILL.md → 修正原则段 + LLM修正工作流段 + +### 修复 +- [BUG] 个股行情数据来源不规范 — 海博思创266.02误读事件 + - 问题:2026-07-01 11:40对海博思创的分析中,我用了266.02作为当前价(实际265.00),并将K线描述为"光头光脚阴线"(实际是长下影线,低点248.68)。266.02来自新浪原始CSV的ask2字段(第二档卖盘价),被我误读为当前价 + - 根因:没有统一的权威价格源。LLM有时读portfolio.json、有时读decisions.json、有时直接解析原始API——解析CSV时字段极易混淆 + - 修复1(脚本级):创建 stock_quote.py — 统一行情查询工具。自动识别A股/港股,按东财→新浪→腾讯优先级获取,自带验证(price在[low,high]内,change_pct自洽)。输出结构化JSON,LLM禁止解析原始API + - 修复2(管道级):mofin_collect.py 增加 stock_quote.py --all-holdings 注入步骤。每个cron分析前自动注入持仓行情数据,LLM只需读注入数据 + - 修复3(记忆级):增加"数据来源铁律"记忆条目——输出价格前必须验证 + - 文件:新增 MoFin/scripts/stock_quote.py,修改 mofin_collect.py(加步骤4),新增记忆条目 + - 原则:用脚本固定规范,不依赖LLM"随机遵守" +### 审计 +- [AUDIT] 全系统"脚本强制规范"覆盖审计 + - 结果:开盘简报✓ 收盘简报✓ MoFin盘前中监控✓(已在mofin_collect中注入stock_quote) MoFin午后监控✓ + - 违规:策略评估-每日(stale_detector.py直接调用腾讯API) ✗ → 已修复:改调stock_quote.py,原腾讯API降级为兜底 + - 违规:策略评估SKILL.md写"数据源:腾讯API实时行情" ✗ → 已修复:改为"数据源:decisions.json/stock_quote.py" + - 违规:芯片微装-价格监控prompt未指定数据源 ✗ → 已修复:添加"数据源铁律:从decisions.json或stock_quote.py获取" + - 不修复:price_monitor.py是no_agent脚本,直接写portfolio.json供LLM读,不经过LLM解析,风险可控 + - ⚠️ 补充审计(12:21):此前标记「已修复」的 stale_detector.py 实际未改——代码仍直接调腾讯API qt.gtimg.cn。已重新修复:fetch_prices() 优先调 stock_quote.py,腾讯API降级为兜底fallback + - 验证:stale_detector.py 当前运行输出正常(芯碁微装521.12 -5.15%、中钨高新95.86 +0.15%等),数据来源已切换至stock_quote.py + - .pyc 回收规范验证:仅 macro_context_collector.py 有 .pyc 缓存(已清除+加固完整性校验),其余脚本 __pycache__ 为空 + +## 2026-07-01 + +### 修复: macro_context_collector.py .pyc缓存过期导致误报复发 + +发现: self-healing executor 报告 12:00 采集器误将 KOSPI -1%(正常日内波动)和基金经理展望(正面评论)判为 HIGH 宏观风险。 + +根因: .pyc 缓存过期。当前 .py 的 HIGH_PATTERNS 已包含"指数+跌幅≥2%"阈值和"指数+暴跌词"强词检测,但 cron 运行时 Python 加载了过期 .pyc(旧版模式),导致 KOSPI -1% 依然匹配旧版"指数.*跌幅"模式。 + +修改: +1. 删除 `__pycache__/` + touch `.py` — 强制重新编译 +2. 《macro_context_collector.py》加固模式完整性校验 _PATTERN_CHECKS: + - 新增 index 8 检查: 必须包含"暴跌|熔断|闪崩|重挫"(禁止"跌幅"弱词命中) + - 新增 index 9 检查: 必须包含"[2-9]%"(禁止 1% 正常波动触发) + - 新增 _KNOWN_BAD_SIGS 旧版签名扫描: 检查"指数.*跌幅""|核|""英伟达|nvidia.*跌""导弹.*发射"是否残留 +3. 清除 stale macro_risk_state.json(level=high→expired) +4. 关闭 TODO #41 + +验证: 三条误报标题在修复后均不触发 HIGH 匹配。 diff --git a/docs/decisions-db-migration.md b/docs/decisions-db-migration.md new file mode 100644 index 0000000..321a197 --- /dev/null +++ b/docs/decisions-db-migration.md @@ -0,0 +1,159 @@ +# decisions.json → SQLite 数据库迁移需求 + +## 背景 + +当前系统所有策略数据存在 `/home/hmo/web-dashboard/data/decisions.json`,一个约 50~60 条策略的 JSON 文件。 + +## 现状痛点 + +| 问题 | 举例 | +|------|------| +| 没有写入锁,并发写会损坏 | price_monitor + per_stock_reassess 同时写,JSON 截断 | +| 币种字段不统一 | 港股 price 曾经存 HKD 也存过 CNY,修了几轮才用 currency 标记 | +| 缺乏 schema 校验 | 空字段、类型错误(str 写成了 int)无声失败 | +| 无 changelog 审计 | 谁在什么时候改了哪个字段,查不了 | +| 没有事务回滚 | 写一半 crash,整个文件废了 | +| 只能全量读 | 50 条策略每次全部加载,浪费 token | +| 各脚本自拉价格 | stale_detector 拉一次腾讯 API,per_stock_reassess 又拉一次 | + +## 需求目标 + +**单线程写入 / 多线程安全读**。 +将 decisions.json 迁移到 `mofin.db`(已有该数据库),建 `strategies` 表。 + +## 表结构 + +```sql +CREATE TABLE strategies ( + code TEXT PRIMARY KEY, -- 股票代码,如 "00700" + name TEXT NOT NULL, -- 股票名称 + type TEXT DEFAULT '自选策略', -- 持仓策略 / 自选策略 + status TEXT DEFAULT 'active', -- active / updated / stale + currency TEXT DEFAULT 'CNY', -- CNY / HKD。港股固定 HKD + + -- 价格与仓位 + price REAL, -- 最新价格(原始币种,港股=HKD,A股=CNY) + price_cny REAL, -- 折算为人民币的价格(统一口径用) + cost REAL, -- 持仓成本(有持仓时) + shares INTEGER, -- 持仓股数 + share INTEGER, -- 同 shares,历史遗留字段 + + -- 策略参数 + entry_low REAL, -- 买入区间下沿(原始币种) + entry_high REAL, -- 买入区间上沿(原始币种) + stop_loss REAL, -- 止损价 + take_profit REAL, -- 止盈/目标价 + stop_loss_cny REAL, -- 止损(人民币,统一口径用) + take_profit_cny REAL, -- 止盈(人民币) + rr_ratio REAL, -- 盈亏比 + timing_signal TEXT, -- 短词信号:买入/加仓/持有/观望/冷却中 + + -- 来源与状态 + trigger_reason TEXT, -- 策略生成原由 + created_at TEXT, -- ISO时间 + updated_at TEXT, -- 最后更新时间 + reassessed_at TEXT, -- 最近一次重评时间 + action TEXT, -- 最新操作摘要文本 + + -- JSON 嵌套字段(存为 TEXT,应用层 JSON parse) + analysis TEXT, -- JSON: 分析详情 + trigger TEXT, -- JSON: 触发条件 + changelog TEXT, -- JSON: 变更历史数组 + signal_factors TEXT, -- JSON: 因子列表 + tech_snapshot TEXT, -- JSON: 技术面快照 + action_note TEXT, -- 长文本动作说明 + sector_context TEXT -- 行业上下文 +); +``` + +### 为什么不全部展开成列 + +analysis 和 trigger 有嵌套结构且未来可能加字段。存 JSON 字符串,应用层 parse。查询止损/止盈用 `json_extract()`。 + +## 读写接口需求 + +### 写操作(高频,每 2 分钟) + +price_monitor 每轮更新所有持仓 + 自选的价格: + +```sql +INSERT INTO strategies (code, price, price_cny, currency, updated_at) +VALUES (?, ?, ?, ?, ?) +ON CONFLICT(code) DO UPDATE SET + price = excluded.price, + price_cny = excluded.price_cny, + updated_at = excluded.updated_at; +``` + +价格更新不涉及其他字段。港股:price=HKD,price_cny=HKD×汇率。 +A股:price=price_cny。 + +### 写操作(低频,策略重评时) + +per_stock_reassess 跑完单股重评后更新全部策略参数: + +```sql +UPDATE strategies SET + entry_low = ?, entry_high = ?, stop_loss = ?, + take_profit = ?, rr_ratio = ?, timing_signal = ?, + stop_loss_cny = ?, take_profit_cny = ?, + currency = ?, + analysis = ?, + trigger = ?, + reassessed_at = ?, + changelog = json_insert(changelog, '$[#]', ?) +WHERE code = ?; +``` + +### 读操作(各报告脚本) + +所有 LLM cron、no_agent 脚本统一从 `strategies` 表读,不再拉腾讯 API: + +```sql +SELECT * FROM strategies WHERE status = 'active' ORDER BY code; +``` + +按币种过滤: +```sql +SELECT * FROM strategies WHERE currency = 'HKD'; +``` + +读某只具体股票: +```sql +SELECT * FROM strategies WHERE code = '00700'; +``` + +## 不变的输出 + +1. **保留 decisions.json 同步输出**(过渡期 2 周)。每次写 DB 后,同步写一份 decisions.json 给旧脚本兼容。 +2. **输出格式不做大改**。JSON decode analysis/trigger 后保持现有字段名。 + +## 不允许的行为 + +1. ❌ 各脚本自行拉腾讯 API 获取价格。价格入口只有 price_monitor。 +2. ❌ 直接写 decisions.json。全部走 DB。 +3. ❌ 变更 decisions.json 的输出字段名/格式(过渡期兼容)。 + +## 验收标准 + +1. `strategies` 表有数据,decisions.json 和 `SELECT * FROM strategies` 内容一致 +2. price_monitor 跑一轮后 DB 里的 price 更新正确(港股 HKD,A 股 CNY) +3. per_stock_reassess 跑完单股后 DB 里对应股票策略更新 +4. stale_detector 从 DB 读数据,输出和从 JSON 读一样 +5. 并发读写(price_monitor 2min + stale_detector 同时跑)不损坏数据 +6. 迁移后旧 decisions.json 仍同步更新 + +## 相关文件路径 + +| 文件 | 说明 | +|------|------| +| `/home/hmo/MoFin/price_monitor.py` | 价格监控,每2分钟写price | +| `/home/hmo/MoFin/scripts/strategy_lifecycle.py` | 策略生命周期,reassess_strategy() | +| `/home/hmo/MoFin/scripts/per_stock_reassess.py` | 单股重评入口 | +| `/home/hmo/MoFin/scripts/stale_push_wlin.py` | 自选买入提醒 | +| `/home/hmo/web-dashboard/data/decisions.json` | 当前JSON文件 | +| `/home/hmo/MoFin/data/mofin.db` | 目标数据库(已有market/trend等表) | + +## 联系人 + +有问题问 hmo(老爸)。笑笑负责代码实现,测试完成后通知老爸验收。 diff --git a/mo_data.py b/mo_data.py new file mode 100644 index 0000000..03a3d38 --- /dev/null +++ b/mo_data.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 +""" +mo_data.py — MoFin 统一数据读取层 + +替代 json.load(open(portfolio.json)) 等直接读 JSON 文件的方式。 +所有数据从 DB 读取,币种字段强制存在。 + +用法: + from mo_data import read_portfolio, read_decisions, read_watchlist + + pf = read_portfolio() # 返回和 portfolio.json 一样的 dict 结构 + dec = read_decisions() # 返回和 decisions.json 一样的 dict 结构 + wl = read_watchlist() # 返回和 watchlist.json 一样的 dict 结构 +""" + +import sqlite3, json, os +from datetime import datetime + +DB_PATH = '/home/hmo/web-dashboard/data/mofin.db' + +# JSON 文件路径(冷备,仅当 DB 不可用时 fallback) +PORTFOLIO_JSON = '/home/hmo/web-dashboard/data/portfolio.json' +DECISIONS_JSON = '/home/hmo/web-dashboard/data/decisions.json' +WATCHLIST_JSON = '/home/hmo/web-dashboard/data/watchlist.json' + + +def _get_db(): + db = sqlite3.connect(DB_PATH) + db.row_factory = sqlite3.Row + return db + + +# ── portfolio.json → holdings + portfolio_summary ───────────────── + +def read_portfolio(): + """返回 portfolio.json 等价 dict。DB 优先,JSON 冷备。""" + try: + db = _get_db() + # holdings + rows = db.execute( + "SELECT code, name, shares, cost, price, market_value, " + "change_pct, currency, position_pct " + "FROM holdings WHERE is_active=1" + ).fetchall() + holdings = [] + for r in rows: + h = dict(r) + h['_currency'] = h.get('currency', 'CNY') # 兼容旧代码的 _currency 字段名 + holdings.append(h) + + # summary + sum_row = db.execute("SELECT * FROM portfolio_summary WHERE id=1").fetchone() + summary = dict(sum_row) if sum_row else {} + + db.close() + + return { + "holdings": holdings, + "total_assets": summary.get("total_assets", 0), + "total_mv": summary.get("total_mv", 0), + "stock_value": summary.get("stock_value", summary.get("total_mv", 0)), + "cash": summary.get("cash", 0), + "frozen_cash": summary.get("frozen_cash", 0), + "position_pct": summary.get("position_pct", 0), + "currency": summary.get("currency", "CNY"), + "updated_at": summary.get("updated_at", ""), + } + except Exception: + pass + + # JSON 冷备 + try: + return json.load(open(PORTFOLIO_JSON, encoding='utf-8')) + except: + return {"holdings": [], "total_assets": 0, "cash": 0, "frozen_cash": 0} + + +# ── decisions.json → holding_strategies ──────────────────────────── + +def read_decisions(): + """返回 decisions.json 等价 dict。DB 优先,JSON 冷备。""" + try: + db = _get_db() + rows = db.execute( + "SELECT code, name, version, price, cost, shares, " + "stop_loss, take_profit, entry_low, entry_high, " + "currency, strategy_type, action, timing_signal, " + "rr_ratio, tech_snapshot, stock_category, sector_context, " + "status, trigger_json, changelog_json, source, reason, " + "created_at, updated_at " + "FROM holding_strategies WHERE status IN ('active','updated') " + "ORDER BY code" + ).fetchall() + + decisions = [] + for r in rows: + d = dict(r) + # 还原 trigger 字段 + if d.get('trigger_json'): + try: + d['trigger'] = json.loads(d['trigger_json']) + except: + d['trigger'] = {} + else: + d['trigger'] = {} + # 还原 changelog 字段 + if d.get('changelog_json'): + try: + d['changelog'] = json.loads(d['changelog_json']) + except: + d['changelog'] = [] + else: + d['changelog'] = [] + decisions.append(d) + + db.close() + + return { + "decisions": decisions, + "total": len(decisions), + "regenerated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), + } + except Exception: + pass + + try: + return json.load(open(DECISIONS_JSON, encoding='utf-8')) + except: + return {"decisions": [], "total": 0} + + +# ── watchlist.json → watchlist_stocks ────────────────────────────── + +def read_watchlist(): + """返回 watchlist.json 等价 dict。DB 优先,JSON 冷备。""" + try: + db = _get_db() + rows = db.execute( + "SELECT code, name, price, entry_low, entry_high, " + "stop_loss, currency, source, source_detail, notes, " + "added_by, added_at, analysis_json " + "FROM watchlist_stocks WHERE is_active=1" + ).fetchall() + + stocks = [] + for r in rows: + s = dict(r) + if s.get('source_detail'): + try: s['source_detail'] = json.loads(s['source_detail']) + except: pass + if s.get('analysis_json'): + try: s['analysis'] = json.loads(s['analysis_json']) + except: s['analysis'] = {} + else: + s['analysis'] = {} + stocks.append(s) + + db.close() + + return { + "stocks": stocks, + "updated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), + } + except Exception: + pass + + try: + return json.load(open(WATCHLIST_JSON, encoding='utf-8')) + except: + return {"stocks": []} + + +# ── 便捷函数 ──────────────────────────────────────────────────────── + +def read_portfolio_json(): + """别名(兼容旧代码直接 import 后调用)""" + return read_portfolio() + +def read_decisions_json(): + """别名""" + return read_decisions() + +def read_watchlist_json(): + """别名""" + return read_watchlist() + + +# ── 自检 ──────────────────────────────────────────────────────────── + +if __name__ == "__main__": + pf = read_portfolio() + print(f"portfolio: {len(pf.get('holdings',[]))} holdings, total_assets={pf.get('total_assets',0)}") + + dec = read_decisions() + print(f"decisions: {len(dec.get('decisions',[]))} entries") + + wl = read_watchlist() + print(f"watchlist: {len(wl.get('stocks',[]))} stocks") diff --git a/mofin_db.py b/mofin_db.py index d8a6ae2..15f1ed5 100644 --- a/mofin_db.py +++ b/mofin_db.py @@ -263,6 +263,20 @@ def init_all_tables(conn: sqlite3.Connection): updated_at TEXT ); + -- 现金变更日志(每次买卖/出入金记录) + CREATE TABLE IF NOT EXISTS cash_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp TEXT NOT NULL DEFAULT (datetime('now','localtime')), + cash_before REAL, -- 变更前可用现金 + cash_after REAL, -- 变更后可用现金 + frozen_before REAL, -- 变更前冻结资金 + frozen_after REAL, -- 变更后冻结资金 + change_amount REAL, -- 现金变动额(正=入金/卖股,负=出金/买股) + source TEXT NOT NULL, -- 来源: screenshot/manual/import_xls/trade + note TEXT, -- 备注: 例如 "卖出法拉电子 200股" + verified INTEGER DEFAULT 0 -- 是否已验证(0=未验证,1=Dad确认) + ); + -- 建议时间线(decisions.json advice_timeline[]) CREATE TABLE IF NOT EXISTS advice_timeline ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -371,6 +385,20 @@ def init_all_tables(conn: sqlite3.Connection): except sqlite3.OperationalError: pass + # cash_log migration (2026-07-01) + try: + conn.execute("ALTER TABLE cash_log ADD COLUMN frozen_before REAL") + except sqlite3.OperationalError: + pass + try: + conn.execute("ALTER TABLE cash_log ADD COLUMN frozen_after REAL") + except sqlite3.OperationalError: + pass + try: + conn.execute("ALTER TABLE cash_log ADD COLUMN verified INTEGER DEFAULT 0") + except sqlite3.OperationalError: + pass + # ── 币种约束迁移(2026-06-30)──────────────────────────────── _currency_migrations = [ ("holdings", ["price REAL", "market_value REAL", "change_pct REAL", @@ -1041,3 +1069,29 @@ def write_watchlist_stock(conn, stock: dict) -> tuple[bool, str]: return True, f"自选 {stock.get('code')} 已写入" except sqlite3.IntegrityError as e: return False, f"约束: {e}" + + +def write_cash_log(conn, data: dict) -> tuple[bool, str]: + """记录现金变更(替代手动改 portfolio.json cash 字段)""" + try: + conn.execute(""" + INSERT INTO cash_log (cash_before, cash_after, frozen_before, frozen_after, + change_amount, source, note) + VALUES (?,?,?,?,?,?,?) + """, ( + data.get('cash_before'), data.get('cash_after'), + data.get('frozen_before'), data.get('frozen_after'), + data.get('change_amount'), data.get('source', 'manual'), + data.get('note', ''), + )) + conn.commit() + return True, "现金变更已记录" + except Exception as e: + return False, str(e) + + +def query_cash_log(conn, limit: int = 20) -> list[dict]: + rows = conn.execute( + "SELECT * FROM cash_log ORDER BY id DESC LIMIT ?", (limit,) + ).fetchall() + return [dict(r) for r in rows] diff --git a/price_monitor.py b/price_monitor.py index 7485c24..0583ec5 100644 --- a/price_monitor.py +++ b/price_monitor.py @@ -1,713 +1,714 @@ -#!/usr/bin/env python3 -"""price_monitor.py — 高频价格监控脚本(批量版) -规则:进入区间报一次,离开区间报一次,中间不重复。 -每次运行时一次性刷新所有持仓+自选股的实时价。 -""" -import json -import urllib.request -import os -import sys -import time -from datetime import datetime - -# ── MoFin unified model ────────────────────────────────────────────── -from mo_models import is_hk_stock, get_hk_rate, calc_total_assets, calc_total_mv, calc_position_pct -from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_price_event, write_watchlist_stock - -DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" -WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" -BREACH_PATH = "/home/hmo/.hermes/zone_breach.json" -STATE_PATH = os.path.expanduser("~/.hermes/price_trigger_state.json") -EVENTS_PATH = "/home/hmo/web-dashboard/data/price_events.json" - -# 策略重评依赖(技术面驱动,非机械百分比) -sys.path.insert(0, "/home/hmo/web-dashboard") -try: - from strategy_lifecycle import reassess_strategy - HAS_REASSESS = True -except ImportError: - HAS_REASSESS = False - -try: - HK_RATE = get_hk_rate() -except Exception: - HK_RATE = 0.87 # ultimate fallback - -# 分支系统与情景检测 -try: - sys.path.insert(0, '/home/hmo/MoFin') - from strategy_tree import detect_scenario, evaluate_branches - HAS_TREE = True -except Exception: - HAS_TREE = False - def detect_scenario(): return {} - def evaluate_branches(*a, **kw): return [] - -# 情景缓存(每次run_once刷新) -_SCENARIO_CACHE = {} -_BRANCH_CACHE = {} # code -> branches list - -UA = "Mozilla/5.0" - -# ── 批量拉取价格 ────────────────────────────────────────────────────────── - -def fetch_all_prices(codes): - """腾讯批量行情API:仅用于A股(沪市/深市) - A股:sh600110 / sz000001 - 港股已迁移至 fetch_hk_eastmoney()(东方财富实时行情) - 返回 {code: (price, change, change_pct)} - """ - if not codes: - return {} - - # 只处理A股(6位代码),港股走东方财富 - a_codes = [c for c in codes if len(str(c).strip()) == 6] - if not a_codes: - return {} - - symbols = [] - code_map = {} - for code in a_codes: - code_s = str(code).strip() - if code_s.startswith(('5', '6', '9')): - sym = f"sh{code_s}" - else: - sym = f"sz{code_s}" - symbols.append(sym) - code_map[sym] = code_s - - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - try: - req = urllib.request.Request(url, headers={"User-Agent": UA}) - with urllib.request.urlopen(req, timeout=10) as r: - text = r.read().decode("gbk") - except Exception as e: - print(f"⚠️ 腾讯A股拉取失败: {e}", file=sys.stderr) - return {} - - results = {} - for line in text.strip().split("\n"): - line = line.strip() - if not line or "=" not in line: - continue - try: - raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw_value.split("~") - if len(fields) < 6: - continue - sym = line.split("=", 1)[0].strip().lstrip("v_") - orig_code = code_map.get(sym) - if not orig_code: - continue - price = float(fields[3]) if fields[3] else 0 - prev_close = float(fields[4]) if fields[4] else 0 - change = price - prev_close if prev_close > 0 else 0 - change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" - results[orig_code] = (price, change, change_pct) - except (ValueError, IndexError): - continue - - return results - - -# ── 港股实时行情(东方财富,无15分钟延迟)────────────────────────────── - -def fetch_hk_eastmoney(codes): - """东方财富港股实时行情 API — 免费、实时、无15分钟延迟。 - - API: push2.eastmoney.com - 市场代码: 116 (港交所) - 格式: 116.00700 - - 返回 {code: (price, change, change_pct)} - - Fallback: 失败时回退到腾讯 qt.gtimg.cn(15分钟延迟) - """ - if not codes: - return {} - - hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] - if not hk_codes: - return {} - - results = {} - - # 主通道:东方财富实时行情(逐股查询,港股仅~10只,<1秒完成。该API不支持批量) - for code in hk_codes: - try: - url = (f"https://push2.eastmoney.com/api/qt/stock/get" - f"?secid=116.{code}" - f"&fields=f43,f170,f60,f57,f58" - f"&fltt=2") - req = urllib.request.Request(url, headers={"User-Agent": UA}) - with urllib.request.urlopen(req, timeout=5) as r: - resp = json.loads(r.read().decode("utf-8")) - - if resp.get("rc") != 0: - continue - item = resp.get("data", {}) - if not item: - continue - price = float(item.get("f43", 0)) if item.get("f43") else 0 - prev_close = float(item.get("f60", 0)) if item.get("f60") else 0 - change = round(price - prev_close, 2) if prev_close > 0 else 0 - change_pct = str(item.get("f170", "0")) - if price > 0: - results[code] = (price, change, change_pct) - time.sleep(0.1) # 防止触发东财反爬(逐股查询,不支持批量) - except Exception as e: - print(f"⚠️ 东方财富 {code} 拉取失败: {e}", file=sys.stderr) - continue - - # Fallback: 腾讯 qt.gtimg.cn(15分钟延迟) - missing = [c for c in hk_codes if c not in results] - if missing: - try: - fallback = _fetch_hk_tencent_fallback(missing) - results.update(fallback) - except Exception: - pass - - return results - - -def _fetch_hk_tencent_fallback(codes): - """腾讯港股行情(15分钟延迟,仅作 fallback)""" - symbols = [f"hk{c}" for c in codes] - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - req = urllib.request.Request(url, headers={"User-Agent": UA}) - with urllib.request.urlopen(req, timeout=10) as r: - text = r.read().decode("gbk") - - code_map = {f"hk{c}": c for c in codes} - results = {} - for line in text.strip().split("\n"): - if "=" not in line: - continue - try: - raw = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw.split("~") - if len(fields) < 6: - continue - sym = line.split("=", 1)[0].strip().lstrip("v_") - orig = code_map.get(sym) - if not orig: - continue - price = float(fields[3]) if fields[3] else 0 - prev_close = float(fields[4]) if fields[4] else 0 - change = price - prev_close if prev_close > 0 else 0 - change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" - results[orig] = (price, change, change_pct) - except (ValueError, IndexError): - continue - return results - - -def refresh_data_prices(): - """一次性刷新portfolio.json和watchlist.json的所有实时价""" - all_codes = set() - - # 收集所有需要拉取的代码 - try: - pf = json.load(open(PORTFOLIO_PATH)) - for s in pf.get('holdings', []): - all_codes.add(s['code']) - except: - pf = {"holdings": []} - - try: - wl = json.load(open(WATCHLIST_PATH)) - for s in wl.get('stocks', []): - all_codes.add(s['code']) - except: - wl = {"stocks": []} - - if not all_codes: - return 0 - - # 分批拉取:A股走腾讯(实时) + 港股走东方财富(实时) - all_list = list(all_codes) - prices = fetch_all_prices(all_list) # A股(腾讯,实时) - hk_prices = fetch_hk_eastmoney(all_list) # 港股(东方财富,实时) - prices.update(hk_prices) - updated = 0 - - # 保存全量实时价快照(供报告管道消费,确保分析用最新数据) - try: - live = {"updated_at": datetime.now().isoformat(), "prices": {}} - for code in all_codes: - if code in prices: - p, c, chg = prices[code] - live["prices"][code] = {"price": p, "change_pct": chg} - json.dump(live, open("/home/hmo/web-dashboard/data/live_prices.json", "w"), indent=2) - except Exception: - pass - - # 更新portfolio(只在价格变化时写入,避免触发文件变更通知) - changed = False - for s in pf.get('holdings', []): - if s['code'] in prices: - price, _, change_pct = prices[s['code']] - if price > 0: - # 港股:API返回HKD,需转RMB - if is_hk_stock(s['code']): - price = round(price * HK_RATE, 2) - old = s.get('price', 0) - if abs(old - price) > 0.001: - s['price'] = round(price, 2) - s['change_pct'] = float(change_pct) if change_pct else 0 - updated += 1 - changed = True - if changed: - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - pf['total_mv'] = calc_total_mv(pf.get('holdings', [])) - pf['total_assets'] = calc_total_assets(pf) - pf['position_pct'] = calc_position_pct(pf) - # DB 写入(替代 json.dump,强制币种约束) - try: - conn = get_conn() - write_holdings_batch(conn, pf['holdings']) - write_portfolio_summary(conn, pf) - conn.close() - except Exception as e: - print(f" [DB写入失败] {e}", flush=True) - # 保留 JSON 副本作为冷备 - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - elif pf.get('updated_at'): - try: - last_ts = datetime.strptime(pf['updated_at'], '%Y-%m-%d %H:%M') - if (datetime.now() - last_ts).total_seconds() > 600: - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - except: - pass - - # 更新watchlist(只在价格变化时写入) - changed = False - for s in wl.get('stocks', []): - if s['code'] in prices: - price, _, change_pct = prices[s['code']] - if price > 0: - # 港股:API返回HKD,需转RMB - if is_hk_stock(s['code']): - price = round(price * HK_RATE, 2) - old = s.get('price', 0) - if abs(old - price) > 0.001: - s['price'] = round(price, 2) - s['change_pct'] = float(change_pct) if change_pct else 0 - updated += 1 - changed = True - if changed: - wl['updated_at'] = datetime.now().isoformat() - # DB 写入(替代 json.dump) - try: - conn = get_conn() - for s in wl.get('stocks', []): - s['currency'] = 'CNY' # 自选股价格统一CNY - write_watchlist_stock(conn, s) - conn.close() - except Exception as e: - print(f" [DB watchlist写入失败] {e}", flush=True) - # 保留 JSON 冷备 - json.dump(wl, open(WATCHLIST_PATH, 'w'), ensure_ascii=False, indent=2) - - # --- 汇总值重算(使用 mo_models 唯一公式)--- - try: - live_market_value = calc_total_mv(pf.get('holdings', [])) - old_mv = pf.get('total_mv', 0) - - if abs(old_mv - live_market_value) > 0.01: - pf['total_mv'] = round(live_market_value, 2) - - pf['total_assets'] = calc_total_assets(pf) - if pf['total_assets'] > 0: - pf['position_pct'] = calc_position_pct(pf) - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - # DB 写入 - try: - conn = get_conn() - write_portfolio_summary(conn, pf) - conn.close() - except Exception as e: - print(f" [DB汇总写入失败] {e}", flush=True) - # JSON 冷备 - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - except Exception as e: - print(f" [汇总重算失败] {e}", flush=True) - # --- 结束汇总重算 --- - - return updated - - -# ── 分支系统辅助函数 ────────────────────────────────────────────────────── - -def _branch_alert_suffix(code, price, shares=0, cost=0): - """返回分支信息后缀:「 | 情景→动作」""" - if not HAS_TREE or not _SCENARIO_CACHE.get('id'): - return "" - try: - sc_id = _SCENARIO_CACHE['id'] - results = evaluate_branches(code, sc_id, price, shares, cost) - for r in results: - if r.get('applicable'): - _record_branch_trigger(code, r.get('branch_id',''), price) - branch_action = r.get('action_type', r.get('action', 'hold')) - return f" | {sc_id}→{branch_action}" - except Exception: - pass - return "" - - -def _record_branch_trigger(code, branch_id, price): - """记录分支触发事件(自成长:trigger_count+1)""" - try: - raw = json.load(open(DECISIONS_PATH)) - for d in raw.get('decisions', []): - if d.get('code') == code and d.get('strategy_tree',{}).get('branches'): - for b in d['strategy_tree']['branches']: - if b['id'] == branch_id: - b.setdefault('trigger_count', 0) - b['trigger_count'] += 1 - b['last_trigger_price'] = round(price, 2) - b['last_triggered'] = datetime.now().isoformat() - break - json.dump(raw, open(DECISIONS_PATH, 'w'), ensure_ascii=False, indent=2) - except Exception: - pass - - -# ── 区间偏离检测 ────────────────────────────────────────────────────────── - -def load_state(): - try: - with open(STATE_PATH) as f: - return json.load(f) - except: - return {} - -def save_state(state): - os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) - with open(STATE_PATH, 'w') as f: - json.dump(state, f, ensure_ascii=False, indent=2) - -def load_breaches(): - try: - with open(BREACH_PATH) as f: - return json.load(f) - except: - return {} - -def save_breaches(data): - os.makedirs(os.path.dirname(BREACH_PATH), exist_ok=True) - with open(BREACH_PATH, 'w') as f: - json.dump(data, f, ensure_ascii=False, indent=2) - - -def load_events(): - try: - with open(EVENTS_PATH) as f: - return json.load(f) - except: - return {"events": []} - - -def save_events(events): - os.makedirs(os.path.dirname(EVENTS_PATH), exist_ok=True) - with open(EVENTS_PATH, 'w') as f: - json.dump(events, f, ensure_ascii=False, indent=2) - - -def record_event(code, name, event_type, price, trigger_value, event_label=""): - """记录一次价格触发事件到 price_events.json + SQLite""" - events = load_events() - now = datetime.now().isoformat() - events["events"].append({ - "code": code, - "name": name, - "event_type": event_type, # entry_zone, stop_loss, take_profit, exit_zone - "price": round(price, 2), - "trigger_value": trigger_value, - "event_label": event_label, - "timestamp": now, - "date": datetime.now().strftime("%Y-%m-%d"), - }) - # 保留最近10000条 - events["events"] = events["events"][-10000:] - save_events(events) - - # ── SQLite 双写 ── - try: - from mofin_db import get_conn, init_all_tables, write_price_event - conn = get_conn() - init_all_tables(conn) - write_price_event(conn, code, name, event_type, price, trigger_value, event_label) - conn.close() - except Exception: - pass # SQLite 写入失败不影响主流程 - - -def get_trigger_zones(d): - """返回该decision所有可监控的区间列表,从顶层字段读取""" - zones = [] - is_holding = d.get('shares', 0) > 0 - # 买入区间(自选和持仓都监控) - el = d.get("entry_low", 0) - eh = d.get("entry_high", 0) - if el and eh and float(el) > 0 and float(eh) > 0: - try: - zones.append(("entry_zone", "买入区间", float(el), float(eh))) - except: - pass - # 止损+止盈(只有持仓才监控,自选无意义) - if is_holding: - sl = d.get("stop_loss", 0) - if sl and float(sl) > 0: - try: - zones.append(("stop_loss", "止损", 0, float(sl))) - except: - pass - tp = d.get("take_profit", 0) - if tp and float(tp) > 0: - try: - zones.append(("take_profit_zone", "止盈区间", 0, float(tp))) - except: - pass - return zones - - -def run_once(round_label=""): - """执行一轮完整的监控流程""" - global _SCENARIO_CACHE, _BRANCH_CACHE - label = f" [{round_label}]" if round_label else "" - start = time.time() - - # 刷新情景与分支缓存(每轮更新) - _SCENARIO_CACHE = detect_scenario() if HAS_TREE else {} - _BRANCH_CACHE = {} - try: - raw = json.load(open(DECISIONS_PATH)) - for d in raw.get('decisions', []): - tree = d.get('strategy_tree', {}) - if tree and tree.get('branches'): - _BRANCH_CACHE[d['code']] = tree['branches'] - except Exception: - pass - - # === 第一步:一次性刷新所有价格 === - refreshed = refresh_data_prices() - - # === 第二步:检查触发条件 === - try: - with open(DECISIONS_PATH) as f: - dec = json.load(f) - except: - print(f"❌{label} 无法读取decisions.json", file=sys.stderr) - return - - active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")] - state = load_state() - outputs = [] - state_updated = False - - # 收集所有需要检查的代码 - check_codes = set() - for d in active: - if get_trigger_zones(d): - check_codes.add(d["code"]) - - # 批量拉取这些股票的价格 - prices = fetch_all_prices(list(check_codes)) - - for d in active: - code = d["code"] - - zones = get_trigger_zones(d) - if not zones: - continue - - price_info = prices.get(code) - if not price_info: - continue - price, _, _ = price_info - if price == 0: - continue - - name = d.get("name", code) - if code not in state: - state[code] = {} - - for key, label, lo, hi in zones: - in_zone = lo <= price <= hi - prev_in_zone = state[code].get(key, None) - - if in_zone and prev_in_zone != True: - if key == "stop_loss": - branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) - outputs.append(f"⚠️ {name}({code}) {price} → 跌破止损{hi}!{branch_sfx}") - record_event(code, name, "stop_loss", price, str(hi)) - else: - extra = "" - if "_price" in key: - batch_shares = d.get(key.replace("_price", "_shares"), "") - action = d.get(key.replace("_price", "_action"), "") - if batch_shares: - extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股" - elif key in ("take_profit_zone",): - act = d.get("take_profit_action", "") - if act: - extra = f"({act})" - branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) - outputs.append(f"⚡ {name}({code}) {price} → 进入{label}{lo}~{hi}{extra}{branch_sfx}") - record_event(code, name, "entry_zone", price, f"{lo}~{hi}", label) - state[code][key] = True - state_updated = True - - elif not in_zone and prev_in_zone == True: - if key != "stop_loss": - outputs.append(f"📌 {name}({code}) {price} → 离开{label}{lo}~{hi}") - state[code][key] = False - state_updated = True - - # === 第三步:买入区偏离检测 + 自动重评 === - reassesed_codes = [] - for d in active: - code = d["code"] - name = d.get("name", code) - price_info = prices.get(code) - if not price_info: - continue - price, _, _ = price_info - if price == 0: - continue - - # 从 decisions.json 中读取 analysis 的买入区 - entry_low = d.get("entry_low", 0) - entry_high = d.get("entry_high", 0) - if not entry_low or not entry_high: - continue - - in_buy_zone = entry_low <= price <= entry_high - prev_in_buy_zone = state.get(code, {}).get("__buy_zone", None) - - # 状态变化时才触发 - if in_buy_zone and prev_in_buy_zone == False: - # 重新进入买入区 → 重评确认区间是否仍然有效 - outputs.append(f"🔄 {name}({code}) {price} → 重新进入买入区{entry_low}~{entry_high},触发技术面重评") - do_reassess = True - elif not in_buy_zone and prev_in_buy_zone == True: - # 离开买入区 → 立即重评,更新止损/止盈/区间 - outputs.append(f"🔄 {name}({code}) {price} → 离开买入区{entry_low}~{entry_high},立即技术面重评") - do_reassess = True - else: - do_reassess = False - - if do_reassess and HAS_REASSESS: - try: - cost = d.get("cost", 0) or 0 - shares = d.get("shares", 0) or 0 - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_deep_loss = profit_pct < -20 - sentiment = "neutral" - if d.get("tech_snapshot"): - if "bearish" in d["tech_snapshot"]: - sentiment = "bearish" - elif "bullish" in d["tech_snapshot"]: - sentiment = "bullish" - - # 调用技术面驱动重评(非机械百分比) - result = reassess_strategy( - code, name, price, cost, shares, - current_action=d.get("action", ""), - volume_signal="中性", sentiment=sentiment, - ) - outputs.append(f" 📊 新策略: 损{result['stop_loss']} 盈{result['take_profit']} 区{result['entry_low']}~{result['entry_high']} RR={result['rr_ratio']}") - reassesed_codes.append(code) - except Exception as e: - outputs.append(f" ⚠️ 重评失败: {e}") - - # 更新买入区状态 - if "__buy_zone" not in state.get(code, {}): - if code not in state: - state[code] = {} - state[code]["__buy_zone"] = in_buy_zone - state_updated = True - - # 如果有重评过的股票,更新 decisions.json - if reassesed_codes and HAS_REASSESS: - try: - # 重新 regenerate_all 只针对受影响的股票效率太低 - # 直接全量重评(regenerate_all 内部会批量拉价格、做技术分析) - from strategy_lifecycle import regenerate_all - r = regenerate_all(stdout=False) - outputs.append(f" ✅ 策略已全量重评: {r.get('ok',0)}/{r.get('total',0)}成功") - outputs.append(f" 📌 触发股票: {', '.join(reassesed_codes)}") - except Exception as e: - outputs.append(f" ⚠️ 全量重评失败: {e}") - - # === 3.5 资金流异常检测(2026-06-27 新增)=== - try: - cf = json.load(open("/home/hmo/web-dashboard/data/capital_flow_cache.json")) - # 检查所有 active decision 中的资金流异常 - for d in active: - code = d["code"] - stock_cf = cf.get("stocks", {}).get(code, {}) - analysis = stock_cf.get("analysis", {}) - alerts = analysis.get("alerts", []) - if alerts: - name = d.get("name", code) - for a in alerts: - outputs.append(f" 💰 {name}({code}) {a}") - except Exception: - pass - - # === 第四步:情景变化检测 + 输出 → 直接推XMPP === - now_str = datetime.now().strftime("%H:%M:%S") - elapsed = time.time() - start - - # 情景变化检测(跨轮对比) - if HAS_TREE and _SCENARIO_CACHE.get('id'): - prev_scenario = state.get('_system', {}).get('last_scenario', '') - curr_scenario = _SCENARIO_CACHE['id'] - if prev_scenario and curr_scenario != prev_scenario: - combo = _SCENARIO_CACHE.get('combo_action', '') - outputs.insert(0, f"🌀 情景切换: {prev_scenario}→{curr_scenario} | {combo}") - if outputs: - state.setdefault('_system', {})['last_scenario'] = curr_scenario - state_updated = True - elif not prev_scenario: - state.setdefault('_system', {})['last_scenario'] = curr_scenario - state_updated = True - - if outputs: - # 简短一行一个触发 - for o in outputs: - print(o) - # 推送XMPP(只推关键事件:止损跌破+情景切换+资金流异动,不推买入区进出/重评等操作细节) - critical = [o for o in outputs if o.startswith(("⚠️", "🌀", "💰"))] - if critical: - try: - body = "\n".join([f"{now_str}"] + critical) - payload = json.dumps({ - "to": "hmo@yoin.fun", "body": body, "type": "chat", - }).encode("utf-8") - req = urllib.request.Request( - "http://127.0.0.1:5805/", data=payload, - headers={"Content-Type": "application/json"}, - ) - urllib.request.urlopen(req, timeout=5) - except Exception: - pass - # else: SILENT — 无触发,无输出,不推 - - if state_updated: - save_state(state) - - -def main(): - """每cron触发跑一轮""" - run_once() - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""price_monitor.py — 高频价格监控脚本(批量版) +规则:进入区间报一次,离开区间报一次,中间不重复。 +每次运行时一次性刷新所有持仓+自选股的实时价。 +""" +import json +import urllib.request +import os +import sys +import time +from datetime import datetime + +# ── MoFin unified model ────────────────────────────────────────────── +from mo_models import is_hk_stock, get_hk_rate, calc_total_assets, calc_total_mv, calc_position_pct +from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_price_event, write_watchlist_stock +from mo_data import read_portfolio, read_decisions, read_watchlist + +DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" +WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" +BREACH_PATH = "/home/hmo/.hermes/zone_breach.json" +STATE_PATH = os.path.expanduser("~/.hermes/price_trigger_state.json") +EVENTS_PATH = "/home/hmo/web-dashboard/data/price_events.json" + +# 策略重评依赖(技术面驱动,非机械百分比) +sys.path.insert(0, "/home/hmo/web-dashboard") +try: + from strategy_lifecycle import reassess_strategy + HAS_REASSESS = True +except ImportError: + HAS_REASSESS = False + +try: + HK_RATE = get_hk_rate() +except Exception: + HK_RATE = 0.87 # ultimate fallback + +# 分支系统与情景检测 +try: + sys.path.insert(0, '/home/hmo/MoFin') + from strategy_tree import detect_scenario, evaluate_branches + HAS_TREE = True +except Exception: + HAS_TREE = False + def detect_scenario(): return {} + def evaluate_branches(*a, **kw): return [] + +# 情景缓存(每次run_once刷新) +_SCENARIO_CACHE = {} +_BRANCH_CACHE = {} # code -> branches list + +UA = "Mozilla/5.0" + +# ── 批量拉取价格 ────────────────────────────────────────────────────────── + +def fetch_all_prices(codes): + """腾讯批量行情API:仅用于A股(沪市/深市) + A股:sh600110 / sz000001 + 港股已迁移至 fetch_hk_eastmoney()(东方财富实时行情) + 返回 {code: (price, change, change_pct)} + """ + if not codes: + return {} + + # 只处理A股(6位代码),港股走东方财富 + a_codes = [c for c in codes if len(str(c).strip()) == 6] + if not a_codes: + return {} + + symbols = [] + code_map = {} + for code in a_codes: + code_s = str(code).strip() + if code_s.startswith(('5', '6', '9')): + sym = f"sh{code_s}" + else: + sym = f"sz{code_s}" + symbols.append(sym) + code_map[sym] = code_s + + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + try: + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=10) as r: + text = r.read().decode("gbk") + except Exception as e: + print(f"⚠️ 腾讯A股拉取失败: {e}", file=sys.stderr) + return {} + + results = {} + for line in text.strip().split("\n"): + line = line.strip() + if not line or "=" not in line: + continue + try: + raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw_value.split("~") + if len(fields) < 6: + continue + sym = line.split("=", 1)[0].strip().lstrip("v_") + orig_code = code_map.get(sym) + if not orig_code: + continue + price = float(fields[3]) if fields[3] else 0 + prev_close = float(fields[4]) if fields[4] else 0 + change = price - prev_close if prev_close > 0 else 0 + change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" + results[orig_code] = (price, change, change_pct) + except (ValueError, IndexError): + continue + + return results + + +# ── 港股实时行情(东方财富,无15分钟延迟)────────────────────────────── + +def fetch_hk_eastmoney(codes): + """东方财富港股实时行情 API — 免费、实时、无15分钟延迟。 + + API: push2.eastmoney.com + 市场代码: 116 (港交所) + 格式: 116.00700 + + 返回 {code: (price, change, change_pct)} + + Fallback: 失败时回退到腾讯 qt.gtimg.cn(15分钟延迟) + """ + if not codes: + return {} + + hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] + if not hk_codes: + return {} + + results = {} + + # 主通道:东方财富实时行情(逐股查询,港股仅~10只,<1秒完成。该API不支持批量) + for code in hk_codes: + try: + url = (f"https://push2.eastmoney.com/api/qt/stock/get" + f"?secid=116.{code}" + f"&fields=f43,f170,f60,f57,f58" + f"&fltt=2") + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=5) as r: + resp = json.loads(r.read().decode("utf-8")) + + if resp.get("rc") != 0: + continue + item = resp.get("data", {}) + if not item: + continue + price = float(item.get("f43", 0)) if item.get("f43") else 0 + prev_close = float(item.get("f60", 0)) if item.get("f60") else 0 + change = round(price - prev_close, 2) if prev_close > 0 else 0 + change_pct = str(item.get("f170", "0")) + if price > 0: + results[code] = (price, change, change_pct) + time.sleep(0.1) # 防止触发东财反爬(逐股查询,不支持批量) + except Exception as e: + print(f"⚠️ 东方财富 {code} 拉取失败: {e}", file=sys.stderr) + continue + + # Fallback: 腾讯 qt.gtimg.cn(15分钟延迟) + missing = [c for c in hk_codes if c not in results] + if missing: + try: + fallback = _fetch_hk_tencent_fallback(missing) + results.update(fallback) + except Exception: + pass + + return results + + +def _fetch_hk_tencent_fallback(codes): + """腾讯港股行情(15分钟延迟,仅作 fallback)""" + symbols = [f"hk{c}" for c in codes] + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=10) as r: + text = r.read().decode("gbk") + + code_map = {f"hk{c}": c for c in codes} + results = {} + for line in text.strip().split("\n"): + if "=" not in line: + continue + try: + raw = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw.split("~") + if len(fields) < 6: + continue + sym = line.split("=", 1)[0].strip().lstrip("v_") + orig = code_map.get(sym) + if not orig: + continue + price = float(fields[3]) if fields[3] else 0 + prev_close = float(fields[4]) if fields[4] else 0 + change = price - prev_close if prev_close > 0 else 0 + change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" + results[orig] = (price, change, change_pct) + except (ValueError, IndexError): + continue + return results + + +def refresh_data_prices(): + """一次性刷新portfolio.json和watchlist.json的所有实时价""" + all_codes = set() + + # 收集所有需要拉取的代码 + try: + pf = mo_data.read_portfolio() + for s in pf.get('holdings', []): + all_codes.add(s['code']) + except: + pf = {"holdings": []} + + try: + wl = mo_data.read_watchlist() + for s in wl.get('stocks', []): + all_codes.add(s['code']) + except: + wl = {"stocks": []} + + if not all_codes: + return 0 + + # 分批拉取:A股走腾讯(实时) + 港股走东方财富(实时) + all_list = list(all_codes) + prices = fetch_all_prices(all_list) # A股(腾讯,实时) + hk_prices = fetch_hk_eastmoney(all_list) # 港股(东方财富,实时) + prices.update(hk_prices) + updated = 0 + + # 保存全量实时价快照(供报告管道消费,确保分析用最新数据) + try: + live = {"updated_at": datetime.now().isoformat(), "prices": {}} + for code in all_codes: + if code in prices: + p, c, chg = prices[code] + live["prices"][code] = {"price": p, "change_pct": chg} + json.dump(live, open("/home/hmo/web-dashboard/data/live_prices.json", "w"), indent=2) + except Exception: + pass + + # 更新portfolio(只在价格变化时写入,避免触发文件变更通知) + changed = False + for s in pf.get('holdings', []): + if s['code'] in prices: + price, _, change_pct = prices[s['code']] + if price > 0: + # 港股:API返回HKD,需转RMB + if is_hk_stock(s['code']): + price = round(price * HK_RATE, 2) + old = s.get('price', 0) + if abs(old - price) > 0.001: + s['price'] = round(price, 2) + s['change_pct'] = float(change_pct) if change_pct else 0 + updated += 1 + changed = True + if changed: + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + pf['total_mv'] = calc_total_mv(pf.get('holdings', [])) + pf['total_assets'] = calc_total_assets(pf) + pf['position_pct'] = calc_position_pct(pf) + # DB 写入(替代 json.dump,强制币种约束) + try: + conn = get_conn() + write_holdings_batch(conn, pf['holdings']) + write_portfolio_summary(conn, pf) + conn.close() + except Exception as e: + print(f" [DB写入失败] {e}", flush=True) + # 保留 JSON 副本作为冷备 + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + elif pf.get('updated_at'): + try: + last_ts = datetime.strptime(pf['updated_at'], '%Y-%m-%d %H:%M') + if (datetime.now() - last_ts).total_seconds() > 600: + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + except: + pass + + # 更新watchlist(只在价格变化时写入) + changed = False + for s in wl.get('stocks', []): + if s['code'] in prices: + price, _, change_pct = prices[s['code']] + if price > 0: + # 港股:API返回HKD,需转RMB + if is_hk_stock(s['code']): + price = round(price * HK_RATE, 2) + old = s.get('price', 0) + if abs(old - price) > 0.001: + s['price'] = round(price, 2) + s['change_pct'] = float(change_pct) if change_pct else 0 + updated += 1 + changed = True + if changed: + wl['updated_at'] = datetime.now().isoformat() + # DB 写入(替代 json.dump) + try: + conn = get_conn() + for s in wl.get('stocks', []): + s['currency'] = 'CNY' # 自选股价格统一CNY + write_watchlist_stock(conn, s) + conn.close() + except Exception as e: + print(f" [DB watchlist写入失败] {e}", flush=True) + # 保留 JSON 冷备 + json.dump(wl, open(WATCHLIST_PATH, 'w'), ensure_ascii=False, indent=2) + + # --- 汇总值重算(使用 mo_models 唯一公式)--- + try: + live_market_value = calc_total_mv(pf.get('holdings', [])) + old_mv = pf.get('total_mv', 0) + + if abs(old_mv - live_market_value) > 0.01: + pf['total_mv'] = round(live_market_value, 2) + + pf['total_assets'] = calc_total_assets(pf) + if pf['total_assets'] > 0: + pf['position_pct'] = calc_position_pct(pf) + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + # DB 写入 + try: + conn = get_conn() + write_portfolio_summary(conn, pf) + conn.close() + except Exception as e: + print(f" [DB汇总写入失败] {e}", flush=True) + # JSON 冷备 + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + except Exception as e: + print(f" [汇总重算失败] {e}", flush=True) + # --- 结束汇总重算 --- + + return updated + + +# ── 分支系统辅助函数 ────────────────────────────────────────────────────── + +def _branch_alert_suffix(code, price, shares=0, cost=0): + """返回分支信息后缀:「 | 情景→动作」""" + if not HAS_TREE or not _SCENARIO_CACHE.get('id'): + return "" + try: + sc_id = _SCENARIO_CACHE['id'] + results = evaluate_branches(code, sc_id, price, shares, cost) + for r in results: + if r.get('applicable'): + _record_branch_trigger(code, r.get('branch_id',''), price) + branch_action = r.get('action_type', r.get('action', 'hold')) + return f" | {sc_id}→{branch_action}" + except Exception: + pass + return "" + + +def _record_branch_trigger(code, branch_id, price): + """记录分支触发事件(自成长:trigger_count+1)""" + try: + raw = mo_data.read_decisions() + for d in raw.get('decisions', []): + if d.get('code') == code and d.get('strategy_tree',{}).get('branches'): + for b in d['strategy_tree']['branches']: + if b['id'] == branch_id: + b.setdefault('trigger_count', 0) + b['trigger_count'] += 1 + b['last_trigger_price'] = round(price, 2) + b['last_triggered'] = datetime.now().isoformat() + break + json.dump(raw, open(DECISIONS_PATH, 'w'), ensure_ascii=False, indent=2) + except Exception: + pass + + +# ── 区间偏离检测 ────────────────────────────────────────────────────────── + +def load_state(): + try: + with open(STATE_PATH) as f: + return json.load(f) + except: + return {} + +def save_state(state): + os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) + with open(STATE_PATH, 'w') as f: + json.dump(state, f, ensure_ascii=False, indent=2) + +def load_breaches(): + try: + with open(BREACH_PATH) as f: + return json.load(f) + except: + return {} + +def save_breaches(data): + os.makedirs(os.path.dirname(BREACH_PATH), exist_ok=True) + with open(BREACH_PATH, 'w') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def load_events(): + try: + with open(EVENTS_PATH) as f: + return json.load(f) + except: + return {"events": []} + + +def save_events(events): + os.makedirs(os.path.dirname(EVENTS_PATH), exist_ok=True) + with open(EVENTS_PATH, 'w') as f: + json.dump(events, f, ensure_ascii=False, indent=2) + + +def record_event(code, name, event_type, price, trigger_value, event_label=""): + """记录一次价格触发事件到 price_events.json + SQLite""" + events = load_events() + now = datetime.now().isoformat() + events["events"].append({ + "code": code, + "name": name, + "event_type": event_type, # entry_zone, stop_loss, take_profit, exit_zone + "price": round(price, 2), + "trigger_value": trigger_value, + "event_label": event_label, + "timestamp": now, + "date": datetime.now().strftime("%Y-%m-%d"), + }) + # 保留最近10000条 + events["events"] = events["events"][-10000:] + save_events(events) + + # ── SQLite 双写 ── + try: + from mofin_db import get_conn, init_all_tables, write_price_event + conn = get_conn() + init_all_tables(conn) + write_price_event(conn, code, name, event_type, price, trigger_value, event_label) + conn.close() + except Exception: + pass # SQLite 写入失败不影响主流程 + + +def get_trigger_zones(d): + """返回该decision所有可监控的区间列表,从顶层字段读取""" + zones = [] + is_holding = d.get('shares', 0) > 0 + # 买入区间(自选和持仓都监控) + el = d.get("entry_low", 0) + eh = d.get("entry_high", 0) + if el and eh and float(el) > 0 and float(eh) > 0: + try: + zones.append(("entry_zone", "买入区间", float(el), float(eh))) + except: + pass + # 止损+止盈(只有持仓才监控,自选无意义) + if is_holding: + sl = d.get("stop_loss", 0) + if sl and float(sl) > 0: + try: + zones.append(("stop_loss", "止损", 0, float(sl))) + except: + pass + tp = d.get("take_profit", 0) + if tp and float(tp) > 0: + try: + zones.append(("take_profit_zone", "止盈区间", 0, float(tp))) + except: + pass + return zones + + +def run_once(round_label=""): + """执行一轮完整的监控流程""" + global _SCENARIO_CACHE, _BRANCH_CACHE + label = f" [{round_label}]" if round_label else "" + start = time.time() + + # 刷新情景与分支缓存(每轮更新) + _SCENARIO_CACHE = detect_scenario() if HAS_TREE else {} + _BRANCH_CACHE = {} + try: + raw = mo_data.read_decisions() + for d in raw.get('decisions', []): + tree = d.get('strategy_tree', {}) + if tree and tree.get('branches'): + _BRANCH_CACHE[d['code']] = tree['branches'] + except Exception: + pass + + # === 第一步:一次性刷新所有价格 === + refreshed = refresh_data_prices() + + # === 第二步:检查触发条件 === + try: + with open(DECISIONS_PATH) as f: + dec = json.load(f) + except: + print(f"❌{label} 无法读取decisions.json", file=sys.stderr) + return + + active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")] + state = load_state() + outputs = [] + state_updated = False + + # 收集所有需要检查的代码 + check_codes = set() + for d in active: + if get_trigger_zones(d): + check_codes.add(d["code"]) + + # 批量拉取这些股票的价格 + prices = fetch_all_prices(list(check_codes)) + + for d in active: + code = d["code"] + + zones = get_trigger_zones(d) + if not zones: + continue + + price_info = prices.get(code) + if not price_info: + continue + price, _, _ = price_info + if price == 0: + continue + + name = d.get("name", code) + if code not in state: + state[code] = {} + + for key, label, lo, hi in zones: + in_zone = lo <= price <= hi + prev_in_zone = state[code].get(key, None) + + if in_zone and prev_in_zone != True: + if key == "stop_loss": + branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) + outputs.append(f"⚠️ {name}({code}) {price} → 跌破止损{hi}!{branch_sfx}") + record_event(code, name, "stop_loss", price, str(hi)) + else: + extra = "" + if "_price" in key: + batch_shares = d.get(key.replace("_price", "_shares"), "") + action = d.get(key.replace("_price", "_action"), "") + if batch_shares: + extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股" + elif key in ("take_profit_zone",): + act = d.get("take_profit_action", "") + if act: + extra = f"({act})" + branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) + outputs.append(f"⚡ {name}({code}) {price} → 进入{label}{lo}~{hi}{extra}{branch_sfx}") + record_event(code, name, "entry_zone", price, f"{lo}~{hi}", label) + state[code][key] = True + state_updated = True + + elif not in_zone and prev_in_zone == True: + if key != "stop_loss": + outputs.append(f"📌 {name}({code}) {price} → 离开{label}{lo}~{hi}") + state[code][key] = False + state_updated = True + + # === 第三步:买入区偏离检测 + 自动重评 === + reassesed_codes = [] + for d in active: + code = d["code"] + name = d.get("name", code) + price_info = prices.get(code) + if not price_info: + continue + price, _, _ = price_info + if price == 0: + continue + + # 从 decisions.json 中读取 analysis 的买入区 + entry_low = d.get("entry_low", 0) + entry_high = d.get("entry_high", 0) + if not entry_low or not entry_high: + continue + + in_buy_zone = entry_low <= price <= entry_high + prev_in_buy_zone = state.get(code, {}).get("__buy_zone", None) + + # 状态变化时才触发 + if in_buy_zone and prev_in_buy_zone == False: + # 重新进入买入区 → 重评确认区间是否仍然有效 + outputs.append(f"🔄 {name}({code}) {price} → 重新进入买入区{entry_low}~{entry_high},触发技术面重评") + do_reassess = True + elif not in_buy_zone and prev_in_buy_zone == True: + # 离开买入区 → 立即重评,更新止损/止盈/区间 + outputs.append(f"🔄 {name}({code}) {price} → 离开买入区{entry_low}~{entry_high},立即技术面重评") + do_reassess = True + else: + do_reassess = False + + if do_reassess and HAS_REASSESS: + try: + cost = d.get("cost", 0) or 0 + shares = d.get("shares", 0) or 0 + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_deep_loss = profit_pct < -20 + sentiment = "neutral" + if d.get("tech_snapshot"): + if "bearish" in d["tech_snapshot"]: + sentiment = "bearish" + elif "bullish" in d["tech_snapshot"]: + sentiment = "bullish" + + # 调用技术面驱动重评(非机械百分比) + result = reassess_strategy( + code, name, price, cost, shares, + current_action=d.get("action", ""), + volume_signal="中性", sentiment=sentiment, + ) + outputs.append(f" 📊 新策略: 损{result['stop_loss']} 盈{result['take_profit']} 区{result['entry_low']}~{result['entry_high']} RR={result['rr_ratio']}") + reassesed_codes.append(code) + except Exception as e: + outputs.append(f" ⚠️ 重评失败: {e}") + + # 更新买入区状态 + if "__buy_zone" not in state.get(code, {}): + if code not in state: + state[code] = {} + state[code]["__buy_zone"] = in_buy_zone + state_updated = True + + # 如果有重评过的股票,更新 decisions.json + if reassesed_codes and HAS_REASSESS: + try: + # 重新 regenerate_all 只针对受影响的股票效率太低 + # 直接全量重评(regenerate_all 内部会批量拉价格、做技术分析) + from strategy_lifecycle import regenerate_all + r = regenerate_all(stdout=False) + outputs.append(f" ✅ 策略已全量重评: {r.get('ok',0)}/{r.get('total',0)}成功") + outputs.append(f" 📌 触发股票: {', '.join(reassesed_codes)}") + except Exception as e: + outputs.append(f" ⚠️ 全量重评失败: {e}") + + # === 3.5 资金流异常检测(2026-06-27 新增)=== + try: + cf = json.load(open("/home/hmo/web-dashboard/data/capital_flow_cache.json")) + # 检查所有 active decision 中的资金流异常 + for d in active: + code = d["code"] + stock_cf = cf.get("stocks", {}).get(code, {}) + analysis = stock_cf.get("analysis", {}) + alerts = analysis.get("alerts", []) + if alerts: + name = d.get("name", code) + for a in alerts: + outputs.append(f" 💰 {name}({code}) {a}") + except Exception: + pass + + # === 第四步:情景变化检测 + 输出 → 直接推XMPP === + now_str = datetime.now().strftime("%H:%M:%S") + elapsed = time.time() - start + + # 情景变化检测(跨轮对比) + if HAS_TREE and _SCENARIO_CACHE.get('id'): + prev_scenario = state.get('_system', {}).get('last_scenario', '') + curr_scenario = _SCENARIO_CACHE['id'] + if prev_scenario and curr_scenario != prev_scenario: + combo = _SCENARIO_CACHE.get('combo_action', '') + outputs.insert(0, f"🌀 情景切换: {prev_scenario}→{curr_scenario} | {combo}") + if outputs: + state.setdefault('_system', {})['last_scenario'] = curr_scenario + state_updated = True + elif not prev_scenario: + state.setdefault('_system', {})['last_scenario'] = curr_scenario + state_updated = True + + if outputs: + # 简短一行一个触发 + for o in outputs: + print(o) + # 推送XMPP(只推关键事件:止损跌破+情景切换+资金流异动,不推买入区进出/重评等操作细节) + critical = [o for o in outputs if o.startswith(("⚠️", "🌀", "💰"))] + if critical: + try: + body = "\n".join([f"{now_str}"] + critical) + payload = json.dumps({ + "to": "hmo@yoin.fun", "body": body, "type": "chat", + }).encode("utf-8") + req = urllib.request.Request( + "http://127.0.0.1:5805/", data=payload, + headers={"Content-Type": "application/json"}, + ) + urllib.request.urlopen(req, timeout=5) + except Exception: + pass + # else: SILENT — 无触发,无输出,不推 + + if state_updated: + save_state(state) + + +def main(): + """每cron触发跑一轮""" + run_once() + + +if __name__ == "__main__": + main() diff --git a/scripts/capital_flow_collector.py b/scripts/capital_flow_collector.py index 18efb91..7bf450a 100644 --- a/scripts/capital_flow_collector.py +++ b/scripts/capital_flow_collector.py @@ -11,6 +11,7 @@ from datetime import datetime from urllib.request import urlopen, Request from concurrent.futures import ThreadPoolExecutor, as_completed from threading import Semaphore +from mo_data import read_portfolio, read_decisions, read_watchlist DATA_DIR = "/home/hmo/web-dashboard/data" DECISIONS_PATH = f"{DATA_DIR}/decisions.json" @@ -135,7 +136,7 @@ def main(): codes = set() # 读取持仓+自选 try: - dec = json.load(open(DECISIONS_PATH)) + dec = mo_data.read_decisions() for d in dec.get("decisions", []): c = d.get("code", "") if c: diff --git a/scripts/clean_watchlist.py b/scripts/clean_watchlist.py index f6cda1c..222f2a0 100644 --- a/scripts/clean_watchlist.py +++ b/scripts/clean_watchlist.py @@ -2,12 +2,13 @@ """Remove held stocks from watchlist""" import json, os +from mo_data import read_portfolio, read_decisions, read_watchlist WL = "/home/hmo/web-dashboard/data/watchlist.json" DEC = "/home/hmo/web-dashboard/data/decisions.json" holding_codes = set() -pf = json.load(open("/home/hmo/web-dashboard/data/portfolio.json")) +pf = mo_data.read_portfolio() for h in pf.get("holdings", []): c = h.get("code", "") if c: diff --git a/scripts/data_governance.py b/scripts/data_governance.py index 6015811..91ab14f 100644 --- a/scripts/data_governance.py +++ b/scripts/data_governance.py @@ -9,6 +9,7 @@ import json, sqlite3 from pathlib import Path from datetime import datetime +from mo_data import read_portfolio, read_decisions, read_watchlist BASE = Path("/home/hmo/MoFin") DATA = BASE / "data" @@ -60,7 +61,7 @@ def main(): print(f"holding_strategies: 归档{archived}条过期记录 | 剩余活跃{remaining}条") # 2. 检查缺失策略的持仓 - decisions = json.loads(DECISIONS_PATH.read_text()) + decisions = mo_data.read_decisions() decisions_list = decisions.get("decisions", []) missing = check_missing_strategies(conn, decisions_list) if missing: diff --git a/scripts/data_validate.py b/scripts/data_validate.py index 62fdcd5..d613ce0 100644 --- a/scripts/data_validate.py +++ b/scripts/data_validate.py @@ -12,6 +12,7 @@ import json, sys from datetime import datetime, timezone +from mo_data import read_portfolio, read_decisions, read_watchlist DATA_DIR = "/home/hmo/web-dashboard/data" PORTFOLIO_PATH = f"{DATA_DIR}/portfolio.json" @@ -22,7 +23,7 @@ issues = [] # ── 1. 总资产校验 ──────────────────────────────────────────── try: - pf = json.load(open(PORTFOLIO_PATH)) + pf = mo_data.read_portfolio() mv_calc = sum(h["shares"] * h["price"] for h in pf.get("holdings", []) if h.get("price")) stored_ta = pf.get("total_assets", 0) cash = pf.get("cash", 0) @@ -35,7 +36,7 @@ except Exception as e: # ── 2. 持仓 vs 决策交叉检查 ────────────────────────────────── try: - dec = json.load(open(DECISIONS_PATH)) + dec = mo_data.read_decisions() dec_codes = {} for d in dec.get("decisions", []): dec_codes[d["code"]] = d diff --git a/scripts/fix_trigger.py b/scripts/fix_trigger.py index 8bc832b..33a3e55 100644 --- a/scripts/fix_trigger.py +++ b/scripts/fix_trigger.py @@ -2,6 +2,7 @@ """修复decisions.json中所有决策的trigger字段(由regenerate_all负责填充)""" import json, sys, os +from mo_data import read_portfolio, read_decisions, read_watchlist DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" DECISIONS_BAK = DECISIONS_PATH + ".bak" @@ -42,7 +43,7 @@ for d in dec.get("decisions", []): # 备份 os.makedirs(os.path.dirname(DECISIONS_BAK), exist_ok=True) with open(DECISIONS_BAK, 'w') as f: - json.dump(json.load(open(DECISIONS_PATH)), f, indent=2, ensure_ascii=False) + json.dump(mo_data.read_decisions(), f, indent=2, ensure_ascii=False) with open(DECISIONS_PATH, 'w') as f: json.dump(dec, f, indent=2, ensure_ascii=False) diff --git a/scripts/intraday_health_check.py b/scripts/intraday_health_check.py index 14af743..9bea90f 100644 --- a/scripts/intraday_health_check.py +++ b/scripts/intraday_health_check.py @@ -8,6 +8,7 @@ import json, os, sqlite3, subprocess, urllib.request from pathlib import Path from datetime import datetime, timedelta +from mo_data import read_portfolio, read_decisions, read_watchlist BASE = Path("/home/hmo/MoFin") DATA = BASE / "data" @@ -113,7 +114,7 @@ def check_price_monitor(): # 检查portfolio.json数据新鲜度 try: - pf = json.load(open(PORTFOLIO_PATH)) + pf = mo_data.read_portfolio() pf_updated = pf.get("updated_at", "") if pf_updated: pf_dt = datetime.strptime(pf_updated, "%Y-%m-%d %H:%M") diff --git a/scripts/price_monitor.py b/scripts/price_monitor.py index 4a81ffe..6405d34 100644 --- a/scripts/price_monitor.py +++ b/scripts/price_monitor.py @@ -1,788 +1,789 @@ -#!/usr/bin/env python3 -"""price_monitor.py — 高频价格监控脚本(批量版) -规则:进入区间报一次,离开区间报一次,中间不重复。 -每次运行时一次性刷新所有持仓+自选股的实时价。 -""" -import json -import urllib.request -import os -import sys -import time -from datetime import datetime - -# ── MoFin unified model ────────────────────────────────────────────── -sys.path.insert(0, "/home/hmo/MoFin") -from mo_models import is_hk_stock, get_hk_rate, calc_total_assets, calc_total_mv, calc_position_pct -from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_price_event, write_watchlist_stock - -DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" -WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" -BREACH_PATH = "/home/hmo/.hermes/zone_breach.json" -STATE_PATH = os.path.expanduser("~/.hermes/price_trigger_state.json") -EVENTS_PATH = "/home/hmo/web-dashboard/data/price_events.json" - -# 策略重评依赖(技术面驱动,非机械百分比) -sys.path.insert(0, "/home/hmo/web-dashboard") -try: - from strategy_lifecycle import reassess_strategy - HAS_REASSESS = True -except ImportError: - HAS_REASSESS = False - -try: - HK_RATE = get_hk_rate() -except Exception: - HK_RATE = 0.87 # ultimate fallback - -# 分支系统与情景检测 -try: - sys.path.insert(0, '/home/hmo/MoFin') - from strategy_tree import detect_scenario, evaluate_branches - HAS_TREE = True -except Exception: - HAS_TREE = False - def detect_scenario(): return {} - def evaluate_branches(*a, **kw): return [] - -# 情景缓存(每次run_once刷新) -_SCENARIO_CACHE = {} -_BRANCH_CACHE = {} # code -> branches list - -UA = "Mozilla/5.0" - -# ── 批量拉取价格 ────────────────────────────────────────────────────────── - -def fetch_all_prices(codes): - """腾讯批量行情API:仅用于A股(沪市/深市) - A股:sh600110 / sz000001 - 港股已迁移至 fetch_hk_eastmoney()(东方财富实时行情) - 返回 {code: (price, change, change_pct)} - """ - if not codes: - return {} - - # 只处理A股(6位代码),港股走东方财富 - a_codes = [c for c in codes if len(str(c).strip()) == 6] - if not a_codes: - return {} - - symbols = [] - code_map = {} - for code in a_codes: - code_s = str(code).strip() - if code_s.startswith(('5', '6', '9')): - sym = f"sh{code_s}" - else: - sym = f"sz{code_s}" - symbols.append(sym) - code_map[sym] = code_s - - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - try: - req = urllib.request.Request(url, headers={"User-Agent": UA}) - with urllib.request.urlopen(req, timeout=10) as r: - text = r.read().decode("gbk") - except Exception as e: - print(f"⚠️ 腾讯A股拉取失败: {e}", file=sys.stderr) - return {} - - results = {} - for line in text.strip().split("\n"): - line = line.strip() - if not line or "=" not in line: - continue - try: - raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw_value.split("~") - if len(fields) < 6: - continue - sym = line.split("=", 1)[0].strip().lstrip("v_") - orig_code = code_map.get(sym) - if not orig_code: - continue - price = float(fields[3]) if fields[3] else 0 - prev_close = float(fields[4]) if fields[4] else 0 - change = price - prev_close if prev_close > 0 else 0 - change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" - results[orig_code] = (price, change, change_pct) - except (ValueError, IndexError): - continue - - return results - - -# ── 港股实时行情(新浪财经批量版,实时,无延迟)───────────────────────────── - -def fetch_hk_sina_batch(codes): - """新浪财经港股批量实时行情 — 一次HTTP请求获取全部港股。 - - 新浪港股API(hq.sinajs.cn)支持批量查询,返回实时数据。 - 对比东财逐股查询(0.2s间隔×17只=3.4s),新浪1次请求搞定。 - - API: https://hq.sinajs.cn/list=hk00700,hk09988 - 格式: hq_str_hk00700="TENCENT,腾讯控股,当前价,昨收,开盘,最高,最低,涨跌额,涨跌幅,..." - - 返回 {code: (price, change, change_pct)} - """ - if not codes: - return {} - - hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] - if not hk_codes: - return {} - - symbols = [f"hk{c}" for c in hk_codes] - url = f"https://hq.sinajs.cn/list={','.join(symbols)}" - - try: - # 新浪要求有 Referer,且需绕过系统代理(某些环境下东财/新浪走代理会断连) - proxy_handler = urllib.request.ProxyHandler({}) - opener = urllib.request.build_opener(proxy_handler) - req = urllib.request.Request(url, headers={ - "User-Agent": "Mozilla/5.0", - "Referer": "https://finance.sina.com.cn", - }) - with opener.open(req, timeout=10) as r: - text = r.read().decode("gbk") - except Exception as e: - print(f"⚠️ 新浪港股批量拉取失败: {e}", file=sys.stderr) - return {} - - results = {} - for line in text.strip().split("\n"): - line = line.strip() - if "=" not in line: - continue - try: - code = line.split("=", 1)[0].replace("hq_str_hk", "").replace("var ", "").strip() - raw = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw.split(",") - if len(fields) < 9: - continue - price = float(fields[2]) if fields[2] else 0 - prev_close = float(fields[3]) if fields[3] else 0 - change_amt = float(fields[7]) if fields[7] else 0 - change_pct = fields[8] if fields[8] else "0" - # 新浪 field[2] 可能非实时最新价,用 prev_close + change 计算更准确 - if prev_close > 0 and abs(change_amt) > 0: - price = round(prev_close + change_amt, 2) - change = round(change_amt, 2) - if price > 0: - results[code] = (price, change, change_pct) - except (ValueError, IndexError): - continue - - return results - - -# ── 港股备用通道(东方财富逐股 + 腾讯15min延迟)─────────────────────────── - -def fetch_hk_eastmoney_fallback(codes): - """东方财富港股实时行情(备用通道),逐股查询、间隔1秒避免限流。 - - FTP 说明:港股限流严重,不适合主通道,降级为备用。 - 建议用上面的 fetch_hk_sina_batch() 做主通道。 - - 返回 {code: (price, change, change_pct)} - Fallback: 仍失败时回退到腾讯 qt.gtimg.cn(15分钟延迟) - """ - if not codes: - return {} - - hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] - if not hk_codes: - return {} - - results = {} - - # 东方财富逐股查询,1秒间隔避免限流 - for code in hk_codes: - try: - url = (f"https://push2.eastmoney.com/api/qt/stock/get" - f"?secid=116.{code}" - f"&fields=f43,f170,f60,f57,f58" - f"&fltt=2") - proxy_handler = urllib.request.ProxyHandler({}) - opener = urllib.request.build_opener(proxy_handler) - req = urllib.request.Request(url, headers={ - "User-Agent": UA, - "Referer": "https://quote.eastmoney.com/", - }) - with opener.open(req, timeout=5) as r: - resp = json.loads(r.read().decode("utf-8")) - - if resp.get("rc") != 0: - continue - item = resp.get("data", {}) - if not item: - continue - price = float(item.get("f43", 0)) if item.get("f43") else 0 - prev_close = float(item.get("f60", 0)) if item.get("f60") else 0 - change = round(price - prev_close, 2) if prev_close > 0 else 0 - change_pct = str(item.get("f170", "0")) - if price > 0: - results[code] = (price, change, change_pct) - time.sleep(1.0) # 1秒间隔,大幅降低限流概率 - except Exception as e: - print(f" [东财备用 {code}] {e}", file=sys.stderr) - continue - - # Fallback: 腾讯 qt.gtimg.cn(15分钟延迟) - missing = [c for c in hk_codes if c not in results] - if missing: - try: - fallback = _fetch_hk_tencent_fallback(missing) - results.update(fallback) - except Exception: - pass - - return results - - -def _fetch_hk_tencent_fallback(codes): - """腾讯港股行情(15分钟延迟,仅作 fallback)""" - symbols = [f"hk{c}" for c in codes] - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - req = urllib.request.Request(url, headers={"User-Agent": UA}) - with urllib.request.urlopen(req, timeout=10) as r: - text = r.read().decode("gbk") - - code_map = {f"hk{c}": c for c in codes} - results = {} - for line in text.strip().split("\n"): - if "=" not in line: - continue - try: - raw = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw.split("~") - if len(fields) < 6: - continue - sym = line.split("=", 1)[0].strip().lstrip("v_") - orig = code_map.get(sym) - if not orig: - continue - price = float(fields[3]) if fields[3] else 0 - prev_close = float(fields[4]) if fields[4] else 0 - change = price - prev_close if prev_close > 0 else 0 - change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" - results[orig] = (price, change, change_pct) - except (ValueError, IndexError): - continue - return results - - -def refresh_data_prices(): - """一次性刷新portfolio.json和watchlist.json的所有实时价""" - all_codes = set() - - # 收集所有需要拉取的代码 - try: - pf = json.load(open(PORTFOLIO_PATH)) - for s in pf.get('holdings', []): - all_codes.add(s['code']) - except: - pf = {"holdings": []} - - try: - wl = json.load(open(WATCHLIST_PATH)) - for s in wl.get('stocks', []): - all_codes.add(s['code']) - except: - wl = {"stocks": []} - - if not all_codes: - return 0 - - # 分批拉取:A股走腾讯(实时) + 港股走新浪批量(实时,无限流) - all_list = list(all_codes) - prices = fetch_all_prices(all_list) # A股(腾讯,实时) - hk_prices = fetch_hk_sina_batch(all_list) # 港股(新浪批量,实时) - # 新浪未覆盖的走备用通道(东财逐股→腾讯15min延迟) - hk_codes_missing = [c for c in all_list if len(str(c).strip()) <= 5 and c not in hk_prices] - if hk_codes_missing: - fallback = fetch_hk_eastmoney_fallback(hk_codes_missing) - hk_prices.update(fallback) - prices.update(hk_prices) - updated = 0 - - # 保存全量实时价快照(供报告管道消费,确保分析用最新数据) - try: - live = {"updated_at": datetime.now().isoformat(), "prices": {}} - for code in all_codes: - if code in prices: - p, c, chg = prices[code] - live["prices"][code] = {"price": p, "change_pct": chg} - json.dump(live, open("/home/hmo/web-dashboard/data/live_prices.json", "w"), indent=2) - except Exception: - pass - - # 更新portfolio(只在价格变化时写入,避免触发文件变更通知) - changed = False - for s in pf.get('holdings', []): - if s['code'] in prices: - price, _, change_pct = prices[s['code']] - if price > 0: - # 港股:API返回HKD,需转RMB - if is_hk_stock(s['code']): - price = round(price * HK_RATE, 2) - old = s.get('price', 0) - if abs(old - price) > 0.001: - s['price'] = round(price, 2) - s['change_pct'] = float(change_pct) if change_pct else 0 - updated += 1 - changed = True - if changed: - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - pf['total_mv'] = calc_total_mv(pf.get('holdings', [])) - pf['total_assets'] = calc_total_assets(pf) - pf['position_pct'] = calc_position_pct(pf) - # DB 写入(替代 json.dump,强制币种约束) - try: - conn = get_conn() - write_holdings_batch(conn, pf['holdings']) - write_portfolio_summary(conn, pf) - conn.close() - except Exception as e: - print(f" [DB写入失败] {e}", flush=True) - # 保留 JSON 副本作为冷备 - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - elif pf.get('updated_at'): - try: - last_ts = datetime.strptime(pf['updated_at'], '%Y-%m-%d %H:%M') - if (datetime.now() - last_ts).total_seconds() > 600: - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - except: - pass - - # 更新watchlist(只在价格变化时写入) - changed = False - for s in wl.get('stocks', []): - if s['code'] in prices: - price, _, change_pct = prices[s['code']] - if price > 0: - # 港股:API返回HKD,需转RMB - if is_hk_stock(s['code']): - price = round(price * HK_RATE, 2) - old = s.get('price', 0) - if abs(old - price) > 0.001: - s['price'] = round(price, 2) - s['change_pct'] = float(change_pct) if change_pct else 0 - updated += 1 - changed = True - if changed: - wl['updated_at'] = datetime.now().isoformat() - # DB 写入(替代 json.dump) - try: - conn = get_conn() - for s in wl.get('stocks', []): - s['currency'] = 'CNY' # 自选股价格统一CNY - write_watchlist_stock(conn, s) - conn.close() - except Exception as e: - print(f" [DB watchlist写入失败] {e}", flush=True) - # 保留 JSON 冷备 - json.dump(wl, open(WATCHLIST_PATH, 'w'), ensure_ascii=False, indent=2) - - # --- 汇总值重算(使用 mo_models 唯一公式)--- - try: - live_market_value = calc_total_mv(pf.get('holdings', [])) - old_mv = pf.get('total_mv', 0) - - if abs(old_mv - live_market_value) > 0.01: - pf['total_mv'] = round(live_market_value, 2) - - pf['total_assets'] = calc_total_assets(pf) - if pf['total_assets'] > 0: - pf['position_pct'] = calc_position_pct(pf) - pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') - # DB 写入 - try: - conn = get_conn() - write_portfolio_summary(conn, pf) - conn.close() - except Exception as e: - print(f" [DB汇总写入失败] {e}", flush=True) - # JSON 冷备 - json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) - except Exception as e: - print(f" [汇总重算失败] {e}", flush=True) - # --- 结束汇总重算 --- - - return updated - - -# ── 分支系统辅助函数 ────────────────────────────────────────────────────── - -def _branch_alert_suffix(code, price, shares=0, cost=0): - """返回分支信息后缀:「 | 情景→动作」""" - if not HAS_TREE or not _SCENARIO_CACHE.get('id'): - return "" - try: - sc_id = _SCENARIO_CACHE['id'] - results = evaluate_branches(code, sc_id, price, shares, cost) - for r in results: - if r.get('applicable'): - _record_branch_trigger(code, r.get('branch_id',''), price) - branch_action = r.get('action_type', r.get('action', 'hold')) - return f" | {sc_id}→{branch_action}" - except Exception: - pass - return "" - - -def _record_branch_trigger(code, branch_id, price): - """记录分支触发事件(自成长:trigger_count+1)""" - try: - raw = json.load(open(DECISIONS_PATH)) - for d in raw.get('decisions', []): - if d.get('code') == code and d.get('strategy_tree',{}).get('branches'): - for b in d['strategy_tree']['branches']: - if b['id'] == branch_id: - b.setdefault('trigger_count', 0) - b['trigger_count'] += 1 - b['last_trigger_price'] = round(price, 2) - b['last_triggered'] = datetime.now().isoformat() - break - json.dump(raw, open(DECISIONS_PATH, 'w'), ensure_ascii=False, indent=2) - except Exception: - pass - - -# ── 区间偏离检测 ────────────────────────────────────────────────────────── - -def load_state(): - try: - with open(STATE_PATH) as f: - return json.load(f) - except: - return {} - -def save_state(state): - os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) - with open(STATE_PATH, 'w') as f: - json.dump(state, f, ensure_ascii=False, indent=2) - -def load_breaches(): - try: - with open(BREACH_PATH) as f: - return json.load(f) - except: - return {} - -def save_breaches(data): - os.makedirs(os.path.dirname(BREACH_PATH), exist_ok=True) - with open(BREACH_PATH, 'w') as f: - json.dump(data, f, ensure_ascii=False, indent=2) - - -def load_events(): - try: - with open(EVENTS_PATH) as f: - return json.load(f) - except: - return {"events": []} - - -def save_events(events): - os.makedirs(os.path.dirname(EVENTS_PATH), exist_ok=True) - with open(EVENTS_PATH, 'w') as f: - json.dump(events, f, ensure_ascii=False, indent=2) - - -def record_event(code, name, event_type, price, trigger_value, event_label=""): - """记录一次价格触发事件到 price_events.json + SQLite""" - events = load_events() - now = datetime.now().isoformat() - events["events"].append({ - "code": code, - "name": name, - "event_type": event_type, # entry_zone, stop_loss, take_profit, exit_zone - "price": round(price, 2), - "trigger_value": trigger_value, - "event_label": event_label, - "timestamp": now, - "date": datetime.now().strftime("%Y-%m-%d"), - }) - # 保留最近10000条 - events["events"] = events["events"][-10000:] - save_events(events) - - # ── SQLite 双写 ── - try: - from mofin_db import get_conn, init_all_tables, write_price_event - conn = get_conn() - init_all_tables(conn) - write_price_event(conn, code, name, event_type, price, trigger_value, event_label) - conn.close() - except Exception: - pass # SQLite 写入失败不影响主流程 - - -def get_trigger_zones(d): - """返回该decision所有可监控的区间列表,从顶层字段读取""" - zones = [] - is_holding = d.get('shares', 0) > 0 - # 买入区间(自选和持仓都监控) - el = d.get("entry_low", 0) - eh = d.get("entry_high", 0) - if el and eh and float(el) > 0 and float(eh) > 0: - try: - zones.append(("entry_zone", "买入区间", float(el), float(eh))) - except: - pass - # 止损+止盈(只有持仓才监控,自选无意义) - if is_holding: - sl = d.get("stop_loss", 0) - if sl and float(sl) > 0: - try: - zones.append(("stop_loss", "止损", 0, float(sl))) - except: - pass - tp = d.get("take_profit", 0) - if tp and float(tp) > 0: - try: - zones.append(("take_profit_zone", "止盈区间", 0, float(tp))) - except: - pass - return zones - - -def run_once(round_label=""): - """执行一轮完整的监控流程""" - global _SCENARIO_CACHE, _BRANCH_CACHE - label = f" [{round_label}]" if round_label else "" - start = time.time() - - # 刷新情景与分支缓存(每轮更新) - _SCENARIO_CACHE = detect_scenario() if HAS_TREE else {} - _BRANCH_CACHE = {} - try: - raw = json.load(open(DECISIONS_PATH)) - for d in raw.get('decisions', []): - tree = d.get('strategy_tree', {}) - if tree and tree.get('branches'): - _BRANCH_CACHE[d['code']] = tree['branches'] - except Exception: - pass - - # === 第一步:一次性刷新所有价格 === - refreshed = refresh_data_prices() - - # === 第二步:检查触发条件 === - try: - with open(DECISIONS_PATH) as f: - dec = json.load(f) - except: - print(f"❌{label} 无法读取decisions.json", file=sys.stderr) - return - - active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")] - state = load_state() - outputs = [] - state_updated = False - - # 收集所有需要检查的代码 - check_codes = set() - for d in active: - if get_trigger_zones(d): - check_codes.add(d["code"]) - - # 批量拉取这些股票的价格 - prices = fetch_all_prices(list(check_codes)) - - for d in active: - code = d["code"] - - zones = get_trigger_zones(d) - if not zones: - continue - - price_info = prices.get(code) - if not price_info: - continue - price, _, _ = price_info - if price == 0: - continue - - name = d.get("name", code) - if code not in state: - state[code] = {} - - for key, label, lo, hi in zones: - in_zone = lo <= price <= hi - prev_in_zone = state[code].get(key, None) - - if in_zone and prev_in_zone != True: - if key == "stop_loss": - branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) - outputs.append(f"⚠️ {name}({code}) {price} → 跌破止损{hi}!{branch_sfx}") - record_event(code, name, "stop_loss", price, str(hi)) - else: - extra = "" - if "_price" in key: - batch_shares = d.get(key.replace("_price", "_shares"), "") - action = d.get(key.replace("_price", "_action"), "") - if batch_shares: - extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股" - elif key in ("take_profit_zone",): - act = d.get("take_profit_action", "") - if act: - extra = f"({act})" - branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) - outputs.append(f"⚡ {name}({code}) {price} → 进入{label}{lo}~{hi}{extra}{branch_sfx}") - record_event(code, name, "entry_zone", price, f"{lo}~{hi}", label) - state[code][key] = True - state_updated = True - - elif not in_zone and prev_in_zone == True: - if key != "stop_loss": - outputs.append(f"📌 {name}({code}) {price} → 离开{label}{lo}~{hi}") - state[code][key] = False - state_updated = True - - # === 第三步:买入区偏离检测 + 自动重评 === - reassesed_codes = [] - for d in active: - code = d["code"] - name = d.get("name", code) - price_info = prices.get(code) - if not price_info: - continue - price, _, _ = price_info - if price == 0: - continue - - # 从 decisions.json 中读取 analysis 的买入区 - entry_low = d.get("entry_low", 0) - entry_high = d.get("entry_high", 0) - if not entry_low or not entry_high: - continue - - in_buy_zone = entry_low <= price <= entry_high - prev_in_buy_zone = state.get(code, {}).get("__buy_zone", None) - - # 状态变化时才触发:True→False离区 或 False→True进区 - # [2026-07-01 fix] prev_in_buy_zone is None(新加自选首次检测) - # 也要触发——否则新自选全程不走重评,timing_signal卡在初始值 - if in_buy_zone and (prev_in_buy_zone == False or prev_in_buy_zone is None): - # 进入买入区 → 触发技术面重评,更新止损/止盈/信号 - outputs.append(f"🔄 {name}({code}) {price} → 重新进入买入区{entry_low}~{entry_high},触发技术面重评") - do_reassess = True - elif not in_buy_zone and prev_in_buy_zone == True: - # 离开买入区 → 立即重评,更新止损/止盈/区间 - outputs.append(f"🔄 {name}({code}) {price} → 离开买入区{entry_low}~{entry_high},立即技术面重评") - do_reassess = True - else: - do_reassess = False - - if do_reassess and HAS_REASSESS: - try: - cost = d.get("cost", 0) or 0 - shares = d.get("shares", 0) or 0 - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_deep_loss = profit_pct < -20 - sentiment = "neutral" - if d.get("tech_snapshot"): - if "bearish" in d["tech_snapshot"]: - sentiment = "bearish" - elif "bullish" in d["tech_snapshot"]: - sentiment = "bullish" - - # 调用技术面驱动重评(非机械百分比) - result = reassess_strategy( - code, name, price, cost, shares, - current_action=d.get("action", ""), - volume_signal="中性", sentiment=sentiment, - ) - outputs.append(f" 📊 新策略: 损{result['stop_loss']} 盈{result['take_profit']} 区{result['entry_low']}~{result['entry_high']} RR={result['rr_ratio']}") - reassesed_codes.append(code) - except Exception as e: - outputs.append(f" ⚠️ 重评失败: {e}") - - # 更新买入区状态 - if "__buy_zone" not in state.get(code, {}): - if code not in state: - state[code] = {} - state[code]["__buy_zone"] = in_buy_zone - state_updated = True - - # 如果有重评过的股票,更新 decisions.json - if reassesed_codes and HAS_REASSESS: - try: - # 重新 regenerate_all 只针对受影响的股票效率太低 - # 直接全量重评(regenerate_all 内部会批量拉价格、做技术分析) - from strategy_lifecycle import regenerate_all - r = regenerate_all(stdout=False) - outputs.append(f" ✅ 策略已全量重评: {r.get('ok',0)}/{r.get('total',0)}成功") - outputs.append(f" 📌 触发股票: {', '.join(reassesed_codes)}") - except Exception as e: - outputs.append(f" ⚠️ 全量重评失败: {e}") - - # === 3.5 资金流异常检测(2026-06-27 新增)=== - try: - cf = json.load(open("/home/hmo/web-dashboard/data/capital_flow_cache.json")) - # 检查所有 active decision 中的资金流异常 - for d in active: - code = d["code"] - stock_cf = cf.get("stocks", {}).get(code, {}) - analysis = stock_cf.get("analysis", {}) - alerts = analysis.get("alerts", []) - if alerts: - name = d.get("name", code) - for a in alerts: - outputs.append(f" 💰 {name}({code}) {a}") - except Exception: - pass - - # === 第四步:情景变化检测 + 输出 → 直接推XMPP === - now_str = datetime.now().strftime("%H:%M:%S") - elapsed = time.time() - start - - # 情景变化检测(跨轮对比) - if HAS_TREE and _SCENARIO_CACHE.get('id'): - prev_scenario = state.get('_system', {}).get('last_scenario', '') - curr_scenario = _SCENARIO_CACHE['id'] - if prev_scenario and curr_scenario != prev_scenario: - combo = _SCENARIO_CACHE.get('combo_action', '') - outputs.insert(0, f"🌀 情景切换: {prev_scenario}→{curr_scenario} | {combo}") - if outputs: - state.setdefault('_system', {})['last_scenario'] = curr_scenario - state_updated = True - elif not prev_scenario: - state.setdefault('_system', {})['last_scenario'] = curr_scenario - state_updated = True - - if outputs: - # 简短一行一个触发 - for o in outputs: - print(o) - # 推送XMPP(只推关键事件:止损跌破+情景切换+资金流异动,不推买入区进出/重评等操作细节) - critical = [o for o in outputs if o.startswith(("⚠️", "🌀", "💰"))] - if critical: - try: - body = "\n".join([f"{now_str}"] + critical) - payload = json.dumps({ - "to": "hmo@yoin.fun", "body": body, "type": "chat", - }).encode("utf-8") - req = urllib.request.Request( - "http://127.0.0.1:5805/", data=payload, - headers={"Content-Type": "application/json"}, - ) - urllib.request.urlopen(req, timeout=5) - except Exception: - pass - # else: SILENT — 无触发,无输出,不推 - - if state_updated: - save_state(state) - - -def main(): - """每cron触发跑一轮""" - run_once() - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""price_monitor.py — 高频价格监控脚本(批量版) +规则:进入区间报一次,离开区间报一次,中间不重复。 +每次运行时一次性刷新所有持仓+自选股的实时价。 +""" +import json +import urllib.request +import os +import sys +import time +from datetime import datetime + +# ── MoFin unified model ────────────────────────────────────────────── +sys.path.insert(0, "/home/hmo/MoFin") +from mo_models import is_hk_stock, get_hk_rate, calc_total_assets, calc_total_mv, calc_position_pct +from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_price_event, write_watchlist_stock +from mo_data import read_portfolio, read_decisions, read_watchlist + +DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" +WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" +BREACH_PATH = "/home/hmo/.hermes/zone_breach.json" +STATE_PATH = os.path.expanduser("~/.hermes/price_trigger_state.json") +EVENTS_PATH = "/home/hmo/web-dashboard/data/price_events.json" + +# 策略重评依赖(技术面驱动,非机械百分比) +sys.path.insert(0, "/home/hmo/web-dashboard") +try: + from strategy_lifecycle import reassess_strategy + HAS_REASSESS = True +except ImportError: + HAS_REASSESS = False + +try: + HK_RATE = get_hk_rate() +except Exception: + HK_RATE = 0.87 # ultimate fallback + +# 分支系统与情景检测 +try: + sys.path.insert(0, '/home/hmo/MoFin') + from strategy_tree import detect_scenario, evaluate_branches + HAS_TREE = True +except Exception: + HAS_TREE = False + def detect_scenario(): return {} + def evaluate_branches(*a, **kw): return [] + +# 情景缓存(每次run_once刷新) +_SCENARIO_CACHE = {} +_BRANCH_CACHE = {} # code -> branches list + +UA = "Mozilla/5.0" + +# ── 批量拉取价格 ────────────────────────────────────────────────────────── + +def fetch_all_prices(codes): + """腾讯批量行情API:仅用于A股(沪市/深市) + A股:sh600110 / sz000001 + 港股已迁移至 fetch_hk_eastmoney()(东方财富实时行情) + 返回 {code: (price, change, change_pct)} + """ + if not codes: + return {} + + # 只处理A股(6位代码),港股走东方财富 + a_codes = [c for c in codes if len(str(c).strip()) == 6] + if not a_codes: + return {} + + symbols = [] + code_map = {} + for code in a_codes: + code_s = str(code).strip() + if code_s.startswith(('5', '6', '9')): + sym = f"sh{code_s}" + else: + sym = f"sz{code_s}" + symbols.append(sym) + code_map[sym] = code_s + + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + try: + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=10) as r: + text = r.read().decode("gbk") + except Exception as e: + print(f"⚠️ 腾讯A股拉取失败: {e}", file=sys.stderr) + return {} + + results = {} + for line in text.strip().split("\n"): + line = line.strip() + if not line or "=" not in line: + continue + try: + raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw_value.split("~") + if len(fields) < 6: + continue + sym = line.split("=", 1)[0].strip().lstrip("v_") + orig_code = code_map.get(sym) + if not orig_code: + continue + price = float(fields[3]) if fields[3] else 0 + prev_close = float(fields[4]) if fields[4] else 0 + change = price - prev_close if prev_close > 0 else 0 + change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" + results[orig_code] = (price, change, change_pct) + except (ValueError, IndexError): + continue + + return results + + +# ── 港股实时行情(新浪财经批量版,实时,无延迟)───────────────────────────── + +def fetch_hk_sina_batch(codes): + """新浪财经港股批量实时行情 — 一次HTTP请求获取全部港股。 + + 新浪港股API(hq.sinajs.cn)支持批量查询,返回实时数据。 + 对比东财逐股查询(0.2s间隔×17只=3.4s),新浪1次请求搞定。 + + API: https://hq.sinajs.cn/list=hk00700,hk09988 + 格式: hq_str_hk00700="TENCENT,腾讯控股,当前价,昨收,开盘,最高,最低,涨跌额,涨跌幅,..." + + 返回 {code: (price, change, change_pct)} + """ + if not codes: + return {} + + hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] + if not hk_codes: + return {} + + symbols = [f"hk{c}" for c in hk_codes] + url = f"https://hq.sinajs.cn/list={','.join(symbols)}" + + try: + # 新浪要求有 Referer,且需绕过系统代理(某些环境下东财/新浪走代理会断连) + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) + req = urllib.request.Request(url, headers={ + "User-Agent": "Mozilla/5.0", + "Referer": "https://finance.sina.com.cn", + }) + with opener.open(req, timeout=10) as r: + text = r.read().decode("gbk") + except Exception as e: + print(f"⚠️ 新浪港股批量拉取失败: {e}", file=sys.stderr) + return {} + + results = {} + for line in text.strip().split("\n"): + line = line.strip() + if "=" not in line: + continue + try: + code = line.split("=", 1)[0].replace("hq_str_hk", "").replace("var ", "").strip() + raw = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw.split(",") + if len(fields) < 9: + continue + price = float(fields[2]) if fields[2] else 0 + prev_close = float(fields[3]) if fields[3] else 0 + change_amt = float(fields[7]) if fields[7] else 0 + change_pct = fields[8] if fields[8] else "0" + # 新浪 field[2] 可能非实时最新价,用 prev_close + change 计算更准确 + if prev_close > 0 and abs(change_amt) > 0: + price = round(prev_close + change_amt, 2) + change = round(change_amt, 2) + if price > 0: + results[code] = (price, change, change_pct) + except (ValueError, IndexError): + continue + + return results + + +# ── 港股备用通道(东方财富逐股 + 腾讯15min延迟)─────────────────────────── + +def fetch_hk_eastmoney_fallback(codes): + """东方财富港股实时行情(备用通道),逐股查询、间隔1秒避免限流。 + + FTP 说明:港股限流严重,不适合主通道,降级为备用。 + 建议用上面的 fetch_hk_sina_batch() 做主通道。 + + 返回 {code: (price, change, change_pct)} + Fallback: 仍失败时回退到腾讯 qt.gtimg.cn(15分钟延迟) + """ + if not codes: + return {} + + hk_codes = [str(c).strip() for c in codes if len(str(c).strip()) <= 5] + if not hk_codes: + return {} + + results = {} + + # 东方财富逐股查询,1秒间隔避免限流 + for code in hk_codes: + try: + url = (f"https://push2.eastmoney.com/api/qt/stock/get" + f"?secid=116.{code}" + f"&fields=f43,f170,f60,f57,f58" + f"&fltt=2") + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) + req = urllib.request.Request(url, headers={ + "User-Agent": UA, + "Referer": "https://quote.eastmoney.com/", + }) + with opener.open(req, timeout=5) as r: + resp = json.loads(r.read().decode("utf-8")) + + if resp.get("rc") != 0: + continue + item = resp.get("data", {}) + if not item: + continue + price = float(item.get("f43", 0)) if item.get("f43") else 0 + prev_close = float(item.get("f60", 0)) if item.get("f60") else 0 + change = round(price - prev_close, 2) if prev_close > 0 else 0 + change_pct = str(item.get("f170", "0")) + if price > 0: + results[code] = (price, change, change_pct) + time.sleep(1.0) # 1秒间隔,大幅降低限流概率 + except Exception as e: + print(f" [东财备用 {code}] {e}", file=sys.stderr) + continue + + # Fallback: 腾讯 qt.gtimg.cn(15分钟延迟) + missing = [c for c in hk_codes if c not in results] + if missing: + try: + fallback = _fetch_hk_tencent_fallback(missing) + results.update(fallback) + except Exception: + pass + + return results + + +def _fetch_hk_tencent_fallback(codes): + """腾讯港股行情(15分钟延迟,仅作 fallback)""" + symbols = [f"hk{c}" for c in codes] + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + req = urllib.request.Request(url, headers={"User-Agent": UA}) + with urllib.request.urlopen(req, timeout=10) as r: + text = r.read().decode("gbk") + + code_map = {f"hk{c}": c for c in codes} + results = {} + for line in text.strip().split("\n"): + if "=" not in line: + continue + try: + raw = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw.split("~") + if len(fields) < 6: + continue + sym = line.split("=", 1)[0].strip().lstrip("v_") + orig = code_map.get(sym) + if not orig: + continue + price = float(fields[3]) if fields[3] else 0 + prev_close = float(fields[4]) if fields[4] else 0 + change = price - prev_close if prev_close > 0 else 0 + change_pct = fields[32] if len(fields) > 32 and fields[32] else "0" + results[orig] = (price, change, change_pct) + except (ValueError, IndexError): + continue + return results + + +def refresh_data_prices(): + """一次性刷新portfolio.json和watchlist.json的所有实时价""" + all_codes = set() + + # 收集所有需要拉取的代码 + try: + pf = mo_data.read_portfolio() + for s in pf.get('holdings', []): + all_codes.add(s['code']) + except: + pf = {"holdings": []} + + try: + wl = mo_data.read_watchlist() + for s in wl.get('stocks', []): + all_codes.add(s['code']) + except: + wl = {"stocks": []} + + if not all_codes: + return 0 + + # 分批拉取:A股走腾讯(实时) + 港股走新浪批量(实时,无限流) + all_list = list(all_codes) + prices = fetch_all_prices(all_list) # A股(腾讯,实时) + hk_prices = fetch_hk_sina_batch(all_list) # 港股(新浪批量,实时) + # 新浪未覆盖的走备用通道(东财逐股→腾讯15min延迟) + hk_codes_missing = [c for c in all_list if len(str(c).strip()) <= 5 and c not in hk_prices] + if hk_codes_missing: + fallback = fetch_hk_eastmoney_fallback(hk_codes_missing) + hk_prices.update(fallback) + prices.update(hk_prices) + updated = 0 + + # 保存全量实时价快照(供报告管道消费,确保分析用最新数据) + try: + live = {"updated_at": datetime.now().isoformat(), "prices": {}} + for code in all_codes: + if code in prices: + p, c, chg = prices[code] + live["prices"][code] = {"price": p, "change_pct": chg} + json.dump(live, open("/home/hmo/web-dashboard/data/live_prices.json", "w"), indent=2) + except Exception: + pass + + # 更新portfolio(只在价格变化时写入,避免触发文件变更通知) + changed = False + for s in pf.get('holdings', []): + if s['code'] in prices: + price, _, change_pct = prices[s['code']] + if price > 0: + # 港股:API返回HKD,需转RMB + if is_hk_stock(s['code']): + price = round(price * HK_RATE, 2) + old = s.get('price', 0) + if abs(old - price) > 0.001: + s['price'] = round(price, 2) + s['change_pct'] = float(change_pct) if change_pct else 0 + updated += 1 + changed = True + if changed: + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + pf['total_mv'] = calc_total_mv(pf.get('holdings', [])) + pf['total_assets'] = calc_total_assets(pf) + pf['position_pct'] = calc_position_pct(pf) + # DB 写入(替代 json.dump,强制币种约束) + try: + conn = get_conn() + write_holdings_batch(conn, pf['holdings']) + write_portfolio_summary(conn, pf) + conn.close() + except Exception as e: + print(f" [DB写入失败] {e}", flush=True) + # 保留 JSON 副本作为冷备 + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + elif pf.get('updated_at'): + try: + last_ts = datetime.strptime(pf['updated_at'], '%Y-%m-%d %H:%M') + if (datetime.now() - last_ts).total_seconds() > 600: + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + except: + pass + + # 更新watchlist(只在价格变化时写入) + changed = False + for s in wl.get('stocks', []): + if s['code'] in prices: + price, _, change_pct = prices[s['code']] + if price > 0: + # 港股:API返回HKD,需转RMB + if is_hk_stock(s['code']): + price = round(price * HK_RATE, 2) + old = s.get('price', 0) + if abs(old - price) > 0.001: + s['price'] = round(price, 2) + s['change_pct'] = float(change_pct) if change_pct else 0 + updated += 1 + changed = True + if changed: + wl['updated_at'] = datetime.now().isoformat() + # DB 写入(替代 json.dump) + try: + conn = get_conn() + for s in wl.get('stocks', []): + s['currency'] = 'CNY' # 自选股价格统一CNY + write_watchlist_stock(conn, s) + conn.close() + except Exception as e: + print(f" [DB watchlist写入失败] {e}", flush=True) + # 保留 JSON 冷备 + json.dump(wl, open(WATCHLIST_PATH, 'w'), ensure_ascii=False, indent=2) + + # --- 汇总值重算(使用 mo_models 唯一公式)--- + try: + live_market_value = calc_total_mv(pf.get('holdings', [])) + old_mv = pf.get('total_mv', 0) + + if abs(old_mv - live_market_value) > 0.01: + pf['total_mv'] = round(live_market_value, 2) + + pf['total_assets'] = calc_total_assets(pf) + if pf['total_assets'] > 0: + pf['position_pct'] = calc_position_pct(pf) + pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M') + # DB 写入 + try: + conn = get_conn() + write_portfolio_summary(conn, pf) + conn.close() + except Exception as e: + print(f" [DB汇总写入失败] {e}", flush=True) + # JSON 冷备 + json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2) + except Exception as e: + print(f" [汇总重算失败] {e}", flush=True) + # --- 结束汇总重算 --- + + return updated + + +# ── 分支系统辅助函数 ────────────────────────────────────────────────────── + +def _branch_alert_suffix(code, price, shares=0, cost=0): + """返回分支信息后缀:「 | 情景→动作」""" + if not HAS_TREE or not _SCENARIO_CACHE.get('id'): + return "" + try: + sc_id = _SCENARIO_CACHE['id'] + results = evaluate_branches(code, sc_id, price, shares, cost) + for r in results: + if r.get('applicable'): + _record_branch_trigger(code, r.get('branch_id',''), price) + branch_action = r.get('action_type', r.get('action', 'hold')) + return f" | {sc_id}→{branch_action}" + except Exception: + pass + return "" + + +def _record_branch_trigger(code, branch_id, price): + """记录分支触发事件(自成长:trigger_count+1)""" + try: + raw = mo_data.read_decisions() + for d in raw.get('decisions', []): + if d.get('code') == code and d.get('strategy_tree',{}).get('branches'): + for b in d['strategy_tree']['branches']: + if b['id'] == branch_id: + b.setdefault('trigger_count', 0) + b['trigger_count'] += 1 + b['last_trigger_price'] = round(price, 2) + b['last_triggered'] = datetime.now().isoformat() + break + json.dump(raw, open(DECISIONS_PATH, 'w'), ensure_ascii=False, indent=2) + except Exception: + pass + + +# ── 区间偏离检测 ────────────────────────────────────────────────────────── + +def load_state(): + try: + with open(STATE_PATH) as f: + return json.load(f) + except: + return {} + +def save_state(state): + os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) + with open(STATE_PATH, 'w') as f: + json.dump(state, f, ensure_ascii=False, indent=2) + +def load_breaches(): + try: + with open(BREACH_PATH) as f: + return json.load(f) + except: + return {} + +def save_breaches(data): + os.makedirs(os.path.dirname(BREACH_PATH), exist_ok=True) + with open(BREACH_PATH, 'w') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def load_events(): + try: + with open(EVENTS_PATH) as f: + return json.load(f) + except: + return {"events": []} + + +def save_events(events): + os.makedirs(os.path.dirname(EVENTS_PATH), exist_ok=True) + with open(EVENTS_PATH, 'w') as f: + json.dump(events, f, ensure_ascii=False, indent=2) + + +def record_event(code, name, event_type, price, trigger_value, event_label=""): + """记录一次价格触发事件到 price_events.json + SQLite""" + events = load_events() + now = datetime.now().isoformat() + events["events"].append({ + "code": code, + "name": name, + "event_type": event_type, # entry_zone, stop_loss, take_profit, exit_zone + "price": round(price, 2), + "trigger_value": trigger_value, + "event_label": event_label, + "timestamp": now, + "date": datetime.now().strftime("%Y-%m-%d"), + }) + # 保留最近10000条 + events["events"] = events["events"][-10000:] + save_events(events) + + # ── SQLite 双写 ── + try: + from mofin_db import get_conn, init_all_tables, write_price_event + conn = get_conn() + init_all_tables(conn) + write_price_event(conn, code, name, event_type, price, trigger_value, event_label) + conn.close() + except Exception: + pass # SQLite 写入失败不影响主流程 + + +def get_trigger_zones(d): + """返回该decision所有可监控的区间列表,从顶层字段读取""" + zones = [] + is_holding = d.get('shares', 0) > 0 + # 买入区间(自选和持仓都监控) + el = d.get("entry_low", 0) + eh = d.get("entry_high", 0) + if el and eh and float(el) > 0 and float(eh) > 0: + try: + zones.append(("entry_zone", "买入区间", float(el), float(eh))) + except: + pass + # 止损+止盈(只有持仓才监控,自选无意义) + if is_holding: + sl = d.get("stop_loss", 0) + if sl and float(sl) > 0: + try: + zones.append(("stop_loss", "止损", 0, float(sl))) + except: + pass + tp = d.get("take_profit", 0) + if tp and float(tp) > 0: + try: + zones.append(("take_profit_zone", "止盈区间", 0, float(tp))) + except: + pass + return zones + + +def run_once(round_label=""): + """执行一轮完整的监控流程""" + global _SCENARIO_CACHE, _BRANCH_CACHE + label = f" [{round_label}]" if round_label else "" + start = time.time() + + # 刷新情景与分支缓存(每轮更新) + _SCENARIO_CACHE = detect_scenario() if HAS_TREE else {} + _BRANCH_CACHE = {} + try: + raw = mo_data.read_decisions() + for d in raw.get('decisions', []): + tree = d.get('strategy_tree', {}) + if tree and tree.get('branches'): + _BRANCH_CACHE[d['code']] = tree['branches'] + except Exception: + pass + + # === 第一步:一次性刷新所有价格 === + refreshed = refresh_data_prices() + + # === 第二步:检查触发条件 === + try: + with open(DECISIONS_PATH) as f: + dec = json.load(f) + except: + print(f"❌{label} 无法读取decisions.json", file=sys.stderr) + return + + active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")] + state = load_state() + outputs = [] + state_updated = False + + # 收集所有需要检查的代码 + check_codes = set() + for d in active: + if get_trigger_zones(d): + check_codes.add(d["code"]) + + # 批量拉取这些股票的价格 + prices = fetch_all_prices(list(check_codes)) + + for d in active: + code = d["code"] + + zones = get_trigger_zones(d) + if not zones: + continue + + price_info = prices.get(code) + if not price_info: + continue + price, _, _ = price_info + if price == 0: + continue + + name = d.get("name", code) + if code not in state: + state[code] = {} + + for key, label, lo, hi in zones: + in_zone = lo <= price <= hi + prev_in_zone = state[code].get(key, None) + + if in_zone and prev_in_zone != True: + if key == "stop_loss": + branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) + outputs.append(f"⚠️ {name}({code}) {price} → 跌破止损{hi}!{branch_sfx}") + record_event(code, name, "stop_loss", price, str(hi)) + else: + extra = "" + if "_price" in key: + batch_shares = d.get(key.replace("_price", "_shares"), "") + action = d.get(key.replace("_price", "_action"), "") + if batch_shares: + extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股" + elif key in ("take_profit_zone",): + act = d.get("take_profit_action", "") + if act: + extra = f"({act})" + branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0)) + outputs.append(f"⚡ {name}({code}) {price} → 进入{label}{lo}~{hi}{extra}{branch_sfx}") + record_event(code, name, "entry_zone", price, f"{lo}~{hi}", label) + state[code][key] = True + state_updated = True + + elif not in_zone and prev_in_zone == True: + if key != "stop_loss": + outputs.append(f"📌 {name}({code}) {price} → 离开{label}{lo}~{hi}") + state[code][key] = False + state_updated = True + + # === 第三步:买入区偏离检测 + 自动重评 === + reassesed_codes = [] + for d in active: + code = d["code"] + name = d.get("name", code) + price_info = prices.get(code) + if not price_info: + continue + price, _, _ = price_info + if price == 0: + continue + + # 从 decisions.json 中读取 analysis 的买入区 + entry_low = d.get("entry_low", 0) + entry_high = d.get("entry_high", 0) + if not entry_low or not entry_high: + continue + + in_buy_zone = entry_low <= price <= entry_high + prev_in_buy_zone = state.get(code, {}).get("__buy_zone", None) + + # 状态变化时才触发:True→False离区 或 False→True进区 + # [2026-07-01 fix] prev_in_buy_zone is None(新加自选首次检测) + # 也要触发——否则新自选全程不走重评,timing_signal卡在初始值 + if in_buy_zone and (prev_in_buy_zone == False or prev_in_buy_zone is None): + # 进入买入区 → 触发技术面重评,更新止损/止盈/信号 + outputs.append(f"🔄 {name}({code}) {price} → 重新进入买入区{entry_low}~{entry_high},触发技术面重评") + do_reassess = True + elif not in_buy_zone and prev_in_buy_zone == True: + # 离开买入区 → 立即重评,更新止损/止盈/区间 + outputs.append(f"🔄 {name}({code}) {price} → 离开买入区{entry_low}~{entry_high},立即技术面重评") + do_reassess = True + else: + do_reassess = False + + if do_reassess and HAS_REASSESS: + try: + cost = d.get("cost", 0) or 0 + shares = d.get("shares", 0) or 0 + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_deep_loss = profit_pct < -20 + sentiment = "neutral" + if d.get("tech_snapshot"): + if "bearish" in d["tech_snapshot"]: + sentiment = "bearish" + elif "bullish" in d["tech_snapshot"]: + sentiment = "bullish" + + # 调用技术面驱动重评(非机械百分比) + result = reassess_strategy( + code, name, price, cost, shares, + current_action=d.get("action", ""), + volume_signal="中性", sentiment=sentiment, + ) + outputs.append(f" 📊 新策略: 损{result['stop_loss']} 盈{result['take_profit']} 区{result['entry_low']}~{result['entry_high']} RR={result['rr_ratio']}") + reassesed_codes.append(code) + except Exception as e: + outputs.append(f" ⚠️ 重评失败: {e}") + + # 更新买入区状态 + if "__buy_zone" not in state.get(code, {}): + if code not in state: + state[code] = {} + state[code]["__buy_zone"] = in_buy_zone + state_updated = True + + # 如果有重评过的股票,更新 decisions.json + if reassesed_codes and HAS_REASSESS: + try: + # 重新 regenerate_all 只针对受影响的股票效率太低 + # 直接全量重评(regenerate_all 内部会批量拉价格、做技术分析) + from strategy_lifecycle import regenerate_all + r = regenerate_all(stdout=False) + outputs.append(f" ✅ 策略已全量重评: {r.get('ok',0)}/{r.get('total',0)}成功") + outputs.append(f" 📌 触发股票: {', '.join(reassesed_codes)}") + except Exception as e: + outputs.append(f" ⚠️ 全量重评失败: {e}") + + # === 3.5 资金流异常检测(2026-06-27 新增)=== + try: + cf = json.load(open("/home/hmo/web-dashboard/data/capital_flow_cache.json")) + # 检查所有 active decision 中的资金流异常 + for d in active: + code = d["code"] + stock_cf = cf.get("stocks", {}).get(code, {}) + analysis = stock_cf.get("analysis", {}) + alerts = analysis.get("alerts", []) + if alerts: + name = d.get("name", code) + for a in alerts: + outputs.append(f" 💰 {name}({code}) {a}") + except Exception: + pass + + # === 第四步:情景变化检测 + 输出 → 直接推XMPP === + now_str = datetime.now().strftime("%H:%M:%S") + elapsed = time.time() - start + + # 情景变化检测(跨轮对比) + if HAS_TREE and _SCENARIO_CACHE.get('id'): + prev_scenario = state.get('_system', {}).get('last_scenario', '') + curr_scenario = _SCENARIO_CACHE['id'] + if prev_scenario and curr_scenario != prev_scenario: + combo = _SCENARIO_CACHE.get('combo_action', '') + outputs.insert(0, f"🌀 情景切换: {prev_scenario}→{curr_scenario} | {combo}") + if outputs: + state.setdefault('_system', {})['last_scenario'] = curr_scenario + state_updated = True + elif not prev_scenario: + state.setdefault('_system', {})['last_scenario'] = curr_scenario + state_updated = True + + if outputs: + # 简短一行一个触发 + for o in outputs: + print(o) + # 推送XMPP(只推关键事件:止损跌破+情景切换+资金流异动,不推买入区进出/重评等操作细节) + critical = [o for o in outputs if o.startswith(("⚠️", "🌀", "💰"))] + if critical: + try: + body = "\n".join([f"{now_str}"] + critical) + payload = json.dumps({ + "to": "hmo@yoin.fun", "body": body, "type": "chat", + }).encode("utf-8") + req = urllib.request.Request( + "http://127.0.0.1:5805/", data=payload, + headers={"Content-Type": "application/json"}, + ) + urllib.request.urlopen(req, timeout=5) + except Exception: + pass + # else: SILENT — 无触发,无输出,不推 + + if state_updated: + save_state(state) + + +def main(): + """每cron触发跑一轮""" + run_once() + + +if __name__ == "__main__": + main() diff --git a/scripts/process_trade.py b/scripts/process_trade.py index e955435..0afc2d2 100644 --- a/scripts/process_trade.py +++ b/scripts/process_trade.py @@ -1,148 +1,149 @@ -#!/usr/bin/env python3 -"""process_trade.py — 处理交易截图,更新 portfolio.json - -Dad 发交易截图后,填入以下信息运行此脚本: - python3 process_trade.py --action buy --code 600563 --shares 100 --price 189.20 - -它会: -1. 更新 holdings(加/减股数,归零则移除) -2. 更新 cash(买入减现金,卖出加现金) -3. 同步更新 decisions.json 的 shares 字段 -4. 记录 changelog - -用法: - python3 process_trade.py --action sell --code 600563 --shares 100 --price 189.20 - python3 process_trade.py --action buy --code 300308 --shares 50 --price 1230.00 -""" -import json, sys, os -from datetime import datetime - -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" -DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" - -def parse_args(): - args = {} - for i, a in enumerate(sys.argv[1:]): - if a.startswith("--"): - key = a.lstrip("-") - val = sys.argv[i+2] if i+2 < len(sys.argv) and not sys.argv[i+2].startswith("--") else None - args[key] = val - return args - -def main(): - args = parse_args() - action = args.get("action", "") - code = args.get("code", "") - shares = int(float(args.get("shares", 0))) - price = float(args.get("price", 0)) - name = args.get("name", "") - - if not action or not code or not shares or not price: - print("用法: python3 process_trade.py --action sell --code 600563 --shares 100 --price 189.20") - sys.exit(1) - - now = datetime.now().strftime("%Y-%m-%d %H:%M") - cost = shares * price - - # 读数据 - pf = json.load(open(PORTFOLIO_PATH)) - dec = json.load(open(DECISIONS_PATH)) - - if action == "sell": - # 找持仓 - found = None - for h in pf["holdings"]: - if h["code"] == code: - found = h - break - if not found: - print(f"❌ 错误: 代码 {code} 未在持仓中找到") - sys.exit(1) - old_shares = found.get("shares", 0) - if old_shares < shares: - print(f"❌ 错误: 持仓只有 {old_shares} 股,不够卖 {shares} 股") - sys.exit(1) - # 减股数 - found["shares"] = old_shares - shares - found["updated_at"] = now - # 归零则移除 - if found["shares"] <= 0: - pf["holdings"] = [h for h in pf["holdings"] if h["code"] != code] - print(f" 已全部清仓,从持仓移除") - # 加现金 - old_cash = pf.get("cash", 0) or 0 - pf["cash"] = round(old_cash + cost, 2) - print(f" ✅ 卖出 {name}({code}) {shares}股 @{price} = {cost:.2f}") - print(f" 现金: {old_cash} → {pf['cash']}") - - elif action == "buy": - # 找是否已有该股 - found = None - for h in pf["holdings"]: - if h["code"] == code: - found = h - break - if found: - # 加权平均成本 - old_shares = found.get("shares", 0) or 0 - old_cost = found.get("cost", 0) or 0 - total_cost = old_cost * old_shares + cost - new_shares = old_shares + shares - new_avg_cost = round(total_cost / new_shares, 2) if new_shares > 0 else price - found["shares"] = new_shares - found["cost"] = new_avg_cost - found["updated_at"] = now - else: - pf["holdings"].append({ - "code": code, "name": name, "shares": shares, - "cost": price, "price": price, "updated_at": now - }) - # 减现金 - old_cash = pf.get("cash", 0) or 0 - pf["cash"] = round(old_cash - cost, 2) - print(f" ✅ 买入 {name}({code}) {shares}股 @{price} = {cost:.2f}") - print(f" 现金: {old_cash} → {pf['cash']}") - - # 同步 decisions.json 的 shares - for d in dec.get("decisions", []): - if d["code"] == code: - old_dec_shares = d.get("shares", 0) or 0 - d["shares"] = (d.get("shares", 0) or 0) + (shares if action == "buy" else -shares) - if d["shares"] <= 0 and action == "sell": - d["shares"] = 0 - d["type"] = "自选策略" - d.setdefault("changelog", []).append({ - "time": now, - "event": action, - "shares": shares, - "price": price, - "total": cost - }) - break - - # 写入 — DB 优先 - pf["updated_at"] = now - try: - sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_holding_strategy - conn = get_conn() - write_holdings_batch(conn, pf.get('holdings', [])) - write_portfolio_summary(conn, pf) - for d in dec.get('decisions', []): - write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) - conn.close() - except Exception: - pass - json.dump(pf, open(PORTFOLIO_PATH, "w"), indent=2, ensure_ascii=False) - json.dump(dec, open(DECISIONS_PATH, "w"), indent=2, ensure_ascii=False) - - # 重算总资产 - total_mv = sum((h.get("shares",0) or 0) * (h.get("price",0) or 0) for h in pf["holdings"]) - total = round(total_mv + (pf.get("cash",0) or 0), 2) - print(f"\n📊 持仓市值: {total_mv:.2f}") - print(f"📊 现金: {pf.get('cash',0):.2f}") - print(f"📊 总资产: {total:.2f}") - print(f"📊 持仓 {len(pf['holdings'])} 只") - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""process_trade.py — 处理交易截图,更新 portfolio.json + +Dad 发交易截图后,填入以下信息运行此脚本: + python3 process_trade.py --action buy --code 600563 --shares 100 --price 189.20 + +它会: +1. 更新 holdings(加/减股数,归零则移除) +2. 更新 cash(买入减现金,卖出加现金) +3. 同步更新 decisions.json 的 shares 字段 +4. 记录 changelog + +用法: + python3 process_trade.py --action sell --code 600563 --shares 100 --price 189.20 + python3 process_trade.py --action buy --code 300308 --shares 50 --price 1230.00 +""" +import json, sys, os +from datetime import datetime +from mo_data import read_portfolio, read_decisions, read_watchlist + +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" +DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" + +def parse_args(): + args = {} + for i, a in enumerate(sys.argv[1:]): + if a.startswith("--"): + key = a.lstrip("-") + val = sys.argv[i+2] if i+2 < len(sys.argv) and not sys.argv[i+2].startswith("--") else None + args[key] = val + return args + +def main(): + args = parse_args() + action = args.get("action", "") + code = args.get("code", "") + shares = int(float(args.get("shares", 0))) + price = float(args.get("price", 0)) + name = args.get("name", "") + + if not action or not code or not shares or not price: + print("用法: python3 process_trade.py --action sell --code 600563 --shares 100 --price 189.20") + sys.exit(1) + + now = datetime.now().strftime("%Y-%m-%d %H:%M") + cost = shares * price + + # 读数据 + pf = mo_data.read_portfolio() + dec = mo_data.read_decisions() + + if action == "sell": + # 找持仓 + found = None + for h in pf["holdings"]: + if h["code"] == code: + found = h + break + if not found: + print(f"❌ 错误: 代码 {code} 未在持仓中找到") + sys.exit(1) + old_shares = found.get("shares", 0) + if old_shares < shares: + print(f"❌ 错误: 持仓只有 {old_shares} 股,不够卖 {shares} 股") + sys.exit(1) + # 减股数 + found["shares"] = old_shares - shares + found["updated_at"] = now + # 归零则移除 + if found["shares"] <= 0: + pf["holdings"] = [h for h in pf["holdings"] if h["code"] != code] + print(f" 已全部清仓,从持仓移除") + # 加现金 + old_cash = pf.get("cash", 0) or 0 + pf["cash"] = round(old_cash + cost, 2) + print(f" ✅ 卖出 {name}({code}) {shares}股 @{price} = {cost:.2f}") + print(f" 现金: {old_cash} → {pf['cash']}") + + elif action == "buy": + # 找是否已有该股 + found = None + for h in pf["holdings"]: + if h["code"] == code: + found = h + break + if found: + # 加权平均成本 + old_shares = found.get("shares", 0) or 0 + old_cost = found.get("cost", 0) or 0 + total_cost = old_cost * old_shares + cost + new_shares = old_shares + shares + new_avg_cost = round(total_cost / new_shares, 2) if new_shares > 0 else price + found["shares"] = new_shares + found["cost"] = new_avg_cost + found["updated_at"] = now + else: + pf["holdings"].append({ + "code": code, "name": name, "shares": shares, + "cost": price, "price": price, "updated_at": now + }) + # 减现金 + old_cash = pf.get("cash", 0) or 0 + pf["cash"] = round(old_cash - cost, 2) + print(f" ✅ 买入 {name}({code}) {shares}股 @{price} = {cost:.2f}") + print(f" 现金: {old_cash} → {pf['cash']}") + + # 同步 decisions.json 的 shares + for d in dec.get("decisions", []): + if d["code"] == code: + old_dec_shares = d.get("shares", 0) or 0 + d["shares"] = (d.get("shares", 0) or 0) + (shares if action == "buy" else -shares) + if d["shares"] <= 0 and action == "sell": + d["shares"] = 0 + d["type"] = "自选策略" + d.setdefault("changelog", []).append({ + "time": now, + "event": action, + "shares": shares, + "price": price, + "total": cost + }) + break + + # 写入 — DB 优先 + pf["updated_at"] = now + try: + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_holding_strategy + conn = get_conn() + write_holdings_batch(conn, pf.get('holdings', [])) + write_portfolio_summary(conn, pf) + for d in dec.get('decisions', []): + write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) + conn.close() + except Exception: + pass + json.dump(pf, open(PORTFOLIO_PATH, "w"), indent=2, ensure_ascii=False) + json.dump(dec, open(DECISIONS_PATH, "w"), indent=2, ensure_ascii=False) + + # 重算总资产 + total_mv = sum((h.get("shares",0) or 0) * (h.get("price",0) or 0) for h in pf["holdings"]) + total = round(total_mv + (pf.get("cash",0) or 0), 2) + print(f"\n📊 持仓市值: {total_mv:.2f}") + print(f"📊 现金: {pf.get('cash',0):.2f}") + print(f"📊 总资产: {total:.2f}") + print(f"📊 持仓 {len(pf['holdings'])} 只") + +if __name__ == "__main__": + main() diff --git a/scripts/stale_detector.py b/scripts/stale_detector.py index 5911b49..bd141c2 100644 --- a/scripts/stale_detector.py +++ b/scripts/stale_detector.py @@ -1,286 +1,287 @@ -#!/usr/bin/env python3 -"""stale_detector.py — 检查所有策略,标记价格偏离/过期的策略 - -读取 decisions.json 的扁平列表。自选策略和持仓策略分开判断。 -可被 cron no_agent 模式调用:stdout 注入到后续 LLM 分析。 - -输出格式: - [FLAG] [自选/持仓] 股票名(代码) 价XX | 买入A~B | 问题 - -用法: - python3 stale_detector.py -""" -import json -import sys -import os -from datetime import datetime, timezone - -DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" - - -def fetch_prices(codes): - """统一价格源:优先 stock_quote.py,腾讯API降级为兜底""" - if not codes: - return {} - # 尝试用 stock_quote.py 获取(脚本强制规范) - try: - import subprocess - script = None - for p in ["/home/hmo/MoFin/scripts/stock_quote.py", "/home/hmo/MoFin/stock_quote.py"]: - if os.path.exists(p): - script = p - break - if script: - result = subprocess.run( - [sys.executable, script] + [str(c) for c in codes], - capture_output=True, text=True, timeout=30 - ) - if result.returncode == 0 and result.stdout.strip(): - results = {} - for line in result.stdout.strip().split("\n"): - if not line.strip(): - continue - try: - item = json.loads(line) - code = str(item.get("code", "")) - price = item.get("price") - change = item.get("change_pct", 0) - if code and price is not None: - results[code] = (float(price), float(change)) - except (json.JSONDecodeError, ValueError): - continue - if results: - return results - except Exception as e: - print(f"[STALE] stock_quote.py 回退: {e}", file=sys.stderr) - - # 兜底:腾讯API(不应依赖,仅作为最后手段) - import urllib.request - symbols, code_map = [], {} - for c in codes: - c = str(c).strip() - p = "sh" if (len(c) == 6 and c[0] in "569") else "sz" if len(c) == 6 else "hk" - sym = f"{p}{c}" - symbols.append(sym) - code_map[sym] = c - try: - req = urllib.request.Request( - f"http://qt.gtimg.cn/q={','.join(symbols)}", - headers={"User-Agent": "curl/7.81"}, - ) - with urllib.request.urlopen(req, timeout=10) as r: - text = r.read().decode("gbk") - except Exception as e: - print(f"FETCH_FAIL (fallback): {e}", file=sys.stderr) - return {} - - results = {} - for line in text.strip().split("\n"): - if "=" not in line: - continue - try: - raw = line.split("=", 1)[1].strip().strip('"').strip(";") - fld = raw.split("~") - if len(fld) < 6: - continue - sym = line.split("=", 1)[0].strip().lstrip("v_") - oc = code_map.get(sym) - if not oc: - continue - p = float(fld[3]) if fld[3] else 0 - c = fld[32] if len(fld) > 32 else "0" - results[oc] = (p, c) - except (ValueError, IndexError): - continue - return results - - -def main(): - decisions_list = json.load(open(DECISIONS_PATH)) - if not isinstance(decisions_list, list): - decisions_list = decisions_list.get("decisions", []) if isinstance(decisions_list, dict) else [] - - # 只保留有买入区的条目,排除已关闭的(inactive/closed) - EXCLUDED_STATUSES = ("closed", "inactive") - to_check = [d for d in decisions_list if (d.get("entry_low") is not None or d.get("entry_high") is not None) and d.get("status") not in EXCLUDED_STATUSES] - if not to_check: - print("[SILENT] 无需要检查的策略") - return 0 - - # ----- 组合级监测:读取总仓位 + 弱势比例 ----- - position_pct = 0 - cash = 0 - total_assets = 0 - try: - with open(PORTFOLIO_PATH) as f: - pf = json.load(f) - position_pct = pf.get("position_pct", 0) - cash = pf.get("cash", 0) - total_assets = pf.get("total_assets", 0) - except Exception: - pass - # 统计持仓策略中弱势/深套的比例 - weak_count = 0 - holding_count = 0 - for d in decisions_list: - if d.get("type") == "持仓策略" and d.get("status") not in ("closed", "inactive"): - holding_count += 1 - cat = d.get("stock_category", "") - if cat in ("弱势", "深套"): - weak_count += 1 - weak_ratio = (weak_count / holding_count * 100) if holding_count > 0 else 0 - - prices = fetch_prices([d["code"] for d in to_check]) - now = datetime.now(timezone.utc).astimezone() - found = 0 - - for d in to_check: - code = d["code"] - name = d.get("name", code) - el = d.get("entry_low") - eh = d.get("entry_high") - sl = d.get("stop_loss") - tp = d.get("take_profit") - ts = d.get("created_at") or d.get("timestamp") or d.get("updated_at", "") - is_wl = "自选" in (d.get("type", "")) - - pi = prices.get(code) - if not pi: - continue - price, chg = pi - if price <= 0: - continue - - issues, flags = [], [] - tag = "[自选]" if is_wl else "[持仓]" - - # -- 偏离 -- - if is_wl and el and eh: - # 读取 timing_signal 判断策略有效性(timing_signal 字段优先,fallback to action) - current_str = d.get("current", "") or "" - timing_signal = d.get("timing_signal", "") or current_str - has_nonbuy_signal = any(kw in timing_signal for kw in [ - "等企稳再入", "等企稳", "弱势持有", "观望", - "不建议买入", "谨慎买入", - ]) - - # 直接计算 R/R(不依赖文本匹配) - rr_invalid = False - if sl and sl > 0 and tp and tp > 0 and price > sl: - rr = (tp - price) / (price - sl) - if rr < 1.5: - rr_invalid = True - # 也检查 tp 是否接近或低于成本(微盈/浮亏止盈) - cost = d.get("cost", 0) - if cost and cost > 0 and tp <= cost * 1.05: - rr_invalid = True - - strategy_deficient = has_nonbuy_signal or rr_invalid - # 对自选无止盈位的也标记(策略不完整) - if not tp or tp == 0: - strategy_deficient = True - - if el <= price <= eh: - flags.append("[WL_IN]") - if strategy_deficient: - flags.append("[STRATEGY_STALE]") - prefix = "⚠️仓位挤占 " if position_pct > 80 else "" - issues.append(f"[STRATEGY_STALE] {prefix}价{price:.2f}在买入区{el}~{eh}但策略不完整({'RR='+f'{rr:.2f}<1.5' if rr_invalid else '无止盈位' if not tp else '非买入信号'}),买入区需重评") - else: - prefix = "⚠️仓位挤占 " if position_pct > 80 else "" - issues.append(f"[PUSH] {prefix}价{price:.2f}入买入区{el}~{eh}") - elif price > eh * 1.35: - flags.append("[WL_HIGH]") - issues.append(f"价{price:.2f}高出买入区+{((price/eh)-1)*100:.0f}%,买入区需重评") - elif price > eh * 1.20: - flags.append("[WL_DRIFT]") - issues.append(f"价{price:.2f}高于买入区+{((price/eh)-1)*100:.0f}%") - elif not is_wl and eh: - dp = (price / eh - 1) * 100 - if dp > 35: - flags.append("[SEVERE]") - issues.append(f"偏离买入区上沿+{dp:.0f}%") - elif dp > 20: - flags.append("[DRIFT]") - issues.append(f"偏离买入区上沿+{dp:.0f}%") - elif dp > 10: - flags.append("[WARN]") - issues.append(f"偏离买入区上沿+{dp:.0f}%") - # 持仓在买入区内但 R/R 不达标 - if el and sl and sl > 0 and tp and tp > 0 and price > sl: - if el <= price <= eh: - rr = (tp - price) / (price - sl) - if rr < 1.5: - flags.append("[RR_WARN]") - issues.append(f"买入区内RR仅{rr:.2f}<1.5,策略需重评") - - # -- 距止损/止盈(仅持仓) -- - if not is_wl: - if sl and sl > 0: - dsl = (price / sl - 1) * 100 - if dsl < 5: - # 成本基准校验:浮盈>5%时止损是利润保护,不是危险信号 - # (mirrors NEAR_TP cost_check logic at line 195-198) - cost = d.get("cost") - if cost and cost > 0 and price > cost * 1.05: - flags.append("[PROFIT_PROTECT]") - pnl = (price / cost - 1) * 100 - issues.append(f"距止损仅{dsl:.1f}%(利润保护,浮盈{pnl:.0f}%)") - else: - flags.append("[NEAR_SL]") - issues.append(f"距止损仅{dsl:.1f}%") - if tp and tp > 0: - dtp = (tp / price - 1) * 100 - if dtp < 5: - # 成本基准校验:止盈标记只有在盈利≥5%时才有效 - cost_check = True - cost = d.get("cost") - if cost and cost > 0 and price < cost * 1.05: - cost_check = False - if cost_check: - flags.append("[NEAR_TP]") - issues.append(f"距止盈仅{dtp:.1f}%") - - # -- 过期 -- - stale_limit = 30 if is_wl else 14 - if ts: - try: - ud = datetime.fromisoformat(ts) - if ud.tzinfo is None: - ud = ud.replace(tzinfo=timezone.utc) - days = (now - ud).days - if days > stale_limit: - flags.append("[STALE]") - issues.append(f"{days}天未更新(>{stale_limit})") - except (ValueError, TypeError): - pass - - if issues: - print(f"{' '.join(flags)} {tag} {name}({code}) 价{price:.2f}{chg} | 买入{el}~{eh} | {'; '.join(issues)}") - found += 1 - - if found == 0: - print("[SILENT] 所有策略正常") - - # ----- 组合级警报 ----- - portfolio_alerts = 0 - if holding_count > 0: - if weak_ratio > 40: - print(f"\n[PORTFOLIO_WEAK] 组合弱势比例{weak_ratio:.0f}% ({weak_count}/{holding_count})!仓位{position_pct:.1f}% → 建议系统性减仓") - portfolio_alerts += 1 - elif weak_ratio > 30: - print(f"\n[PORTFOLIO_WEAK_MILD] 组合弱势比例{weak_ratio:.0f}% ({weak_count}/{holding_count}),仓位{position_pct:.1f}%,关注") - portfolio_alerts += 1 - if position_pct > 80 and holding_count > 0: - # 仓位过满提醒 - print(f"[PORTFOLIO_FULL] 总仓位{position_pct:.1f}% > 80%,现金{cash:.0f}({cash/total_assets*100:.1f}%)") - portfolio_alerts += 1 - if portfolio_alerts > 0: - found += portfolio_alerts - - return found - - -if __name__ == "__main__": - main() +#!/usr/bin/env python3 +"""stale_detector.py — 检查所有策略,标记价格偏离/过期的策略 + +读取 decisions.json 的扁平列表。自选策略和持仓策略分开判断。 +可被 cron no_agent 模式调用:stdout 注入到后续 LLM 分析。 + +输出格式: + [FLAG] [自选/持仓] 股票名(代码) 价XX | 买入A~B | 问题 + +用法: + python3 stale_detector.py +""" +import json +import sys +import os +from datetime import datetime, timezone +from mo_data import read_portfolio, read_decisions, read_watchlist + +DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" + + +def fetch_prices(codes): + """统一价格源:优先 stock_quote.py,腾讯API降级为兜底""" + if not codes: + return {} + # 尝试用 stock_quote.py 获取(脚本强制规范) + try: + import subprocess + script = None + for p in ["/home/hmo/MoFin/scripts/stock_quote.py", "/home/hmo/MoFin/stock_quote.py"]: + if os.path.exists(p): + script = p + break + if script: + result = subprocess.run( + [sys.executable, script] + [str(c) for c in codes], + capture_output=True, text=True, timeout=30 + ) + if result.returncode == 0 and result.stdout.strip(): + results = {} + for line in result.stdout.strip().split("\n"): + if not line.strip(): + continue + try: + item = json.loads(line) + code = str(item.get("code", "")) + price = item.get("price") + change = item.get("change_pct", 0) + if code and price is not None: + results[code] = (float(price), float(change)) + except (json.JSONDecodeError, ValueError): + continue + if results: + return results + except Exception as e: + print(f"[STALE] stock_quote.py 回退: {e}", file=sys.stderr) + + # 兜底:腾讯API(不应依赖,仅作为最后手段) + import urllib.request + symbols, code_map = [], {} + for c in codes: + c = str(c).strip() + p = "sh" if (len(c) == 6 and c[0] in "569") else "sz" if len(c) == 6 else "hk" + sym = f"{p}{c}" + symbols.append(sym) + code_map[sym] = c + try: + req = urllib.request.Request( + f"http://qt.gtimg.cn/q={','.join(symbols)}", + headers={"User-Agent": "curl/7.81"}, + ) + with urllib.request.urlopen(req, timeout=10) as r: + text = r.read().decode("gbk") + except Exception as e: + print(f"FETCH_FAIL (fallback): {e}", file=sys.stderr) + return {} + + results = {} + for line in text.strip().split("\n"): + if "=" not in line: + continue + try: + raw = line.split("=", 1)[1].strip().strip('"').strip(";") + fld = raw.split("~") + if len(fld) < 6: + continue + sym = line.split("=", 1)[0].strip().lstrip("v_") + oc = code_map.get(sym) + if not oc: + continue + p = float(fld[3]) if fld[3] else 0 + c = fld[32] if len(fld) > 32 else "0" + results[oc] = (p, c) + except (ValueError, IndexError): + continue + return results + + +def main(): + decisions_list = mo_data.read_decisions() + if not isinstance(decisions_list, list): + decisions_list = decisions_list.get("decisions", []) if isinstance(decisions_list, dict) else [] + + # 只保留有买入区的条目,排除已关闭的(inactive/closed) + EXCLUDED_STATUSES = ("closed", "inactive") + to_check = [d for d in decisions_list if (d.get("entry_low") is not None or d.get("entry_high") is not None) and d.get("status") not in EXCLUDED_STATUSES] + if not to_check: + print("[SILENT] 无需要检查的策略") + return 0 + + # ----- 组合级监测:读取总仓位 + 弱势比例 ----- + position_pct = 0 + cash = 0 + total_assets = 0 + try: + with open(PORTFOLIO_PATH) as f: + pf = json.load(f) + position_pct = pf.get("position_pct", 0) + cash = pf.get("cash", 0) + total_assets = pf.get("total_assets", 0) + except Exception: + pass + # 统计持仓策略中弱势/深套的比例 + weak_count = 0 + holding_count = 0 + for d in decisions_list: + if d.get("type") == "持仓策略" and d.get("status") not in ("closed", "inactive"): + holding_count += 1 + cat = d.get("stock_category", "") + if cat in ("弱势", "深套"): + weak_count += 1 + weak_ratio = (weak_count / holding_count * 100) if holding_count > 0 else 0 + + prices = fetch_prices([d["code"] for d in to_check]) + now = datetime.now(timezone.utc).astimezone() + found = 0 + + for d in to_check: + code = d["code"] + name = d.get("name", code) + el = d.get("entry_low") + eh = d.get("entry_high") + sl = d.get("stop_loss") + tp = d.get("take_profit") + ts = d.get("created_at") or d.get("timestamp") or d.get("updated_at", "") + is_wl = "自选" in (d.get("type", "")) + + pi = prices.get(code) + if not pi: + continue + price, chg = pi + if price <= 0: + continue + + issues, flags = [], [] + tag = "[自选]" if is_wl else "[持仓]" + + # -- 偏离 -- + if is_wl and el and eh: + # 读取 timing_signal 判断策略有效性(timing_signal 字段优先,fallback to action) + current_str = d.get("current", "") or "" + timing_signal = d.get("timing_signal", "") or current_str + has_nonbuy_signal = any(kw in timing_signal for kw in [ + "等企稳再入", "等企稳", "弱势持有", "观望", + "不建议买入", "谨慎买入", + ]) + + # 直接计算 R/R(不依赖文本匹配) + rr_invalid = False + if sl and sl > 0 and tp and tp > 0 and price > sl: + rr = (tp - price) / (price - sl) + if rr < 1.5: + rr_invalid = True + # 也检查 tp 是否接近或低于成本(微盈/浮亏止盈) + cost = d.get("cost", 0) + if cost and cost > 0 and tp <= cost * 1.05: + rr_invalid = True + + strategy_deficient = has_nonbuy_signal or rr_invalid + # 对自选无止盈位的也标记(策略不完整) + if not tp or tp == 0: + strategy_deficient = True + + if el <= price <= eh: + flags.append("[WL_IN]") + if strategy_deficient: + flags.append("[STRATEGY_STALE]") + prefix = "⚠️仓位挤占 " if position_pct > 80 else "" + issues.append(f"[STRATEGY_STALE] {prefix}价{price:.2f}在买入区{el}~{eh}但策略不完整({'RR='+f'{rr:.2f}<1.5' if rr_invalid else '无止盈位' if not tp else '非买入信号'}),买入区需重评") + else: + prefix = "⚠️仓位挤占 " if position_pct > 80 else "" + issues.append(f"[PUSH] {prefix}价{price:.2f}入买入区{el}~{eh}") + elif price > eh * 1.35: + flags.append("[WL_HIGH]") + issues.append(f"价{price:.2f}高出买入区+{((price/eh)-1)*100:.0f}%,买入区需重评") + elif price > eh * 1.20: + flags.append("[WL_DRIFT]") + issues.append(f"价{price:.2f}高于买入区+{((price/eh)-1)*100:.0f}%") + elif not is_wl and eh: + dp = (price / eh - 1) * 100 + if dp > 35: + flags.append("[SEVERE]") + issues.append(f"偏离买入区上沿+{dp:.0f}%") + elif dp > 20: + flags.append("[DRIFT]") + issues.append(f"偏离买入区上沿+{dp:.0f}%") + elif dp > 10: + flags.append("[WARN]") + issues.append(f"偏离买入区上沿+{dp:.0f}%") + # 持仓在买入区内但 R/R 不达标 + if el and sl and sl > 0 and tp and tp > 0 and price > sl: + if el <= price <= eh: + rr = (tp - price) / (price - sl) + if rr < 1.5: + flags.append("[RR_WARN]") + issues.append(f"买入区内RR仅{rr:.2f}<1.5,策略需重评") + + # -- 距止损/止盈(仅持仓) -- + if not is_wl: + if sl and sl > 0: + dsl = (price / sl - 1) * 100 + if dsl < 5: + # 成本基准校验:浮盈>5%时止损是利润保护,不是危险信号 + # (mirrors NEAR_TP cost_check logic at line 195-198) + cost = d.get("cost") + if cost and cost > 0 and price > cost * 1.05: + flags.append("[PROFIT_PROTECT]") + pnl = (price / cost - 1) * 100 + issues.append(f"距止损仅{dsl:.1f}%(利润保护,浮盈{pnl:.0f}%)") + else: + flags.append("[NEAR_SL]") + issues.append(f"距止损仅{dsl:.1f}%") + if tp and tp > 0: + dtp = (tp / price - 1) * 100 + if dtp < 5: + # 成本基准校验:止盈标记只有在盈利≥5%时才有效 + cost_check = True + cost = d.get("cost") + if cost and cost > 0 and price < cost * 1.05: + cost_check = False + if cost_check: + flags.append("[NEAR_TP]") + issues.append(f"距止盈仅{dtp:.1f}%") + + # -- 过期 -- + stale_limit = 30 if is_wl else 14 + if ts: + try: + ud = datetime.fromisoformat(ts) + if ud.tzinfo is None: + ud = ud.replace(tzinfo=timezone.utc) + days = (now - ud).days + if days > stale_limit: + flags.append("[STALE]") + issues.append(f"{days}天未更新(>{stale_limit})") + except (ValueError, TypeError): + pass + + if issues: + print(f"{' '.join(flags)} {tag} {name}({code}) 价{price:.2f}{chg} | 买入{el}~{eh} | {'; '.join(issues)}") + found += 1 + + if found == 0: + print("[SILENT] 所有策略正常") + + # ----- 组合级警报 ----- + portfolio_alerts = 0 + if holding_count > 0: + if weak_ratio > 40: + print(f"\n[PORTFOLIO_WEAK] 组合弱势比例{weak_ratio:.0f}% ({weak_count}/{holding_count})!仓位{position_pct:.1f}% → 建议系统性减仓") + portfolio_alerts += 1 + elif weak_ratio > 30: + print(f"\n[PORTFOLIO_WEAK_MILD] 组合弱势比例{weak_ratio:.0f}% ({weak_count}/{holding_count}),仓位{position_pct:.1f}%,关注") + portfolio_alerts += 1 + if position_pct > 80 and holding_count > 0: + # 仓位过满提醒 + print(f"[PORTFOLIO_FULL] 总仓位{position_pct:.1f}% > 80%,现金{cash:.0f}({cash/total_assets*100:.1f}%)") + portfolio_alerts += 1 + if portfolio_alerts > 0: + found += portfolio_alerts + + return found + + +if __name__ == "__main__": + main() diff --git a/scripts/strategy_lifecycle.py b/scripts/strategy_lifecycle.py index c03aee4..2537585 100644 --- a/scripts/strategy_lifecycle.py +++ b/scripts/strategy_lifecycle.py @@ -1,2073 +1,2074 @@ -#!/usr/bin/env python3 -"""策略生命周期管理系统 — 技术面驱动版本 v2 - -核心原则: -1. 止损放在合理的技术位,不拍数字 -2. 新买入推荐:止损=弱支撑(约3%跌幅),止盈=强压力,盈亏比≥2:1 -3. 已持仓:止损=强支撑(约5-8%跌幅),目标=强压力 -4. 买入区间:弱支撑~弱压力之间 -5. 买入时机:量价齐跌不买,缩量至支撑买,量价齐升追买 -""" - -import json -import urllib.request -import os -import sys -import re -from datetime import datetime -import technical_analysis as ta -import multi_timeframe as mtf - - -def is_hk_stock(code): - """判断是否港股(港股代码5位,A股6位带前导零)""" - return len(str(code)) <= 5 - - -def calc_atr(code, period=14): - """从腾讯API K线数据计算ATR(period),返回ATR值或None""" - try: - url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param=hk{code},day,,,60,qfq" - req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) - resp = urllib.request.urlopen(req, timeout=5).read().decode('utf-8') - data = json.loads(resp) - bars = data.get('data', {}).get(f'hk{code}', {}).get('day', []) - if len(bars) < period + 1: - return None - trs = [] - for i in range(1, min(len(bars), period + 1)): - try: - high = float(bars[i][2]) - low = float(bars[i][3]) - prev_close = float(bars[i-1][4]) if len(bars[i-1]) > 4 else float(bars[i-1][3]) - tr = max(high - low, abs(high - prev_close), abs(low - prev_close)) - trs.append(tr) - except (ValueError, IndexError): - continue - if not trs: - return None - return round(sum(trs) / len(trs), 2) - except Exception: - return None - -# 提示词版本追踪 -try: - from prompt_manager.tracking import record_strategy_generation - HAS_PROMPT_TRACKING = True -except ImportError: - HAS_PROMPT_TRACKING = False - -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" -WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" - -def safe_json_load(path, default=None): - """安全加载 JSON,遇到坏数据自动修复""" - if not os.path.exists(path): - return default if default is not None else {} - try: - with open(path, "r", encoding="utf-8") as f: - return json.load(f) - except json.JSONDecodeError: - # 尝试修复:替换字符串内未转义的换行符,去多余括号 - with open(path, "r", encoding="utf-8") as f: - raw = f.read() - fixed = raw - - # 修复1: 字符串内未转义的换行 -> \\n - result = [] - in_str = False - for ch in fixed: - if ch == '"': - in_str = not in_str - result.append(ch) - elif in_str and ch in '\n\r': - result.append('\\n') - else: - result.append(ch) - fixed = ''.join(result) - - # 修复2: 去掉多余的尾部括号 - fixed = fixed.rstrip('}') - # 补回正确的闭合 - if not fixed.endswith('}'): - fixed += '}' - - try: - return json.loads(fixed) - except json.JSONDecodeError as e: - print(f"[WARN] watchlist.json 自动修复失败: {e}", file=sys.stderr) - return default if default is not None else {} -KNOWLEDGE_LOG = "/home/hmo/Obsidian/knowledge/finance/analyst-knowledge-log.md" -MACRO_CONTEXT_PATH = "/home/hmo/web-dashboard/data/macro_context.json" -MARKET_CONTEXT_PATH = "/home/hmo/web-dashboard/data/market.json" -STOCK_SECTOR_MAP_PATH = "/home/hmo/web-dashboard/data/stock_sector_map.json" - - -def load_stock_sector_map(): - """读取个股归属行业映射 - - stock_sector_map.json 格式: {code: [sector1, sector2, ...]} - 跳过 _note, _created_at 等元数据键。 - """ - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_sector_stocks - conn = get_conn() - # 从 stock_sectors 表反向构建 code→[sectors] 映射 - rows = conn.execute("SELECT code, sector_name FROM stock_sectors ORDER BY code").fetchall() - conn.close() - code_to_sectors = {} - for code, sector in rows: - if code not in code_to_sectors: - code_to_sectors[code] = [] - code_to_sectors[code].append(sector) - return code_to_sectors - except Exception: - pass - try: - with open(STOCK_SECTOR_MAP_PATH) as f: - data = json.load(f) - code_to_sectors = {} - for key, value in data.items(): - if key.startswith("_"): - continue - if isinstance(value, list): - code_to_sectors[key] = value - return code_to_sectors - except Exception: - return {} - - -def load_market_context(): - """读取市场上下文,优先 SQLite,回退 market.json""" - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_latest_market - conn = get_conn() - market = query_latest_market(conn) - conn.close() - if market and market.get("sectors"): - sector_perf = {} - for s in market["sectors"]: - name = s.get("name", "") - if name: - sector_perf[name] = { - "change": s.get("change_pct", 0), - "up_count": s.get("up_count", 0), - "down_count": s.get("down_count", 0), - "net_inflow": s.get("net_inflow", 0), - "lead_stock": s.get("lead_stock", ""), - "lead_stock_change": s.get("lead_stock_change", 0), - } - return { - "sector_perf": sector_perf, - "breadth": market.get("up_ratio", 50), - "mood": market.get("mood", "neutral"), - "top_gainers": {g["name"]: g["change_pct"] for g in market.get("top_gainers", [])}, - "top_losers": {g["name"]: g["change_pct"] for g in market.get("top_losers", [])}, - "total_sectors": len(market["sectors"]), - "market_timestamp": market.get("timestamp", ""), - } - except Exception: - pass - try: - with open(MARKET_CONTEXT_PATH) as f: - market = json.load(f) - sectors = market.get("sectors", []) - sector_perf = {} - for s in sectors: - name = s.get("name", "") - if name: - sector_perf[name] = { - "change": s.get("change", 0), - "up_count": s.get("up_count", 0), - "down_count": s.get("down_count", 0), - "net_inflow": s.get("net_inflow", 0), - "lead_stock": s.get("lead_stock", ""), - "lead_stock_change": s.get("lead_stock_change", 0), - } - top_gainers = {s.get("name", ""): s.get("change", 0) - for s in market.get("top_gainers", [])} - top_losers = {s.get("name", ""): s.get("change", 0) - for s in market.get("top_losers", [])} - return { - "sector_perf": sector_perf, - "breadth": market.get("up_ratio", 50), - "mood": market.get("mood", "neutral"), - "top_gainers": top_gainers, - "top_losers": top_losers, - "total_sectors": market.get("total_sectors", 0), - "market_timestamp": market.get("timestamp", ""), - } - except Exception: - return { - "sector_perf": {}, - "breadth": 50, - "mood": "neutral", - "top_gainers": {}, - "top_losers": {}, - "total_sectors": 0, - "market_timestamp": "", - } - - -def compute_sector_adjustment(code, market_ctx, stock_sector_map): - """根据个股所属行业的市场表现+小果情感,返回调整系数 - - 返回 dict: - stop_bias: 止损调整系数(<1.0收紧, >1.0放宽) - target_bias: 止盈调整系数 - note: 行业背景一句话 - sector_name: 匹配到的行业名称 - sector_change: 行业涨跌幅 - """ - # 默认无调整 - adj = {"stop_bias": 1.0, "target_bias": 1.0, "note": "", - "sector_name": "", "sector_change": 0} - - sectors_for_code = stock_sector_map.get(code, []) - if not sectors_for_code: - return adj - - sector_perf = market_ctx.get("sector_perf", {}) - breadth = market_ctx.get("breadth", 50) - - # 找第一个能匹配到的行业 - for sec in sectors_for_code: - if sec in sector_perf: - perf = sector_perf[sec] - chg = perf.get("change", 0) - adj["sector_name"] = sec - adj["sector_change"] = chg - - # 行业暴跌 > 3% - if chg <= -3: - adj["stop_bias"] = 0.92 # 止损收紧8% - adj["target_bias"] = 0.90 # 止盈下调10% - adj["note"] = f"行业{sec}大跌{chg:+.1f}%,收紧止损" - # 行业大跌 1~3% - elif chg <= -1: - adj["stop_bias"] = 0.96 - adj["target_bias"] = 0.95 - adj["note"] = f"行业{sec}下跌{chg:+.1f}%,适度防御" - # 行业大涨 > 3% - elif chg >= 3: - adj["stop_bias"] = 1.05 # 止损放宽5%(给趋势空间) - adj["target_bias"] = 1.03 - adj["note"] = f"行业{sec}大涨{chg:+.1f}%,可适度积极" - # 行业上涨 1~3% - elif chg >= 1: - adj["stop_bias"] = 1.02 - adj["note"] = f"行业{sec}上涨{chg:+.1f}%,正常" - else: - adj["note"] = f"行业{sec}{chg:+.1f}%,中性" - break - # 尝试处理命名差异:market.json中的行业名可能多了"板块"后缀 - for market_sec_name in sector_perf: - if sec in market_sec_name or market_sec_name in sec: - perf = sector_perf[market_sec_name] - chg = perf.get("change", 0) - adj["sector_name"] = market_sec_name - adj["sector_change"] = chg - if chg <= -3: - adj["stop_bias"] = 0.92 - adj["target_bias"] = 0.90 - adj["note"] = f"行业{market_sec_name}大跌{chg:+.1f}%,收紧止损" - elif chg <= -1: - adj["stop_bias"] = 0.96 - adj["target_bias"] = 0.95 - adj["note"] = f"行业{market_sec_name}下跌{chg:+.1f}%,适度防御" - elif chg >= 3: - adj["stop_bias"] = 1.05 - adj["target_bias"] = 1.03 - adj["note"] = f"行业{market_sec_name}大涨{chg:+.1f}%,可适度积极" - elif chg >= 1: - adj["stop_bias"] = 1.02 - adj["note"] = f"行业{market_sec_name}上涨{chg:+.1f}%,正常" - else: - adj["note"] = f"行业{market_sec_name}{chg:+.1f}%,中性" - break - - # 如果breath<30% (大盘极弱),再加一层收紧 - if breadth < 30: - adj["stop_bias"] *= 0.97 # 再收紧3% - breadth_note = "大盘仅{}%个股上涨".format(int(breadth)) - adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note - elif breadth < 40: - adj["stop_bias"] *= 0.99 - breadth_note = "大盘偏弱({}%上涨)".format(int(breadth)) - adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note - - # 小果情感约束:利空置信度>80%时收紧止损 - try: - xiaoguo_path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" - if os.path.exists(xiaoguo_path): - xg = json.load(open(xiaoguo_path)) - stock_sentiment = xg.get("stocks", {}).get(code, {}) - if stock_sentiment: - sentiment = stock_sentiment.get("sentiment", "") - confidence = stock_sentiment.get("confidence", 0) - summary = stock_sentiment.get("summary", "") - if sentiment == "negative" and confidence > 0.8: - adj["stop_bias"] = min(adj["stop_bias"], 0.95) - adj["note"] += f" | 小果利空{confidence:.0%}:{summary[:30]}" - except Exception: - pass - - return adj - - -def load_macro_context(): - """读取宏观上下文,返回 (bias, desc),优先 DB,回退 JSON""" - try: - import sqlite3 - from pathlib import Path - conn = sqlite3.connect(str(Path(__file__).parent.parent / "data" / "mofin.db")) - row = conn.execute( - "SELECT indices, structure FROM macro_context_log " - "WHERE has_valid_data=1 ORDER BY created_at DESC LIMIT 1" - ).fetchone() - conn.close() - if row: - indices = json.loads(row[0]) if row[0] else {} - structure = json.loads(row[1]) if row[1] else {} - overall = structure.get("overall", "neutral") - desc = structure.get("description", "") - else: - raise ValueError("no db data") - except Exception: - try: - with open(MACRO_CONTEXT_PATH) as f: - ctx = json.load(f) - overall = ctx.get("structure", {}).get("overall", "neutral") - desc = ctx.get("structure", {}).get("description", "") - except Exception: - return 1.0, "宏观未加载" - if "bearish" in overall: - return 0.8, f"宏观{desc}" - elif overall == "bullish": - return 1.05, f"宏观{desc}" - elif overall == "strong_bullish": - return 1.1, f"宏观{desc}" - else: - return 1.0, f"宏观{desc}" - - -def batch_fetch_prices(codes): - """批量获取实时价格,合并为一次API调用(自动分批,每批15只)""" - if not codes: - return {} - - # 分批处理,避免单次请求过大导致超时 - batch_size = 15 - all_results = {} - for batch_start in range(0, len(codes), batch_size): - batch = codes[batch_start:batch_start + batch_size] - symbols = [] - code_map = {} - for raw_code in batch: - raw_code = str(raw_code).split('_')[0] - if not raw_code: - continue - if len(raw_code) == 5 and raw_code.isdigit(): - prefix = "hk" - elif raw_code.startswith(("6", "5")): - prefix = "sh" - else: - prefix = "sz" - sym = f"{prefix}{raw_code}" - symbols.append(sym) - code_map[sym] = raw_code - if not symbols: - continue - - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - max_retries = 2 - for attempt in range(max_retries + 1): - try: - r = urllib.request.urlopen(url, timeout=10) - text = r.read().decode("gbk") - except Exception as e: - if attempt < max_retries: - continue - print(f" batch_fetch_prices error: {e}", file=sys.stderr) - continue - - for line in text.strip().split("\n"): - line = line.strip() - if not line or "=" not in line: - continue - try: - sym = line.split("=", 1)[0].strip().lstrip("v_") - raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw_value.split("~") - if len(fields) < 35: - continue - orig_code = code_map.get(sym) - if not orig_code: - continue - def f(i): - try: - return float(fields[i]) if fields[i].strip() else 0.0 - except: - return 0.0 - all_results[orig_code] = { - "price": f(3), "close": f(4), "high": f(33), "low": f(34), - "code": orig_code, - } - except Exception: - continue - break # Success - break retry loop - - return all_results - - -def get_price_tencent(code): - """获取实时价格,港股转CNY统一存CNY""" - try: - from mo_models import to_cny, is_hk_stock - except ImportError: - to_cny = lambda v, r=None: v - is_hk_stock = lambda c: len(str(c).strip()) == 5 and str(c).strip().isdigit() - try: - raw_code = code.split('_')[0] - if not raw_code: - return None - if is_hk_stock(raw_code): - prefix = "hk" - elif raw_code.startswith("6") or raw_code.startswith("5"): - prefix = "sh" - else: - prefix = "sz" - url = f"http://qt.gtimg.cn/q={prefix}{raw_code}" - r = urllib.request.urlopen(url, timeout=5) - fields = r.read().decode("gbk").split('"')[1].split("~") - def f(i): - try: - return float(fields[i]) if fields[i].strip() else 0.0 - except: - return 0.0 - price = f(3) - if is_hk_stock(raw_code) and price > 0: - price = to_cny(price) - return { - "price": price, "close": f(4), "high": f(33), "low": f(34), - "code": raw_code, - } - except Exception as e: - print(f" get_price error {code}: {e}", file=sys.stderr) - return None - - -def reassess_strategy(code, name, price, cost, shares, current_action, - volume_signal="", sentiment="neutral", - is_watchlist=False): - """根据技术分析重评策略""" - - tech = ta.full_analysis(code) - if tech and "support_resistance" in tech: - sr = tech["support_resistance"] - candle = tech.get("candlestick", {}) - vol = tech.get("volume", {}) - ss = sr.get("strong_support") - ws = sr.get("weak_support") - wr = sr.get("weak_resist") - sr_resist = sr.get("strong_resist") - pivot = sr.get("pivot") - effective_range = sr.get("effective_range") - print(f" TECH: 强撑={ss} 弱撑={ws} 枢轴={pivot} 弱压={wr} 强压={sr_resist} 有效区间={effective_range}") - else: - print(f" ⚠️ 技术分析不可用", file=sys.stderr) - ss = ws = wr = sr_resist = pivot = None - candle = {} - vol = {} - - # ----- 多周期技术分析(周线/月线/均线) ----- - mtf_analysis = {} - mtf_adj = {} - try: - mtf_result = mtf.full_multi_tf_analysis(code) - if mtf_result.get("daily") and mtf_result["daily"].get("count", 0) >= 5: - mtf_analysis = mtf_result - mtf_adj = mtf_result.get("strategy_adjustment", {}) - daily_mas = mtf_result.get("daily", {}).get("mas", {}) - weekly = mtf_result.get("weekly", {}) - monthly = mtf_result.get("monthly", {}) - trend_align = mtf_adj.get("trend_alignment", "未知") - print(f" 多周期: {trend_align} | " - f"MA5={daily_mas.get('ma5','?')} MA20={daily_mas.get('ma20','?')} MA60={daily_mas.get('ma60','?')} | " - f"周线{weekly.get('trend',{}).get('description','?')} 月线{monthly.get('trend',{}).get('description','?')}") - except Exception as e: - print(f" 多周期分析失败: {e}", file=sys.stderr) - - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_new_entry = (cost == 0) or (shares == 0) - is_deep_loss = profit_pct < -20 - - # ----- 股票分类(短炒/中短线/中长线/弱势/深套) ----- - stock_category = "中短线" - time_horizon = "2周~3月" - position_advice = "中等仓位" - try: - mtf_cache = json.load(open("/home/hmo/web-dashboard/data/multi_tf_cache.json")) - stock_data = mtf_cache.get(code, {}) - daily_klines = stock_data.get("daily", []) - fund = stock_data.get("fundamentals", {}) - closes = [d["close"] for d in daily_klines] if daily_klines else [] - - if len(closes) >= 10: - cur = closes[-1] - ma20 = sum(closes[-20:])/20 if len(closes)>=20 else 0 - ma60 = sum(closes[-60:])/60 if len(closes)>=60 else 0 - highs = [d["high"] for d in daily_klines[-20:]] - lows = [d["low"] for d in daily_klines[-20:]] - volatility = ((max(highs)-min(lows))/min(lows)*100) if min(lows)>0 else 0 - pe = fund.get("pe") or 0 - eps = fund.get("eps") or 0 - mcap = fund.get("mcap_total") or 0 - is_high_vol = volatility > 30 - is_high_pe = pe > 100 or pe < 0 - is_value = 0 < pe < 20 and eps > 0.5 - - if is_deep_loss: - stock_category = "深套" - time_horizon = "长期" - position_advice = "不补不割" - elif is_high_vol and is_high_pe: - stock_category = "短炒" - time_horizon = "数日~2周" - position_advice = "小仓快进快出" - elif cur < ma20 and cur < ma60 and ma20 > 0: - stock_category = "弱势" - time_horizon = "观望" - position_advice = "减仓或观望" - elif (is_value or mcap > 1000) and cur > ma20: - stock_category = "中长线" - time_horizon = "数月~1年" - position_advice = "正常配置" - elif volatility > 20: - stock_category = "中短线" - time_horizon = "2~6周" - position_advice = "中等仓位" - except Exception: - pass - - print(f" 分类: {stock_category} | {time_horizon} | {position_advice}") - - # ----- 短炒+强趋势检测:短炒分类但多周期多头时用移动止损代替弱支撑止损 ----- - is_short_term_strong_trend = False - if stock_category == "短炒": - trend_align = mtf_adj.get("trend_alignment", "") - strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] - if any(ind in trend_align for ind in strong_trend_indicators): - is_short_term_strong_trend = True - print(f" ⚡ 短炒+强趋势检测: 趋势={trend_align} → 启用移动止损, 不止盈") - position_advice = "小仓强趋势让利润跑" - - # ----- 止损设置(含最小距离3%保护) ----- - if is_new_entry: - # 新买入推荐:止损 = 弱支撑(约2-3%跌幅,合理可控) - if ws and ws > 0: - new_stop = round(ws, 2) - else: - new_stop = round(price * 0.96, 2) - elif is_deep_loss: - # 深套:止损 = 强支撑再下移(不轻易割) - if ss and ss > 0: - new_stop = round(min(ss, price * 0.85), 2) - else: - new_stop = round(price * 0.85, 2) - else: - # 已持仓正常:止损 = 强支撑 - if is_short_term_strong_trend: - # 短炒+强趋势:用移动止损(距现价-5%),不止盈让利润跑 - trailing_sl = round(max(ws or 0, price * 0.95), 2) if ws else round(price * 0.95, 2) - new_stop = trailing_sl - print(f" 短炒强趋势移动止损: {new_stop} (距现价-{(1-new_stop/price)*100:.1f}%)") - elif ss and ss > 0: - new_stop = round(ss, 2) - else: - new_stop = round(price * 0.88, 2) - - # 已盈利仓位(>5%):用较紧的移动止损保护利润,但不超过成本线 - if profit_pct > 5 and not is_new_entry and not is_deep_loss: - # 取 max(弱支撑, 成本线, 当前价×0.95) 作为止损 - cost_protect = cost if cost > 0 else 0 - trailing_stop = round(max(ws or 0, cost_protect, price * 0.95), 2) - if trailing_stop > new_stop: - new_stop = trailing_stop - print(f" 已启用移动止损: {new_stop} (保护+{profit_pct:.1f}%利润)", file=sys.stderr) - - # 最小止损距离 —— 随趋势强度调整(2026-06-23 震度保护规则) - # 强趋势(多周期看多 + MA多头排列):最小1.5%下行空间 - # 普通/弱势:最小3%下行空间 - is_strong_trend = False - trend_align = mtf_adj.get("trend_alignment", "") - strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] - try: - if any(ind in trend_align for ind in strong_trend_indicators) and ma20 > ma60 and cur >= ma20: - is_strong_trend = True - except (NameError, TypeError): - pass # ma20/ma60/cur may be unbound if MTF data insufficient - - if is_strong_trend: - min_stop_gap = 0.015 # 1.5% - else: - min_stop_gap = 0.03 # 3% - - min_stop = round(price * (1 - min_stop_gap), 2) - if new_stop > min_stop and not is_deep_loss: - old_stop = new_stop - new_stop = min_stop - if old_stop != new_stop: - print(f" 最小止损 {round(min_stop_gap*100)}%间距约束: {old_stop}→{new_stop} (趋势{'强' if is_strong_trend else '普通'})") - - # 港股附加:ATR波动率校验 — 止损距现价不得小于 1×ATR(14) - if is_hk_stock(code): - atr = calc_atr(code) - if atr and atr > 0: - min_atr_stop = round(price - atr, 2) - if new_stop > min_atr_stop: - old_stop_val = new_stop - new_stop = min_atr_stop - print(f" 港股ATR波动率校验({atr:.2f}): 止损 {old_stop_val}→{new_stop} (1×ATR间距)") - - # ----- 止盈设置 ----- - if is_short_term_strong_trend and not is_new_entry: - # 短炒+强趋势:不止盈让利润跑 - mtf_tp = mtf_adj.get("take_profit_reference", {}) - if mtf_tp and mtf_tp.get("level", 0) > price * 1.2: - new_target = round(mtf_tp["level"], 2) - else: - new_target = 0 # 无多周期阻力时不编造止盈 - print(f" 短炒强趋势不止盈: 止盈设为{new_target} (+{(new_target/price-1)*100:.0f}%)") - elif sr_resist and sr_resist > 0: - new_target = round(sr_resist, 2) - else: - new_target = 0 # 无技术面数据时不编造止盈 - - # ----- 风险回报比校验 ----- - stop_distance = price - new_stop if price > new_stop else price * 0.02 - target_distance = new_target - price if new_target > price else 0 - - # 1:2 检查 - min_target_distance = stop_distance * 2.0 - if target_distance < min_target_distance: - # 尝试更高的阻力位,但不超过下一个真实压力位 - candidate_targets = [] - if wr and wr > price and wr != sr_resist: - candidate_targets.append(wr) - if sr_resist and sr_resist > price: - candidate_targets.append(sr_resist) - # 检查有效区间,如果有更高的自然目标位 - if effective_range and price < effective_range * 0.9: - candidate_targets.append(effective_range) - - found = False - for level in candidate_targets: - if (level - price) >= min_target_distance: - new_target = level - found = True - break - - # 如果仍然不满足,检查是否至少能到 1:1.5 - min15_distance = stop_distance * 1.5 - if not found: - for level in candidate_targets: - if (level - price) >= min15_distance: - new_target = level - found = True - break - - # ----- 风险回报比最终计算 ----- - risk = max(price - new_stop, price * 0.01) - reward = max(new_target - price, 0) - rr_ratio = reward / risk if risk > 0 else 0 - - # ----- 状态判断 ----- - if is_deep_loss: - status = "updated" - action_note = "深套持有" - elif is_new_entry: - if rr_ratio < 1.5: - status = "review" - action_note = "⚠️盈亏比不足1:1.5,不建议买入" - elif rr_ratio < 2.0: - status = "updated" - action_note = "⚠️盈亏比偏低(1:{:.1f}),谨慎买入".format(rr_ratio) - else: - status = "updated" - action_note = "" - else: - if rr_ratio < 0.5: - status = "updated" - action_note = "⚠️盈亏比极低,关注" - elif rr_ratio < 1.5: - status = "updated" - action_note = "⚠️盈亏比偏低(1:{:.1f}),不建议加仓".format(rr_ratio) - else: - status = "updated" - action_note = "" - - # 短炒+强趋势:在action_note追加标记 - if is_short_term_strong_trend and not is_new_entry and not is_deep_loss: - extra_note = "短炒强趋势持" if "深套" not in action_note else "" - if extra_note: - action_note = f"{action_note} | {extra_note}" if action_note else extra_note - - # ----- 买入区间(有盈亏比严格约束) ----- - max_acceptable_entry = None # 最大可接受买入价(满足R/R约束) - - if new_target and new_stop and new_target > new_stop and not is_deep_loss: - # 买入价的R/R约束: - # 要求 (target - entry) / (entry - stop) >= min_rr - # 即 entry <= (target + min_rr * stop) / (1 + min_rr) - min_rr = 1.0 # 至少1:1,才不亏 - recommend_rr = 1.5 # 推荐1:1.5以上 - - max_for_recommend = (new_target + recommend_rr * new_stop) / (1 + recommend_rr) - max_for_neutral = (new_target + min_rr * new_stop) / (1 + min_rr) - - if is_new_entry: - # 新买入:要求1:1.5+ - max_acceptable_entry = max_for_recommend - else: - # 已持仓加仓:至少1:1 - max_acceptable_entry = max_for_neutral - - if is_new_entry: - # 新买入:买入区 = 弱支撑附近(不是当前价附近!) - # 只在价格跌到弱支撑附近时才推买入 - entry_low = round(price * 0.98, 2) - entry_high = round(price * 1.02, 2) - if max_acceptable_entry and entry_high > max_acceptable_entry: - entry_high = round(max_acceptable_entry, 2) - # 确保买入区不小于1% - if entry_high - entry_low < price * 0.01: - if max_acceptable_entry and price <= max_acceptable_entry: - entry_low = round(max(price * 0.99, new_stop), 2) - entry_high = round(min(price * 1.01, max_acceptable_entry), 2) - elif ws and ws > 0 and wr and wr > 0 and not is_deep_loss: - # 已持仓正常:买入区 = 弱支撑~弱支撑上方5%(给合理回调空间) - # 上限不能低于成本价×0.95(保护已有持仓不被高位逼空) - entry_low = round(ws, 2) - entry_max = round(ws * 1.05, 2) # 比弱支撑高5%,有足够空间 - # 如果当前价已远离买入区,保持买入区不变(不因价格涨了就收窄) - min_upper = round(cost * 0.95, 2) if cost > 0 else 0 - if entry_max < min_upper: - entry_max = min_upper - if max_acceptable_entry: - entry_high = round(min(entry_max, max_acceptable_entry), 2) - else: - entry_high = entry_max - # 如果当前价已远离买入区(高于买入区上沿),禁止加仓推荐 - if price > entry_high: - # 买入区锁定在弱支撑位,但标记为"价格远离" - pass - # 如果买入区过窄,标记但不扩展(加仓必须在支撑位) - if entry_high - entry_low < price * 0.005: - entry_low = round(ws * 0.995, 2) - entry_high = round(ws * 1.005, 2) - else: - entry_low = round(price * 0.90, 2) - entry_high = round(price * 1.05, 2) - - # 买入区间稳定性保护:上边界单次变动不超过5% - if 'entry_high' in dir() and entry_high: - # 读取当前策略中已有的买入区上界,如果有且变化过大则限制 - old_entry_high = None - if 'current_action' in dir() and current_action: - import re - m = re.search(r'买入区[\d.]+~([\d.]+)', current_action) - if m: - old_entry_high = float(m.group(1)) - if old_entry_high and old_entry_high > 0: - max_change = old_entry_high * 0.95 # 单次最多下降5% - if entry_high < max_change: - entry_high = round(max_change, 2) - - # ----- 买入时机信号(三维分析:大盘+行业+个股,基本面+消息面+技术面+资金流)----- - # [2026-07-01] 扩展:不再只看volume_signal + candlestick_sentiment - # 融合大盘趋势、行业板块强弱、基本面估值作为修正因子 - volume_signal = vol.get("volume_signal", "") - candlestick_sentiment = candle.get("sentiment", "neutral") - timing_signal = "neutral" - - # --- 三维分析数据装载 --- - # 因子1: 大盘环境(从macro_context_log读) - market_bearish = False - market_bullish = False - try: - import sqlite3 - _db = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _mc = _db.execute( - "SELECT structure FROM macro_context_log WHERE has_valid_data=1 ORDER BY rowid DESC LIMIT 1" - ).fetchone() - if _mc and _mc[0]: - _s = json.loads(_mc[0]) - _overall = _s.get("overall", "") - if "bearish" in _overall: - market_bearish = True - elif _overall == "bullish": - market_bullish = True - _db.close() - except Exception: - pass - - # 因子2: 行业板块强弱 - sector_strong = False - sector_weak = False - try: - _db2 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _rows2 = _db2.execute( - "SELECT name, change_pct FROM sector_snapshots ORDER BY change_pct DESC" - ).fetchall() - if _rows2: - # 找到该股所属行业(简单匹配name或通过stock_sectors) - _my_sectors = _db2.execute( - "SELECT sector_name FROM stock_sectors WHERE code=?", - (code,) - ).fetchall() - if _my_sectors: - for (_sn,) in _my_sectors: - for r_name, r_chg in _rows2: - if _sn in r_name or r_name in _sn: - _rank = [r[0] for r in _rows2].index(r_name) if r_name in [x[0] for x in _rows2] else -1 - _total = len(_rows2) - if _rank >= 0: - if _rank < _total * 0.2: - sector_strong = True - if _rank > _total * 0.8: - sector_weak = True - break - _db2.close() - except Exception: - pass - - # 因子3: 基本面估值 - is_value_stock = False - try: - _db3 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _fd = _db3.execute( - "SELECT pe, eps FROM stock_fundamentals WHERE code=?", (code,) - ).fetchone() - if _fd: - _pe, _eps = _fd - is_value_stock = (0 < (_pe or 0) < 25 and (_eps or 0) > 0.3) - _db3.close() - except Exception: - pass - - # --- 三维修正规则 --- - # 大盘偏弱时收紧买入信号,大盘偏强时放宽 - # 行业领先加分,行业落后减分 - # 低估值加分(有安全边际) - - def _adjust_timing(signal, market_b, market_bb, sec_s, sec_w, is_val): - """根据三维因子修正 timing_signal""" - # 大盘偏弱时降级买入信号 - if market_b: - if signal in ("买入", "加仓"): - if not sec_s: # 大盘弱+行业不强→降级 - return "关注" - # 大盘偏强时放宽 - if market_bb: - if signal == "关注" and (sec_s or is_val): - return "买入" - # 行业弱势时降级买入信号 - if sec_w: - if signal in ("买入", "加仓"): - return "关注" - # 行业强势+低估时升级关注 - if sec_s and is_val: - if signal == "关注": - return "买入" - return signal - - if is_new_entry: - # 新买入时机 - if volume_signal == "主动买盘占优" and candlestick_sentiment == "bullish": - timing_signal = "买入" - elif volume_signal == "主动卖盘占优": - timing_signal = "观望" - elif volume_signal == "买卖均衡" and ws and price <= ws * 1.03: - timing_signal = "买入" - elif candlestick_sentiment == "bullish": - timing_signal = "买入" - elif ws and price < ws * 1.02: - timing_signal = "关注" - # 新买入时三维修正:大盘向上+行业强→升级,大盘弱→降级 - _pre_signal = timing_signal - timing_signal = _adjust_timing(timing_signal, market_bearish, market_bullish, - sector_strong, sector_weak, is_value_stock) - if timing_signal != _pre_signal: - print(f" 三维修正(新入): {_pre_signal}→{timing_signal} " - f"| 大盘{'弱' if market_bearish else '强' if market_bullish else '中性'}" - f"| 行业{'强' if sector_strong else '弱' if sector_weak else '中性'}" - f"| 估值{'低' if is_value_stock else '一般'}") - else: - # 已持仓时机(用于加仓/减仓参考) - if is_short_term_strong_trend: - # 短炒+强趋势:强趋势持有,禁止加仓信号 - timing_signal = "持有" - elif profit_pct > 5: - # 已盈利 - if volume_signal == "主动买盘占优": - timing_signal = "持有" - elif volume_signal == "主动卖盘占优" and not is_new_entry: - timing_signal = "关注" - else: - timing_signal = "持有" - elif profit_pct > 0: - # 微盈 - if volume_signal == "主动买盘占优": - timing_signal = "持有" - elif ws and price <= ws * 1.02: - timing_signal = "加仓" - else: - timing_signal = "持有" - else: - # 浮亏 - if volume_signal == "主动卖盘占优" and ss and price <= ss * 1.03: - timing_signal = "关注" - elif volume_signal == "主动买盘占优" and sr_resist and price >= sr_resist * 0.97: - timing_signal = "关注" - elif volume_signal == "买卖均衡" and ws and price <= ws * 1.02: - timing_signal = "加仓" - else: - timing_signal = "持有" - - # ----- 【v3.2新增】分类约束:弱势/深套禁止输出买入/加仓类信号 ----- - if stock_category == "弱势" or is_deep_loss: - buy_signals = ["买入", "加仓", "可追"] - if any(s in timing_signal for s in buy_signals): - old_signal = timing_signal - timing_signal = "弱势持有" if stock_category == "弱势" else "深套持有" - print(f" 分类约束: {stock_category} 原信号\"{old_signal}\" → \"{timing_signal}\"") - - # ----- 构造 action 描述(供 cron prompt 使用) ----- - action_parts = [] - if profit_pct < -20: - action_parts.append("深套持有") - elif profit_pct < -10: - action_parts.append("持有观察") - elif profit_pct < 0: - action_parts.append("持有观察") - elif profit_pct < 5: - action_parts.append("盈利持有") - else: - action_parts.append("盈利良好") - - if action_note: - action_parts.append(action_note) - - if is_watchlist: - # 自选股(未入场):有止损参考+买入区,内部算RR需要止盈位 - action_parts.append(f"目标参考{new_target}") - action_parts.append(f"止损参考{new_stop}") - action_parts.append(f"买入区{entry_low}~{entry_high}") - elif is_new_entry: - action_parts.append(f"损{new_stop}") - action_parts.append(f"盈{new_target}") - action_parts.append(f"买{entry_low}~{entry_high}") - else: - action_parts.append(f"止损{new_stop}") - action_parts.append(f"目标{new_target}") - action_parts.append(f"买入区{entry_low}~{entry_high}") - - if timing_signal != "neutral": - action_parts.append(f"信号:{timing_signal}") - - new_action = " | ".join(action_parts) - - # 技术面快照 - tech_snapshot = "" - if candle: - tech_snapshot = (f"形态:{candle.get('pattern','?')}/{candle.get('sentiment','?')} " - f"量价:{vol.get('volume_signal','?')} " - f"强撑:{ss} 弱撑:{ws} 弱压:{wr} 强压:{sr_resist}") - # 加入均线信息(如果可用) - try: - dm = mtf_analysis.get("daily", {}).get("mas", {}) - ma_parts = [] - for m in ['ma5', 'ma10', 'ma20', 'ma60']: - v = dm.get(m) - if v: - ma_parts.append(f"{m.upper()}={v}") - if ma_parts: - tech_snapshot += " | " + " ".join(ma_parts) - except (NameError, AttributeError): - pass - - # 多周期快照(追加到 tech_snapshot) - mtf_context = "" - if mtf_adj: - trend_align = mtf_adj.get("trend_alignment", "") - daily_mas = mtf_analysis.get("daily", {}).get("mas", {}) - ma20 = daily_mas.get("ma20") - ma60 = daily_mas.get("ma60") - stop_ref = mtf_adj.get("stop_loss_reference", {}) - take_ref = mtf_adj.get("take_profit_reference", {}) - - parts = [] - if trend_align: - parts.append(trend_align) - if ma20: - parts.append(f"MA20={ma20}") - if ma60: - parts.append(f"MA60={ma60}") - if stop_ref: - parts.append(f"长撑:{stop_ref.get('source','?')}={stop_ref['level']}") - if take_ref: - parts.append(f"长压:{take_ref.get('source','?')}={take_ref['level']}") - mtf_context = " | ".join(parts) - - now_str = datetime.now().strftime('%Y-%m-%d %H:%M') - return { - 'stop_loss': new_stop, - 'take_profit': new_target, - 'entry_low': entry_low, - 'entry_high': entry_high, - 'action': new_action, - 'status': status, - 'tech_snapshot': tech_snapshot, - 'timing_signal': timing_signal, - 'rr_ratio': round(rr_ratio, 2), - 'action_note': action_note, - 'reassessed_at': now_str, - 'multi_tf_context': mtf_context, # 多周期上下文 - 'stock_category': stock_category, # 股票分类:短炒/中短线/中长线/弱势/深套 - 'time_horizon': time_horizon, # 时间跨度 - 'position_advice': position_advice, # 仓位建议 - } - - -def load_stock_news_sentiment(code): - """加载小果消息面情感""" - try: - path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" - if not os.path.exists(path): - return {} - xg = json.load(open(path)) - return xg.get("stocks", {}).get(code, {}) - except Exception: - return {} - - -def load_fundamentals(code): - """加载个股基本面""" - try: - path = "/home/hmo/web-dashboard/data/multi_tf_cache.json" - if not os.path.exists(path): - return {} - m = json.load(open(path)) - return m.get(code, {}).get("fundamentals", {}) or {} - except Exception: - return {} - - -def _get_portfolio_risk_state(): - """读取 portfolio 组合风险状态(2026-06-23 引擎协调)""" - try: - # 数据一致性检查:警告多副本(2026-06-23 bugfix) - _check_portfolio_consistency() - p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) - pos_pct = p.get('position_pct', 0) - cash = p.get('cash', 0) - holdings = p.get('holdings', []) - weak_cnt = sum(1 for h in holdings if h.get('change_pct', 0) < -15) - total = len(holdings) or 1 - weak_ratio = weak_cnt / total - return { - 'position_pct': pos_pct, - 'cash': cash, - 'is_high_position': pos_pct > 80, - 'is_very_high_position': pos_pct > 90, - 'is_high_weak': weak_ratio > 0.35, - 'weak_ratio': round(weak_ratio * 100), - 'total_holdings': total, - } - except: - return {} - - -def _is_buy_signal(signal): - """判断信号是否为买入/持有类(用于防洗盘)""" - if not signal: - return False - buy_keywords = ['买入', '持有', '加仓', '关注'] - for kw in buy_keywords: - if kw in signal: - return True - return False - - -def _check_portfolio_consistency(): - """数据一致性检查:如果存在多份 portfolio.json 则报警(2026-06-23 bugfix)""" - main = '/home/hmo/web-dashboard/data/portfolio.json' - main_cash = None - try: - import json - main_cash = json.load(open(main)).get('cash') - except Exception: - return - for path in [ - '/home/hmo/data/portfolio.json', - '/home/hmo/projects/MoFin/data/portfolio.json', - '/home/hmo/web-dashboard.bak/data/portfolio.json', - ]: - if os.path.exists(path): - try: - other = json.load(open(path)) - if other.get('cash') != main_cash: - print(f"⚠️ 数据一致性: {os.path.realpath(path)} cash={other.get('cash')} ≠ 主文件 cash={main_cash} (需清理)", file=sys.stderr) - except Exception: - pass - - -def _check_contradiction(code, today_only=True): - """反馈循环核——检查本股是否有刚卖出的记录 - - 返回 dict or None: - - sold_reason: 'portfolio_trim'|'stop_loss' - - sold_at: 卖出日期 - - days_ago: 卖出距今交易日数 - - is_today: 是否今日卖出 - - tag: 追加到信号的标注 - """ - try: - from datetime import datetime, date - dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) - for e in dec.get('decisions', []): - if e.get('code') != code: - continue - sold_at = e.get('sold_at', '') - if not sold_at: - return None - try: - sd = datetime.strptime(sold_at, '%Y-%m-%d').date() - td = date.today() - days = (td - sd).days - except: - return None - - reason = e.get('sold_reason', 'portfolio_trim') - if reason == 'stop_loss': - tag = '止损离场(逻辑破坏,短期不关注)' - else: - tag = '组合减仓后关注(已清仓,等回踩确认)' - - return { - 'sold_reason': reason, - 'sold_at': sold_at, - 'days_ago': days, - 'is_today': days == 0, - 'tag': tag, - } - except: - return None - return None - - -def _get_sell_priority_list(): - """减仓优先级排序:深套>亏损>微盈>盈利(2026-06-23 反馈循环) - - 返回 [(code, name, change_pct, position_pct, priority_label), ...] - 按卖出的优先顺序排列(最先应该卖的在最前) - """ - try: - p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) - holdings = p.get('holdings', []) - ranked = [] - for h in holdings: - chg = h.get('change_pct', 0) - pos = h.get('position_pct', 0) - if chg < -30: - label = '深套(>30%),优先减' - rank = 0 - elif chg < -20: - label = '深套(>20%),优先减' - rank = 1 - elif chg < -10: - label = '亏损,建议减' - rank = 2 - elif chg < 0: - label = '微亏,可减' - rank = 3 - elif chg < 10: - label = '微盈,持有' - rank = 4 - else: - label = '盈利,最后减' - rank = 5 - ranked.append((rank, h['code'], h.get('name',''), chg, pos, label)) - ranked.sort(key=lambda x: (x[0], -x[4])) # 优先 rank, 其次仓位大优先 - return [{'code':c,'name':n,'change_pct':chg,'position_pct':pos,'label':l} - for r,c,n,chg,pos,l in ranked] - except: - return [] - - -def enrich_timing_signal(base_signal, macro_desc="", sector_note="", - profit_pct=0, stock_category="", is_new_entry=False, - fundamentals=None, news_sentiment=None, - timing_signal_override=None, - portfolio_context=None, - rr_ratio=0): # 2026-06-24 新参:盈亏比约束 - """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险+盈亏比 - - 返回 (enriched_signal, factors_list) - - enriched_signal: 可读的多因子信号描述 - - factors_list: 各因子的摘要列表(用于后续显示) - """ - # 如果已手动设定,尊重手动 - if timing_signal_override and timing_signal_override != "neutral": - return timing_signal_override, [timing_signal_override] - - factors = [] - - # 1. 大盘因子 - if "偏强" in macro_desc or "大涨" in macro_desc or "bullish" in macro_desc.lower(): - macro_txt = "大盘偏强" - factors.append(macro_txt) - elif "偏弱" in macro_desc or "大跌" in macro_desc or "bearish" in macro_desc.lower(): - macro_txt = "大盘偏弱" - factors.append(macro_txt) - elif macro_desc and macro_desc != "宏观未加载": - factors.append("大盘中性") - - # 2. 行业因子 - if sector_note: - # 把"行业X大跌3%+"简化为"行业偏弱","行业X大涨3%+"简化为"行业偏强" - if "大跌" in sector_note or "下跌" in sector_note: - factors.append("行业偏弱") - elif "大涨" in sector_note: - factors.append("行业偏强") - elif "上涨" in sector_note: - factors.append("行业偏强") - else: - factors.append("行业中性") - - # 3. 基本面因子 - if fundamentals: - pe = fundamentals.get("pe", 0) - eps = fundamentals.get("eps", 0) - profit_growth = fundamentals.get("profit_growth", fundamentals.get("yoy_profit", "")) - revenue_growth = fundamentals.get("revenue_growth", fundamentals.get("yoy_revenue", "")) - mcap = fundamentals.get("mcap_total", 0) - - pe = pe or 0 - eps = eps or 0 - profit_growth_str = str(profit_growth or "") - revenue_growth_str = str(revenue_growth or "") - - # 净利增长 - for val in [profit_growth_str, revenue_growth_str]: - try: - v = float(val.replace("%", "").replace("+", "")) - if v > 50: - factors.append("净利增50%+") - break - elif v > 20: - factors.append(f"净利增{int(v)}%") - break - elif v < -20: - factors.append("净利降20%+") - break - except (ValueError, AttributeError): - continue - - # PE估值 - if 0 < pe < 15: - factors.append("低估值") - elif pe > 100 or pe < 0: - factors.append("高估值") - - # 市值 - if mcap and mcap > 5000: - factors.append("蓝筹") - - # 4. 消息面因子(小果情感) - if news_sentiment: - ns = news_sentiment.get("sentiment", "") - nc = news_sentiment.get("confidence", 0) - if ns == "positive" and nc >= 0.7: - kws = news_sentiment.get("keywords", []) - kw_str = f"({'/'.join(kws[:3])})" if kws else "" - factors.append(f"消息偏多{kw_str}") - elif ns == "negative" and nc >= 0.7: - kws = news_sentiment.get("keywords", []) - kw_str = f"({'/'.join(kws[:3])})" if kws else "" - factors.append(f"消息偏空{kw_str}") - - # 5. 技术面(基础信号) - if base_signal and base_signal != "neutral": - factors.append(base_signal) - - # 5.5 组合风险因子(2026-06-23 双引擎协调) - if portfolio_context and not is_new_entry: - if portfolio_context.get('is_very_high_position'): - factors.append("组合仓位极重(>90%)") - elif portfolio_context.get('is_high_position'): - factors.append("组合仓位偏重(>80%)") - if portfolio_context.get('is_high_weak'): - factors.append(f"弱势占{portfolio_context.get('weak_ratio')}%") - elif portfolio_context and is_new_entry: - # 新买入推荐:注明组合上下文 - if portfolio_context.get('is_high_position'): - factors.append(f"仓{portfolio_context.get('position_pct')}%现金有限") - elif portfolio_context.get('is_high_weak'): - factors.append("组合风险信号") - - # 5.7 盈亏比因子(2026-06-24 新增——RR<1.5降级买入信号) - if rr_ratio > 0: - if rr_ratio < 1.5: - factors.append(f"RR{rr_ratio}过低") - elif rr_ratio >= 3: - factors.append(f"RR{rr_ratio}") - # 1.5~3之间:中性,不特别标注 - - # 如果没有足够因素,返回信号不充分 - if not factors: - return "信号不充分", [] - - # 信号只应包含明确的买卖方向,不能从行业/大盘等上下文因子拼凑 - # base_signal 存在且非 neutral → 用 base_signal - # 否则 → 信号不充分(不拿 factors[-1] 当信号) - if base_signal and base_signal != "neutral": - clean_signal = base_signal - else: - # 从 factors 中找第一个有效的操作方向信号 - valid_direction = {"买入", "加仓", "观望", "持有", "关注", "信号不充分"} - signal_found = "" - for f in reversed(factors): - if f in valid_direction: - signal_found = f - break - clean_signal = signal_found if signal_found else "信号不充分" - - # 6. RR约束降级(2026-06-24 新增) - # 买入/加仓信号但RR<1.5 → 降级为"信号不充分" - buy_signals = {"买入", "加仓"} - if clean_signal in buy_signals and 0 < rr_ratio < 1.5: - clean_signal = "信号不充分" - factors.append("RR过低降级") - - return clean_signal, factors - - -def reassess_with_context(code, name, price, cost, shares, current_action, - volume_signal="", sentiment="neutral", is_watchlist=False): - """reassess_strategy + 多因子信号合成(大盘+行业+技术) - - 为 per_stock_reassess 等单只场景提供一站式多因子分析 - """ - result = reassess_strategy( - code, name, price, cost, shares, - current_action, volume_signal, sentiment, is_watchlist - ) - if not result: - return result - - # 加载宏观+行业+消息+基本面上下文 - try: - macro_bias, macro_desc = load_macro_context() - market_ctx = load_market_context() - stock_sector_map = load_stock_sector_map() - sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) - sector_note = sector_adj.get("note", "") - news_sentiment = load_stock_news_sentiment(code) - fund = load_fundamentals(code) - except Exception: - macro_desc = "" - sector_note = "" - news_sentiment = {} - fund = {} - - # ── DSA 集成:注入大盘复盘 + 新闻情报 ────────────────────────── - try: - from mo_bridge import enrich_analysis_context - region = "hk" if len(str(code)) == 5 and str(code)[0] in ('0','1') else "cn" - dsa_ctx = enrich_analysis_context(stock_code=code, stock_name=name, - region=region, include_news=True) - if dsa_ctx: - macro_desc = (macro_desc + "\n\n" + dsa_ctx).strip() - except Exception: - pass # DSA 不可用时静默跳过 - - enriched, factors = enrich_timing_signal( - base_signal=result.get("timing_signal", ""), - macro_desc=macro_desc, - sector_note=sector_note, - profit_pct=(price - cost) / cost * 100 if cost else 0, - stock_category=result.get("stock_category", ""), - is_new_entry=is_watchlist, - fundamentals=fund, - news_sentiment=news_sentiment, - portfolio_context=_get_portfolio_risk_state(), - rr_ratio=result.get("rr_ratio", 0), - ) - result["timing_signal"] = enriched - result["signal_factors"] = factors - - # 6. 防洗盘:信号不要一天一翻(2026-06-23) - # 如果旧信号是买入/持有类,新信号是谨慎/等待类,但中期趋势未破→维持旧信号 - try: - dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) - for e in dec.get('decisions', []): - if e.get('code') == code: - old_signal = e.get('timing_signal', '') - if old_signal and _is_buy_signal(old_signal) and not _is_buy_signal(enriched): - # 中等趋势检查:MA5 > MA20 + 多周期看多 - mtf = result.get('multi_tf_context', '') - if '看多' in mtf or '多头' in mtf: - try: - closes = [float(k.split()[2]) for k in mtf.split('|') if 'MA5' in k] - except: - closes = [] - has_uptrend = 'MA5' in mtf and 'MA20' in mtf - if has_uptrend: - print(f" 防洗盘: {old_signal}→保持旧信号(中期趋势完整)") - result["timing_signal"] = f"{old_signal}(正常回调价稳)" - sf = result.get("signal_factors") or [] - if "正常回调价稳" not in sf: - result["signal_factors"] = sf + ["正常回调价稳"] - break - except Exception as e: - print(f" 防洗盘跳过: {e}") - - # 7. 反馈循环核:检查本股是否有刚卖出的记录(2026-06-23) - contradiction = _check_contradiction(code) - if contradiction and contradiction.get('is_today'): - # 今日刚卖出 → 不屏蔽信号,但必须自标注矛盾 - print(f" 反馈循环: {contradiction.get('tag')} (sold_at={contradiction.get('sold_at')})") - if _is_buy_signal(result.get('timing_signal', '')): - result['action_note'] = contradiction['tag'] - # 在 timing_signal 中追加反馈标注,供报告层可见 - curr_signal = result.get('timing_signal', '') - if '⚠️' not in curr_signal: - result['timing_signal'] = f"⚠️{contradiction['tag']}|{curr_signal}" - elif contradiction: - # 非今日卖出但近期卖出 → 标注已清仓 - print(f" 近期清仓: sold_at={contradiction.get('sold_at')} ({contradiction.get('days_ago')}日前)") - if _is_buy_signal(result.get('timing_signal', '')): - curr_signal = result.get('timing_signal', '') - if '已清仓' not in curr_signal: - result['timing_signal'] = f"已清仓,{curr_signal}" - - # 重建 action 文本(同步多因子信号) - try: - if new_action_needs_refresh(result, {"source": "auto"}, price): - _refresh_action_text(result, price, name) - except Exception: - pass - - return result - - -def new_action_needs_refresh(result, old_entry, price): - """判断宏观/行业调整后是否需要刷新action文本""" - # 自选股和手动策略不做调整,不需要刷新 - if old_entry.get("source") == "manual": - return False - return True - - -def _refresh_action_text(result, price, name): - """根据调整后的止损/止盈重建action文本""" - sl = result.get("stop_loss", 0) - tp = result.get("take_profit", 0) - el = result.get("entry_low", 0) - eh = result.get("entry_high", 0) - ts = result.get("timing_signal", "") - an = result.get("action_note", "") - old_action = result.get("action", "") - - # 保持原action的前缀(持有状态部分不变) - # action格式一般是: "状态 | 止损X | 目标Y | 买入区X~Y | 信号:Z" - parts = old_action.split(" | ") - new_parts = [] - for p in parts: - p = p.strip() - # 替换止损数字 - if p.startswith("止损") or p.startswith("止损参考"): - if sl: - p = f"止损{sl}" if "止损参考" not in old_action.split(" | ")[0] else f"止损参考{sl}" - # 替换目标/止盈数字 - if p.startswith("目标") or p.startswith("止盈"): - if tp: - p = f"目标{tp}" - # 替换买入区数字 - if "买入区" in p and "~" in p: - if el and eh: - p = f"买入区{el}~{eh}" - new_parts.append(p) - result["action"] = " | ".join(new_parts) - - -def check_sector_alerts(market_ctx, stock_sector_map, holdings, wl): - """行业轮动主动预警:检测板块崩盘级别信号→查持仓→输出预警 - - 返回 list of alerts: [{code, name, sector, chg, action}] - """ - alerts = [] - if not market_ctx: - return alerts - - sector_perf = market_ctx.get("sector_perf", {}) - - # 找出所有跌幅>3%的行业 - crashing_sectors = {name: data for name, data in sector_perf.items() - if data.get("change", 0) <= -3} - - if not crashing_sectors: - return alerts - - # 构建 code→持仓信息 的映射 - holding_map = {} - for h in holdings: - c = h.get("code", "") - if c: - holding_map[c] = {"name": h.get("name", c), "type": "持仓"} - for s in wl.get("stocks", []): - c = s.get("code", "") - if c and c not in holding_map: - holding_map[c] = {"name": s.get("name", c), "type": "自选"} - - # 对每个暴跌行业,查持仓中是否有股票属于该行业 - for sec_name, sec_data in sorted(crashing_sectors.items(), - key=lambda x: x[1].get("change", 0)): - chg = sec_data.get("change", 0) - for code, sectors in stock_sector_map.items(): - if code in holding_map and sec_name in sectors: - info = holding_map[code] - alerts.append({ - "code": code, - "name": info["name"], - "sector": sec_name, - "sector_change": chg, - "type": info["type"], - "action": f"行业{sec_name}跌{chg:+.1f}%,{info['type']}需关注", - }) - - alerts.sort(key=lambda a: a["sector_change"]) - return alerts - - -def regenerate_all(stdout=True): - """全量重评所有持仓+自选策略""" - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_holdings, query_watchlist - conn = get_conn() - holdings = query_holdings(conn) - wl_stocks = query_watchlist(conn) - conn.close() - pf = {"holdings": holdings} - wl = {"stocks": wl_stocks} - except Exception: - pf = safe_json_load(PORTFOLIO_PATH, {}) - wl = safe_json_load(WATCHLIST_PATH, {}) - - all_stocks = {} - for item in pf.get("holdings", []): - code = item.get("code", "") - if code: - all_stocks[code] = {"source": "portfolio", "data": item} - for item in wl.get("stocks", []): - code = item.get("code", "") - if code and code not in all_stocks: - all_stocks[code] = {"source": "watchlist", "data": item} - - total = len(all_stocks) - ok = 0 - errors = 0 - results = [] - decisions = [] - - # 加载现有 decisions.json 以便追踪变更 - decisions_path = "/home/hmo/web-dashboard/data/decisions.json" - try: - existing_decisions = {d["code"]: d for d in json.load(open(decisions_path)).get("decisions", []) if d.get("code")} - except: - existing_decisions = {} - - # 加载宏观上下文(影响策略参数调整) - macro_bias, macro_desc = load_macro_context() - if stdout: - print(f" 宏观参考: {macro_desc} (bias={macro_bias})") - - # 加载市场上下文 — 行业板块表现 + 大盘宽度(策略参数调整用) - market_ctx = load_market_context() - stock_sector_map = load_stock_sector_map() - market_breadth = market_ctx.get("breadth", 50) - market_mood = market_ctx.get("mood", "neutral") - if stdout: - sectors_found = sum(1 for c in all_stocks if stock_sector_map.get(c)) - print(f" 市场参考: {market_mood} 上涨比{market_breadth}% 已匹配{sectors_found}/{total}只个股行业") - - # 批量预取所有价格(一次API调用 vs 之前N次) - prices_map = batch_fetch_prices(list(all_stocks.keys())) - if stdout: - print(f" 批量获取价格: {len(prices_map)}/{total} 成功") - - for code, info in sorted(all_stocks.items()): - stock = info["data"] - name = stock.get("name", code) - cost = stock.get("cost", 0) or 0 - shares = stock.get("shares", 0) or 0 - source = info["source"] - - q = prices_map.get(code) - if not q or not q.get("price"): - results.append({"code": code, "name": name, "error": "腾讯API无数据"}) - errors += 1 - if stdout: - print(f" ❌ {name}({code}): 腾讯API无数据") - continue - - price = q["price"] - profit_pct = (price - cost) / cost * 100 if cost else 0 - current_action = stock.get("analysis", {}).get("action", "") - close_yest = q.get("close", 0) - sentiment = "neutral" - if close_yest and price > close_yest * 1.02: - sentiment = "bullish" - elif close_yest and price < close_yest * 0.98: - sentiment = "bearish" - - try: - is_wl = (source == "watchlist") - result = reassess_strategy( - code, name, price, cost, shares, - current_action, volume_signal="中性", sentiment=sentiment, - is_watchlist=(source == "watchlist"), - ) - - # --- Manual param preservation: 用户手动策略永不覆盖 --- - old_entry = existing_decisions.get(code, {}) - if old_entry.get("source") == "manual": - # 仅覆盖策略参数,技术分析/信号/价格照常保留 - for key in ["entry_low", "entry_high", "stop_loss", "take_profit"]: - if key in old_entry and old_entry[key] is not None: - result[key] = old_entry[key] - # 重算盈亏比(基于手动参数) - manual_stop = result.get("stop_loss", 0) or 0 - manual_target = result.get("take_profit", 0) or 0 - risk = max(price - manual_stop, price * 0.01) if manual_stop > 0 else price * 0.01 - reward = max(manual_target - price, 0) if manual_target > 0 else 0 - result["rr_ratio"] = round(reward / risk, 2) if risk > 0 else 0 - # 重建 action 文本(引用手动参数,不引用自动计算的) - profit_pct = (price - cost) / cost * 100 if cost else 0 - manual_action_parts = [] - if profit_pct < -20: - manual_action_parts.append("深套持有") - elif profit_pct < -10: - manual_action_parts.append("持有观察") - elif profit_pct < 0: - manual_action_parts.append("持有观察") - elif profit_pct < 5: - manual_action_parts.append("盈利持有") - else: - manual_action_parts.append("盈利良好") - if result.get("action_note"): - manual_action_parts.append(result["action_note"]) - if is_wl: - if manual_stop > 0: - manual_action_parts.append(f"止损参考{manual_stop}") - manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") - else: - if manual_stop > 0: - manual_action_parts.append(f"止损{manual_stop}") - if manual_target > 0: - manual_action_parts.append(f"目标{manual_target}") - manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") - ts = result.get("timing_signal", "") - if ts and ts != "neutral": - manual_action_parts.append(f"信号:{ts}") - result["action"] = " | ".join(manual_action_parts) - result["status"] = "manual" # 标记为手动管理,变更追踪不受影响 - if stdout: - print(f" [手动保留] {name}({code}) 策略参数未覆盖") - - # 宏观偏差调整:收盘后重评时根据宏观方向微调止损/止盈 - # 自选股不做止盈宏观调整(无持仓) - # 手动策略不做宏观偏差调整(尊重用户设定) - if macro_bias != 1.0 and not is_wl and old_entry.get("source") != "manual": - old_stop = result.get("stop_loss", 0) - old_target = result.get("take_profit", 0) - if macro_bias < 1.0 and old_stop > 0: # 宏观偏弱 → 收紧止损 - # 止损上移(但保留最小3%间距) - adjusted_stop = round(old_stop * (1 + (1 - macro_bias) * 0.3), 2) - min_stop = round(price * 0.97, 2) - result["stop_loss"] = min(adjusted_stop, min_stop) - if old_target > 0: - result["take_profit"] = round(old_target * (1 - (1 - macro_bias) * 0.2), 2) - elif macro_bias > 1.0 and old_target > 0: # 宏观偏强 → 止盈上调让利润跑 - result["take_profit"] = round(old_target * (1 + (macro_bias - 1) * 0.3), 2) - - # 行业偏差调整:根据个股所在行业的市场表现微调止损/止盈 - # 手动策略不做行业调整(尊重用户设定) - sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) - sector_note = sector_adj.get("note", "") - if sector_note and old_entry.get("source") != "manual": - old_stop = result.get("stop_loss", 0) - old_target = result.get("take_profit", 0) - stop_bias = sector_adj.get("stop_bias", 1.0) - target_bias = sector_adj.get("target_bias", 1.0) - if stop_bias != 1.0 and old_stop > 0: - # 行业偏差调整(在宏观调整之后叠加) - adjusted = round(old_stop * stop_bias, 2) - # 保留最小3%间距 - min_stop = round(price * 0.97, 2) - result["stop_loss"] = min(adjusted, min_stop) - if target_bias != 1.0 and old_target > 0 and not is_wl: - result["take_profit"] = round(old_target * target_bias, 2) - - # 加载消息面+基本面(逐个股) - news_sentiment = load_stock_news_sentiment(code) - fund = load_fundamentals(code) - - # 多因子合成 timing_signal:大盘+行业+消息+基本面+技术 - if old_entry.get("source") != "manual": - enriched, _ = enrich_timing_signal( - base_signal=result.get("timing_signal", ""), - macro_desc=macro_desc, - sector_note=sector_note, - profit_pct=profit_pct, - stock_category=result.get("stock_category", ""), - is_new_entry=(source == "watchlist"), - fundamentals=fund, - news_sentiment=news_sentiment, - rr_ratio=result.get("rr_ratio", 0), - ) - result["timing_signal"] = enriched - - # 在宏观/行业/多因子调整后重建 action 文本(同步调整后的止损/止盈数字) - if new_action_needs_refresh(result, old_entry, price): - _refresh_action_text(result, price, name) - - extra = { - "rr_ratio": result.get("rr_ratio"), - "action_note": result.get("action_note", ""), - "timing_signal": result.get("timing_signal", ""), - } - analysis = { - "stop_loss": result["stop_loss"], - "take_profit": result["take_profit"], - "entry_low": result["entry_low"], - "entry_high": result["entry_high"], - "action": result["action"], - "tech_snapshot": result.get("tech_snapshot", ""), - "multi_tf_context": result.get("multi_tf_context", ""), - "reassessed_at": result["reassessed_at"], - "status": result["status"], - **extra, - } - stock["analysis"] = analysis - # 同步 top-level 字段 → zone_breach/price_monitor 依赖这些字段 - # (2026-06-24 bugfix: analysis 子对象有但顶层没有,导致新持仓的止损检测盲区) - stock["stop_loss"] = result.get("stop_loss", 0) - stock["take_profit"] = result.get("take_profit", 0) - stock["entry_low"] = result.get("entry_low", 0) - stock["entry_high"] = result.get("entry_high", 0) - # 同步 trigger 字段 -> price_monitor 依赖 - sl = result.get("stop_loss", 0) - tp = result.get("take_profit", 0) - el = result.get("entry_low", 0) - eh = result.get("entry_high", 0) - trig = {} - if sl and float(sl) > 0: - trig["stop_loss"] = float(sl) - if el and eh and float(el) > 0 and float(eh) > 0: - trig["entry_zone"] = f"{float(el)}~{float(eh)}" - if tp and float(tp) > 0: - trig["take_profit_zone"] = f"0~{float(tp)}" - stock["trigger"] = trig - results.append({ - "code": code, "name": name, - "price": price, "cost": cost, - "action": result["action"], - "stop_loss": result["stop_loss"], - "take_profit": result["take_profit"], - "rr_ratio": result["rr_ratio"], - }) - ok += 1 - if stdout: - rr_str = f" RR={result['rr_ratio']}" if "rr_ratio" in result else "" - print(f" ✅ {name}({code}) {price} {result['action']}{rr_str}") - - # 记录所有股票的决策日志(含变更追踪) - status_display = result.get("status", "active") - # 构建行业上下文 - sector_ctx_str = "" - sec_name = sector_adj.get("sector_name", "") - sec_chg = sector_adj.get("sector_change", 0) - if sec_name: - sector_ctx_str = f"行业{sec_name}{sec_chg:+.1f}%" - if sector_adj.get("note"): - # note 已包含大盘宽度信息 - sector_ctx_str = sector_adj["note"] - elif market_breadth < 40: - # 无行业映射时至少记录大盘宽度 - sector_ctx_str = f"大盘上涨比{market_breadth}%" - new_entry = { - "code": code, "name": name, "price": price, - "cost": old_entry.get("cost", cost) if old_entry else cost, # 优先保留旧成本(holding.xls权威) - "shares": old_entry.get("shares", 0), # 保留持仓股数 - "avg_price": old_entry.get("avg_price", 0), # 保留持仓均价 - "action": result["action"], - "stop_loss": result.get("stop_loss"), - "entry_low": result["entry_low"], - "entry_high": result["entry_high"], - "tech_snapshot": result.get("tech_snapshot", ""), - "timing_signal": result.get("timing_signal", ""), - "rr_ratio": result.get("rr_ratio", 0), - "status": status_display, - "note": result.get("action_note", ""), - "timestamp": result["reassessed_at"], - "updated_at": result["reassessed_at"], - "type": "自选策略" if is_wl else "持仓策略", - "source": old_entry.get("source", "auto"), # manual/auto,继承旧标记 - "sector_context": sector_ctx_str, # 市场上下文:行业表现+大盘宽度 - "stock_category": result.get("stock_category", "中短线"), # 组合监测用 - "position_advice": result.get("position_advice", "中等仓位"), - "time_horizon": result.get("time_horizon", "2周~3月"), - } - new_entry["trigger"] = trig - # created_at: 首次创建时设置,后续 preserve - old_entry = existing_decisions.get(code, {}) - if old_entry.get("created_at"): - new_entry["created_at"] = old_entry["created_at"] - else: - new_entry["created_at"] = result["reassessed_at"] - # 保留 last_reassessed_price(per_stock_reassess 维护的防抖字段) - if old_entry.get("last_reassessed_price"): - new_entry["last_reassessed_price"] = old_entry["last_reassessed_price"] - # 自选股也写止盈位(用于RR校验),但标签用"目标参考"非"止盈" - new_entry["take_profit"] = result.get("take_profit") - - # --- 变更追踪 --- - old_action = old_entry.get("action", "") - old_stop = old_entry.get("stop_loss") - old_target = old_entry.get("take_profit") - - # 构建旧策略摘要和变更理由 - update_reason = "" - changelog_entry = None - - if old_action and old_action != result["action"]: - # 策略有变化 → 记录变更 - old_summary = old_action - new_summary = result["action"] - - # 判断触发原因 - if abs(price - old_entry.get("price", price)) / max(price, 0.01) > 0.03: - trigger = f"价格变动({old_entry.get('price','?')}→{price})" - elif result.get("timing_signal") and result["timing_signal"] != old_entry.get("timing_signal", ""): - trigger = f"技术信号变化: {result['timing_signal']}" - else: - trigger = "技术面重评" - - # 格式化的变更理由(自选股只看止损,不看止盈) - diff_parts = [] - if old_stop and result["stop_loss"] != old_stop: - diff_parts.append(f"止损{old_stop}→{result['stop_loss']}") - if not is_wl and old_target and result.get("take_profit") and result["take_profit"] != old_target: - diff_parts.append(f"止盈{old_target}→{result['take_profit']}") - if diff_parts: - update_reason = f"{trigger}: {', '.join(diff_parts)} | {result.get('tech_snapshot','')[:60]}" - else: - update_reason = f"{trigger}: 策略文字调整" - - changelog_entry = { - "date": result["reassessed_at"], - "old_action": old_action, - "new_action": result["action"], - "reason": update_reason, - "trigger": trigger, - } - new_entry["updated_reason"] = update_reason - - elif not old_action: - # 首次创建策略 - update_reason = f"初始策略创建 | {result.get('tech_snapshot','')[:60]}" - changelog_entry = { - "date": result["reassessed_at"], - "old_action": "", - "new_action": result["action"], - "reason": update_reason, - "trigger": "初始创建", - } - - # 合并changelog - old_changelog = old_entry.get("changelog", []) if old_entry else [] - if changelog_entry: - new_entry["changelog"] = old_changelog + [changelog_entry] - else: - new_entry["changelog"] = old_changelog - - # 保留执行记录 - if old_entry and old_entry.get("execution"): - new_entry["execution"] = old_entry["execution"] - elif stock.get("analysis", {}).get("status") == "executing": - new_entry["execution"] = { - "status": "executing", - "entry_price": cost if cost else 0, - "shares": shares, - "notes": "", - } - - # --- 自动标记 current_recommend --- - # 只在真正执行中的持仓才自动推荐:execution.status 为 executing 或 partial_exit - exec_status = old_entry.get("execution", {}).get("status", "") if old_entry else "" - is_active = exec_status in ("executing", "partial_exit") - - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_deep_loss_stock = profit_pct < -20 - rr = result.get("rr_ratio", 0) - ts = result.get("timing_signal", "") - note = result.get("action_note", "") - - # 计算是否在/接近买入区 - entry_low_val = result.get("entry_low", 0) - entry_high_val = result.get("entry_high", 0) - in_buy_zone = (entry_low_val > 0 and entry_high_val > 0 and - entry_low_val <= price <= entry_high_val) - near_buy_zone_low = (entry_low_val > 0 and - price >= entry_low_val * 0.98 and - price <= entry_high_val) - - # 推荐条件:必须是执行中的持仓 + 基本面条件达标 - is_recommendable = ( - is_active - and not is_deep_loss_stock - and rr >= 1.5 - and ts != "neutral" - and "不建议" not in note - ) - if is_recommendable: - new_entry["tag"] = "current_recommend" - else: - # 不清除 active_manual(用户手动标记),只清除自动推荐的 - old_tag = old_entry.get("tag", "") if old_entry else "" - if old_tag != "active_manual": - new_entry.pop("tag", None) - - decisions.append(new_entry) - - except Exception as e: - results.append({"code": code, "name": name, "error": str(e)}) - errors += 1 - if stdout: - print(f" ❌ {name}({code}): {e}") - - # 写回数据文件 — 保留现有字段(现金、总资产等)不丢 - try: - existing_pf = json.load(open(PORTFOLIO_PATH)) - except Exception: - existing_pf = {} - # 保留 price/change_pct — price_monitor 维护的实时价,regenerate_all 不应清除 - _existing_holdings_map = {} - for _h in existing_pf.get('holdings', []): - if _h.get('code'): - _existing_holdings_map[_h['code']] = _h - _new_holdings = pf.get("holdings", []) - for _h in _new_holdings: - _code = _h.get('code') - if _code and _code in _existing_holdings_map: - _old = _existing_holdings_map[_code] - _h['price'] = _old.get('price', 0) - _h['change_pct'] = _old.get('change_pct', 0) - existing_pf["holdings"] = _new_holdings - existing_pf["updated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M') - - # ── Watchlist ↔ Holdings 双向自动迁移(2026-06-27 Dad要求)── - # ① 持仓已有 → 从自选移除(买入自动清除) - wl_codes = {s.get("code") for s in wl.get("stocks", []) if s.get("code")} - pf_codes = {h.get("code") for h in _new_holdings if h.get("code") and h.get("shares", 0) > 0} - removed_from_wl = [] - for h_code in wl_codes & pf_codes: - # 持仓>0且量够 → 自选移除 - wl["stocks"] = [s for s in wl.get("stocks", []) if s.get("code") != h_code] - removed_from_wl.append(h_code) - if removed_from_wl and stdout: - print(f" 自选→持仓自动移除: {', '.join(removed_from_wl)}") - - # ② 清仓/卖光 → 加回自选(只要仍有关注价值) - added_to_wl = [] - old_pf_codes = {_h.get("code") for _h in existing_pf.get("holdings", []) if _h.get("code")} - sold_codes = old_pf_codes - pf_codes # 曾持仓但现在没有(或不在了) - for sc in sold_codes: - # 已有自选就不重复加 - if sc in wl_codes: - continue - # 从现有decisions看是否有关注价值 - for d in decisions: - if d.get("code") == sc and d.get("entry_low") and d.get("entry_high"): - wl["stocks"].append({ - "code": sc, "name": d.get("name", sc), - "entry_low": d.get("entry_low"), "entry_high": d.get("entry_high"), - "stop_loss": d.get("stop_loss", 0), - "analysis": {"action": d.get("action", ""), "tech_snapshot": d.get("tech_snapshot", "")} - }) - added_to_wl.append(sc) - break - if added_to_wl and stdout: - print(f" 清仓→自选自动加入: {', '.join(added_to_wl)}") - - # DB 写入(替代 JSON dump — 强制币种约束) - try: - from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_watchlist_stock, write_holding_strategy - conn = get_conn() - write_holdings_batch(conn, existing_pf.get('holdings', [])) - write_portfolio_summary(conn, existing_pf) - for s in wl.get('stocks', []): - s.setdefault('currency', 'CNY') - write_watchlist_stock(conn, s) - for d in decisions: - write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) - conn.close() - except Exception as e: - print(f" [DB写入失败] {e}", flush=True) - # JSON 冷备 - json.dump(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2) - json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2) - - # 写 decisions.json - decisions_path = "/home/hmo/web-dashboard/data/decisions.json" - decisions_data = { - "decisions": decisions, # 全部保留 - "total": len(decisions), - "regenerated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), - } - json.dump(decisions_data, open(decisions_path, "w"), ensure_ascii=False, indent=2) - # DB 已在上方写入(和 portfolio/watchlist 一起) - - # 记录策略→提示词版本关联 - if HAS_PROMPT_TRACKING: - try: - for d in decisions: - if d.get("code") and d.get("action"): - record_strategy_generation( - d["code"], d.get("name", ""), d.get("action", "") - ) - except Exception as e: - if stdout: - print(f" ⚠️ 提示词版本追踪失败: {e}", file=sys.stderr) - - # 刷新多周期缓存到磁盘 - try: - import multi_timeframe as _mtf - _mtf.flush_mtf_cache() - except Exception: - pass - - summary = {"total": total, "ok": ok, "errors": errors} - if stdout: - print(f"\n✅ 全量重评完成: {ok}/{total}成功, {errors}错误") - return summary - - -if __name__ == "__main__": - regenerate_all() +#!/usr/bin/env python3 +"""策略生命周期管理系统 — 技术面驱动版本 v2 + +核心原则: +1. 止损放在合理的技术位,不拍数字 +2. 新买入推荐:止损=弱支撑(约3%跌幅),止盈=强压力,盈亏比≥2:1 +3. 已持仓:止损=强支撑(约5-8%跌幅),目标=强压力 +4. 买入区间:弱支撑~弱压力之间 +5. 买入时机:量价齐跌不买,缩量至支撑买,量价齐升追买 +""" + +import json +import urllib.request +import os +import sys +import re +from datetime import datetime +import technical_analysis as ta +import multi_timeframe as mtf +from mo_data import read_portfolio, read_decisions, read_watchlist + + +def is_hk_stock(code): + """判断是否港股(港股代码5位,A股6位带前导零)""" + return len(str(code)) <= 5 + + +def calc_atr(code, period=14): + """从腾讯API K线数据计算ATR(period),返回ATR值或None""" + try: + url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param=hk{code},day,,,60,qfq" + req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) + resp = urllib.request.urlopen(req, timeout=5).read().decode('utf-8') + data = json.loads(resp) + bars = data.get('data', {}).get(f'hk{code}', {}).get('day', []) + if len(bars) < period + 1: + return None + trs = [] + for i in range(1, min(len(bars), period + 1)): + try: + high = float(bars[i][2]) + low = float(bars[i][3]) + prev_close = float(bars[i-1][4]) if len(bars[i-1]) > 4 else float(bars[i-1][3]) + tr = max(high - low, abs(high - prev_close), abs(low - prev_close)) + trs.append(tr) + except (ValueError, IndexError): + continue + if not trs: + return None + return round(sum(trs) / len(trs), 2) + except Exception: + return None + +# 提示词版本追踪 +try: + from prompt_manager.tracking import record_strategy_generation + HAS_PROMPT_TRACKING = True +except ImportError: + HAS_PROMPT_TRACKING = False + +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" +WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" + +def safe_json_load(path, default=None): + """安全加载 JSON,遇到坏数据自动修复""" + if not os.path.exists(path): + return default if default is not None else {} + try: + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + except json.JSONDecodeError: + # 尝试修复:替换字符串内未转义的换行符,去多余括号 + with open(path, "r", encoding="utf-8") as f: + raw = f.read() + fixed = raw + + # 修复1: 字符串内未转义的换行 -> \\n + result = [] + in_str = False + for ch in fixed: + if ch == '"': + in_str = not in_str + result.append(ch) + elif in_str and ch in '\n\r': + result.append('\\n') + else: + result.append(ch) + fixed = ''.join(result) + + # 修复2: 去掉多余的尾部括号 + fixed = fixed.rstrip('}') + # 补回正确的闭合 + if not fixed.endswith('}'): + fixed += '}' + + try: + return json.loads(fixed) + except json.JSONDecodeError as e: + print(f"[WARN] watchlist.json 自动修复失败: {e}", file=sys.stderr) + return default if default is not None else {} +KNOWLEDGE_LOG = "/home/hmo/Obsidian/knowledge/finance/analyst-knowledge-log.md" +MACRO_CONTEXT_PATH = "/home/hmo/web-dashboard/data/macro_context.json" +MARKET_CONTEXT_PATH = "/home/hmo/web-dashboard/data/market.json" +STOCK_SECTOR_MAP_PATH = "/home/hmo/web-dashboard/data/stock_sector_map.json" + + +def load_stock_sector_map(): + """读取个股归属行业映射 + + stock_sector_map.json 格式: {code: [sector1, sector2, ...]} + 跳过 _note, _created_at 等元数据键。 + """ + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_sector_stocks + conn = get_conn() + # 从 stock_sectors 表反向构建 code→[sectors] 映射 + rows = conn.execute("SELECT code, sector_name FROM stock_sectors ORDER BY code").fetchall() + conn.close() + code_to_sectors = {} + for code, sector in rows: + if code not in code_to_sectors: + code_to_sectors[code] = [] + code_to_sectors[code].append(sector) + return code_to_sectors + except Exception: + pass + try: + with open(STOCK_SECTOR_MAP_PATH) as f: + data = json.load(f) + code_to_sectors = {} + for key, value in data.items(): + if key.startswith("_"): + continue + if isinstance(value, list): + code_to_sectors[key] = value + return code_to_sectors + except Exception: + return {} + + +def load_market_context(): + """读取市场上下文,优先 SQLite,回退 market.json""" + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_latest_market + conn = get_conn() + market = query_latest_market(conn) + conn.close() + if market and market.get("sectors"): + sector_perf = {} + for s in market["sectors"]: + name = s.get("name", "") + if name: + sector_perf[name] = { + "change": s.get("change_pct", 0), + "up_count": s.get("up_count", 0), + "down_count": s.get("down_count", 0), + "net_inflow": s.get("net_inflow", 0), + "lead_stock": s.get("lead_stock", ""), + "lead_stock_change": s.get("lead_stock_change", 0), + } + return { + "sector_perf": sector_perf, + "breadth": market.get("up_ratio", 50), + "mood": market.get("mood", "neutral"), + "top_gainers": {g["name"]: g["change_pct"] for g in market.get("top_gainers", [])}, + "top_losers": {g["name"]: g["change_pct"] for g in market.get("top_losers", [])}, + "total_sectors": len(market["sectors"]), + "market_timestamp": market.get("timestamp", ""), + } + except Exception: + pass + try: + with open(MARKET_CONTEXT_PATH) as f: + market = json.load(f) + sectors = market.get("sectors", []) + sector_perf = {} + for s in sectors: + name = s.get("name", "") + if name: + sector_perf[name] = { + "change": s.get("change", 0), + "up_count": s.get("up_count", 0), + "down_count": s.get("down_count", 0), + "net_inflow": s.get("net_inflow", 0), + "lead_stock": s.get("lead_stock", ""), + "lead_stock_change": s.get("lead_stock_change", 0), + } + top_gainers = {s.get("name", ""): s.get("change", 0) + for s in market.get("top_gainers", [])} + top_losers = {s.get("name", ""): s.get("change", 0) + for s in market.get("top_losers", [])} + return { + "sector_perf": sector_perf, + "breadth": market.get("up_ratio", 50), + "mood": market.get("mood", "neutral"), + "top_gainers": top_gainers, + "top_losers": top_losers, + "total_sectors": market.get("total_sectors", 0), + "market_timestamp": market.get("timestamp", ""), + } + except Exception: + return { + "sector_perf": {}, + "breadth": 50, + "mood": "neutral", + "top_gainers": {}, + "top_losers": {}, + "total_sectors": 0, + "market_timestamp": "", + } + + +def compute_sector_adjustment(code, market_ctx, stock_sector_map): + """根据个股所属行业的市场表现+小果情感,返回调整系数 + + 返回 dict: + stop_bias: 止损调整系数(<1.0收紧, >1.0放宽) + target_bias: 止盈调整系数 + note: 行业背景一句话 + sector_name: 匹配到的行业名称 + sector_change: 行业涨跌幅 + """ + # 默认无调整 + adj = {"stop_bias": 1.0, "target_bias": 1.0, "note": "", + "sector_name": "", "sector_change": 0} + + sectors_for_code = stock_sector_map.get(code, []) + if not sectors_for_code: + return adj + + sector_perf = market_ctx.get("sector_perf", {}) + breadth = market_ctx.get("breadth", 50) + + # 找第一个能匹配到的行业 + for sec in sectors_for_code: + if sec in sector_perf: + perf = sector_perf[sec] + chg = perf.get("change", 0) + adj["sector_name"] = sec + adj["sector_change"] = chg + + # 行业暴跌 > 3% + if chg <= -3: + adj["stop_bias"] = 0.92 # 止损收紧8% + adj["target_bias"] = 0.90 # 止盈下调10% + adj["note"] = f"行业{sec}大跌{chg:+.1f}%,收紧止损" + # 行业大跌 1~3% + elif chg <= -1: + adj["stop_bias"] = 0.96 + adj["target_bias"] = 0.95 + adj["note"] = f"行业{sec}下跌{chg:+.1f}%,适度防御" + # 行业大涨 > 3% + elif chg >= 3: + adj["stop_bias"] = 1.05 # 止损放宽5%(给趋势空间) + adj["target_bias"] = 1.03 + adj["note"] = f"行业{sec}大涨{chg:+.1f}%,可适度积极" + # 行业上涨 1~3% + elif chg >= 1: + adj["stop_bias"] = 1.02 + adj["note"] = f"行业{sec}上涨{chg:+.1f}%,正常" + else: + adj["note"] = f"行业{sec}{chg:+.1f}%,中性" + break + # 尝试处理命名差异:market.json中的行业名可能多了"板块"后缀 + for market_sec_name in sector_perf: + if sec in market_sec_name or market_sec_name in sec: + perf = sector_perf[market_sec_name] + chg = perf.get("change", 0) + adj["sector_name"] = market_sec_name + adj["sector_change"] = chg + if chg <= -3: + adj["stop_bias"] = 0.92 + adj["target_bias"] = 0.90 + adj["note"] = f"行业{market_sec_name}大跌{chg:+.1f}%,收紧止损" + elif chg <= -1: + adj["stop_bias"] = 0.96 + adj["target_bias"] = 0.95 + adj["note"] = f"行业{market_sec_name}下跌{chg:+.1f}%,适度防御" + elif chg >= 3: + adj["stop_bias"] = 1.05 + adj["target_bias"] = 1.03 + adj["note"] = f"行业{market_sec_name}大涨{chg:+.1f}%,可适度积极" + elif chg >= 1: + adj["stop_bias"] = 1.02 + adj["note"] = f"行业{market_sec_name}上涨{chg:+.1f}%,正常" + else: + adj["note"] = f"行业{market_sec_name}{chg:+.1f}%,中性" + break + + # 如果breath<30% (大盘极弱),再加一层收紧 + if breadth < 30: + adj["stop_bias"] *= 0.97 # 再收紧3% + breadth_note = "大盘仅{}%个股上涨".format(int(breadth)) + adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note + elif breadth < 40: + adj["stop_bias"] *= 0.99 + breadth_note = "大盘偏弱({}%上涨)".format(int(breadth)) + adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note + + # 小果情感约束:利空置信度>80%时收紧止损 + try: + xiaoguo_path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" + if os.path.exists(xiaoguo_path): + xg = json.load(open(xiaoguo_path)) + stock_sentiment = xg.get("stocks", {}).get(code, {}) + if stock_sentiment: + sentiment = stock_sentiment.get("sentiment", "") + confidence = stock_sentiment.get("confidence", 0) + summary = stock_sentiment.get("summary", "") + if sentiment == "negative" and confidence > 0.8: + adj["stop_bias"] = min(adj["stop_bias"], 0.95) + adj["note"] += f" | 小果利空{confidence:.0%}:{summary[:30]}" + except Exception: + pass + + return adj + + +def load_macro_context(): + """读取宏观上下文,返回 (bias, desc),优先 DB,回退 JSON""" + try: + import sqlite3 + from pathlib import Path + conn = sqlite3.connect(str(Path(__file__).parent.parent / "data" / "mofin.db")) + row = conn.execute( + "SELECT indices, structure FROM macro_context_log " + "WHERE has_valid_data=1 ORDER BY created_at DESC LIMIT 1" + ).fetchone() + conn.close() + if row: + indices = json.loads(row[0]) if row[0] else {} + structure = json.loads(row[1]) if row[1] else {} + overall = structure.get("overall", "neutral") + desc = structure.get("description", "") + else: + raise ValueError("no db data") + except Exception: + try: + with open(MACRO_CONTEXT_PATH) as f: + ctx = json.load(f) + overall = ctx.get("structure", {}).get("overall", "neutral") + desc = ctx.get("structure", {}).get("description", "") + except Exception: + return 1.0, "宏观未加载" + if "bearish" in overall: + return 0.8, f"宏观{desc}" + elif overall == "bullish": + return 1.05, f"宏观{desc}" + elif overall == "strong_bullish": + return 1.1, f"宏观{desc}" + else: + return 1.0, f"宏观{desc}" + + +def batch_fetch_prices(codes): + """批量获取实时价格,合并为一次API调用(自动分批,每批15只)""" + if not codes: + return {} + + # 分批处理,避免单次请求过大导致超时 + batch_size = 15 + all_results = {} + for batch_start in range(0, len(codes), batch_size): + batch = codes[batch_start:batch_start + batch_size] + symbols = [] + code_map = {} + for raw_code in batch: + raw_code = str(raw_code).split('_')[0] + if not raw_code: + continue + if len(raw_code) == 5 and raw_code.isdigit(): + prefix = "hk" + elif raw_code.startswith(("6", "5")): + prefix = "sh" + else: + prefix = "sz" + sym = f"{prefix}{raw_code}" + symbols.append(sym) + code_map[sym] = raw_code + if not symbols: + continue + + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + max_retries = 2 + for attempt in range(max_retries + 1): + try: + r = urllib.request.urlopen(url, timeout=10) + text = r.read().decode("gbk") + except Exception as e: + if attempt < max_retries: + continue + print(f" batch_fetch_prices error: {e}", file=sys.stderr) + continue + + for line in text.strip().split("\n"): + line = line.strip() + if not line or "=" not in line: + continue + try: + sym = line.split("=", 1)[0].strip().lstrip("v_") + raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw_value.split("~") + if len(fields) < 35: + continue + orig_code = code_map.get(sym) + if not orig_code: + continue + def f(i): + try: + return float(fields[i]) if fields[i].strip() else 0.0 + except: + return 0.0 + all_results[orig_code] = { + "price": f(3), "close": f(4), "high": f(33), "low": f(34), + "code": orig_code, + } + except Exception: + continue + break # Success - break retry loop + + return all_results + + +def get_price_tencent(code): + """获取实时价格,港股转CNY统一存CNY""" + try: + from mo_models import to_cny, is_hk_stock + except ImportError: + to_cny = lambda v, r=None: v + is_hk_stock = lambda c: len(str(c).strip()) == 5 and str(c).strip().isdigit() + try: + raw_code = code.split('_')[0] + if not raw_code: + return None + if is_hk_stock(raw_code): + prefix = "hk" + elif raw_code.startswith("6") or raw_code.startswith("5"): + prefix = "sh" + else: + prefix = "sz" + url = f"http://qt.gtimg.cn/q={prefix}{raw_code}" + r = urllib.request.urlopen(url, timeout=5) + fields = r.read().decode("gbk").split('"')[1].split("~") + def f(i): + try: + return float(fields[i]) if fields[i].strip() else 0.0 + except: + return 0.0 + price = f(3) + if is_hk_stock(raw_code) and price > 0: + price = to_cny(price) + return { + "price": price, "close": f(4), "high": f(33), "low": f(34), + "code": raw_code, + } + except Exception as e: + print(f" get_price error {code}: {e}", file=sys.stderr) + return None + + +def reassess_strategy(code, name, price, cost, shares, current_action, + volume_signal="", sentiment="neutral", + is_watchlist=False): + """根据技术分析重评策略""" + + tech = ta.full_analysis(code) + if tech and "support_resistance" in tech: + sr = tech["support_resistance"] + candle = tech.get("candlestick", {}) + vol = tech.get("volume", {}) + ss = sr.get("strong_support") + ws = sr.get("weak_support") + wr = sr.get("weak_resist") + sr_resist = sr.get("strong_resist") + pivot = sr.get("pivot") + effective_range = sr.get("effective_range") + print(f" TECH: 强撑={ss} 弱撑={ws} 枢轴={pivot} 弱压={wr} 强压={sr_resist} 有效区间={effective_range}") + else: + print(f" ⚠️ 技术分析不可用", file=sys.stderr) + ss = ws = wr = sr_resist = pivot = None + candle = {} + vol = {} + + # ----- 多周期技术分析(周线/月线/均线) ----- + mtf_analysis = {} + mtf_adj = {} + try: + mtf_result = mtf.full_multi_tf_analysis(code) + if mtf_result.get("daily") and mtf_result["daily"].get("count", 0) >= 5: + mtf_analysis = mtf_result + mtf_adj = mtf_result.get("strategy_adjustment", {}) + daily_mas = mtf_result.get("daily", {}).get("mas", {}) + weekly = mtf_result.get("weekly", {}) + monthly = mtf_result.get("monthly", {}) + trend_align = mtf_adj.get("trend_alignment", "未知") + print(f" 多周期: {trend_align} | " + f"MA5={daily_mas.get('ma5','?')} MA20={daily_mas.get('ma20','?')} MA60={daily_mas.get('ma60','?')} | " + f"周线{weekly.get('trend',{}).get('description','?')} 月线{monthly.get('trend',{}).get('description','?')}") + except Exception as e: + print(f" 多周期分析失败: {e}", file=sys.stderr) + + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_new_entry = (cost == 0) or (shares == 0) + is_deep_loss = profit_pct < -20 + + # ----- 股票分类(短炒/中短线/中长线/弱势/深套) ----- + stock_category = "中短线" + time_horizon = "2周~3月" + position_advice = "中等仓位" + try: + mtf_cache = json.load(open("/home/hmo/web-dashboard/data/multi_tf_cache.json")) + stock_data = mtf_cache.get(code, {}) + daily_klines = stock_data.get("daily", []) + fund = stock_data.get("fundamentals", {}) + closes = [d["close"] for d in daily_klines] if daily_klines else [] + + if len(closes) >= 10: + cur = closes[-1] + ma20 = sum(closes[-20:])/20 if len(closes)>=20 else 0 + ma60 = sum(closes[-60:])/60 if len(closes)>=60 else 0 + highs = [d["high"] for d in daily_klines[-20:]] + lows = [d["low"] for d in daily_klines[-20:]] + volatility = ((max(highs)-min(lows))/min(lows)*100) if min(lows)>0 else 0 + pe = fund.get("pe") or 0 + eps = fund.get("eps") or 0 + mcap = fund.get("mcap_total") or 0 + is_high_vol = volatility > 30 + is_high_pe = pe > 100 or pe < 0 + is_value = 0 < pe < 20 and eps > 0.5 + + if is_deep_loss: + stock_category = "深套" + time_horizon = "长期" + position_advice = "不补不割" + elif is_high_vol and is_high_pe: + stock_category = "短炒" + time_horizon = "数日~2周" + position_advice = "小仓快进快出" + elif cur < ma20 and cur < ma60 and ma20 > 0: + stock_category = "弱势" + time_horizon = "观望" + position_advice = "减仓或观望" + elif (is_value or mcap > 1000) and cur > ma20: + stock_category = "中长线" + time_horizon = "数月~1年" + position_advice = "正常配置" + elif volatility > 20: + stock_category = "中短线" + time_horizon = "2~6周" + position_advice = "中等仓位" + except Exception: + pass + + print(f" 分类: {stock_category} | {time_horizon} | {position_advice}") + + # ----- 短炒+强趋势检测:短炒分类但多周期多头时用移动止损代替弱支撑止损 ----- + is_short_term_strong_trend = False + if stock_category == "短炒": + trend_align = mtf_adj.get("trend_alignment", "") + strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] + if any(ind in trend_align for ind in strong_trend_indicators): + is_short_term_strong_trend = True + print(f" ⚡ 短炒+强趋势检测: 趋势={trend_align} → 启用移动止损, 不止盈") + position_advice = "小仓强趋势让利润跑" + + # ----- 止损设置(含最小距离3%保护) ----- + if is_new_entry: + # 新买入推荐:止损 = 弱支撑(约2-3%跌幅,合理可控) + if ws and ws > 0: + new_stop = round(ws, 2) + else: + new_stop = round(price * 0.96, 2) + elif is_deep_loss: + # 深套:止损 = 强支撑再下移(不轻易割) + if ss and ss > 0: + new_stop = round(min(ss, price * 0.85), 2) + else: + new_stop = round(price * 0.85, 2) + else: + # 已持仓正常:止损 = 强支撑 + if is_short_term_strong_trend: + # 短炒+强趋势:用移动止损(距现价-5%),不止盈让利润跑 + trailing_sl = round(max(ws or 0, price * 0.95), 2) if ws else round(price * 0.95, 2) + new_stop = trailing_sl + print(f" 短炒强趋势移动止损: {new_stop} (距现价-{(1-new_stop/price)*100:.1f}%)") + elif ss and ss > 0: + new_stop = round(ss, 2) + else: + new_stop = round(price * 0.88, 2) + + # 已盈利仓位(>5%):用较紧的移动止损保护利润,但不超过成本线 + if profit_pct > 5 and not is_new_entry and not is_deep_loss: + # 取 max(弱支撑, 成本线, 当前价×0.95) 作为止损 + cost_protect = cost if cost > 0 else 0 + trailing_stop = round(max(ws or 0, cost_protect, price * 0.95), 2) + if trailing_stop > new_stop: + new_stop = trailing_stop + print(f" 已启用移动止损: {new_stop} (保护+{profit_pct:.1f}%利润)", file=sys.stderr) + + # 最小止损距离 —— 随趋势强度调整(2026-06-23 震度保护规则) + # 强趋势(多周期看多 + MA多头排列):最小1.5%下行空间 + # 普通/弱势:最小3%下行空间 + is_strong_trend = False + trend_align = mtf_adj.get("trend_alignment", "") + strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] + try: + if any(ind in trend_align for ind in strong_trend_indicators) and ma20 > ma60 and cur >= ma20: + is_strong_trend = True + except (NameError, TypeError): + pass # ma20/ma60/cur may be unbound if MTF data insufficient + + if is_strong_trend: + min_stop_gap = 0.015 # 1.5% + else: + min_stop_gap = 0.03 # 3% + + min_stop = round(price * (1 - min_stop_gap), 2) + if new_stop > min_stop and not is_deep_loss: + old_stop = new_stop + new_stop = min_stop + if old_stop != new_stop: + print(f" 最小止损 {round(min_stop_gap*100)}%间距约束: {old_stop}→{new_stop} (趋势{'强' if is_strong_trend else '普通'})") + + # 港股附加:ATR波动率校验 — 止损距现价不得小于 1×ATR(14) + if is_hk_stock(code): + atr = calc_atr(code) + if atr and atr > 0: + min_atr_stop = round(price - atr, 2) + if new_stop > min_atr_stop: + old_stop_val = new_stop + new_stop = min_atr_stop + print(f" 港股ATR波动率校验({atr:.2f}): 止损 {old_stop_val}→{new_stop} (1×ATR间距)") + + # ----- 止盈设置 ----- + if is_short_term_strong_trend and not is_new_entry: + # 短炒+强趋势:不止盈让利润跑 + mtf_tp = mtf_adj.get("take_profit_reference", {}) + if mtf_tp and mtf_tp.get("level", 0) > price * 1.2: + new_target = round(mtf_tp["level"], 2) + else: + new_target = 0 # 无多周期阻力时不编造止盈 + print(f" 短炒强趋势不止盈: 止盈设为{new_target} (+{(new_target/price-1)*100:.0f}%)") + elif sr_resist and sr_resist > 0: + new_target = round(sr_resist, 2) + else: + new_target = 0 # 无技术面数据时不编造止盈 + + # ----- 风险回报比校验 ----- + stop_distance = price - new_stop if price > new_stop else price * 0.02 + target_distance = new_target - price if new_target > price else 0 + + # 1:2 检查 + min_target_distance = stop_distance * 2.0 + if target_distance < min_target_distance: + # 尝试更高的阻力位,但不超过下一个真实压力位 + candidate_targets = [] + if wr and wr > price and wr != sr_resist: + candidate_targets.append(wr) + if sr_resist and sr_resist > price: + candidate_targets.append(sr_resist) + # 检查有效区间,如果有更高的自然目标位 + if effective_range and price < effective_range * 0.9: + candidate_targets.append(effective_range) + + found = False + for level in candidate_targets: + if (level - price) >= min_target_distance: + new_target = level + found = True + break + + # 如果仍然不满足,检查是否至少能到 1:1.5 + min15_distance = stop_distance * 1.5 + if not found: + for level in candidate_targets: + if (level - price) >= min15_distance: + new_target = level + found = True + break + + # ----- 风险回报比最终计算 ----- + risk = max(price - new_stop, price * 0.01) + reward = max(new_target - price, 0) + rr_ratio = reward / risk if risk > 0 else 0 + + # ----- 状态判断 ----- + if is_deep_loss: + status = "updated" + action_note = "深套持有" + elif is_new_entry: + if rr_ratio < 1.5: + status = "review" + action_note = "⚠️盈亏比不足1:1.5,不建议买入" + elif rr_ratio < 2.0: + status = "updated" + action_note = "⚠️盈亏比偏低(1:{:.1f}),谨慎买入".format(rr_ratio) + else: + status = "updated" + action_note = "" + else: + if rr_ratio < 0.5: + status = "updated" + action_note = "⚠️盈亏比极低,关注" + elif rr_ratio < 1.5: + status = "updated" + action_note = "⚠️盈亏比偏低(1:{:.1f}),不建议加仓".format(rr_ratio) + else: + status = "updated" + action_note = "" + + # 短炒+强趋势:在action_note追加标记 + if is_short_term_strong_trend and not is_new_entry and not is_deep_loss: + extra_note = "短炒强趋势持" if "深套" not in action_note else "" + if extra_note: + action_note = f"{action_note} | {extra_note}" if action_note else extra_note + + # ----- 买入区间(有盈亏比严格约束) ----- + max_acceptable_entry = None # 最大可接受买入价(满足R/R约束) + + if new_target and new_stop and new_target > new_stop and not is_deep_loss: + # 买入价的R/R约束: + # 要求 (target - entry) / (entry - stop) >= min_rr + # 即 entry <= (target + min_rr * stop) / (1 + min_rr) + min_rr = 1.0 # 至少1:1,才不亏 + recommend_rr = 1.5 # 推荐1:1.5以上 + + max_for_recommend = (new_target + recommend_rr * new_stop) / (1 + recommend_rr) + max_for_neutral = (new_target + min_rr * new_stop) / (1 + min_rr) + + if is_new_entry: + # 新买入:要求1:1.5+ + max_acceptable_entry = max_for_recommend + else: + # 已持仓加仓:至少1:1 + max_acceptable_entry = max_for_neutral + + if is_new_entry: + # 新买入:买入区 = 弱支撑附近(不是当前价附近!) + # 只在价格跌到弱支撑附近时才推买入 + entry_low = round(price * 0.98, 2) + entry_high = round(price * 1.02, 2) + if max_acceptable_entry and entry_high > max_acceptable_entry: + entry_high = round(max_acceptable_entry, 2) + # 确保买入区不小于1% + if entry_high - entry_low < price * 0.01: + if max_acceptable_entry and price <= max_acceptable_entry: + entry_low = round(max(price * 0.99, new_stop), 2) + entry_high = round(min(price * 1.01, max_acceptable_entry), 2) + elif ws and ws > 0 and wr and wr > 0 and not is_deep_loss: + # 已持仓正常:买入区 = 弱支撑~弱支撑上方5%(给合理回调空间) + # 上限不能低于成本价×0.95(保护已有持仓不被高位逼空) + entry_low = round(ws, 2) + entry_max = round(ws * 1.05, 2) # 比弱支撑高5%,有足够空间 + # 如果当前价已远离买入区,保持买入区不变(不因价格涨了就收窄) + min_upper = round(cost * 0.95, 2) if cost > 0 else 0 + if entry_max < min_upper: + entry_max = min_upper + if max_acceptable_entry: + entry_high = round(min(entry_max, max_acceptable_entry), 2) + else: + entry_high = entry_max + # 如果当前价已远离买入区(高于买入区上沿),禁止加仓推荐 + if price > entry_high: + # 买入区锁定在弱支撑位,但标记为"价格远离" + pass + # 如果买入区过窄,标记但不扩展(加仓必须在支撑位) + if entry_high - entry_low < price * 0.005: + entry_low = round(ws * 0.995, 2) + entry_high = round(ws * 1.005, 2) + else: + entry_low = round(price * 0.90, 2) + entry_high = round(price * 1.05, 2) + + # 买入区间稳定性保护:上边界单次变动不超过5% + if 'entry_high' in dir() and entry_high: + # 读取当前策略中已有的买入区上界,如果有且变化过大则限制 + old_entry_high = None + if 'current_action' in dir() and current_action: + import re + m = re.search(r'买入区[\d.]+~([\d.]+)', current_action) + if m: + old_entry_high = float(m.group(1)) + if old_entry_high and old_entry_high > 0: + max_change = old_entry_high * 0.95 # 单次最多下降5% + if entry_high < max_change: + entry_high = round(max_change, 2) + + # ----- 买入时机信号(三维分析:大盘+行业+个股,基本面+消息面+技术面+资金流)----- + # [2026-07-01] 扩展:不再只看volume_signal + candlestick_sentiment + # 融合大盘趋势、行业板块强弱、基本面估值作为修正因子 + volume_signal = vol.get("volume_signal", "") + candlestick_sentiment = candle.get("sentiment", "neutral") + timing_signal = "neutral" + + # --- 三维分析数据装载 --- + # 因子1: 大盘环境(从macro_context_log读) + market_bearish = False + market_bullish = False + try: + import sqlite3 + _db = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _mc = _db.execute( + "SELECT structure FROM macro_context_log WHERE has_valid_data=1 ORDER BY rowid DESC LIMIT 1" + ).fetchone() + if _mc and _mc[0]: + _s = json.loads(_mc[0]) + _overall = _s.get("overall", "") + if "bearish" in _overall: + market_bearish = True + elif _overall == "bullish": + market_bullish = True + _db.close() + except Exception: + pass + + # 因子2: 行业板块强弱 + sector_strong = False + sector_weak = False + try: + _db2 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _rows2 = _db2.execute( + "SELECT name, change_pct FROM sector_snapshots ORDER BY change_pct DESC" + ).fetchall() + if _rows2: + # 找到该股所属行业(简单匹配name或通过stock_sectors) + _my_sectors = _db2.execute( + "SELECT sector_name FROM stock_sectors WHERE code=?", + (code,) + ).fetchall() + if _my_sectors: + for (_sn,) in _my_sectors: + for r_name, r_chg in _rows2: + if _sn in r_name or r_name in _sn: + _rank = [r[0] for r in _rows2].index(r_name) if r_name in [x[0] for x in _rows2] else -1 + _total = len(_rows2) + if _rank >= 0: + if _rank < _total * 0.2: + sector_strong = True + if _rank > _total * 0.8: + sector_weak = True + break + _db2.close() + except Exception: + pass + + # 因子3: 基本面估值 + is_value_stock = False + try: + _db3 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _fd = _db3.execute( + "SELECT pe, eps FROM stock_fundamentals WHERE code=?", (code,) + ).fetchone() + if _fd: + _pe, _eps = _fd + is_value_stock = (0 < (_pe or 0) < 25 and (_eps or 0) > 0.3) + _db3.close() + except Exception: + pass + + # --- 三维修正规则 --- + # 大盘偏弱时收紧买入信号,大盘偏强时放宽 + # 行业领先加分,行业落后减分 + # 低估值加分(有安全边际) + + def _adjust_timing(signal, market_b, market_bb, sec_s, sec_w, is_val): + """根据三维因子修正 timing_signal""" + # 大盘偏弱时降级买入信号 + if market_b: + if signal in ("买入", "加仓"): + if not sec_s: # 大盘弱+行业不强→降级 + return "关注" + # 大盘偏强时放宽 + if market_bb: + if signal == "关注" and (sec_s or is_val): + return "买入" + # 行业弱势时降级买入信号 + if sec_w: + if signal in ("买入", "加仓"): + return "关注" + # 行业强势+低估时升级关注 + if sec_s and is_val: + if signal == "关注": + return "买入" + return signal + + if is_new_entry: + # 新买入时机 + if volume_signal == "主动买盘占优" and candlestick_sentiment == "bullish": + timing_signal = "买入" + elif volume_signal == "主动卖盘占优": + timing_signal = "观望" + elif volume_signal == "买卖均衡" and ws and price <= ws * 1.03: + timing_signal = "买入" + elif candlestick_sentiment == "bullish": + timing_signal = "买入" + elif ws and price < ws * 1.02: + timing_signal = "关注" + # 新买入时三维修正:大盘向上+行业强→升级,大盘弱→降级 + _pre_signal = timing_signal + timing_signal = _adjust_timing(timing_signal, market_bearish, market_bullish, + sector_strong, sector_weak, is_value_stock) + if timing_signal != _pre_signal: + print(f" 三维修正(新入): {_pre_signal}→{timing_signal} " + f"| 大盘{'弱' if market_bearish else '强' if market_bullish else '中性'}" + f"| 行业{'强' if sector_strong else '弱' if sector_weak else '中性'}" + f"| 估值{'低' if is_value_stock else '一般'}") + else: + # 已持仓时机(用于加仓/减仓参考) + if is_short_term_strong_trend: + # 短炒+强趋势:强趋势持有,禁止加仓信号 + timing_signal = "持有" + elif profit_pct > 5: + # 已盈利 + if volume_signal == "主动买盘占优": + timing_signal = "持有" + elif volume_signal == "主动卖盘占优" and not is_new_entry: + timing_signal = "关注" + else: + timing_signal = "持有" + elif profit_pct > 0: + # 微盈 + if volume_signal == "主动买盘占优": + timing_signal = "持有" + elif ws and price <= ws * 1.02: + timing_signal = "加仓" + else: + timing_signal = "持有" + else: + # 浮亏 + if volume_signal == "主动卖盘占优" and ss and price <= ss * 1.03: + timing_signal = "关注" + elif volume_signal == "主动买盘占优" and sr_resist and price >= sr_resist * 0.97: + timing_signal = "关注" + elif volume_signal == "买卖均衡" and ws and price <= ws * 1.02: + timing_signal = "加仓" + else: + timing_signal = "持有" + + # ----- 【v3.2新增】分类约束:弱势/深套禁止输出买入/加仓类信号 ----- + if stock_category == "弱势" or is_deep_loss: + buy_signals = ["买入", "加仓", "可追"] + if any(s in timing_signal for s in buy_signals): + old_signal = timing_signal + timing_signal = "弱势持有" if stock_category == "弱势" else "深套持有" + print(f" 分类约束: {stock_category} 原信号\"{old_signal}\" → \"{timing_signal}\"") + + # ----- 构造 action 描述(供 cron prompt 使用) ----- + action_parts = [] + if profit_pct < -20: + action_parts.append("深套持有") + elif profit_pct < -10: + action_parts.append("持有观察") + elif profit_pct < 0: + action_parts.append("持有观察") + elif profit_pct < 5: + action_parts.append("盈利持有") + else: + action_parts.append("盈利良好") + + if action_note: + action_parts.append(action_note) + + if is_watchlist: + # 自选股(未入场):有止损参考+买入区,内部算RR需要止盈位 + action_parts.append(f"目标参考{new_target}") + action_parts.append(f"止损参考{new_stop}") + action_parts.append(f"买入区{entry_low}~{entry_high}") + elif is_new_entry: + action_parts.append(f"损{new_stop}") + action_parts.append(f"盈{new_target}") + action_parts.append(f"买{entry_low}~{entry_high}") + else: + action_parts.append(f"止损{new_stop}") + action_parts.append(f"目标{new_target}") + action_parts.append(f"买入区{entry_low}~{entry_high}") + + if timing_signal != "neutral": + action_parts.append(f"信号:{timing_signal}") + + new_action = " | ".join(action_parts) + + # 技术面快照 + tech_snapshot = "" + if candle: + tech_snapshot = (f"形态:{candle.get('pattern','?')}/{candle.get('sentiment','?')} " + f"量价:{vol.get('volume_signal','?')} " + f"强撑:{ss} 弱撑:{ws} 弱压:{wr} 强压:{sr_resist}") + # 加入均线信息(如果可用) + try: + dm = mtf_analysis.get("daily", {}).get("mas", {}) + ma_parts = [] + for m in ['ma5', 'ma10', 'ma20', 'ma60']: + v = dm.get(m) + if v: + ma_parts.append(f"{m.upper()}={v}") + if ma_parts: + tech_snapshot += " | " + " ".join(ma_parts) + except (NameError, AttributeError): + pass + + # 多周期快照(追加到 tech_snapshot) + mtf_context = "" + if mtf_adj: + trend_align = mtf_adj.get("trend_alignment", "") + daily_mas = mtf_analysis.get("daily", {}).get("mas", {}) + ma20 = daily_mas.get("ma20") + ma60 = daily_mas.get("ma60") + stop_ref = mtf_adj.get("stop_loss_reference", {}) + take_ref = mtf_adj.get("take_profit_reference", {}) + + parts = [] + if trend_align: + parts.append(trend_align) + if ma20: + parts.append(f"MA20={ma20}") + if ma60: + parts.append(f"MA60={ma60}") + if stop_ref: + parts.append(f"长撑:{stop_ref.get('source','?')}={stop_ref['level']}") + if take_ref: + parts.append(f"长压:{take_ref.get('source','?')}={take_ref['level']}") + mtf_context = " | ".join(parts) + + now_str = datetime.now().strftime('%Y-%m-%d %H:%M') + return { + 'stop_loss': new_stop, + 'take_profit': new_target, + 'entry_low': entry_low, + 'entry_high': entry_high, + 'action': new_action, + 'status': status, + 'tech_snapshot': tech_snapshot, + 'timing_signal': timing_signal, + 'rr_ratio': round(rr_ratio, 2), + 'action_note': action_note, + 'reassessed_at': now_str, + 'multi_tf_context': mtf_context, # 多周期上下文 + 'stock_category': stock_category, # 股票分类:短炒/中短线/中长线/弱势/深套 + 'time_horizon': time_horizon, # 时间跨度 + 'position_advice': position_advice, # 仓位建议 + } + + +def load_stock_news_sentiment(code): + """加载小果消息面情感""" + try: + path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" + if not os.path.exists(path): + return {} + xg = json.load(open(path)) + return xg.get("stocks", {}).get(code, {}) + except Exception: + return {} + + +def load_fundamentals(code): + """加载个股基本面""" + try: + path = "/home/hmo/web-dashboard/data/multi_tf_cache.json" + if not os.path.exists(path): + return {} + m = json.load(open(path)) + return m.get(code, {}).get("fundamentals", {}) or {} + except Exception: + return {} + + +def _get_portfolio_risk_state(): + """读取 portfolio 组合风险状态(2026-06-23 引擎协调)""" + try: + # 数据一致性检查:警告多副本(2026-06-23 bugfix) + _check_portfolio_consistency() + p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) + pos_pct = p.get('position_pct', 0) + cash = p.get('cash', 0) + holdings = p.get('holdings', []) + weak_cnt = sum(1 for h in holdings if h.get('change_pct', 0) < -15) + total = len(holdings) or 1 + weak_ratio = weak_cnt / total + return { + 'position_pct': pos_pct, + 'cash': cash, + 'is_high_position': pos_pct > 80, + 'is_very_high_position': pos_pct > 90, + 'is_high_weak': weak_ratio > 0.35, + 'weak_ratio': round(weak_ratio * 100), + 'total_holdings': total, + } + except: + return {} + + +def _is_buy_signal(signal): + """判断信号是否为买入/持有类(用于防洗盘)""" + if not signal: + return False + buy_keywords = ['买入', '持有', '加仓', '关注'] + for kw in buy_keywords: + if kw in signal: + return True + return False + + +def _check_portfolio_consistency(): + """数据一致性检查:如果存在多份 portfolio.json 则报警(2026-06-23 bugfix)""" + main = '/home/hmo/web-dashboard/data/portfolio.json' + main_cash = None + try: + import json + main_cash = json.load(open(main)).get('cash') + except Exception: + return + for path in [ + '/home/hmo/data/portfolio.json', + '/home/hmo/projects/MoFin/data/portfolio.json', + '/home/hmo/web-dashboard.bak/data/portfolio.json', + ]: + if os.path.exists(path): + try: + other = json.load(open(path)) + if other.get('cash') != main_cash: + print(f"⚠️ 数据一致性: {os.path.realpath(path)} cash={other.get('cash')} ≠ 主文件 cash={main_cash} (需清理)", file=sys.stderr) + except Exception: + pass + + +def _check_contradiction(code, today_only=True): + """反馈循环核——检查本股是否有刚卖出的记录 + + 返回 dict or None: + - sold_reason: 'portfolio_trim'|'stop_loss' + - sold_at: 卖出日期 + - days_ago: 卖出距今交易日数 + - is_today: 是否今日卖出 + - tag: 追加到信号的标注 + """ + try: + from datetime import datetime, date + dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) + for e in dec.get('decisions', []): + if e.get('code') != code: + continue + sold_at = e.get('sold_at', '') + if not sold_at: + return None + try: + sd = datetime.strptime(sold_at, '%Y-%m-%d').date() + td = date.today() + days = (td - sd).days + except: + return None + + reason = e.get('sold_reason', 'portfolio_trim') + if reason == 'stop_loss': + tag = '止损离场(逻辑破坏,短期不关注)' + else: + tag = '组合减仓后关注(已清仓,等回踩确认)' + + return { + 'sold_reason': reason, + 'sold_at': sold_at, + 'days_ago': days, + 'is_today': days == 0, + 'tag': tag, + } + except: + return None + return None + + +def _get_sell_priority_list(): + """减仓优先级排序:深套>亏损>微盈>盈利(2026-06-23 反馈循环) + + 返回 [(code, name, change_pct, position_pct, priority_label), ...] + 按卖出的优先顺序排列(最先应该卖的在最前) + """ + try: + p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) + holdings = p.get('holdings', []) + ranked = [] + for h in holdings: + chg = h.get('change_pct', 0) + pos = h.get('position_pct', 0) + if chg < -30: + label = '深套(>30%),优先减' + rank = 0 + elif chg < -20: + label = '深套(>20%),优先减' + rank = 1 + elif chg < -10: + label = '亏损,建议减' + rank = 2 + elif chg < 0: + label = '微亏,可减' + rank = 3 + elif chg < 10: + label = '微盈,持有' + rank = 4 + else: + label = '盈利,最后减' + rank = 5 + ranked.append((rank, h['code'], h.get('name',''), chg, pos, label)) + ranked.sort(key=lambda x: (x[0], -x[4])) # 优先 rank, 其次仓位大优先 + return [{'code':c,'name':n,'change_pct':chg,'position_pct':pos,'label':l} + for r,c,n,chg,pos,l in ranked] + except: + return [] + + +def enrich_timing_signal(base_signal, macro_desc="", sector_note="", + profit_pct=0, stock_category="", is_new_entry=False, + fundamentals=None, news_sentiment=None, + timing_signal_override=None, + portfolio_context=None, + rr_ratio=0): # 2026-06-24 新参:盈亏比约束 + """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险+盈亏比 + + 返回 (enriched_signal, factors_list) + - enriched_signal: 可读的多因子信号描述 + - factors_list: 各因子的摘要列表(用于后续显示) + """ + # 如果已手动设定,尊重手动 + if timing_signal_override and timing_signal_override != "neutral": + return timing_signal_override, [timing_signal_override] + + factors = [] + + # 1. 大盘因子 + if "偏强" in macro_desc or "大涨" in macro_desc or "bullish" in macro_desc.lower(): + macro_txt = "大盘偏强" + factors.append(macro_txt) + elif "偏弱" in macro_desc or "大跌" in macro_desc or "bearish" in macro_desc.lower(): + macro_txt = "大盘偏弱" + factors.append(macro_txt) + elif macro_desc and macro_desc != "宏观未加载": + factors.append("大盘中性") + + # 2. 行业因子 + if sector_note: + # 把"行业X大跌3%+"简化为"行业偏弱","行业X大涨3%+"简化为"行业偏强" + if "大跌" in sector_note or "下跌" in sector_note: + factors.append("行业偏弱") + elif "大涨" in sector_note: + factors.append("行业偏强") + elif "上涨" in sector_note: + factors.append("行业偏强") + else: + factors.append("行业中性") + + # 3. 基本面因子 + if fundamentals: + pe = fundamentals.get("pe", 0) + eps = fundamentals.get("eps", 0) + profit_growth = fundamentals.get("profit_growth", fundamentals.get("yoy_profit", "")) + revenue_growth = fundamentals.get("revenue_growth", fundamentals.get("yoy_revenue", "")) + mcap = fundamentals.get("mcap_total", 0) + + pe = pe or 0 + eps = eps or 0 + profit_growth_str = str(profit_growth or "") + revenue_growth_str = str(revenue_growth or "") + + # 净利增长 + for val in [profit_growth_str, revenue_growth_str]: + try: + v = float(val.replace("%", "").replace("+", "")) + if v > 50: + factors.append("净利增50%+") + break + elif v > 20: + factors.append(f"净利增{int(v)}%") + break + elif v < -20: + factors.append("净利降20%+") + break + except (ValueError, AttributeError): + continue + + # PE估值 + if 0 < pe < 15: + factors.append("低估值") + elif pe > 100 or pe < 0: + factors.append("高估值") + + # 市值 + if mcap and mcap > 5000: + factors.append("蓝筹") + + # 4. 消息面因子(小果情感) + if news_sentiment: + ns = news_sentiment.get("sentiment", "") + nc = news_sentiment.get("confidence", 0) + if ns == "positive" and nc >= 0.7: + kws = news_sentiment.get("keywords", []) + kw_str = f"({'/'.join(kws[:3])})" if kws else "" + factors.append(f"消息偏多{kw_str}") + elif ns == "negative" and nc >= 0.7: + kws = news_sentiment.get("keywords", []) + kw_str = f"({'/'.join(kws[:3])})" if kws else "" + factors.append(f"消息偏空{kw_str}") + + # 5. 技术面(基础信号) + if base_signal and base_signal != "neutral": + factors.append(base_signal) + + # 5.5 组合风险因子(2026-06-23 双引擎协调) + if portfolio_context and not is_new_entry: + if portfolio_context.get('is_very_high_position'): + factors.append("组合仓位极重(>90%)") + elif portfolio_context.get('is_high_position'): + factors.append("组合仓位偏重(>80%)") + if portfolio_context.get('is_high_weak'): + factors.append(f"弱势占{portfolio_context.get('weak_ratio')}%") + elif portfolio_context and is_new_entry: + # 新买入推荐:注明组合上下文 + if portfolio_context.get('is_high_position'): + factors.append(f"仓{portfolio_context.get('position_pct')}%现金有限") + elif portfolio_context.get('is_high_weak'): + factors.append("组合风险信号") + + # 5.7 盈亏比因子(2026-06-24 新增——RR<1.5降级买入信号) + if rr_ratio > 0: + if rr_ratio < 1.5: + factors.append(f"RR{rr_ratio}过低") + elif rr_ratio >= 3: + factors.append(f"RR{rr_ratio}") + # 1.5~3之间:中性,不特别标注 + + # 如果没有足够因素,返回信号不充分 + if not factors: + return "信号不充分", [] + + # 信号只应包含明确的买卖方向,不能从行业/大盘等上下文因子拼凑 + # base_signal 存在且非 neutral → 用 base_signal + # 否则 → 信号不充分(不拿 factors[-1] 当信号) + if base_signal and base_signal != "neutral": + clean_signal = base_signal + else: + # 从 factors 中找第一个有效的操作方向信号 + valid_direction = {"买入", "加仓", "观望", "持有", "关注", "信号不充分"} + signal_found = "" + for f in reversed(factors): + if f in valid_direction: + signal_found = f + break + clean_signal = signal_found if signal_found else "信号不充分" + + # 6. RR约束降级(2026-06-24 新增) + # 买入/加仓信号但RR<1.5 → 降级为"信号不充分" + buy_signals = {"买入", "加仓"} + if clean_signal in buy_signals and 0 < rr_ratio < 1.5: + clean_signal = "信号不充分" + factors.append("RR过低降级") + + return clean_signal, factors + + +def reassess_with_context(code, name, price, cost, shares, current_action, + volume_signal="", sentiment="neutral", is_watchlist=False): + """reassess_strategy + 多因子信号合成(大盘+行业+技术) + + 为 per_stock_reassess 等单只场景提供一站式多因子分析 + """ + result = reassess_strategy( + code, name, price, cost, shares, + current_action, volume_signal, sentiment, is_watchlist + ) + if not result: + return result + + # 加载宏观+行业+消息+基本面上下文 + try: + macro_bias, macro_desc = load_macro_context() + market_ctx = load_market_context() + stock_sector_map = load_stock_sector_map() + sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) + sector_note = sector_adj.get("note", "") + news_sentiment = load_stock_news_sentiment(code) + fund = load_fundamentals(code) + except Exception: + macro_desc = "" + sector_note = "" + news_sentiment = {} + fund = {} + + # ── DSA 集成:注入大盘复盘 + 新闻情报 ────────────────────────── + try: + from mo_bridge import enrich_analysis_context + region = "hk" if len(str(code)) == 5 and str(code)[0] in ('0','1') else "cn" + dsa_ctx = enrich_analysis_context(stock_code=code, stock_name=name, + region=region, include_news=True) + if dsa_ctx: + macro_desc = (macro_desc + "\n\n" + dsa_ctx).strip() + except Exception: + pass # DSA 不可用时静默跳过 + + enriched, factors = enrich_timing_signal( + base_signal=result.get("timing_signal", ""), + macro_desc=macro_desc, + sector_note=sector_note, + profit_pct=(price - cost) / cost * 100 if cost else 0, + stock_category=result.get("stock_category", ""), + is_new_entry=is_watchlist, + fundamentals=fund, + news_sentiment=news_sentiment, + portfolio_context=_get_portfolio_risk_state(), + rr_ratio=result.get("rr_ratio", 0), + ) + result["timing_signal"] = enriched + result["signal_factors"] = factors + + # 6. 防洗盘:信号不要一天一翻(2026-06-23) + # 如果旧信号是买入/持有类,新信号是谨慎/等待类,但中期趋势未破→维持旧信号 + try: + dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) + for e in dec.get('decisions', []): + if e.get('code') == code: + old_signal = e.get('timing_signal', '') + if old_signal and _is_buy_signal(old_signal) and not _is_buy_signal(enriched): + # 中等趋势检查:MA5 > MA20 + 多周期看多 + mtf = result.get('multi_tf_context', '') + if '看多' in mtf or '多头' in mtf: + try: + closes = [float(k.split()[2]) for k in mtf.split('|') if 'MA5' in k] + except: + closes = [] + has_uptrend = 'MA5' in mtf and 'MA20' in mtf + if has_uptrend: + print(f" 防洗盘: {old_signal}→保持旧信号(中期趋势完整)") + result["timing_signal"] = f"{old_signal}(正常回调价稳)" + sf = result.get("signal_factors") or [] + if "正常回调价稳" not in sf: + result["signal_factors"] = sf + ["正常回调价稳"] + break + except Exception as e: + print(f" 防洗盘跳过: {e}") + + # 7. 反馈循环核:检查本股是否有刚卖出的记录(2026-06-23) + contradiction = _check_contradiction(code) + if contradiction and contradiction.get('is_today'): + # 今日刚卖出 → 不屏蔽信号,但必须自标注矛盾 + print(f" 反馈循环: {contradiction.get('tag')} (sold_at={contradiction.get('sold_at')})") + if _is_buy_signal(result.get('timing_signal', '')): + result['action_note'] = contradiction['tag'] + # 在 timing_signal 中追加反馈标注,供报告层可见 + curr_signal = result.get('timing_signal', '') + if '⚠️' not in curr_signal: + result['timing_signal'] = f"⚠️{contradiction['tag']}|{curr_signal}" + elif contradiction: + # 非今日卖出但近期卖出 → 标注已清仓 + print(f" 近期清仓: sold_at={contradiction.get('sold_at')} ({contradiction.get('days_ago')}日前)") + if _is_buy_signal(result.get('timing_signal', '')): + curr_signal = result.get('timing_signal', '') + if '已清仓' not in curr_signal: + result['timing_signal'] = f"已清仓,{curr_signal}" + + # 重建 action 文本(同步多因子信号) + try: + if new_action_needs_refresh(result, {"source": "auto"}, price): + _refresh_action_text(result, price, name) + except Exception: + pass + + return result + + +def new_action_needs_refresh(result, old_entry, price): + """判断宏观/行业调整后是否需要刷新action文本""" + # 自选股和手动策略不做调整,不需要刷新 + if old_entry.get("source") == "manual": + return False + return True + + +def _refresh_action_text(result, price, name): + """根据调整后的止损/止盈重建action文本""" + sl = result.get("stop_loss", 0) + tp = result.get("take_profit", 0) + el = result.get("entry_low", 0) + eh = result.get("entry_high", 0) + ts = result.get("timing_signal", "") + an = result.get("action_note", "") + old_action = result.get("action", "") + + # 保持原action的前缀(持有状态部分不变) + # action格式一般是: "状态 | 止损X | 目标Y | 买入区X~Y | 信号:Z" + parts = old_action.split(" | ") + new_parts = [] + for p in parts: + p = p.strip() + # 替换止损数字 + if p.startswith("止损") or p.startswith("止损参考"): + if sl: + p = f"止损{sl}" if "止损参考" not in old_action.split(" | ")[0] else f"止损参考{sl}" + # 替换目标/止盈数字 + if p.startswith("目标") or p.startswith("止盈"): + if tp: + p = f"目标{tp}" + # 替换买入区数字 + if "买入区" in p and "~" in p: + if el and eh: + p = f"买入区{el}~{eh}" + new_parts.append(p) + result["action"] = " | ".join(new_parts) + + +def check_sector_alerts(market_ctx, stock_sector_map, holdings, wl): + """行业轮动主动预警:检测板块崩盘级别信号→查持仓→输出预警 + + 返回 list of alerts: [{code, name, sector, chg, action}] + """ + alerts = [] + if not market_ctx: + return alerts + + sector_perf = market_ctx.get("sector_perf", {}) + + # 找出所有跌幅>3%的行业 + crashing_sectors = {name: data for name, data in sector_perf.items() + if data.get("change", 0) <= -3} + + if not crashing_sectors: + return alerts + + # 构建 code→持仓信息 的映射 + holding_map = {} + for h in holdings: + c = h.get("code", "") + if c: + holding_map[c] = {"name": h.get("name", c), "type": "持仓"} + for s in wl.get("stocks", []): + c = s.get("code", "") + if c and c not in holding_map: + holding_map[c] = {"name": s.get("name", c), "type": "自选"} + + # 对每个暴跌行业,查持仓中是否有股票属于该行业 + for sec_name, sec_data in sorted(crashing_sectors.items(), + key=lambda x: x[1].get("change", 0)): + chg = sec_data.get("change", 0) + for code, sectors in stock_sector_map.items(): + if code in holding_map and sec_name in sectors: + info = holding_map[code] + alerts.append({ + "code": code, + "name": info["name"], + "sector": sec_name, + "sector_change": chg, + "type": info["type"], + "action": f"行业{sec_name}跌{chg:+.1f}%,{info['type']}需关注", + }) + + alerts.sort(key=lambda a: a["sector_change"]) + return alerts + + +def regenerate_all(stdout=True): + """全量重评所有持仓+自选策略""" + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_holdings, query_watchlist + conn = get_conn() + holdings = query_holdings(conn) + wl_stocks = query_watchlist(conn) + conn.close() + pf = {"holdings": holdings} + wl = {"stocks": wl_stocks} + except Exception: + pf = safe_json_load(PORTFOLIO_PATH, {}) + wl = safe_json_load(WATCHLIST_PATH, {}) + + all_stocks = {} + for item in pf.get("holdings", []): + code = item.get("code", "") + if code: + all_stocks[code] = {"source": "portfolio", "data": item} + for item in wl.get("stocks", []): + code = item.get("code", "") + if code and code not in all_stocks: + all_stocks[code] = {"source": "watchlist", "data": item} + + total = len(all_stocks) + ok = 0 + errors = 0 + results = [] + decisions = [] + + # 加载现有 decisions.json 以便追踪变更 + decisions_path = "/home/hmo/web-dashboard/data/decisions.json" + try: + existing_decisions = {d["code"]: d for d in mo_data.read_decisions().get("decisions", []) if d.get("code")} + except: + existing_decisions = {} + + # 加载宏观上下文(影响策略参数调整) + macro_bias, macro_desc = load_macro_context() + if stdout: + print(f" 宏观参考: {macro_desc} (bias={macro_bias})") + + # 加载市场上下文 — 行业板块表现 + 大盘宽度(策略参数调整用) + market_ctx = load_market_context() + stock_sector_map = load_stock_sector_map() + market_breadth = market_ctx.get("breadth", 50) + market_mood = market_ctx.get("mood", "neutral") + if stdout: + sectors_found = sum(1 for c in all_stocks if stock_sector_map.get(c)) + print(f" 市场参考: {market_mood} 上涨比{market_breadth}% 已匹配{sectors_found}/{total}只个股行业") + + # 批量预取所有价格(一次API调用 vs 之前N次) + prices_map = batch_fetch_prices(list(all_stocks.keys())) + if stdout: + print(f" 批量获取价格: {len(prices_map)}/{total} 成功") + + for code, info in sorted(all_stocks.items()): + stock = info["data"] + name = stock.get("name", code) + cost = stock.get("cost", 0) or 0 + shares = stock.get("shares", 0) or 0 + source = info["source"] + + q = prices_map.get(code) + if not q or not q.get("price"): + results.append({"code": code, "name": name, "error": "腾讯API无数据"}) + errors += 1 + if stdout: + print(f" ❌ {name}({code}): 腾讯API无数据") + continue + + price = q["price"] + profit_pct = (price - cost) / cost * 100 if cost else 0 + current_action = stock.get("analysis", {}).get("action", "") + close_yest = q.get("close", 0) + sentiment = "neutral" + if close_yest and price > close_yest * 1.02: + sentiment = "bullish" + elif close_yest and price < close_yest * 0.98: + sentiment = "bearish" + + try: + is_wl = (source == "watchlist") + result = reassess_strategy( + code, name, price, cost, shares, + current_action, volume_signal="中性", sentiment=sentiment, + is_watchlist=(source == "watchlist"), + ) + + # --- Manual param preservation: 用户手动策略永不覆盖 --- + old_entry = existing_decisions.get(code, {}) + if old_entry.get("source") == "manual": + # 仅覆盖策略参数,技术分析/信号/价格照常保留 + for key in ["entry_low", "entry_high", "stop_loss", "take_profit"]: + if key in old_entry and old_entry[key] is not None: + result[key] = old_entry[key] + # 重算盈亏比(基于手动参数) + manual_stop = result.get("stop_loss", 0) or 0 + manual_target = result.get("take_profit", 0) or 0 + risk = max(price - manual_stop, price * 0.01) if manual_stop > 0 else price * 0.01 + reward = max(manual_target - price, 0) if manual_target > 0 else 0 + result["rr_ratio"] = round(reward / risk, 2) if risk > 0 else 0 + # 重建 action 文本(引用手动参数,不引用自动计算的) + profit_pct = (price - cost) / cost * 100 if cost else 0 + manual_action_parts = [] + if profit_pct < -20: + manual_action_parts.append("深套持有") + elif profit_pct < -10: + manual_action_parts.append("持有观察") + elif profit_pct < 0: + manual_action_parts.append("持有观察") + elif profit_pct < 5: + manual_action_parts.append("盈利持有") + else: + manual_action_parts.append("盈利良好") + if result.get("action_note"): + manual_action_parts.append(result["action_note"]) + if is_wl: + if manual_stop > 0: + manual_action_parts.append(f"止损参考{manual_stop}") + manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") + else: + if manual_stop > 0: + manual_action_parts.append(f"止损{manual_stop}") + if manual_target > 0: + manual_action_parts.append(f"目标{manual_target}") + manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") + ts = result.get("timing_signal", "") + if ts and ts != "neutral": + manual_action_parts.append(f"信号:{ts}") + result["action"] = " | ".join(manual_action_parts) + result["status"] = "manual" # 标记为手动管理,变更追踪不受影响 + if stdout: + print(f" [手动保留] {name}({code}) 策略参数未覆盖") + + # 宏观偏差调整:收盘后重评时根据宏观方向微调止损/止盈 + # 自选股不做止盈宏观调整(无持仓) + # 手动策略不做宏观偏差调整(尊重用户设定) + if macro_bias != 1.0 and not is_wl and old_entry.get("source") != "manual": + old_stop = result.get("stop_loss", 0) + old_target = result.get("take_profit", 0) + if macro_bias < 1.0 and old_stop > 0: # 宏观偏弱 → 收紧止损 + # 止损上移(但保留最小3%间距) + adjusted_stop = round(old_stop * (1 + (1 - macro_bias) * 0.3), 2) + min_stop = round(price * 0.97, 2) + result["stop_loss"] = min(adjusted_stop, min_stop) + if old_target > 0: + result["take_profit"] = round(old_target * (1 - (1 - macro_bias) * 0.2), 2) + elif macro_bias > 1.0 and old_target > 0: # 宏观偏强 → 止盈上调让利润跑 + result["take_profit"] = round(old_target * (1 + (macro_bias - 1) * 0.3), 2) + + # 行业偏差调整:根据个股所在行业的市场表现微调止损/止盈 + # 手动策略不做行业调整(尊重用户设定) + sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) + sector_note = sector_adj.get("note", "") + if sector_note and old_entry.get("source") != "manual": + old_stop = result.get("stop_loss", 0) + old_target = result.get("take_profit", 0) + stop_bias = sector_adj.get("stop_bias", 1.0) + target_bias = sector_adj.get("target_bias", 1.0) + if stop_bias != 1.0 and old_stop > 0: + # 行业偏差调整(在宏观调整之后叠加) + adjusted = round(old_stop * stop_bias, 2) + # 保留最小3%间距 + min_stop = round(price * 0.97, 2) + result["stop_loss"] = min(adjusted, min_stop) + if target_bias != 1.0 and old_target > 0 and not is_wl: + result["take_profit"] = round(old_target * target_bias, 2) + + # 加载消息面+基本面(逐个股) + news_sentiment = load_stock_news_sentiment(code) + fund = load_fundamentals(code) + + # 多因子合成 timing_signal:大盘+行业+消息+基本面+技术 + if old_entry.get("source") != "manual": + enriched, _ = enrich_timing_signal( + base_signal=result.get("timing_signal", ""), + macro_desc=macro_desc, + sector_note=sector_note, + profit_pct=profit_pct, + stock_category=result.get("stock_category", ""), + is_new_entry=(source == "watchlist"), + fundamentals=fund, + news_sentiment=news_sentiment, + rr_ratio=result.get("rr_ratio", 0), + ) + result["timing_signal"] = enriched + + # 在宏观/行业/多因子调整后重建 action 文本(同步调整后的止损/止盈数字) + if new_action_needs_refresh(result, old_entry, price): + _refresh_action_text(result, price, name) + + extra = { + "rr_ratio": result.get("rr_ratio"), + "action_note": result.get("action_note", ""), + "timing_signal": result.get("timing_signal", ""), + } + analysis = { + "stop_loss": result["stop_loss"], + "take_profit": result["take_profit"], + "entry_low": result["entry_low"], + "entry_high": result["entry_high"], + "action": result["action"], + "tech_snapshot": result.get("tech_snapshot", ""), + "multi_tf_context": result.get("multi_tf_context", ""), + "reassessed_at": result["reassessed_at"], + "status": result["status"], + **extra, + } + stock["analysis"] = analysis + # 同步 top-level 字段 → zone_breach/price_monitor 依赖这些字段 + # (2026-06-24 bugfix: analysis 子对象有但顶层没有,导致新持仓的止损检测盲区) + stock["stop_loss"] = result.get("stop_loss", 0) + stock["take_profit"] = result.get("take_profit", 0) + stock["entry_low"] = result.get("entry_low", 0) + stock["entry_high"] = result.get("entry_high", 0) + # 同步 trigger 字段 -> price_monitor 依赖 + sl = result.get("stop_loss", 0) + tp = result.get("take_profit", 0) + el = result.get("entry_low", 0) + eh = result.get("entry_high", 0) + trig = {} + if sl and float(sl) > 0: + trig["stop_loss"] = float(sl) + if el and eh and float(el) > 0 and float(eh) > 0: + trig["entry_zone"] = f"{float(el)}~{float(eh)}" + if tp and float(tp) > 0: + trig["take_profit_zone"] = f"0~{float(tp)}" + stock["trigger"] = trig + results.append({ + "code": code, "name": name, + "price": price, "cost": cost, + "action": result["action"], + "stop_loss": result["stop_loss"], + "take_profit": result["take_profit"], + "rr_ratio": result["rr_ratio"], + }) + ok += 1 + if stdout: + rr_str = f" RR={result['rr_ratio']}" if "rr_ratio" in result else "" + print(f" ✅ {name}({code}) {price} {result['action']}{rr_str}") + + # 记录所有股票的决策日志(含变更追踪) + status_display = result.get("status", "active") + # 构建行业上下文 + sector_ctx_str = "" + sec_name = sector_adj.get("sector_name", "") + sec_chg = sector_adj.get("sector_change", 0) + if sec_name: + sector_ctx_str = f"行业{sec_name}{sec_chg:+.1f}%" + if sector_adj.get("note"): + # note 已包含大盘宽度信息 + sector_ctx_str = sector_adj["note"] + elif market_breadth < 40: + # 无行业映射时至少记录大盘宽度 + sector_ctx_str = f"大盘上涨比{market_breadth}%" + new_entry = { + "code": code, "name": name, "price": price, + "cost": old_entry.get("cost", cost) if old_entry else cost, # 优先保留旧成本(holding.xls权威) + "shares": old_entry.get("shares", 0), # 保留持仓股数 + "avg_price": old_entry.get("avg_price", 0), # 保留持仓均价 + "action": result["action"], + "stop_loss": result.get("stop_loss"), + "entry_low": result["entry_low"], + "entry_high": result["entry_high"], + "tech_snapshot": result.get("tech_snapshot", ""), + "timing_signal": result.get("timing_signal", ""), + "rr_ratio": result.get("rr_ratio", 0), + "status": status_display, + "note": result.get("action_note", ""), + "timestamp": result["reassessed_at"], + "updated_at": result["reassessed_at"], + "type": "自选策略" if is_wl else "持仓策略", + "source": old_entry.get("source", "auto"), # manual/auto,继承旧标记 + "sector_context": sector_ctx_str, # 市场上下文:行业表现+大盘宽度 + "stock_category": result.get("stock_category", "中短线"), # 组合监测用 + "position_advice": result.get("position_advice", "中等仓位"), + "time_horizon": result.get("time_horizon", "2周~3月"), + } + new_entry["trigger"] = trig + # created_at: 首次创建时设置,后续 preserve + old_entry = existing_decisions.get(code, {}) + if old_entry.get("created_at"): + new_entry["created_at"] = old_entry["created_at"] + else: + new_entry["created_at"] = result["reassessed_at"] + # 保留 last_reassessed_price(per_stock_reassess 维护的防抖字段) + if old_entry.get("last_reassessed_price"): + new_entry["last_reassessed_price"] = old_entry["last_reassessed_price"] + # 自选股也写止盈位(用于RR校验),但标签用"目标参考"非"止盈" + new_entry["take_profit"] = result.get("take_profit") + + # --- 变更追踪 --- + old_action = old_entry.get("action", "") + old_stop = old_entry.get("stop_loss") + old_target = old_entry.get("take_profit") + + # 构建旧策略摘要和变更理由 + update_reason = "" + changelog_entry = None + + if old_action and old_action != result["action"]: + # 策略有变化 → 记录变更 + old_summary = old_action + new_summary = result["action"] + + # 判断触发原因 + if abs(price - old_entry.get("price", price)) / max(price, 0.01) > 0.03: + trigger = f"价格变动({old_entry.get('price','?')}→{price})" + elif result.get("timing_signal") and result["timing_signal"] != old_entry.get("timing_signal", ""): + trigger = f"技术信号变化: {result['timing_signal']}" + else: + trigger = "技术面重评" + + # 格式化的变更理由(自选股只看止损,不看止盈) + diff_parts = [] + if old_stop and result["stop_loss"] != old_stop: + diff_parts.append(f"止损{old_stop}→{result['stop_loss']}") + if not is_wl and old_target and result.get("take_profit") and result["take_profit"] != old_target: + diff_parts.append(f"止盈{old_target}→{result['take_profit']}") + if diff_parts: + update_reason = f"{trigger}: {', '.join(diff_parts)} | {result.get('tech_snapshot','')[:60]}" + else: + update_reason = f"{trigger}: 策略文字调整" + + changelog_entry = { + "date": result["reassessed_at"], + "old_action": old_action, + "new_action": result["action"], + "reason": update_reason, + "trigger": trigger, + } + new_entry["updated_reason"] = update_reason + + elif not old_action: + # 首次创建策略 + update_reason = f"初始策略创建 | {result.get('tech_snapshot','')[:60]}" + changelog_entry = { + "date": result["reassessed_at"], + "old_action": "", + "new_action": result["action"], + "reason": update_reason, + "trigger": "初始创建", + } + + # 合并changelog + old_changelog = old_entry.get("changelog", []) if old_entry else [] + if changelog_entry: + new_entry["changelog"] = old_changelog + [changelog_entry] + else: + new_entry["changelog"] = old_changelog + + # 保留执行记录 + if old_entry and old_entry.get("execution"): + new_entry["execution"] = old_entry["execution"] + elif stock.get("analysis", {}).get("status") == "executing": + new_entry["execution"] = { + "status": "executing", + "entry_price": cost if cost else 0, + "shares": shares, + "notes": "", + } + + # --- 自动标记 current_recommend --- + # 只在真正执行中的持仓才自动推荐:execution.status 为 executing 或 partial_exit + exec_status = old_entry.get("execution", {}).get("status", "") if old_entry else "" + is_active = exec_status in ("executing", "partial_exit") + + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_deep_loss_stock = profit_pct < -20 + rr = result.get("rr_ratio", 0) + ts = result.get("timing_signal", "") + note = result.get("action_note", "") + + # 计算是否在/接近买入区 + entry_low_val = result.get("entry_low", 0) + entry_high_val = result.get("entry_high", 0) + in_buy_zone = (entry_low_val > 0 and entry_high_val > 0 and + entry_low_val <= price <= entry_high_val) + near_buy_zone_low = (entry_low_val > 0 and + price >= entry_low_val * 0.98 and + price <= entry_high_val) + + # 推荐条件:必须是执行中的持仓 + 基本面条件达标 + is_recommendable = ( + is_active + and not is_deep_loss_stock + and rr >= 1.5 + and ts != "neutral" + and "不建议" not in note + ) + if is_recommendable: + new_entry["tag"] = "current_recommend" + else: + # 不清除 active_manual(用户手动标记),只清除自动推荐的 + old_tag = old_entry.get("tag", "") if old_entry else "" + if old_tag != "active_manual": + new_entry.pop("tag", None) + + decisions.append(new_entry) + + except Exception as e: + results.append({"code": code, "name": name, "error": str(e)}) + errors += 1 + if stdout: + print(f" ❌ {name}({code}): {e}") + + # 写回数据文件 — 保留现有字段(现金、总资产等)不丢 + try: + existing_pf = mo_data.read_portfolio() + except Exception: + existing_pf = {} + # 保留 price/change_pct — price_monitor 维护的实时价,regenerate_all 不应清除 + _existing_holdings_map = {} + for _h in existing_pf.get('holdings', []): + if _h.get('code'): + _existing_holdings_map[_h['code']] = _h + _new_holdings = pf.get("holdings", []) + for _h in _new_holdings: + _code = _h.get('code') + if _code and _code in _existing_holdings_map: + _old = _existing_holdings_map[_code] + _h['price'] = _old.get('price', 0) + _h['change_pct'] = _old.get('change_pct', 0) + existing_pf["holdings"] = _new_holdings + existing_pf["updated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M') + + # ── Watchlist ↔ Holdings 双向自动迁移(2026-06-27 Dad要求)── + # ① 持仓已有 → 从自选移除(买入自动清除) + wl_codes = {s.get("code") for s in wl.get("stocks", []) if s.get("code")} + pf_codes = {h.get("code") for h in _new_holdings if h.get("code") and h.get("shares", 0) > 0} + removed_from_wl = [] + for h_code in wl_codes & pf_codes: + # 持仓>0且量够 → 自选移除 + wl["stocks"] = [s for s in wl.get("stocks", []) if s.get("code") != h_code] + removed_from_wl.append(h_code) + if removed_from_wl and stdout: + print(f" 自选→持仓自动移除: {', '.join(removed_from_wl)}") + + # ② 清仓/卖光 → 加回自选(只要仍有关注价值) + added_to_wl = [] + old_pf_codes = {_h.get("code") for _h in existing_pf.get("holdings", []) if _h.get("code")} + sold_codes = old_pf_codes - pf_codes # 曾持仓但现在没有(或不在了) + for sc in sold_codes: + # 已有自选就不重复加 + if sc in wl_codes: + continue + # 从现有decisions看是否有关注价值 + for d in decisions: + if d.get("code") == sc and d.get("entry_low") and d.get("entry_high"): + wl["stocks"].append({ + "code": sc, "name": d.get("name", sc), + "entry_low": d.get("entry_low"), "entry_high": d.get("entry_high"), + "stop_loss": d.get("stop_loss", 0), + "analysis": {"action": d.get("action", ""), "tech_snapshot": d.get("tech_snapshot", "")} + }) + added_to_wl.append(sc) + break + if added_to_wl and stdout: + print(f" 清仓→自选自动加入: {', '.join(added_to_wl)}") + + # DB 写入(替代 JSON dump — 强制币种约束) + try: + from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_watchlist_stock, write_holding_strategy + conn = get_conn() + write_holdings_batch(conn, existing_pf.get('holdings', [])) + write_portfolio_summary(conn, existing_pf) + for s in wl.get('stocks', []): + s.setdefault('currency', 'CNY') + write_watchlist_stock(conn, s) + for d in decisions: + write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) + conn.close() + except Exception as e: + print(f" [DB写入失败] {e}", flush=True) + # JSON 冷备 + json.dump(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2) + json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2) + + # 写 decisions.json + decisions_path = "/home/hmo/web-dashboard/data/decisions.json" + decisions_data = { + "decisions": decisions, # 全部保留 + "total": len(decisions), + "regenerated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), + } + json.dump(decisions_data, open(decisions_path, "w"), ensure_ascii=False, indent=2) + # DB 已在上方写入(和 portfolio/watchlist 一起) + + # 记录策略→提示词版本关联 + if HAS_PROMPT_TRACKING: + try: + for d in decisions: + if d.get("code") and d.get("action"): + record_strategy_generation( + d["code"], d.get("name", ""), d.get("action", "") + ) + except Exception as e: + if stdout: + print(f" ⚠️ 提示词版本追踪失败: {e}", file=sys.stderr) + + # 刷新多周期缓存到磁盘 + try: + import multi_timeframe as _mtf + _mtf.flush_mtf_cache() + except Exception: + pass + + summary = {"total": total, "ok": ok, "errors": errors} + if stdout: + print(f"\n✅ 全量重评完成: {ok}/{total}成功, {errors}错误") + return summary + + +if __name__ == "__main__": + regenerate_all() diff --git a/scripts/strategy_review.py b/scripts/strategy_review.py index 82a4e46..fe28348 100644 --- a/scripts/strategy_review.py +++ b/scripts/strategy_review.py @@ -14,6 +14,7 @@ import json, sqlite3, sys, time, urllib.request from pathlib import Path from datetime import datetime from collections import Counter +from mo_data import read_portfolio, read_decisions, read_watchlist BASE = Path("/home/hmo/MoFin") DATA = BASE / "data" @@ -198,7 +199,7 @@ def evaluate_strategy(s, price): def review(): start = time.time() - decisions = json.loads(DECISIONS_PATH.read_text()) + decisions = mo_data.read_decisions() strategies = decisions.get("decisions", []) conn = sqlite3.connect(str(DB_PATH)) diff --git a/stock_profile.py b/stock_profile.py index d4fe8c3..1a43e18 100644 --- a/stock_profile.py +++ b/stock_profile.py @@ -10,6 +10,7 @@ import os import urllib.request from datetime import datetime from typing import Optional +from mo_data import read_portfolio, read_decisions, read_watchlist DATA_DIR = "/home/hmo/web-dashboard/data" MTF_CACHE_PATH = os.path.join(DATA_DIR, "multi_tf_cache.json") @@ -286,7 +287,7 @@ def classify_stock(f: dict, mtf: dict, macro: dict) -> dict: # 1. 深套检查 cost = 0 try: - pf = json.load(open(PORTFOLIO_PATH)) + pf = mo_data.read_portfolio() for h in pf.get("holdings", []): if h.get("code") == f.get("code"): cost = h.get("cost", 0) or 0 diff --git a/strategy_lifecycle.py b/strategy_lifecycle.py index d6ebaf6..b1e2114 100644 --- a/strategy_lifecycle.py +++ b/strategy_lifecycle.py @@ -1,2114 +1,2115 @@ -#!/usr/bin/env python3 -"""策略生命周期管理系统 — 技术面驱动版本 v2 - -核心原则: -1. 止损放在合理的技术位,不拍数字 -2. 新买入推荐:止损=弱支撑(约3%跌幅),止盈=强压力,盈亏比≥2:1 -3. 已持仓:止损=强支撑(约5-8%跌幅),目标=强压力 -4. 买入区间:弱支撑~弱压力之间 -5. 买入时机:量价齐跌不买,缩量至支撑买,量价齐升追买 -""" - -import json -import urllib.request -import os -import sys -import re -from datetime import datetime -import technical_analysis as ta -import multi_timeframe as mtf - - -def is_hk_stock(code): - """判断是否港股(港股代码5位,A股6位带前导零)""" - return len(str(code)) <= 5 - - -def calc_atr(code, period=14): - """从腾讯API K线数据计算ATR(period),返回ATR值或None""" - try: - url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param=hk{code},day,,,60,qfq" - req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) - resp = urllib.request.urlopen(req, timeout=5).read().decode('utf-8') - data = json.loads(resp) - bars = data.get('data', {}).get(f'hk{code}', {}).get('day', []) - if len(bars) < period + 1: - return None - trs = [] - for i in range(1, min(len(bars), period + 1)): - try: - high = float(bars[i][2]) - low = float(bars[i][3]) - prev_close = float(bars[i-1][4]) if len(bars[i-1]) > 4 else float(bars[i-1][3]) - tr = max(high - low, abs(high - prev_close), abs(low - prev_close)) - trs.append(tr) - except (ValueError, IndexError): - continue - if not trs: - return None - return round(sum(trs) / len(trs), 2) - except Exception: - return None - -# 提示词版本追踪 -try: - from prompt_manager.tracking import record_strategy_generation - HAS_PROMPT_TRACKING = True -except ImportError: - HAS_PROMPT_TRACKING = False - -PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" -WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" - -def safe_json_load(path, default=None): - """安全加载 JSON,遇到坏数据自动修复""" - if not os.path.exists(path): - return default if default is not None else {} - try: - with open(path, "r", encoding="utf-8") as f: - return json.load(f) - except json.JSONDecodeError: - # 尝试修复:替换字符串内未转义的换行符,去多余括号 - with open(path, "r", encoding="utf-8") as f: - raw = f.read() - fixed = raw - - # 修复1: 字符串内未转义的换行 -> \\n - result = [] - in_str = False - for ch in fixed: - if ch == '"': - in_str = not in_str - result.append(ch) - elif in_str and ch in '\n\r': - result.append('\\n') - else: - result.append(ch) - fixed = ''.join(result) - - # 修复2: 去掉多余的尾部括号 - fixed = fixed.rstrip('}') - # 补回正确的闭合 - if not fixed.endswith('}'): - fixed += '}' - - try: - return json.loads(fixed) - except json.JSONDecodeError as e: - print(f"[WARN] watchlist.json 自动修复失败: {e}", file=sys.stderr) - return default if default is not None else {} -KNOWLEDGE_LOG = "/home/hmo/Obsidian/knowledge/finance/analyst-knowledge-log.md" -MACRO_CONTEXT_PATH = "/home/hmo/web-dashboard/data/macro_context.json" -MARKET_CONTEXT_PATH = "/home/hmo/web-dashboard/data/market.json" -STOCK_SECTOR_MAP_PATH = "/home/hmo/web-dashboard/data/stock_sector_map.json" - - -def load_stock_sector_map(): - """读取个股归属行业映射 - - stock_sector_map.json 格式: {code: [sector1, sector2, ...]} - 跳过 _note, _created_at 等元数据键。 - """ - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_sector_stocks - conn = get_conn() - # 从 stock_sectors 表反向构建 code→[sectors] 映射 - rows = conn.execute("SELECT code, sector_name FROM stock_sectors ORDER BY code").fetchall() - conn.close() - code_to_sectors = {} - for code, sector in rows: - if code not in code_to_sectors: - code_to_sectors[code] = [] - code_to_sectors[code].append(sector) - return code_to_sectors - except Exception: - pass - try: - with open(STOCK_SECTOR_MAP_PATH) as f: - data = json.load(f) - code_to_sectors = {} - for key, value in data.items(): - if key.startswith("_"): - continue - if isinstance(value, list): - code_to_sectors[key] = value - return code_to_sectors - except Exception: - return {} - - -def load_market_context(): - """读取市场上下文,优先 SQLite,回退 market.json""" - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_latest_market - conn = get_conn() - market = query_latest_market(conn) - conn.close() - if market and market.get("sectors"): - sector_perf = {} - for s in market["sectors"]: - name = s.get("name", "") - if name: - sector_perf[name] = { - "change": s.get("change_pct", 0), - "up_count": s.get("up_count", 0), - "down_count": s.get("down_count", 0), - "net_inflow": s.get("net_inflow", 0), - "lead_stock": s.get("lead_stock", ""), - "lead_stock_change": s.get("lead_stock_change", 0), - } - return { - "sector_perf": sector_perf, - "breadth": market.get("up_ratio", 50), - "mood": market.get("mood", "neutral"), - "top_gainers": {g["name"]: g["change_pct"] for g in market.get("top_gainers", [])}, - "top_losers": {g["name"]: g["change_pct"] for g in market.get("top_losers", [])}, - "total_sectors": len(market["sectors"]), - "market_timestamp": market.get("timestamp", ""), - } - except Exception: - pass - try: - with open(MARKET_CONTEXT_PATH) as f: - market = json.load(f) - sectors = market.get("sectors", []) - sector_perf = {} - for s in sectors: - name = s.get("name", "") - if name: - sector_perf[name] = { - "change": s.get("change", 0), - "up_count": s.get("up_count", 0), - "down_count": s.get("down_count", 0), - "net_inflow": s.get("net_inflow", 0), - "lead_stock": s.get("lead_stock", ""), - "lead_stock_change": s.get("lead_stock_change", 0), - } - top_gainers = {s.get("name", ""): s.get("change", 0) - for s in market.get("top_gainers", [])} - top_losers = {s.get("name", ""): s.get("change", 0) - for s in market.get("top_losers", [])} - return { - "sector_perf": sector_perf, - "breadth": market.get("up_ratio", 50), - "mood": market.get("mood", "neutral"), - "top_gainers": top_gainers, - "top_losers": top_losers, - "total_sectors": market.get("total_sectors", 0), - "market_timestamp": market.get("timestamp", ""), - } - except Exception: - return { - "sector_perf": {}, - "breadth": 50, - "mood": "neutral", - "top_gainers": {}, - "top_losers": {}, - "total_sectors": 0, - "market_timestamp": "", - } - - -def compute_sector_adjustment(code, market_ctx, stock_sector_map): - """根据个股所属行业的市场表现+小果情感,返回调整系数 - - 返回 dict: - stop_bias: 止损调整系数(<1.0收紧, >1.0放宽) - target_bias: 止盈调整系数 - note: 行业背景一句话 - sector_name: 匹配到的行业名称 - sector_change: 行业涨跌幅 - """ - # 默认无调整 - adj = {"stop_bias": 1.0, "target_bias": 1.0, "note": "", - "sector_name": "", "sector_change": 0} - - sectors_for_code = stock_sector_map.get(code, []) - if not sectors_for_code: - return adj - - sector_perf = market_ctx.get("sector_perf", {}) - breadth = market_ctx.get("breadth", 50) - - # 找第一个能匹配到的行业 - for sec in sectors_for_code: - if sec in sector_perf: - perf = sector_perf[sec] - chg = perf.get("change", 0) - adj["sector_name"] = sec - adj["sector_change"] = chg - - # 行业暴跌 > 3% - if chg <= -3: - adj["stop_bias"] = 0.92 # 止损收紧8% - adj["target_bias"] = 0.90 # 止盈下调10% - adj["note"] = f"行业{sec}大跌{chg:+.1f}%,收紧止损" - # 行业大跌 1~3% - elif chg <= -1: - adj["stop_bias"] = 0.96 - adj["target_bias"] = 0.95 - adj["note"] = f"行业{sec}下跌{chg:+.1f}%,适度防御" - # 行业大涨 > 3% - elif chg >= 3: - adj["stop_bias"] = 1.05 # 止损放宽5%(给趋势空间) - adj["target_bias"] = 1.03 - adj["note"] = f"行业{sec}大涨{chg:+.1f}%,可适度积极" - # 行业上涨 1~3% - elif chg >= 1: - adj["stop_bias"] = 1.02 - adj["note"] = f"行业{sec}上涨{chg:+.1f}%,正常" - else: - adj["note"] = f"行业{sec}{chg:+.1f}%,中性" - break - # 尝试处理命名差异:market.json中的行业名可能多了"板块"后缀 - for market_sec_name in sector_perf: - if sec in market_sec_name or market_sec_name in sec: - perf = sector_perf[market_sec_name] - chg = perf.get("change", 0) - adj["sector_name"] = market_sec_name - adj["sector_change"] = chg - if chg <= -3: - adj["stop_bias"] = 0.92 - adj["target_bias"] = 0.90 - adj["note"] = f"行业{market_sec_name}大跌{chg:+.1f}%,收紧止损" - elif chg <= -1: - adj["stop_bias"] = 0.96 - adj["target_bias"] = 0.95 - adj["note"] = f"行业{market_sec_name}下跌{chg:+.1f}%,适度防御" - elif chg >= 3: - adj["stop_bias"] = 1.05 - adj["target_bias"] = 1.03 - adj["note"] = f"行业{market_sec_name}大涨{chg:+.1f}%,可适度积极" - elif chg >= 1: - adj["stop_bias"] = 1.02 - adj["note"] = f"行业{market_sec_name}上涨{chg:+.1f}%,正常" - else: - adj["note"] = f"行业{market_sec_name}{chg:+.1f}%,中性" - break - - # 如果breath<30% (大盘极弱),再加一层收紧 - if breadth < 30: - adj["stop_bias"] *= 0.97 # 再收紧3% - breadth_note = "大盘仅{}%个股上涨".format(int(breadth)) - adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note - elif breadth < 40: - adj["stop_bias"] *= 0.99 - breadth_note = "大盘偏弱({}%上涨)".format(int(breadth)) - adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note - - # 小果情感约束:利空置信度>80%时收紧止损 - try: - xiaoguo_path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" - if os.path.exists(xiaoguo_path): - xg = json.load(open(xiaoguo_path)) - stock_sentiment = xg.get("stocks", {}).get(code, {}) - if stock_sentiment: - sentiment = stock_sentiment.get("sentiment", "") - confidence = stock_sentiment.get("confidence", 0) - summary = stock_sentiment.get("summary", "") - if sentiment == "negative" and confidence > 0.8: - adj["stop_bias"] = min(adj["stop_bias"], 0.95) - adj["note"] += f" | 小果利空{confidence:.0%}:{summary[:30]}" - except Exception: - pass - - return adj - - -def load_macro_context(): - """读取宏观上下文,返回 (bias, desc),优先 DB,回退 JSON""" - try: - import sqlite3 - from pathlib import Path - conn = sqlite3.connect(str(Path(__file__).parent.parent / "data" / "mofin.db")) - row = conn.execute( - "SELECT indices, structure FROM macro_context_log " - "WHERE has_valid_data=1 ORDER BY created_at DESC LIMIT 1" - ).fetchone() - conn.close() - if row: - indices = json.loads(row[0]) if row[0] else {} - structure = json.loads(row[1]) if row[1] else {} - overall = structure.get("overall", "neutral") - desc = structure.get("description", "") - else: - raise ValueError("no db data") - except Exception: - try: - with open(MACRO_CONTEXT_PATH) as f: - ctx = json.load(f) - overall = ctx.get("structure", {}).get("overall", "neutral") - desc = ctx.get("structure", {}).get("description", "") - except Exception: - return 1.0, "宏观未加载" - if "bearish" in overall: - return 0.8, f"宏观{desc}" - elif overall == "bullish": - return 1.05, f"宏观{desc}" - elif overall == "strong_bullish": - return 1.1, f"宏观{desc}" - else: - return 1.0, f"宏观{desc}" - - -def batch_fetch_prices(codes): - """获取实时价格。优先从 DB 读取(price_monitor 每 2 分钟更新),失败才拉腾讯 API。""" - if not codes: - return {} - - all_results = {} - - # 主通道:从 DB 读取(price_monitor 唯一价格入口) - try: - import sqlite3 - db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db') - db.row_factory = sqlite3.Row - for raw_code in codes: - raw_code = str(raw_code).split('_')[0] - if not raw_code: continue - row = db.execute( - "SELECT price, change_pct FROM holdings WHERE code=? AND is_active=1", (raw_code,) - ).fetchone() - if not row: - row = db.execute( - "SELECT price, change_pct FROM holding_strategies WHERE code=? AND status='active' ORDER BY updated_at DESC LIMIT 1", (raw_code,) - ).fetchone() - if row and row['price']: - all_results[raw_code] = (row['price'], 0, row['change_pct'] or 0) - db.close() - if all_results: - return all_results - except Exception: - pass - - # Fallback: 腾讯 API(仅当 DB 无数据时) - batch_size = 15 - for batch_start in range(0, len(codes), batch_size): - batch = codes[batch_start:batch_start + batch_size] - symbols = [] - code_map = {} - for raw_code in batch: - raw_code = str(raw_code).split('_')[0] - if not raw_code: - continue - if len(raw_code) == 5 and raw_code.isdigit(): - prefix = "hk" - elif raw_code.startswith(("6", "5")): - prefix = "sh" - else: - prefix = "sz" - sym = f"{prefix}{raw_code}" - symbols.append(sym) - code_map[sym] = raw_code - if not symbols: - continue - - url = f"http://qt.gtimg.cn/q={','.join(symbols)}" - max_retries = 2 - for attempt in range(max_retries + 1): - try: - r = urllib.request.urlopen(url, timeout=10) - text = r.read().decode("gbk") - except Exception as e: - if attempt < max_retries: - continue - print(f" batch_fetch_prices error: {e}", file=sys.stderr) - continue - - for line in text.strip().split("\n"): - line = line.strip() - if not line or "=" not in line: - continue - try: - sym = line.split("=", 1)[0].strip().lstrip("v_") - raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") - fields = raw_value.split("~") - if len(fields) < 35: - continue - orig_code = code_map.get(sym) - if not orig_code: - continue - def f(i): - try: - return float(fields[i]) if fields[i].strip() else 0.0 - except: - return 0.0 - all_results[orig_code] = { - "price": f(3), "close": f(4), "high": f(33), "low": f(34), - "code": orig_code, - } - except Exception: - continue - break # Success - break retry loop - - return all_results - - -def get_price_tencent(code): - """获取实时价格。优先 DB(price_monitor 维护),失败才拉腾讯。港股价格已是 CNY。""" - raw_code = str(code).split('_')[0] - if not raw_code: - return None - - # 主通道: DB - try: - import sqlite3 - db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db') - db.row_factory = sqlite3.Row - row = db.execute("SELECT price FROM holdings WHERE code=? AND is_active=1", (raw_code,)).fetchone() - if not row: - row = db.execute("SELECT price FROM holding_strategies WHERE code=? AND status='active' ORDER BY updated_at DESC LIMIT 1", (raw_code,)).fetchone() - if row and row['price']: - db.close() - return row['price'] - db.close() - except Exception: - pass - - # Fallback: 腾讯 API - try: - from mo_models import to_cny, is_hk_stock - except ImportError: - to_cny = lambda v, r=None: v - is_hk_stock = lambda c: len(str(c).strip()) == 5 and str(c).strip().isdigit() - try: - if is_hk_stock(raw_code): - prefix = "hk" - elif raw_code.startswith("6") or raw_code.startswith("5"): - prefix = "sh" - else: - prefix = "sz" - url = f"http://qt.gtimg.cn/q={prefix}{raw_code}" - r = urllib.request.urlopen(url, timeout=5) - fields = r.read().decode("gbk").split('"')[1].split("~") - def f(i): - try: - return float(fields[i]) if fields[i].strip() else 0.0 - except: - return 0.0 - price = f(3) - if is_hk_stock(raw_code) and price > 0: - price = to_cny(price) - return { - "price": price, "close": f(4), "high": f(33), "low": f(34), - "code": raw_code, - } - except Exception as e: - print(f" get_price error {code}: {e}", file=sys.stderr) - return None - - -def reassess_strategy(code, name, price, cost, shares, current_action, - volume_signal="", sentiment="neutral", - is_watchlist=False): - """根据技术分析重评策略""" - - tech = ta.full_analysis(code) - if tech and "support_resistance" in tech: - sr = tech["support_resistance"] - candle = tech.get("candlestick", {}) - vol = tech.get("volume", {}) - ss = sr.get("strong_support") - ws = sr.get("weak_support") - wr = sr.get("weak_resist") - sr_resist = sr.get("strong_resist") - pivot = sr.get("pivot") - effective_range = sr.get("effective_range") - print(f" TECH: 强撑={ss} 弱撑={ws} 枢轴={pivot} 弱压={wr} 强压={sr_resist} 有效区间={effective_range}") - else: - print(f" ⚠️ 技术分析不可用", file=sys.stderr) - ss = ws = wr = sr_resist = pivot = None - candle = {} - vol = {} - - # ----- 多周期技术分析(周线/月线/均线) ----- - mtf_analysis = {} - mtf_adj = {} - try: - mtf_result = mtf.full_multi_tf_analysis(code) - if mtf_result.get("daily") and mtf_result["daily"].get("count", 0) >= 5: - mtf_analysis = mtf_result - mtf_adj = mtf_result.get("strategy_adjustment", {}) - daily_mas = mtf_result.get("daily", {}).get("mas", {}) - weekly = mtf_result.get("weekly", {}) - monthly = mtf_result.get("monthly", {}) - trend_align = mtf_adj.get("trend_alignment", "未知") - print(f" 多周期: {trend_align} | " - f"MA5={daily_mas.get('ma5','?')} MA20={daily_mas.get('ma20','?')} MA60={daily_mas.get('ma60','?')} | " - f"周线{weekly.get('trend',{}).get('description','?')} 月线{monthly.get('trend',{}).get('description','?')}") - except Exception as e: - print(f" 多周期分析失败: {e}", file=sys.stderr) - - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_new_entry = (cost == 0) or (shares == 0) - is_deep_loss = profit_pct < -20 - - # ----- 股票分类(短炒/中短线/中长线/弱势/深套) ----- - stock_category = "中短线" - time_horizon = "2周~3月" - position_advice = "中等仓位" - try: - mtf_cache = json.load(open("/home/hmo/web-dashboard/data/multi_tf_cache.json")) - stock_data = mtf_cache.get(code, {}) - daily_klines = stock_data.get("daily", []) - fund = stock_data.get("fundamentals", {}) - closes = [d["close"] for d in daily_klines] if daily_klines else [] - - if len(closes) >= 10: - cur = closes[-1] - ma20 = sum(closes[-20:])/20 if len(closes)>=20 else 0 - ma60 = sum(closes[-60:])/60 if len(closes)>=60 else 0 - highs = [d["high"] for d in daily_klines[-20:]] - lows = [d["low"] for d in daily_klines[-20:]] - volatility = ((max(highs)-min(lows))/min(lows)*100) if min(lows)>0 else 0 - pe = fund.get("pe") or 0 - eps = fund.get("eps") or 0 - mcap = fund.get("mcap_total") or 0 - is_high_vol = volatility > 30 - is_high_pe = pe > 100 or pe < 0 - is_value = 0 < pe < 20 and eps > 0.5 - - if is_deep_loss: - stock_category = "深套" - time_horizon = "长期" - position_advice = "不补不割" - elif is_high_vol and is_high_pe: - stock_category = "短炒" - time_horizon = "数日~2周" - position_advice = "小仓快进快出" - elif cur < ma20 and cur < ma60 and ma20 > 0: - stock_category = "弱势" - time_horizon = "观望" - position_advice = "减仓或观望" - elif (is_value or mcap > 1000) and cur > ma20: - stock_category = "中长线" - time_horizon = "数月~1年" - position_advice = "正常配置" - elif volatility > 20: - stock_category = "中短线" - time_horizon = "2~6周" - position_advice = "中等仓位" - except Exception: - pass - - print(f" 分类: {stock_category} | {time_horizon} | {position_advice}") - - # ----- 短炒+强趋势检测:短炒分类但多周期多头时用移动止损代替弱支撑止损 ----- - is_short_term_strong_trend = False - if stock_category == "短炒": - trend_align = mtf_adj.get("trend_alignment", "") - strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] - if any(ind in trend_align for ind in strong_trend_indicators): - is_short_term_strong_trend = True - print(f" ⚡ 短炒+强趋势检测: 趋势={trend_align} → 启用移动止损, 不止盈") - position_advice = "小仓强趋势让利润跑" - - # ----- 止损设置(含最小距离3%保护) ----- - if is_new_entry: - # 新买入推荐:止损 = 弱支撑(约2-3%跌幅,合理可控) - if ws and ws > 0: - new_stop = round(ws, 2) - else: - new_stop = round(price * 0.96, 2) - elif is_deep_loss: - # 深套:止损 = 强支撑再下移(不轻易割) - if ss and ss > 0: - new_stop = round(min(ss, price * 0.85), 2) - else: - new_stop = round(price * 0.85, 2) - else: - # 已持仓正常:止损 = 强支撑 - if is_short_term_strong_trend: - # 短炒+强趋势:用移动止损(距现价-5%),不止盈让利润跑 - trailing_sl = round(max(ws or 0, price * 0.95), 2) if ws else round(price * 0.95, 2) - new_stop = trailing_sl - print(f" 短炒强趋势移动止损: {new_stop} (距现价-{(1-new_stop/price)*100:.1f}%)") - elif ss and ss > 0: - new_stop = round(ss, 2) - else: - new_stop = round(price * 0.88, 2) - - # 已盈利仓位(>5%):用较紧的移动止损保护利润,但不超过成本线 - if profit_pct > 5 and not is_new_entry and not is_deep_loss: - # 取 max(弱支撑, 成本线, 当前价×0.95) 作为止损 - cost_protect = cost if cost > 0 else 0 - trailing_stop = round(max(ws or 0, cost_protect, price * 0.95), 2) - if trailing_stop > new_stop: - new_stop = trailing_stop - print(f" 已启用移动止损: {new_stop} (保护+{profit_pct:.1f}%利润)", file=sys.stderr) - - # 最小止损距离 —— 随趋势强度调整(2026-06-23 震度保护规则) - # 强趋势(多周期看多 + MA多头排列):最小1.5%下行空间 - # 普通/弱势:最小3%下行空间 - is_strong_trend = False - trend_align = mtf_adj.get("trend_alignment", "") - strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] - try: - if any(ind in trend_align for ind in strong_trend_indicators) and ma20 > ma60 and cur >= ma20: - is_strong_trend = True - except (NameError, TypeError): - pass # ma20/ma60/cur may be unbound if MTF data insufficient - - if is_strong_trend: - min_stop_gap = 0.015 # 1.5% - else: - min_stop_gap = 0.03 # 3% - - min_stop = round(price * (1 - min_stop_gap), 2) - if new_stop > min_stop and not is_deep_loss: - old_stop = new_stop - new_stop = min_stop - if old_stop != new_stop: - print(f" 最小止损 {round(min_stop_gap*100)}%间距约束: {old_stop}→{new_stop} (趋势{'强' if is_strong_trend else '普通'})") - - # 港股附加:ATR波动率校验 — 止损距现价不得小于 1×ATR(14) - if is_hk_stock(code): - atr = calc_atr(code) - if atr and atr > 0: - min_atr_stop = round(price - atr, 2) - if new_stop > min_atr_stop: - old_stop_val = new_stop - new_stop = min_atr_stop - print(f" 港股ATR波动率校验({atr:.2f}): 止损 {old_stop_val}→{new_stop} (1×ATR间距)") - - # ----- 止盈设置 ----- - if is_short_term_strong_trend and not is_new_entry: - # 短炒+强趋势:不止盈让利润跑 - mtf_tp = mtf_adj.get("take_profit_reference", {}) - if mtf_tp and mtf_tp.get("level", 0) > price * 1.2: - new_target = round(mtf_tp["level"], 2) - else: - new_target = 0 # 无多周期阻力时不编造止盈 - print(f" 短炒强趋势不止盈: 止盈设为{new_target} (+{(new_target/price-1)*100:.0f}%)") - elif sr_resist and sr_resist > 0: - new_target = round(sr_resist, 2) - else: - new_target = 0 # 无技术面数据时不编造止盈 - - # ----- 风险回报比校验 ----- - stop_distance = price - new_stop if price > new_stop else price * 0.02 - target_distance = new_target - price if new_target > price else 0 - - # 1:2 检查 - min_target_distance = stop_distance * 2.0 - if target_distance < min_target_distance: - # 尝试更高的阻力位,但不超过下一个真实压力位 - candidate_targets = [] - if wr and wr > price and wr != sr_resist: - candidate_targets.append(wr) - if sr_resist and sr_resist > price: - candidate_targets.append(sr_resist) - # 检查有效区间,如果有更高的自然目标位 - if effective_range and price < effective_range * 0.9: - candidate_targets.append(effective_range) - - found = False - for level in candidate_targets: - if (level - price) >= min_target_distance: - new_target = level - found = True - break - - # 如果仍然不满足,检查是否至少能到 1:1.5 - min15_distance = stop_distance * 1.5 - if not found: - for level in candidate_targets: - if (level - price) >= min15_distance: - new_target = level - found = True - break - - # ----- 风险回报比最终计算 ----- - risk = max(price - new_stop, price * 0.01) - reward = max(new_target - price, 0) - rr_ratio = reward / risk if risk > 0 else 0 - - # ----- 状态判断 ----- - if is_deep_loss: - status = "updated" - action_note = "深套持有" - elif is_new_entry: - if rr_ratio < 1.5: - status = "review" - action_note = "⚠️盈亏比不足1:1.5,不建议买入" - elif rr_ratio < 2.0: - status = "updated" - action_note = "⚠️盈亏比偏低(1:{:.1f}),谨慎买入".format(rr_ratio) - else: - status = "updated" - action_note = "" - else: - if rr_ratio < 0.5: - status = "updated" - action_note = "⚠️盈亏比极低,关注" - elif rr_ratio < 1.5: - status = "updated" - action_note = "⚠️盈亏比偏低(1:{:.1f}),不建议加仓".format(rr_ratio) - else: - status = "updated" - action_note = "" - - # 短炒+强趋势:在action_note追加标记 - if is_short_term_strong_trend and not is_new_entry and not is_deep_loss: - extra_note = "短炒强趋势持" if "深套" not in action_note else "" - if extra_note: - action_note = f"{action_note} | {extra_note}" if action_note else extra_note - - # ----- 买入区间(有盈亏比严格约束) ----- - max_acceptable_entry = None # 最大可接受买入价(满足R/R约束) - - if new_target and new_stop and new_target > new_stop and not is_deep_loss: - # 买入价的R/R约束: - # 要求 (target - entry) / (entry - stop) >= min_rr - # 即 entry <= (target + min_rr * stop) / (1 + min_rr) - min_rr = 1.0 # 至少1:1,才不亏 - recommend_rr = 1.5 # 推荐1:1.5以上 - - max_for_recommend = (new_target + recommend_rr * new_stop) / (1 + recommend_rr) - max_for_neutral = (new_target + min_rr * new_stop) / (1 + min_rr) - - if is_new_entry: - # 新买入:要求1:1.5+ - max_acceptable_entry = max_for_recommend - else: - # 已持仓加仓:至少1:1 - max_acceptable_entry = max_for_neutral - - if is_new_entry: - # 新买入:买入区 = 弱支撑附近(不是当前价附近!) - # 只在价格跌到弱支撑附近时才推买入 - entry_low = round(price * 0.98, 2) - entry_high = round(price * 1.02, 2) - if max_acceptable_entry and entry_high > max_acceptable_entry: - entry_high = round(max_acceptable_entry, 2) - # 确保买入区不小于1% - if entry_high - entry_low < price * 0.01: - if max_acceptable_entry and price <= max_acceptable_entry: - entry_low = round(max(price * 0.99, new_stop), 2) - entry_high = round(min(price * 1.01, max_acceptable_entry), 2) - elif ws and ws > 0 and wr and wr > 0 and not is_deep_loss: - # 已持仓正常:买入区 = 弱支撑~弱支撑上方5%(给合理回调空间) - # 上限不能低于成本价×0.95(保护已有持仓不被高位逼空) - entry_low = round(ws, 2) - entry_max = round(ws * 1.05, 2) # 比弱支撑高5%,有足够空间 - # 如果当前价已远离买入区,保持买入区不变(不因价格涨了就收窄) - min_upper = round(cost * 0.95, 2) if cost > 0 else 0 - if entry_max < min_upper: - entry_max = min_upper - if max_acceptable_entry: - entry_high = round(min(entry_max, max_acceptable_entry), 2) - else: - entry_high = entry_max - # 如果当前价已远离买入区(高于买入区上沿),禁止加仓推荐 - if price > entry_high: - # 买入区锁定在弱支撑位,但标记为"价格远离" - pass - # 如果买入区过窄,标记但不扩展(加仓必须在支撑位) - if entry_high - entry_low < price * 0.005: - entry_low = round(ws * 0.995, 2) - entry_high = round(ws * 1.005, 2) - else: - entry_low = round(price * 0.90, 2) - entry_high = round(price * 1.05, 2) - - # 买入区间稳定性保护:上边界单次变动不超过5% - if 'entry_high' in dir() and entry_high: - # 读取当前策略中已有的买入区上界,如果有且变化过大则限制 - old_entry_high = None - if 'current_action' in dir() and current_action: - import re - m = re.search(r'买入区[\d.]+~([\d.]+)', current_action) - if m: - old_entry_high = float(m.group(1)) - if old_entry_high and old_entry_high > 0: - max_change = old_entry_high * 0.95 # 单次最多下降5% - if entry_high < max_change: - entry_high = round(max_change, 2) - - # ----- 买入时机信号(三维分析:大盘+行业+个股,基本面+消息面+技术面+资金流)----- - # [2026-07-01] 扩展:不再只看volume_signal + candlestick_sentiment - # 融合大盘趋势、行业板块强弱、基本面估值作为修正因子 - volume_signal = vol.get("volume_signal", "") - candlestick_sentiment = candle.get("sentiment", "neutral") - timing_signal = "neutral" - - # --- 三维分析数据装载 --- - # 因子1: 大盘环境(从macro_context_log读) - market_bearish = False - market_bullish = False - try: - import sqlite3 - _db = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _mc = _db.execute( - "SELECT structure FROM macro_context_log WHERE has_valid_data=1 ORDER BY rowid DESC LIMIT 1" - ).fetchone() - if _mc and _mc[0]: - _s = json.loads(_mc[0]) - _overall = _s.get("overall", "") - if "bearish" in _overall: - market_bearish = True - elif _overall == "bullish": - market_bullish = True - _db.close() - except Exception: - pass - - # 因子2: 行业板块强弱 - sector_strong = False - sector_weak = False - try: - _db2 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _rows2 = _db2.execute( - "SELECT name, change_pct FROM sector_snapshots ORDER BY change_pct DESC" - ).fetchall() - if _rows2: - # 找到该股所属行业(简单匹配name或通过stock_sectors) - _my_sectors = _db2.execute( - "SELECT sector_name FROM stock_sectors WHERE code=?", - (code,) - ).fetchall() - if _my_sectors: - for (_sn,) in _my_sectors: - for r_name, r_chg in _rows2: - if _sn in r_name or r_name in _sn: - _rank = [r[0] for r in _rows2].index(r_name) if r_name in [x[0] for x in _rows2] else -1 - _total = len(_rows2) - if _rank >= 0: - if _rank < _total * 0.2: - sector_strong = True - if _rank > _total * 0.8: - sector_weak = True - break - _db2.close() - except Exception: - pass - - # 因子3: 基本面估值 - is_value_stock = False - try: - _db3 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) - _fd = _db3.execute( - "SELECT pe, eps FROM stock_fundamentals WHERE code=?", (code,) - ).fetchone() - if _fd: - _pe, _eps = _fd - is_value_stock = (0 < (_pe or 0) < 25 and (_eps or 0) > 0.3) - _db3.close() - except Exception: - pass - - # --- 三维修正规则 --- - # 大盘偏弱时收紧买入信号,大盘偏强时放宽 - # 行业领先加分,行业落后减分 - # 低估值加分(有安全边际) - - def _adjust_timing(signal, market_b, market_bb, sec_s, sec_w, is_val): - """根据三维因子修正 timing_signal""" - # 大盘偏弱时降级买入信号 - if market_b: - if signal in ("买入", "加仓"): - if not sec_s: # 大盘弱+行业不强→降级 - return "关注" - # 大盘偏强时放宽 - if market_bb: - if signal == "关注" and (sec_s or is_val): - return "买入" - # 行业弱势时降级买入信号 - if sec_w: - if signal in ("买入", "加仓"): - return "关注" - # 行业强势+低估时升级关注 - if sec_s and is_val: - if signal == "关注": - return "买入" - return signal - - if is_new_entry: - # 新买入时机 - if volume_signal == "主动买盘占优" and candlestick_sentiment == "bullish": - timing_signal = "买入" - elif volume_signal == "主动卖盘占优": - timing_signal = "观望" - elif volume_signal == "买卖均衡" and ws and price <= ws * 1.03: - timing_signal = "买入" - elif candlestick_sentiment == "bullish": - timing_signal = "买入" - elif ws and price < ws * 1.02: - timing_signal = "关注" - # 新买入时三维修正:大盘向上+行业强→升级,大盘弱→降级 - _pre_signal = timing_signal - timing_signal = _adjust_timing(timing_signal, market_bearish, market_bullish, - sector_strong, sector_weak, is_value_stock) - if timing_signal != _pre_signal: - print(f" 三维修正(新入): {_pre_signal}→{timing_signal} " - f"| 大盘{'弱' if market_bearish else '强' if market_bullish else '中性'}" - f"| 行业{'强' if sector_strong else '弱' if sector_weak else '中性'}" - f"| 估值{'低' if is_value_stock else '一般'}") - else: - # 已持仓时机(用于加仓/减仓参考) - if is_short_term_strong_trend: - # 短炒+强趋势:强趋势持有,禁止加仓信号 - timing_signal = "持有" - elif profit_pct > 5: - # 已盈利 - if volume_signal == "主动买盘占优": - timing_signal = "持有" - elif volume_signal == "主动卖盘占优" and not is_new_entry: - timing_signal = "关注" - else: - timing_signal = "持有" - elif profit_pct > 0: - # 微盈 - if volume_signal == "主动买盘占优": - timing_signal = "持有" - elif ws and price <= ws * 1.02: - timing_signal = "加仓" - else: - timing_signal = "持有" - else: - # 浮亏 - if volume_signal == "主动卖盘占优" and ss and price <= ss * 1.03: - timing_signal = "关注" - elif volume_signal == "主动买盘占优" and sr_resist and price >= sr_resist * 0.97: - timing_signal = "关注" - elif volume_signal == "买卖均衡" and ws and price <= ws * 1.02: - timing_signal = "加仓" - else: - timing_signal = "持有" - - # ----- 【v3.2新增】分类约束:弱势/深套禁止输出买入/加仓类信号 ----- - if stock_category == "弱势" or is_deep_loss: - buy_signals = ["买入", "加仓", "可追"] - if any(s in timing_signal for s in buy_signals): - old_signal = timing_signal - timing_signal = "弱势持有" if stock_category == "弱势" else "深套持有" - print(f" 分类约束: {stock_category} 原信号\"{old_signal}\" → \"{timing_signal}\"") - - # ----- 构造 action 描述(供 cron prompt 使用) ----- - action_parts = [] - if profit_pct < -20: - action_parts.append("深套持有") - elif profit_pct < -10: - action_parts.append("持有观察") - elif profit_pct < 0: - action_parts.append("持有观察") - elif profit_pct < 5: - action_parts.append("盈利持有") - else: - action_parts.append("盈利良好") - - if action_note: - action_parts.append(action_note) - - if is_watchlist: - # 自选股(未入场):有止损参考+买入区,内部算RR需要止盈位 - action_parts.append(f"目标参考{new_target}") - action_parts.append(f"止损参考{new_stop}") - action_parts.append(f"买入区{entry_low}~{entry_high}") - elif is_new_entry: - action_parts.append(f"损{new_stop}") - action_parts.append(f"盈{new_target}") - action_parts.append(f"买{entry_low}~{entry_high}") - else: - action_parts.append(f"止损{new_stop}") - action_parts.append(f"目标{new_target}") - action_parts.append(f"买入区{entry_low}~{entry_high}") - - if timing_signal != "neutral": - action_parts.append(f"信号:{timing_signal}") - - new_action = " | ".join(action_parts) - - # 技术面快照 - tech_snapshot = "" - if candle: - tech_snapshot = (f"形态:{candle.get('pattern','?')}/{candle.get('sentiment','?')} " - f"量价:{vol.get('volume_signal','?')} " - f"强撑:{ss} 弱撑:{ws} 弱压:{wr} 强压:{sr_resist}") - # 加入均线信息(如果可用) - try: - dm = mtf_analysis.get("daily", {}).get("mas", {}) - ma_parts = [] - for m in ['ma5', 'ma10', 'ma20', 'ma60']: - v = dm.get(m) - if v: - ma_parts.append(f"{m.upper()}={v}") - if ma_parts: - tech_snapshot += " | " + " ".join(ma_parts) - except (NameError, AttributeError): - pass - - # 多周期快照(追加到 tech_snapshot) - mtf_context = "" - if mtf_adj: - trend_align = mtf_adj.get("trend_alignment", "") - daily_mas = mtf_analysis.get("daily", {}).get("mas", {}) - ma20 = daily_mas.get("ma20") - ma60 = daily_mas.get("ma60") - stop_ref = mtf_adj.get("stop_loss_reference", {}) - take_ref = mtf_adj.get("take_profit_reference", {}) - - parts = [] - if trend_align: - parts.append(trend_align) - if ma20: - parts.append(f"MA20={ma20}") - if ma60: - parts.append(f"MA60={ma60}") - if stop_ref: - parts.append(f"长撑:{stop_ref.get('source','?')}={stop_ref['level']}") - if take_ref: - parts.append(f"长压:{take_ref.get('source','?')}={take_ref['level']}") - mtf_context = " | ".join(parts) - - now_str = datetime.now().strftime('%Y-%m-%d %H:%M') - return { - 'stop_loss': new_stop, - 'take_profit': new_target, - 'entry_low': entry_low, - 'entry_high': entry_high, - 'action': new_action, - 'status': status, - 'tech_snapshot': tech_snapshot, - 'timing_signal': timing_signal, - 'rr_ratio': round(rr_ratio, 2), - 'action_note': action_note, - 'reassessed_at': now_str, - 'multi_tf_context': mtf_context, # 多周期上下文 - 'stock_category': stock_category, # 股票分类:短炒/中短线/中长线/弱势/深套 - 'time_horizon': time_horizon, # 时间跨度 - 'position_advice': position_advice, # 仓位建议 - } - - -def load_stock_news_sentiment(code): - """加载小果消息面情感""" - try: - path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" - if not os.path.exists(path): - return {} - xg = json.load(open(path)) - return xg.get("stocks", {}).get(code, {}) - except Exception: - return {} - - -def load_fundamentals(code): - """加载个股基本面""" - try: - path = "/home/hmo/web-dashboard/data/multi_tf_cache.json" - if not os.path.exists(path): - return {} - m = json.load(open(path)) - return m.get(code, {}).get("fundamentals", {}) or {} - except Exception: - return {} - - -def _get_portfolio_risk_state(): - """读取 portfolio 组合风险状态(2026-06-23 引擎协调)""" - try: - # 数据一致性检查:警告多副本(2026-06-23 bugfix) - _check_portfolio_consistency() - p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) - pos_pct = p.get('position_pct', 0) - cash = p.get('cash', 0) - holdings = p.get('holdings', []) - weak_cnt = sum(1 for h in holdings if h.get('change_pct', 0) < -15) - total = len(holdings) or 1 - weak_ratio = weak_cnt / total - return { - 'position_pct': pos_pct, - 'cash': cash, - 'is_high_position': pos_pct > 80, - 'is_very_high_position': pos_pct > 90, - 'is_high_weak': weak_ratio > 0.35, - 'weak_ratio': round(weak_ratio * 100), - 'total_holdings': total, - } - except: - return {} - - -def _is_buy_signal(signal): - """判断信号是否为买入/持有类(用于防洗盘)""" - if not signal: - return False - buy_keywords = ['买入', '持有', '加仓', '关注'] - for kw in buy_keywords: - if kw in signal: - return True - return False - - -def _check_portfolio_consistency(): - """数据一致性检查:如果存在多份 portfolio.json 则报警(2026-06-23 bugfix)""" - main = '/home/hmo/web-dashboard/data/portfolio.json' - main_cash = None - try: - import json - main_cash = json.load(open(main)).get('cash') - except Exception: - return - for path in [ - '/home/hmo/data/portfolio.json', - '/home/hmo/projects/MoFin/data/portfolio.json', - '/home/hmo/web-dashboard.bak/data/portfolio.json', - ]: - if os.path.exists(path): - try: - other = json.load(open(path)) - if other.get('cash') != main_cash: - print(f"⚠️ 数据一致性: {os.path.realpath(path)} cash={other.get('cash')} ≠ 主文件 cash={main_cash} (需清理)", file=sys.stderr) - except Exception: - pass - - -def _check_contradiction(code, today_only=True): - """反馈循环核——检查本股是否有刚卖出的记录 - - 返回 dict or None: - - sold_reason: 'portfolio_trim'|'stop_loss' - - sold_at: 卖出日期 - - days_ago: 卖出距今交易日数 - - is_today: 是否今日卖出 - - tag: 追加到信号的标注 - """ - try: - from datetime import datetime, date - dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) - for e in dec.get('decisions', []): - if e.get('code') != code: - continue - sold_at = e.get('sold_at', '') - if not sold_at: - return None - try: - sd = datetime.strptime(sold_at, '%Y-%m-%d').date() - td = date.today() - days = (td - sd).days - except: - return None - - reason = e.get('sold_reason', 'portfolio_trim') - if reason == 'stop_loss': - tag = '止损离场(逻辑破坏,短期不关注)' - else: - tag = '组合减仓后关注(已清仓,等回踩确认)' - - return { - 'sold_reason': reason, - 'sold_at': sold_at, - 'days_ago': days, - 'is_today': days == 0, - 'tag': tag, - } - except: - return None - return None - - -def _get_sell_priority_list(): - """减仓优先级排序:深套>亏损>微盈>盈利(2026-06-23 反馈循环) - - 返回 [(code, name, change_pct, position_pct, priority_label), ...] - 按卖出的优先顺序排列(最先应该卖的在最前) - """ - try: - p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) - holdings = p.get('holdings', []) - ranked = [] - for h in holdings: - chg = h.get('change_pct', 0) - pos = h.get('position_pct', 0) - if chg < -30: - label = '深套(>30%),优先减' - rank = 0 - elif chg < -20: - label = '深套(>20%),优先减' - rank = 1 - elif chg < -10: - label = '亏损,建议减' - rank = 2 - elif chg < 0: - label = '微亏,可减' - rank = 3 - elif chg < 10: - label = '微盈,持有' - rank = 4 - else: - label = '盈利,最后减' - rank = 5 - ranked.append((rank, h['code'], h.get('name',''), chg, pos, label)) - ranked.sort(key=lambda x: (x[0], -x[4])) # 优先 rank, 其次仓位大优先 - return [{'code':c,'name':n,'change_pct':chg,'position_pct':pos,'label':l} - for r,c,n,chg,pos,l in ranked] - except: - return [] - - -def enrich_timing_signal(base_signal, macro_desc="", sector_note="", - profit_pct=0, stock_category="", is_new_entry=False, - fundamentals=None, news_sentiment=None, - timing_signal_override=None, - portfolio_context=None, - rr_ratio=0): # 2026-06-24 新参:盈亏比约束 - """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险+盈亏比 - - 返回 (enriched_signal, factors_list) - - enriched_signal: 可读的多因子信号描述 - - factors_list: 各因子的摘要列表(用于后续显示) - """ - # 如果已手动设定,尊重手动 - if timing_signal_override and timing_signal_override != "neutral": - return timing_signal_override, [timing_signal_override] - - factors = [] - - # 1. 大盘因子 - if "偏强" in macro_desc or "大涨" in macro_desc or "bullish" in macro_desc.lower(): - macro_txt = "大盘偏强" - factors.append(macro_txt) - elif "偏弱" in macro_desc or "大跌" in macro_desc or "bearish" in macro_desc.lower(): - macro_txt = "大盘偏弱" - factors.append(macro_txt) - elif macro_desc and macro_desc != "宏观未加载": - factors.append("大盘中性") - - # 2. 行业因子 - if sector_note: - # 把"行业X大跌3%+"简化为"行业偏弱","行业X大涨3%+"简化为"行业偏强" - if "大跌" in sector_note or "下跌" in sector_note: - factors.append("行业偏弱") - elif "大涨" in sector_note: - factors.append("行业偏强") - elif "上涨" in sector_note: - factors.append("行业偏强") - else: - factors.append("行业中性") - - # 3. 基本面因子 - if fundamentals: - pe = fundamentals.get("pe", 0) - eps = fundamentals.get("eps", 0) - profit_growth = fundamentals.get("profit_growth", fundamentals.get("yoy_profit", "")) - revenue_growth = fundamentals.get("revenue_growth", fundamentals.get("yoy_revenue", "")) - mcap = fundamentals.get("mcap_total", 0) - - pe = pe or 0 - eps = eps or 0 - profit_growth_str = str(profit_growth or "") - revenue_growth_str = str(revenue_growth or "") - - # 净利增长 - for val in [profit_growth_str, revenue_growth_str]: - try: - v = float(val.replace("%", "").replace("+", "")) - if v > 50: - factors.append("净利增50%+") - break - elif v > 20: - factors.append(f"净利增{int(v)}%") - break - elif v < -20: - factors.append("净利降20%+") - break - except (ValueError, AttributeError): - continue - - # PE估值 - if 0 < pe < 15: - factors.append("低估值") - elif pe > 100 or pe < 0: - factors.append("高估值") - - # 市值 - if mcap and mcap > 5000: - factors.append("蓝筹") - - # 4. 消息面因子(小果情感) - if news_sentiment: - ns = news_sentiment.get("sentiment", "") - nc = news_sentiment.get("confidence", 0) - if ns == "positive" and nc >= 0.7: - kws = news_sentiment.get("keywords", []) - kw_str = f"({'/'.join(kws[:3])})" if kws else "" - factors.append(f"消息偏多{kw_str}") - elif ns == "negative" and nc >= 0.7: - kws = news_sentiment.get("keywords", []) - kw_str = f"({'/'.join(kws[:3])})" if kws else "" - factors.append(f"消息偏空{kw_str}") - - # 5. 技术面(基础信号) - if base_signal and base_signal != "neutral": - factors.append(base_signal) - - # 5.5 组合风险因子(2026-06-23 双引擎协调) - if portfolio_context and not is_new_entry: - if portfolio_context.get('is_very_high_position'): - factors.append("组合仓位极重(>90%)") - elif portfolio_context.get('is_high_position'): - factors.append("组合仓位偏重(>80%)") - if portfolio_context.get('is_high_weak'): - factors.append(f"弱势占{portfolio_context.get('weak_ratio')}%") - elif portfolio_context and is_new_entry: - # 新买入推荐:注明组合上下文 - if portfolio_context.get('is_high_position'): - factors.append(f"仓{portfolio_context.get('position_pct')}%现金有限") - elif portfolio_context.get('is_high_weak'): - factors.append("组合风险信号") - - # 5.7 盈亏比因子(2026-06-24 新增——RR<1.5降级买入信号) - if rr_ratio > 0: - if rr_ratio < 1.5: - factors.append(f"RR{rr_ratio}过低") - elif rr_ratio >= 3: - factors.append(f"RR{rr_ratio}") - # 1.5~3之间:中性,不特别标注 - - # 如果没有足够因素,返回信号不充分 - if not factors: - return "信号不充分", [] - - # 信号只应包含明确的买卖方向,不能从行业/大盘等上下文因子拼凑 - # base_signal 存在且非 neutral → 用 base_signal - # 否则 → 信号不充分(不拿 factors[-1] 当信号) - if base_signal and base_signal != "neutral": - clean_signal = base_signal - else: - # 从 factors 中找第一个有效的操作方向信号 - valid_direction = {"买入", "加仓", "观望", "持有", "关注", "信号不充分"} - signal_found = "" - for f in reversed(factors): - if f in valid_direction: - signal_found = f - break - clean_signal = signal_found if signal_found else "信号不充分" - - # 6. RR约束降级(2026-06-24 新增) - # 买入/加仓信号但RR<1.5 → 降级为"信号不充分" - buy_signals = {"买入", "加仓"} - if clean_signal in buy_signals and 0 < rr_ratio < 1.5: - clean_signal = "信号不充分" - factors.append("RR过低降级") - - return clean_signal, factors - - -def reassess_with_context(code, name, price, cost, shares, current_action, - volume_signal="", sentiment="neutral", is_watchlist=False): - """reassess_strategy + 多因子信号合成(大盘+行业+技术) - - 为 per_stock_reassess 等单只场景提供一站式多因子分析 - """ - result = reassess_strategy( - code, name, price, cost, shares, - current_action, volume_signal, sentiment, is_watchlist - ) - if not result: - return result - - # 加载宏观+行业+消息+基本面上下文 - try: - macro_bias, macro_desc = load_macro_context() - market_ctx = load_market_context() - stock_sector_map = load_stock_sector_map() - sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) - sector_note = sector_adj.get("note", "") - news_sentiment = load_stock_news_sentiment(code) - fund = load_fundamentals(code) - except Exception: - macro_desc = "" - sector_note = "" - news_sentiment = {} - fund = {} - - # ── DSA 集成:注入大盘复盘 + 新闻情报 ────────────────────────── - try: - from mo_bridge import enrich_analysis_context - region = "hk" if len(str(code)) == 5 and str(code)[0] in ('0','1') else "cn" - dsa_ctx = enrich_analysis_context(stock_code=code, stock_name=name, - region=region, include_news=True) - if dsa_ctx: - macro_desc = (macro_desc + "\n\n" + dsa_ctx).strip() - except Exception: - pass # DSA 不可用时静默跳过 - - enriched, factors = enrich_timing_signal( - base_signal=result.get("timing_signal", ""), - macro_desc=macro_desc, - sector_note=sector_note, - profit_pct=(price - cost) / cost * 100 if cost else 0, - stock_category=result.get("stock_category", ""), - is_new_entry=is_watchlist, - fundamentals=fund, - news_sentiment=news_sentiment, - portfolio_context=_get_portfolio_risk_state(), - rr_ratio=result.get("rr_ratio", 0), - ) - result["timing_signal"] = enriched - result["signal_factors"] = factors - - # 6. 防洗盘:信号不要一天一翻(2026-06-23) - # 如果旧信号是买入/持有类,新信号是谨慎/等待类,但中期趋势未破→维持旧信号 - try: - dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) - for e in dec.get('decisions', []): - if e.get('code') == code: - old_signal = e.get('timing_signal', '') - if old_signal and _is_buy_signal(old_signal) and not _is_buy_signal(enriched): - # 中等趋势检查:MA5 > MA20 + 多周期看多 - mtf = result.get('multi_tf_context', '') - if '看多' in mtf or '多头' in mtf: - try: - closes = [float(k.split()[2]) for k in mtf.split('|') if 'MA5' in k] - except: - closes = [] - has_uptrend = 'MA5' in mtf and 'MA20' in mtf - if has_uptrend: - print(f" 防洗盘: {old_signal}→保持旧信号(中期趋势完整)") - result["timing_signal"] = f"{old_signal}(正常回调价稳)" - sf = result.get("signal_factors") or [] - if "正常回调价稳" not in sf: - result["signal_factors"] = sf + ["正常回调价稳"] - break - except Exception as e: - print(f" 防洗盘跳过: {e}") - - # 7. 反馈循环核:检查本股是否有刚卖出的记录(2026-06-23) - contradiction = _check_contradiction(code) - if contradiction and contradiction.get('is_today'): - # 今日刚卖出 → 不屏蔽信号,但必须自标注矛盾 - print(f" 反馈循环: {contradiction.get('tag')} (sold_at={contradiction.get('sold_at')})") - if _is_buy_signal(result.get('timing_signal', '')): - result['action_note'] = contradiction['tag'] - # 在 timing_signal 中追加反馈标注,供报告层可见 - curr_signal = result.get('timing_signal', '') - if '⚠️' not in curr_signal: - result['timing_signal'] = f"⚠️{contradiction['tag']}|{curr_signal}" - elif contradiction: - # 非今日卖出但近期卖出 → 标注已清仓 - print(f" 近期清仓: sold_at={contradiction.get('sold_at')} ({contradiction.get('days_ago')}日前)") - if _is_buy_signal(result.get('timing_signal', '')): - curr_signal = result.get('timing_signal', '') - if '已清仓' not in curr_signal: - result['timing_signal'] = f"已清仓,{curr_signal}" - - # 重建 action 文本(同步多因子信号) - try: - if new_action_needs_refresh(result, {"source": "auto"}, price): - _refresh_action_text(result, price, name) - except Exception: - pass - - return result - - -def new_action_needs_refresh(result, old_entry, price): - """判断宏观/行业调整后是否需要刷新action文本""" - # 自选股和手动策略不做调整,不需要刷新 - if old_entry.get("source") == "manual": - return False - return True - - -def _refresh_action_text(result, price, name): - """根据调整后的止损/止盈重建action文本""" - sl = result.get("stop_loss", 0) - tp = result.get("take_profit", 0) - el = result.get("entry_low", 0) - eh = result.get("entry_high", 0) - ts = result.get("timing_signal", "") - an = result.get("action_note", "") - old_action = result.get("action", "") - - # 保持原action的前缀(持有状态部分不变) - # action格式一般是: "状态 | 止损X | 目标Y | 买入区X~Y | 信号:Z" - parts = old_action.split(" | ") - new_parts = [] - for p in parts: - p = p.strip() - # 替换止损数字 - if p.startswith("止损") or p.startswith("止损参考"): - if sl: - p = f"止损{sl}" if "止损参考" not in old_action.split(" | ")[0] else f"止损参考{sl}" - # 替换目标/止盈数字 - if p.startswith("目标") or p.startswith("止盈"): - if tp: - p = f"目标{tp}" - # 替换买入区数字 - if "买入区" in p and "~" in p: - if el and eh: - p = f"买入区{el}~{eh}" - new_parts.append(p) - result["action"] = " | ".join(new_parts) - - -def check_sector_alerts(market_ctx, stock_sector_map, holdings, wl): - """行业轮动主动预警:检测板块崩盘级别信号→查持仓→输出预警 - - 返回 list of alerts: [{code, name, sector, chg, action}] - """ - alerts = [] - if not market_ctx: - return alerts - - sector_perf = market_ctx.get("sector_perf", {}) - - # 找出所有跌幅>3%的行业 - crashing_sectors = {name: data for name, data in sector_perf.items() - if data.get("change", 0) <= -3} - - if not crashing_sectors: - return alerts - - # 构建 code→持仓信息 的映射 - holding_map = {} - for h in holdings: - c = h.get("code", "") - if c: - holding_map[c] = {"name": h.get("name", c), "type": "持仓"} - for s in wl.get("stocks", []): - c = s.get("code", "") - if c and c not in holding_map: - holding_map[c] = {"name": s.get("name", c), "type": "自选"} - - # 对每个暴跌行业,查持仓中是否有股票属于该行业 - for sec_name, sec_data in sorted(crashing_sectors.items(), - key=lambda x: x[1].get("change", 0)): - chg = sec_data.get("change", 0) - for code, sectors in stock_sector_map.items(): - if code in holding_map and sec_name in sectors: - info = holding_map[code] - alerts.append({ - "code": code, - "name": info["name"], - "sector": sec_name, - "sector_change": chg, - "type": info["type"], - "action": f"行业{sec_name}跌{chg:+.1f}%,{info['type']}需关注", - }) - - alerts.sort(key=lambda a: a["sector_change"]) - return alerts - - -def regenerate_all(stdout=True): - """全量重评所有持仓+自选策略""" - # 优先从 SQLite 读取 - try: - from mofin_db import get_conn, query_holdings, query_watchlist - conn = get_conn() - holdings = query_holdings(conn) - wl_stocks = query_watchlist(conn) - conn.close() - pf = {"holdings": holdings} - wl = {"stocks": wl_stocks} - except Exception: - pf = safe_json_load(PORTFOLIO_PATH, {}) - wl = safe_json_load(WATCHLIST_PATH, {}) - - all_stocks = {} - for item in pf.get("holdings", []): - code = item.get("code", "") - if code: - all_stocks[code] = {"source": "portfolio", "data": item} - for item in wl.get("stocks", []): - code = item.get("code", "") - if code and code not in all_stocks: - all_stocks[code] = {"source": "watchlist", "data": item} - - total = len(all_stocks) - ok = 0 - errors = 0 - results = [] - decisions = [] - - # 加载现有 decisions.json 以便追踪变更 - decisions_path = "/home/hmo/web-dashboard/data/decisions.json" - try: - existing_decisions = {d["code"]: d for d in json.load(open(decisions_path)).get("decisions", []) if d.get("code")} - except: - existing_decisions = {} - - # 加载宏观上下文(影响策略参数调整) - macro_bias, macro_desc = load_macro_context() - if stdout: - print(f" 宏观参考: {macro_desc} (bias={macro_bias})") - - # 加载市场上下文 — 行业板块表现 + 大盘宽度(策略参数调整用) - market_ctx = load_market_context() - stock_sector_map = load_stock_sector_map() - market_breadth = market_ctx.get("breadth", 50) - market_mood = market_ctx.get("mood", "neutral") - if stdout: - sectors_found = sum(1 for c in all_stocks if stock_sector_map.get(c)) - print(f" 市场参考: {market_mood} 上涨比{market_breadth}% 已匹配{sectors_found}/{total}只个股行业") - - # 批量预取所有价格(一次API调用 vs 之前N次) - prices_map = batch_fetch_prices(list(all_stocks.keys())) - if stdout: - print(f" 批量获取价格: {len(prices_map)}/{total} 成功") - - for code, info in sorted(all_stocks.items()): - stock = info["data"] - name = stock.get("name", code) - cost = stock.get("cost", 0) or 0 - shares = stock.get("shares", 0) or 0 - source = info["source"] - - q = prices_map.get(code) - if not q or not q.get("price"): - results.append({"code": code, "name": name, "error": "腾讯API无数据"}) - errors += 1 - if stdout: - print(f" ❌ {name}({code}): 腾讯API无数据") - continue - - price = q["price"] - profit_pct = (price - cost) / cost * 100 if cost else 0 - current_action = stock.get("analysis", {}).get("action", "") - close_yest = q.get("close", 0) - sentiment = "neutral" - if close_yest and price > close_yest * 1.02: - sentiment = "bullish" - elif close_yest and price < close_yest * 0.98: - sentiment = "bearish" - - try: - is_wl = (source == "watchlist") - result = reassess_strategy( - code, name, price, cost, shares, - current_action, volume_signal="中性", sentiment=sentiment, - is_watchlist=(source == "watchlist"), - ) - - # --- Manual param preservation: 用户手动策略永不覆盖 --- - old_entry = existing_decisions.get(code, {}) - if old_entry.get("source") == "manual": - # 仅覆盖策略参数,技术分析/信号/价格照常保留 - for key in ["entry_low", "entry_high", "stop_loss", "take_profit"]: - if key in old_entry and old_entry[key] is not None: - result[key] = old_entry[key] - # 重算盈亏比(基于手动参数) - manual_stop = result.get("stop_loss", 0) or 0 - manual_target = result.get("take_profit", 0) or 0 - risk = max(price - manual_stop, price * 0.01) if manual_stop > 0 else price * 0.01 - reward = max(manual_target - price, 0) if manual_target > 0 else 0 - result["rr_ratio"] = round(reward / risk, 2) if risk > 0 else 0 - # 重建 action 文本(引用手动参数,不引用自动计算的) - profit_pct = (price - cost) / cost * 100 if cost else 0 - manual_action_parts = [] - if profit_pct < -20: - manual_action_parts.append("深套持有") - elif profit_pct < -10: - manual_action_parts.append("持有观察") - elif profit_pct < 0: - manual_action_parts.append("持有观察") - elif profit_pct < 5: - manual_action_parts.append("盈利持有") - else: - manual_action_parts.append("盈利良好") - if result.get("action_note"): - manual_action_parts.append(result["action_note"]) - if is_wl: - if manual_stop > 0: - manual_action_parts.append(f"止损参考{manual_stop}") - manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") - else: - if manual_stop > 0: - manual_action_parts.append(f"止损{manual_stop}") - if manual_target > 0: - manual_action_parts.append(f"目标{manual_target}") - manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") - ts = result.get("timing_signal", "") - if ts and ts != "neutral": - manual_action_parts.append(f"信号:{ts}") - result["action"] = " | ".join(manual_action_parts) - result["status"] = "manual" # 标记为手动管理,变更追踪不受影响 - if stdout: - print(f" [手动保留] {name}({code}) 策略参数未覆盖") - - # 宏观偏差调整:收盘后重评时根据宏观方向微调止损/止盈 - # 自选股不做止盈宏观调整(无持仓) - # 手动策略不做宏观偏差调整(尊重用户设定) - if macro_bias != 1.0 and not is_wl and old_entry.get("source") != "manual": - old_stop = result.get("stop_loss", 0) - old_target = result.get("take_profit", 0) - if macro_bias < 1.0 and old_stop > 0: # 宏观偏弱 → 收紧止损 - # 止损上移(但保留最小3%间距) - adjusted_stop = round(old_stop * (1 + (1 - macro_bias) * 0.3), 2) - min_stop = round(price * 0.97, 2) - result["stop_loss"] = min(adjusted_stop, min_stop) - if old_target > 0: - result["take_profit"] = round(old_target * (1 - (1 - macro_bias) * 0.2), 2) - elif macro_bias > 1.0 and old_target > 0: # 宏观偏强 → 止盈上调让利润跑 - result["take_profit"] = round(old_target * (1 + (macro_bias - 1) * 0.3), 2) - - # 行业偏差调整:根据个股所在行业的市场表现微调止损/止盈 - # 手动策略不做行业调整(尊重用户设定) - sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) - sector_note = sector_adj.get("note", "") - if sector_note and old_entry.get("source") != "manual": - old_stop = result.get("stop_loss", 0) - old_target = result.get("take_profit", 0) - stop_bias = sector_adj.get("stop_bias", 1.0) - target_bias = sector_adj.get("target_bias", 1.0) - if stop_bias != 1.0 and old_stop > 0: - # 行业偏差调整(在宏观调整之后叠加) - adjusted = round(old_stop * stop_bias, 2) - # 保留最小3%间距 - min_stop = round(price * 0.97, 2) - result["stop_loss"] = min(adjusted, min_stop) - if target_bias != 1.0 and old_target > 0 and not is_wl: - result["take_profit"] = round(old_target * target_bias, 2) - - # 加载消息面+基本面(逐个股) - news_sentiment = load_stock_news_sentiment(code) - fund = load_fundamentals(code) - - # 多因子合成 timing_signal:大盘+行业+消息+基本面+技术 - if old_entry.get("source") != "manual": - enriched, _ = enrich_timing_signal( - base_signal=result.get("timing_signal", ""), - macro_desc=macro_desc, - sector_note=sector_note, - profit_pct=profit_pct, - stock_category=result.get("stock_category", ""), - is_new_entry=(source == "watchlist"), - fundamentals=fund, - news_sentiment=news_sentiment, - rr_ratio=result.get("rr_ratio", 0), - ) - result["timing_signal"] = enriched - - # 在宏观/行业/多因子调整后重建 action 文本(同步调整后的止损/止盈数字) - if new_action_needs_refresh(result, old_entry, price): - _refresh_action_text(result, price, name) - - extra = { - "rr_ratio": result.get("rr_ratio"), - "action_note": result.get("action_note", ""), - "timing_signal": result.get("timing_signal", ""), - } - analysis = { - "stop_loss": result["stop_loss"], - "take_profit": result["take_profit"], - "entry_low": result["entry_low"], - "entry_high": result["entry_high"], - "action": result["action"], - "tech_snapshot": result.get("tech_snapshot", ""), - "multi_tf_context": result.get("multi_tf_context", ""), - "reassessed_at": result["reassessed_at"], - "status": result["status"], - **extra, - } - stock["analysis"] = analysis - # 同步 top-level 字段 → zone_breach/price_monitor 依赖这些字段 - # (2026-06-24 bugfix: analysis 子对象有但顶层没有,导致新持仓的止损检测盲区) - stock["stop_loss"] = result.get("stop_loss", 0) - stock["take_profit"] = result.get("take_profit", 0) - stock["entry_low"] = result.get("entry_low", 0) - stock["entry_high"] = result.get("entry_high", 0) - # 同步 trigger 字段 -> price_monitor 依赖 - sl = result.get("stop_loss", 0) - tp = result.get("take_profit", 0) - el = result.get("entry_low", 0) - eh = result.get("entry_high", 0) - trig = {} - if sl and float(sl) > 0: - trig["stop_loss"] = float(sl) - if el and eh and float(el) > 0 and float(eh) > 0: - trig["entry_zone"] = f"{float(el)}~{float(eh)}" - if tp and float(tp) > 0: - trig["take_profit_zone"] = f"0~{float(tp)}" - stock["trigger"] = trig - results.append({ - "code": code, "name": name, - "price": price, "cost": cost, - "action": result["action"], - "stop_loss": result["stop_loss"], - "take_profit": result["take_profit"], - "rr_ratio": result["rr_ratio"], - }) - ok += 1 - if stdout: - rr_str = f" RR={result['rr_ratio']}" if "rr_ratio" in result else "" - print(f" ✅ {name}({code}) {price} {result['action']}{rr_str}") - - # 记录所有股票的决策日志(含变更追踪) - status_display = result.get("status", "active") - # 构建行业上下文 - sector_ctx_str = "" - sec_name = sector_adj.get("sector_name", "") - sec_chg = sector_adj.get("sector_change", 0) - if sec_name: - sector_ctx_str = f"行业{sec_name}{sec_chg:+.1f}%" - if sector_adj.get("note"): - # note 已包含大盘宽度信息 - sector_ctx_str = sector_adj["note"] - elif market_breadth < 40: - # 无行业映射时至少记录大盘宽度 - sector_ctx_str = f"大盘上涨比{market_breadth}%" - new_entry = { - "code": code, "name": name, "price": price, - "cost": old_entry.get("cost", cost) if old_entry else cost, # 优先保留旧成本(holding.xls权威) - "shares": old_entry.get("shares", 0), # 保留持仓股数 - "avg_price": old_entry.get("avg_price", 0), # 保留持仓均价 - "action": result["action"], - "stop_loss": result.get("stop_loss"), - "entry_low": result["entry_low"], - "entry_high": result["entry_high"], - "tech_snapshot": result.get("tech_snapshot", ""), - "timing_signal": result.get("timing_signal", ""), - "rr_ratio": result.get("rr_ratio", 0), - "status": status_display, - "note": result.get("action_note", ""), - "timestamp": result["reassessed_at"], - "updated_at": result["reassessed_at"], - "type": "自选策略" if is_wl else "持仓策略", - "source": old_entry.get("source", "auto"), # manual/auto,继承旧标记 - "sector_context": sector_ctx_str, # 市场上下文:行业表现+大盘宽度 - "stock_category": result.get("stock_category", "中短线"), # 组合监测用 - "position_advice": result.get("position_advice", "中等仓位"), - "time_horizon": result.get("time_horizon", "2周~3月"), - } - new_entry["trigger"] = trig - # created_at: 首次创建时设置,后续 preserve - old_entry = existing_decisions.get(code, {}) - if old_entry.get("created_at"): - new_entry["created_at"] = old_entry["created_at"] - else: - new_entry["created_at"] = result["reassessed_at"] - # 保留 last_reassessed_price(per_stock_reassess 维护的防抖字段) - if old_entry.get("last_reassessed_price"): - new_entry["last_reassessed_price"] = old_entry["last_reassessed_price"] - # 自选股也写止盈位(用于RR校验),但标签用"目标参考"非"止盈" - new_entry["take_profit"] = result.get("take_profit") - - # --- 变更追踪 --- - old_action = old_entry.get("action", "") - old_stop = old_entry.get("stop_loss") - old_target = old_entry.get("take_profit") - - # 构建旧策略摘要和变更理由 - update_reason = "" - changelog_entry = None - - if old_action and old_action != result["action"]: - # 策略有变化 → 记录变更 - old_summary = old_action - new_summary = result["action"] - - # 判断触发原因 - if abs(price - old_entry.get("price", price)) / max(price, 0.01) > 0.03: - trigger = f"价格变动({old_entry.get('price','?')}→{price})" - elif result.get("timing_signal") and result["timing_signal"] != old_entry.get("timing_signal", ""): - trigger = f"技术信号变化: {result['timing_signal']}" - else: - trigger = "技术面重评" - - # 格式化的变更理由(自选股只看止损,不看止盈) - diff_parts = [] - if old_stop and result["stop_loss"] != old_stop: - diff_parts.append(f"止损{old_stop}→{result['stop_loss']}") - if not is_wl and old_target and result.get("take_profit") and result["take_profit"] != old_target: - diff_parts.append(f"止盈{old_target}→{result['take_profit']}") - if diff_parts: - update_reason = f"{trigger}: {', '.join(diff_parts)} | {result.get('tech_snapshot','')[:60]}" - else: - update_reason = f"{trigger}: 策略文字调整" - - changelog_entry = { - "date": result["reassessed_at"], - "old_action": old_action, - "new_action": result["action"], - "reason": update_reason, - "trigger": trigger, - } - new_entry["updated_reason"] = update_reason - - elif not old_action: - # 首次创建策略 - update_reason = f"初始策略创建 | {result.get('tech_snapshot','')[:60]}" - changelog_entry = { - "date": result["reassessed_at"], - "old_action": "", - "new_action": result["action"], - "reason": update_reason, - "trigger": "初始创建", - } - - # 合并changelog - old_changelog = old_entry.get("changelog", []) if old_entry else [] - if changelog_entry: - new_entry["changelog"] = old_changelog + [changelog_entry] - else: - new_entry["changelog"] = old_changelog - - # 保留执行记录 - if old_entry and old_entry.get("execution"): - new_entry["execution"] = old_entry["execution"] - elif stock.get("analysis", {}).get("status") == "executing": - new_entry["execution"] = { - "status": "executing", - "entry_price": cost if cost else 0, - "shares": shares, - "notes": "", - } - - # --- 自动标记 current_recommend --- - # 只在真正执行中的持仓才自动推荐:execution.status 为 executing 或 partial_exit - exec_status = old_entry.get("execution", {}).get("status", "") if old_entry else "" - is_active = exec_status in ("executing", "partial_exit") - - profit_pct = (price - cost) / cost * 100 if cost else 0 - is_deep_loss_stock = profit_pct < -20 - rr = result.get("rr_ratio", 0) - ts = result.get("timing_signal", "") - note = result.get("action_note", "") - - # 计算是否在/接近买入区 - entry_low_val = result.get("entry_low", 0) - entry_high_val = result.get("entry_high", 0) - in_buy_zone = (entry_low_val > 0 and entry_high_val > 0 and - entry_low_val <= price <= entry_high_val) - near_buy_zone_low = (entry_low_val > 0 and - price >= entry_low_val * 0.98 and - price <= entry_high_val) - - # 推荐条件:必须是执行中的持仓 + 基本面条件达标 - is_recommendable = ( - is_active - and not is_deep_loss_stock - and rr >= 1.5 - and ts != "neutral" - and "不建议" not in note - ) - if is_recommendable: - new_entry["tag"] = "current_recommend" - else: - # 不清除 active_manual(用户手动标记),只清除自动推荐的 - old_tag = old_entry.get("tag", "") if old_entry else "" - if old_tag != "active_manual": - new_entry.pop("tag", None) - - decisions.append(new_entry) - - except Exception as e: - results.append({"code": code, "name": name, "error": str(e)}) - errors += 1 - if stdout: - print(f" ❌ {name}({code}): {e}") - - # 写回数据文件 — 保留现有字段(现金、总资产等)不丢 - try: - existing_pf = json.load(open(PORTFOLIO_PATH)) - except Exception: - existing_pf = {} - # 保留 price/change_pct — price_monitor 维护的实时价,regenerate_all 不应清除 - _existing_holdings_map = {} - for _h in existing_pf.get('holdings', []): - if _h.get('code'): - _existing_holdings_map[_h['code']] = _h - _new_holdings = pf.get("holdings", []) - for _h in _new_holdings: - _code = _h.get('code') - if _code and _code in _existing_holdings_map: - _old = _existing_holdings_map[_code] - _h['price'] = _old.get('price', 0) - _h['change_pct'] = _old.get('change_pct', 0) - existing_pf["holdings"] = _new_holdings - existing_pf["updated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M') - - # ── Watchlist ↔ Holdings 双向自动迁移(2026-06-27 Dad要求)── - # ① 持仓已有 → 从自选移除(买入自动清除) - wl_codes = {s.get("code") for s in wl.get("stocks", []) if s.get("code")} - pf_codes = {h.get("code") for h in _new_holdings if h.get("code") and h.get("shares", 0) > 0} - removed_from_wl = [] - for h_code in wl_codes & pf_codes: - # 持仓>0且量够 → 自选移除 - wl["stocks"] = [s for s in wl.get("stocks", []) if s.get("code") != h_code] - removed_from_wl.append(h_code) - if removed_from_wl and stdout: - print(f" 自选→持仓自动移除: {', '.join(removed_from_wl)}") - - # ② 清仓/卖光 → 加回自选(只要仍有关注价值) - added_to_wl = [] - old_pf_codes = {_h.get("code") for _h in existing_pf.get("holdings", []) if _h.get("code")} - sold_codes = old_pf_codes - pf_codes # 曾持仓但现在没有(或不在了) - for sc in sold_codes: - # 已有自选就不重复加 - if sc in wl_codes: - continue - # 从现有decisions看是否有关注价值 - for d in decisions: - if d.get("code") == sc and d.get("entry_low") and d.get("entry_high"): - wl["stocks"].append({ - "code": sc, "name": d.get("name", sc), - "entry_low": d.get("entry_low"), "entry_high": d.get("entry_high"), - "stop_loss": d.get("stop_loss", 0), - "analysis": {"action": d.get("action", ""), "tech_snapshot": d.get("tech_snapshot", "")} - }) - added_to_wl.append(sc) - break - if added_to_wl and stdout: - print(f" 清仓→自选自动加入: {', '.join(added_to_wl)}") - - # DB 写入(替代 JSON dump — 强制币种约束) - try: - from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_watchlist_stock, write_holding_strategy - conn = get_conn() - write_holdings_batch(conn, existing_pf.get('holdings', [])) - write_portfolio_summary(conn, existing_pf) - for s in wl.get('stocks', []): - s.setdefault('currency', 'CNY') - write_watchlist_stock(conn, s) - for d in decisions: - write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) - conn.close() - except Exception as e: - print(f" [DB写入失败] {e}", flush=True) - # JSON 冷备 - json.dump(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2) - json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2) - - # 写 decisions.json - decisions_path = "/home/hmo/web-dashboard/data/decisions.json" - decisions_data = { - "decisions": decisions, # 全部保留 - "total": len(decisions), - "regenerated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), - } - json.dump(decisions_data, open(decisions_path, "w"), ensure_ascii=False, indent=2) - # DB 已在上方写入(和 portfolio/watchlist 一起) - - # 记录策略→提示词版本关联 - if HAS_PROMPT_TRACKING: - try: - for d in decisions: - if d.get("code") and d.get("action"): - record_strategy_generation( - d["code"], d.get("name", ""), d.get("action", "") - ) - except Exception as e: - if stdout: - print(f" ⚠️ 提示词版本追踪失败: {e}", file=sys.stderr) - - # 刷新多周期缓存到磁盘 - try: - import multi_timeframe as _mtf - _mtf.flush_mtf_cache() - except Exception: - pass - - summary = {"total": total, "ok": ok, "errors": errors} - if stdout: - print(f"\n✅ 全量重评完成: {ok}/{total}成功, {errors}错误") - return summary - - -if __name__ == "__main__": - regenerate_all() +#!/usr/bin/env python3 +"""策略生命周期管理系统 — 技术面驱动版本 v2 + +核心原则: +1. 止损放在合理的技术位,不拍数字 +2. 新买入推荐:止损=弱支撑(约3%跌幅),止盈=强压力,盈亏比≥2:1 +3. 已持仓:止损=强支撑(约5-8%跌幅),目标=强压力 +4. 买入区间:弱支撑~弱压力之间 +5. 买入时机:量价齐跌不买,缩量至支撑买,量价齐升追买 +""" + +import json +import urllib.request +import os +import sys +import re +from datetime import datetime +import technical_analysis as ta +import multi_timeframe as mtf +from mo_data import read_portfolio, read_decisions, read_watchlist + + +def is_hk_stock(code): + """判断是否港股(港股代码5位,A股6位带前导零)""" + return len(str(code)) <= 5 + + +def calc_atr(code, period=14): + """从腾讯API K线数据计算ATR(period),返回ATR值或None""" + try: + url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param=hk{code},day,,,60,qfq" + req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) + resp = urllib.request.urlopen(req, timeout=5).read().decode('utf-8') + data = json.loads(resp) + bars = data.get('data', {}).get(f'hk{code}', {}).get('day', []) + if len(bars) < period + 1: + return None + trs = [] + for i in range(1, min(len(bars), period + 1)): + try: + high = float(bars[i][2]) + low = float(bars[i][3]) + prev_close = float(bars[i-1][4]) if len(bars[i-1]) > 4 else float(bars[i-1][3]) + tr = max(high - low, abs(high - prev_close), abs(low - prev_close)) + trs.append(tr) + except (ValueError, IndexError): + continue + if not trs: + return None + return round(sum(trs) / len(trs), 2) + except Exception: + return None + +# 提示词版本追踪 +try: + from prompt_manager.tracking import record_strategy_generation + HAS_PROMPT_TRACKING = True +except ImportError: + HAS_PROMPT_TRACKING = False + +PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" +WATCHLIST_PATH = "/home/hmo/web-dashboard/data/watchlist.json" + +def safe_json_load(path, default=None): + """安全加载 JSON,遇到坏数据自动修复""" + if not os.path.exists(path): + return default if default is not None else {} + try: + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + except json.JSONDecodeError: + # 尝试修复:替换字符串内未转义的换行符,去多余括号 + with open(path, "r", encoding="utf-8") as f: + raw = f.read() + fixed = raw + + # 修复1: 字符串内未转义的换行 -> \\n + result = [] + in_str = False + for ch in fixed: + if ch == '"': + in_str = not in_str + result.append(ch) + elif in_str and ch in '\n\r': + result.append('\\n') + else: + result.append(ch) + fixed = ''.join(result) + + # 修复2: 去掉多余的尾部括号 + fixed = fixed.rstrip('}') + # 补回正确的闭合 + if not fixed.endswith('}'): + fixed += '}' + + try: + return json.loads(fixed) + except json.JSONDecodeError as e: + print(f"[WARN] watchlist.json 自动修复失败: {e}", file=sys.stderr) + return default if default is not None else {} +KNOWLEDGE_LOG = "/home/hmo/Obsidian/knowledge/finance/analyst-knowledge-log.md" +MACRO_CONTEXT_PATH = "/home/hmo/web-dashboard/data/macro_context.json" +MARKET_CONTEXT_PATH = "/home/hmo/web-dashboard/data/market.json" +STOCK_SECTOR_MAP_PATH = "/home/hmo/web-dashboard/data/stock_sector_map.json" + + +def load_stock_sector_map(): + """读取个股归属行业映射 + + stock_sector_map.json 格式: {code: [sector1, sector2, ...]} + 跳过 _note, _created_at 等元数据键。 + """ + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_sector_stocks + conn = get_conn() + # 从 stock_sectors 表反向构建 code→[sectors] 映射 + rows = conn.execute("SELECT code, sector_name FROM stock_sectors ORDER BY code").fetchall() + conn.close() + code_to_sectors = {} + for code, sector in rows: + if code not in code_to_sectors: + code_to_sectors[code] = [] + code_to_sectors[code].append(sector) + return code_to_sectors + except Exception: + pass + try: + with open(STOCK_SECTOR_MAP_PATH) as f: + data = json.load(f) + code_to_sectors = {} + for key, value in data.items(): + if key.startswith("_"): + continue + if isinstance(value, list): + code_to_sectors[key] = value + return code_to_sectors + except Exception: + return {} + + +def load_market_context(): + """读取市场上下文,优先 SQLite,回退 market.json""" + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_latest_market + conn = get_conn() + market = query_latest_market(conn) + conn.close() + if market and market.get("sectors"): + sector_perf = {} + for s in market["sectors"]: + name = s.get("name", "") + if name: + sector_perf[name] = { + "change": s.get("change_pct", 0), + "up_count": s.get("up_count", 0), + "down_count": s.get("down_count", 0), + "net_inflow": s.get("net_inflow", 0), + "lead_stock": s.get("lead_stock", ""), + "lead_stock_change": s.get("lead_stock_change", 0), + } + return { + "sector_perf": sector_perf, + "breadth": market.get("up_ratio", 50), + "mood": market.get("mood", "neutral"), + "top_gainers": {g["name"]: g["change_pct"] for g in market.get("top_gainers", [])}, + "top_losers": {g["name"]: g["change_pct"] for g in market.get("top_losers", [])}, + "total_sectors": len(market["sectors"]), + "market_timestamp": market.get("timestamp", ""), + } + except Exception: + pass + try: + with open(MARKET_CONTEXT_PATH) as f: + market = json.load(f) + sectors = market.get("sectors", []) + sector_perf = {} + for s in sectors: + name = s.get("name", "") + if name: + sector_perf[name] = { + "change": s.get("change", 0), + "up_count": s.get("up_count", 0), + "down_count": s.get("down_count", 0), + "net_inflow": s.get("net_inflow", 0), + "lead_stock": s.get("lead_stock", ""), + "lead_stock_change": s.get("lead_stock_change", 0), + } + top_gainers = {s.get("name", ""): s.get("change", 0) + for s in market.get("top_gainers", [])} + top_losers = {s.get("name", ""): s.get("change", 0) + for s in market.get("top_losers", [])} + return { + "sector_perf": sector_perf, + "breadth": market.get("up_ratio", 50), + "mood": market.get("mood", "neutral"), + "top_gainers": top_gainers, + "top_losers": top_losers, + "total_sectors": market.get("total_sectors", 0), + "market_timestamp": market.get("timestamp", ""), + } + except Exception: + return { + "sector_perf": {}, + "breadth": 50, + "mood": "neutral", + "top_gainers": {}, + "top_losers": {}, + "total_sectors": 0, + "market_timestamp": "", + } + + +def compute_sector_adjustment(code, market_ctx, stock_sector_map): + """根据个股所属行业的市场表现+小果情感,返回调整系数 + + 返回 dict: + stop_bias: 止损调整系数(<1.0收紧, >1.0放宽) + target_bias: 止盈调整系数 + note: 行业背景一句话 + sector_name: 匹配到的行业名称 + sector_change: 行业涨跌幅 + """ + # 默认无调整 + adj = {"stop_bias": 1.0, "target_bias": 1.0, "note": "", + "sector_name": "", "sector_change": 0} + + sectors_for_code = stock_sector_map.get(code, []) + if not sectors_for_code: + return adj + + sector_perf = market_ctx.get("sector_perf", {}) + breadth = market_ctx.get("breadth", 50) + + # 找第一个能匹配到的行业 + for sec in sectors_for_code: + if sec in sector_perf: + perf = sector_perf[sec] + chg = perf.get("change", 0) + adj["sector_name"] = sec + adj["sector_change"] = chg + + # 行业暴跌 > 3% + if chg <= -3: + adj["stop_bias"] = 0.92 # 止损收紧8% + adj["target_bias"] = 0.90 # 止盈下调10% + adj["note"] = f"行业{sec}大跌{chg:+.1f}%,收紧止损" + # 行业大跌 1~3% + elif chg <= -1: + adj["stop_bias"] = 0.96 + adj["target_bias"] = 0.95 + adj["note"] = f"行业{sec}下跌{chg:+.1f}%,适度防御" + # 行业大涨 > 3% + elif chg >= 3: + adj["stop_bias"] = 1.05 # 止损放宽5%(给趋势空间) + adj["target_bias"] = 1.03 + adj["note"] = f"行业{sec}大涨{chg:+.1f}%,可适度积极" + # 行业上涨 1~3% + elif chg >= 1: + adj["stop_bias"] = 1.02 + adj["note"] = f"行业{sec}上涨{chg:+.1f}%,正常" + else: + adj["note"] = f"行业{sec}{chg:+.1f}%,中性" + break + # 尝试处理命名差异:market.json中的行业名可能多了"板块"后缀 + for market_sec_name in sector_perf: + if sec in market_sec_name or market_sec_name in sec: + perf = sector_perf[market_sec_name] + chg = perf.get("change", 0) + adj["sector_name"] = market_sec_name + adj["sector_change"] = chg + if chg <= -3: + adj["stop_bias"] = 0.92 + adj["target_bias"] = 0.90 + adj["note"] = f"行业{market_sec_name}大跌{chg:+.1f}%,收紧止损" + elif chg <= -1: + adj["stop_bias"] = 0.96 + adj["target_bias"] = 0.95 + adj["note"] = f"行业{market_sec_name}下跌{chg:+.1f}%,适度防御" + elif chg >= 3: + adj["stop_bias"] = 1.05 + adj["target_bias"] = 1.03 + adj["note"] = f"行业{market_sec_name}大涨{chg:+.1f}%,可适度积极" + elif chg >= 1: + adj["stop_bias"] = 1.02 + adj["note"] = f"行业{market_sec_name}上涨{chg:+.1f}%,正常" + else: + adj["note"] = f"行业{market_sec_name}{chg:+.1f}%,中性" + break + + # 如果breath<30% (大盘极弱),再加一层收紧 + if breadth < 30: + adj["stop_bias"] *= 0.97 # 再收紧3% + breadth_note = "大盘仅{}%个股上涨".format(int(breadth)) + adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note + elif breadth < 40: + adj["stop_bias"] *= 0.99 + breadth_note = "大盘偏弱({}%上涨)".format(int(breadth)) + adj["note"] = (adj["note"] + " | " + breadth_note) if adj["note"] else breadth_note + + # 小果情感约束:利空置信度>80%时收紧止损 + try: + xiaoguo_path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" + if os.path.exists(xiaoguo_path): + xg = json.load(open(xiaoguo_path)) + stock_sentiment = xg.get("stocks", {}).get(code, {}) + if stock_sentiment: + sentiment = stock_sentiment.get("sentiment", "") + confidence = stock_sentiment.get("confidence", 0) + summary = stock_sentiment.get("summary", "") + if sentiment == "negative" and confidence > 0.8: + adj["stop_bias"] = min(adj["stop_bias"], 0.95) + adj["note"] += f" | 小果利空{confidence:.0%}:{summary[:30]}" + except Exception: + pass + + return adj + + +def load_macro_context(): + """读取宏观上下文,返回 (bias, desc),优先 DB,回退 JSON""" + try: + import sqlite3 + from pathlib import Path + conn = sqlite3.connect(str(Path(__file__).parent.parent / "data" / "mofin.db")) + row = conn.execute( + "SELECT indices, structure FROM macro_context_log " + "WHERE has_valid_data=1 ORDER BY created_at DESC LIMIT 1" + ).fetchone() + conn.close() + if row: + indices = json.loads(row[0]) if row[0] else {} + structure = json.loads(row[1]) if row[1] else {} + overall = structure.get("overall", "neutral") + desc = structure.get("description", "") + else: + raise ValueError("no db data") + except Exception: + try: + with open(MACRO_CONTEXT_PATH) as f: + ctx = json.load(f) + overall = ctx.get("structure", {}).get("overall", "neutral") + desc = ctx.get("structure", {}).get("description", "") + except Exception: + return 1.0, "宏观未加载" + if "bearish" in overall: + return 0.8, f"宏观{desc}" + elif overall == "bullish": + return 1.05, f"宏观{desc}" + elif overall == "strong_bullish": + return 1.1, f"宏观{desc}" + else: + return 1.0, f"宏观{desc}" + + +def batch_fetch_prices(codes): + """获取实时价格。优先从 DB 读取(price_monitor 每 2 分钟更新),失败才拉腾讯 API。""" + if not codes: + return {} + + all_results = {} + + # 主通道:从 DB 读取(price_monitor 唯一价格入口) + try: + import sqlite3 + db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db') + db.row_factory = sqlite3.Row + for raw_code in codes: + raw_code = str(raw_code).split('_')[0] + if not raw_code: continue + row = db.execute( + "SELECT price, change_pct FROM holdings WHERE code=? AND is_active=1", (raw_code,) + ).fetchone() + if not row: + row = db.execute( + "SELECT price, change_pct FROM holding_strategies WHERE code=? AND status='active' ORDER BY updated_at DESC LIMIT 1", (raw_code,) + ).fetchone() + if row and row['price']: + all_results[raw_code] = (row['price'], 0, row['change_pct'] or 0) + db.close() + if all_results: + return all_results + except Exception: + pass + + # Fallback: 腾讯 API(仅当 DB 无数据时) + batch_size = 15 + for batch_start in range(0, len(codes), batch_size): + batch = codes[batch_start:batch_start + batch_size] + symbols = [] + code_map = {} + for raw_code in batch: + raw_code = str(raw_code).split('_')[0] + if not raw_code: + continue + if len(raw_code) == 5 and raw_code.isdigit(): + prefix = "hk" + elif raw_code.startswith(("6", "5")): + prefix = "sh" + else: + prefix = "sz" + sym = f"{prefix}{raw_code}" + symbols.append(sym) + code_map[sym] = raw_code + if not symbols: + continue + + url = f"http://qt.gtimg.cn/q={','.join(symbols)}" + max_retries = 2 + for attempt in range(max_retries + 1): + try: + r = urllib.request.urlopen(url, timeout=10) + text = r.read().decode("gbk") + except Exception as e: + if attempt < max_retries: + continue + print(f" batch_fetch_prices error: {e}", file=sys.stderr) + continue + + for line in text.strip().split("\n"): + line = line.strip() + if not line or "=" not in line: + continue + try: + sym = line.split("=", 1)[0].strip().lstrip("v_") + raw_value = line.split("=", 1)[1].strip().strip('"').strip(";") + fields = raw_value.split("~") + if len(fields) < 35: + continue + orig_code = code_map.get(sym) + if not orig_code: + continue + def f(i): + try: + return float(fields[i]) if fields[i].strip() else 0.0 + except: + return 0.0 + all_results[orig_code] = { + "price": f(3), "close": f(4), "high": f(33), "low": f(34), + "code": orig_code, + } + except Exception: + continue + break # Success - break retry loop + + return all_results + + +def get_price_tencent(code): + """获取实时价格。优先 DB(price_monitor 维护),失败才拉腾讯。港股价格已是 CNY。""" + raw_code = str(code).split('_')[0] + if not raw_code: + return None + + # 主通道: DB + try: + import sqlite3 + db = sqlite3.connect('/home/hmo/web-dashboard/data/mofin.db') + db.row_factory = sqlite3.Row + row = db.execute("SELECT price FROM holdings WHERE code=? AND is_active=1", (raw_code,)).fetchone() + if not row: + row = db.execute("SELECT price FROM holding_strategies WHERE code=? AND status='active' ORDER BY updated_at DESC LIMIT 1", (raw_code,)).fetchone() + if row and row['price']: + db.close() + return row['price'] + db.close() + except Exception: + pass + + # Fallback: 腾讯 API + try: + from mo_models import to_cny, is_hk_stock + except ImportError: + to_cny = lambda v, r=None: v + is_hk_stock = lambda c: len(str(c).strip()) == 5 and str(c).strip().isdigit() + try: + if is_hk_stock(raw_code): + prefix = "hk" + elif raw_code.startswith("6") or raw_code.startswith("5"): + prefix = "sh" + else: + prefix = "sz" + url = f"http://qt.gtimg.cn/q={prefix}{raw_code}" + r = urllib.request.urlopen(url, timeout=5) + fields = r.read().decode("gbk").split('"')[1].split("~") + def f(i): + try: + return float(fields[i]) if fields[i].strip() else 0.0 + except: + return 0.0 + price = f(3) + if is_hk_stock(raw_code) and price > 0: + price = to_cny(price) + return { + "price": price, "close": f(4), "high": f(33), "low": f(34), + "code": raw_code, + } + except Exception as e: + print(f" get_price error {code}: {e}", file=sys.stderr) + return None + + +def reassess_strategy(code, name, price, cost, shares, current_action, + volume_signal="", sentiment="neutral", + is_watchlist=False): + """根据技术分析重评策略""" + + tech = ta.full_analysis(code) + if tech and "support_resistance" in tech: + sr = tech["support_resistance"] + candle = tech.get("candlestick", {}) + vol = tech.get("volume", {}) + ss = sr.get("strong_support") + ws = sr.get("weak_support") + wr = sr.get("weak_resist") + sr_resist = sr.get("strong_resist") + pivot = sr.get("pivot") + effective_range = sr.get("effective_range") + print(f" TECH: 强撑={ss} 弱撑={ws} 枢轴={pivot} 弱压={wr} 强压={sr_resist} 有效区间={effective_range}") + else: + print(f" ⚠️ 技术分析不可用", file=sys.stderr) + ss = ws = wr = sr_resist = pivot = None + candle = {} + vol = {} + + # ----- 多周期技术分析(周线/月线/均线) ----- + mtf_analysis = {} + mtf_adj = {} + try: + mtf_result = mtf.full_multi_tf_analysis(code) + if mtf_result.get("daily") and mtf_result["daily"].get("count", 0) >= 5: + mtf_analysis = mtf_result + mtf_adj = mtf_result.get("strategy_adjustment", {}) + daily_mas = mtf_result.get("daily", {}).get("mas", {}) + weekly = mtf_result.get("weekly", {}) + monthly = mtf_result.get("monthly", {}) + trend_align = mtf_adj.get("trend_alignment", "未知") + print(f" 多周期: {trend_align} | " + f"MA5={daily_mas.get('ma5','?')} MA20={daily_mas.get('ma20','?')} MA60={daily_mas.get('ma60','?')} | " + f"周线{weekly.get('trend',{}).get('description','?')} 月线{monthly.get('trend',{}).get('description','?')}") + except Exception as e: + print(f" 多周期分析失败: {e}", file=sys.stderr) + + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_new_entry = (cost == 0) or (shares == 0) + is_deep_loss = profit_pct < -20 + + # ----- 股票分类(短炒/中短线/中长线/弱势/深套) ----- + stock_category = "中短线" + time_horizon = "2周~3月" + position_advice = "中等仓位" + try: + mtf_cache = json.load(open("/home/hmo/web-dashboard/data/multi_tf_cache.json")) + stock_data = mtf_cache.get(code, {}) + daily_klines = stock_data.get("daily", []) + fund = stock_data.get("fundamentals", {}) + closes = [d["close"] for d in daily_klines] if daily_klines else [] + + if len(closes) >= 10: + cur = closes[-1] + ma20 = sum(closes[-20:])/20 if len(closes)>=20 else 0 + ma60 = sum(closes[-60:])/60 if len(closes)>=60 else 0 + highs = [d["high"] for d in daily_klines[-20:]] + lows = [d["low"] for d in daily_klines[-20:]] + volatility = ((max(highs)-min(lows))/min(lows)*100) if min(lows)>0 else 0 + pe = fund.get("pe") or 0 + eps = fund.get("eps") or 0 + mcap = fund.get("mcap_total") or 0 + is_high_vol = volatility > 30 + is_high_pe = pe > 100 or pe < 0 + is_value = 0 < pe < 20 and eps > 0.5 + + if is_deep_loss: + stock_category = "深套" + time_horizon = "长期" + position_advice = "不补不割" + elif is_high_vol and is_high_pe: + stock_category = "短炒" + time_horizon = "数日~2周" + position_advice = "小仓快进快出" + elif cur < ma20 and cur < ma60 and ma20 > 0: + stock_category = "弱势" + time_horizon = "观望" + position_advice = "减仓或观望" + elif (is_value or mcap > 1000) and cur > ma20: + stock_category = "中长线" + time_horizon = "数月~1年" + position_advice = "正常配置" + elif volatility > 20: + stock_category = "中短线" + time_horizon = "2~6周" + position_advice = "中等仓位" + except Exception: + pass + + print(f" 分类: {stock_category} | {time_horizon} | {position_advice}") + + # ----- 短炒+强趋势检测:短炒分类但多周期多头时用移动止损代替弱支撑止损 ----- + is_short_term_strong_trend = False + if stock_category == "短炒": + trend_align = mtf_adj.get("trend_alignment", "") + strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] + if any(ind in trend_align for ind in strong_trend_indicators): + is_short_term_strong_trend = True + print(f" ⚡ 短炒+强趋势检测: 趋势={trend_align} → 启用移动止损, 不止盈") + position_advice = "小仓强趋势让利润跑" + + # ----- 止损设置(含最小距离3%保护) ----- + if is_new_entry: + # 新买入推荐:止损 = 弱支撑(约2-3%跌幅,合理可控) + if ws and ws > 0: + new_stop = round(ws, 2) + else: + new_stop = round(price * 0.96, 2) + elif is_deep_loss: + # 深套:止损 = 强支撑再下移(不轻易割) + if ss and ss > 0: + new_stop = round(min(ss, price * 0.85), 2) + else: + new_stop = round(price * 0.85, 2) + else: + # 已持仓正常:止损 = 强支撑 + if is_short_term_strong_trend: + # 短炒+强趋势:用移动止损(距现价-5%),不止盈让利润跑 + trailing_sl = round(max(ws or 0, price * 0.95), 2) if ws else round(price * 0.95, 2) + new_stop = trailing_sl + print(f" 短炒强趋势移动止损: {new_stop} (距现价-{(1-new_stop/price)*100:.1f}%)") + elif ss and ss > 0: + new_stop = round(ss, 2) + else: + new_stop = round(price * 0.88, 2) + + # 已盈利仓位(>5%):用较紧的移动止损保护利润,但不超过成本线 + if profit_pct > 5 and not is_new_entry and not is_deep_loss: + # 取 max(弱支撑, 成本线, 当前价×0.95) 作为止损 + cost_protect = cost if cost > 0 else 0 + trailing_stop = round(max(ws or 0, cost_protect, price * 0.95), 2) + if trailing_stop > new_stop: + new_stop = trailing_stop + print(f" 已启用移动止损: {new_stop} (保护+{profit_pct:.1f}%利润)", file=sys.stderr) + + # 最小止损距离 —— 随趋势强度调整(2026-06-23 震度保护规则) + # 强趋势(多周期看多 + MA多头排列):最小1.5%下行空间 + # 普通/弱势:最小3%下行空间 + is_strong_trend = False + trend_align = mtf_adj.get("trend_alignment", "") + strong_trend_indicators = ["多周期看多", "多周期多头", "上升"] + try: + if any(ind in trend_align for ind in strong_trend_indicators) and ma20 > ma60 and cur >= ma20: + is_strong_trend = True + except (NameError, TypeError): + pass # ma20/ma60/cur may be unbound if MTF data insufficient + + if is_strong_trend: + min_stop_gap = 0.015 # 1.5% + else: + min_stop_gap = 0.03 # 3% + + min_stop = round(price * (1 - min_stop_gap), 2) + if new_stop > min_stop and not is_deep_loss: + old_stop = new_stop + new_stop = min_stop + if old_stop != new_stop: + print(f" 最小止损 {round(min_stop_gap*100)}%间距约束: {old_stop}→{new_stop} (趋势{'强' if is_strong_trend else '普通'})") + + # 港股附加:ATR波动率校验 — 止损距现价不得小于 1×ATR(14) + if is_hk_stock(code): + atr = calc_atr(code) + if atr and atr > 0: + min_atr_stop = round(price - atr, 2) + if new_stop > min_atr_stop: + old_stop_val = new_stop + new_stop = min_atr_stop + print(f" 港股ATR波动率校验({atr:.2f}): 止损 {old_stop_val}→{new_stop} (1×ATR间距)") + + # ----- 止盈设置 ----- + if is_short_term_strong_trend and not is_new_entry: + # 短炒+强趋势:不止盈让利润跑 + mtf_tp = mtf_adj.get("take_profit_reference", {}) + if mtf_tp and mtf_tp.get("level", 0) > price * 1.2: + new_target = round(mtf_tp["level"], 2) + else: + new_target = 0 # 无多周期阻力时不编造止盈 + print(f" 短炒强趋势不止盈: 止盈设为{new_target} (+{(new_target/price-1)*100:.0f}%)") + elif sr_resist and sr_resist > 0: + new_target = round(sr_resist, 2) + else: + new_target = 0 # 无技术面数据时不编造止盈 + + # ----- 风险回报比校验 ----- + stop_distance = price - new_stop if price > new_stop else price * 0.02 + target_distance = new_target - price if new_target > price else 0 + + # 1:2 检查 + min_target_distance = stop_distance * 2.0 + if target_distance < min_target_distance: + # 尝试更高的阻力位,但不超过下一个真实压力位 + candidate_targets = [] + if wr and wr > price and wr != sr_resist: + candidate_targets.append(wr) + if sr_resist and sr_resist > price: + candidate_targets.append(sr_resist) + # 检查有效区间,如果有更高的自然目标位 + if effective_range and price < effective_range * 0.9: + candidate_targets.append(effective_range) + + found = False + for level in candidate_targets: + if (level - price) >= min_target_distance: + new_target = level + found = True + break + + # 如果仍然不满足,检查是否至少能到 1:1.5 + min15_distance = stop_distance * 1.5 + if not found: + for level in candidate_targets: + if (level - price) >= min15_distance: + new_target = level + found = True + break + + # ----- 风险回报比最终计算 ----- + risk = max(price - new_stop, price * 0.01) + reward = max(new_target - price, 0) + rr_ratio = reward / risk if risk > 0 else 0 + + # ----- 状态判断 ----- + if is_deep_loss: + status = "updated" + action_note = "深套持有" + elif is_new_entry: + if rr_ratio < 1.5: + status = "review" + action_note = "⚠️盈亏比不足1:1.5,不建议买入" + elif rr_ratio < 2.0: + status = "updated" + action_note = "⚠️盈亏比偏低(1:{:.1f}),谨慎买入".format(rr_ratio) + else: + status = "updated" + action_note = "" + else: + if rr_ratio < 0.5: + status = "updated" + action_note = "⚠️盈亏比极低,关注" + elif rr_ratio < 1.5: + status = "updated" + action_note = "⚠️盈亏比偏低(1:{:.1f}),不建议加仓".format(rr_ratio) + else: + status = "updated" + action_note = "" + + # 短炒+强趋势:在action_note追加标记 + if is_short_term_strong_trend and not is_new_entry and not is_deep_loss: + extra_note = "短炒强趋势持" if "深套" not in action_note else "" + if extra_note: + action_note = f"{action_note} | {extra_note}" if action_note else extra_note + + # ----- 买入区间(有盈亏比严格约束) ----- + max_acceptable_entry = None # 最大可接受买入价(满足R/R约束) + + if new_target and new_stop and new_target > new_stop and not is_deep_loss: + # 买入价的R/R约束: + # 要求 (target - entry) / (entry - stop) >= min_rr + # 即 entry <= (target + min_rr * stop) / (1 + min_rr) + min_rr = 1.0 # 至少1:1,才不亏 + recommend_rr = 1.5 # 推荐1:1.5以上 + + max_for_recommend = (new_target + recommend_rr * new_stop) / (1 + recommend_rr) + max_for_neutral = (new_target + min_rr * new_stop) / (1 + min_rr) + + if is_new_entry: + # 新买入:要求1:1.5+ + max_acceptable_entry = max_for_recommend + else: + # 已持仓加仓:至少1:1 + max_acceptable_entry = max_for_neutral + + if is_new_entry: + # 新买入:买入区 = 弱支撑附近(不是当前价附近!) + # 只在价格跌到弱支撑附近时才推买入 + entry_low = round(price * 0.98, 2) + entry_high = round(price * 1.02, 2) + if max_acceptable_entry and entry_high > max_acceptable_entry: + entry_high = round(max_acceptable_entry, 2) + # 确保买入区不小于1% + if entry_high - entry_low < price * 0.01: + if max_acceptable_entry and price <= max_acceptable_entry: + entry_low = round(max(price * 0.99, new_stop), 2) + entry_high = round(min(price * 1.01, max_acceptable_entry), 2) + elif ws and ws > 0 and wr and wr > 0 and not is_deep_loss: + # 已持仓正常:买入区 = 弱支撑~弱支撑上方5%(给合理回调空间) + # 上限不能低于成本价×0.95(保护已有持仓不被高位逼空) + entry_low = round(ws, 2) + entry_max = round(ws * 1.05, 2) # 比弱支撑高5%,有足够空间 + # 如果当前价已远离买入区,保持买入区不变(不因价格涨了就收窄) + min_upper = round(cost * 0.95, 2) if cost > 0 else 0 + if entry_max < min_upper: + entry_max = min_upper + if max_acceptable_entry: + entry_high = round(min(entry_max, max_acceptable_entry), 2) + else: + entry_high = entry_max + # 如果当前价已远离买入区(高于买入区上沿),禁止加仓推荐 + if price > entry_high: + # 买入区锁定在弱支撑位,但标记为"价格远离" + pass + # 如果买入区过窄,标记但不扩展(加仓必须在支撑位) + if entry_high - entry_low < price * 0.005: + entry_low = round(ws * 0.995, 2) + entry_high = round(ws * 1.005, 2) + else: + entry_low = round(price * 0.90, 2) + entry_high = round(price * 1.05, 2) + + # 买入区间稳定性保护:上边界单次变动不超过5% + if 'entry_high' in dir() and entry_high: + # 读取当前策略中已有的买入区上界,如果有且变化过大则限制 + old_entry_high = None + if 'current_action' in dir() and current_action: + import re + m = re.search(r'买入区[\d.]+~([\d.]+)', current_action) + if m: + old_entry_high = float(m.group(1)) + if old_entry_high and old_entry_high > 0: + max_change = old_entry_high * 0.95 # 单次最多下降5% + if entry_high < max_change: + entry_high = round(max_change, 2) + + # ----- 买入时机信号(三维分析:大盘+行业+个股,基本面+消息面+技术面+资金流)----- + # [2026-07-01] 扩展:不再只看volume_signal + candlestick_sentiment + # 融合大盘趋势、行业板块强弱、基本面估值作为修正因子 + volume_signal = vol.get("volume_signal", "") + candlestick_sentiment = candle.get("sentiment", "neutral") + timing_signal = "neutral" + + # --- 三维分析数据装载 --- + # 因子1: 大盘环境(从macro_context_log读) + market_bearish = False + market_bullish = False + try: + import sqlite3 + _db = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _mc = _db.execute( + "SELECT structure FROM macro_context_log WHERE has_valid_data=1 ORDER BY rowid DESC LIMIT 1" + ).fetchone() + if _mc and _mc[0]: + _s = json.loads(_mc[0]) + _overall = _s.get("overall", "") + if "bearish" in _overall: + market_bearish = True + elif _overall == "bullish": + market_bullish = True + _db.close() + except Exception: + pass + + # 因子2: 行业板块强弱 + sector_strong = False + sector_weak = False + try: + _db2 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _rows2 = _db2.execute( + "SELECT name, change_pct FROM sector_snapshots ORDER BY change_pct DESC" + ).fetchall() + if _rows2: + # 找到该股所属行业(简单匹配name或通过stock_sectors) + _my_sectors = _db2.execute( + "SELECT sector_name FROM stock_sectors WHERE code=?", + (code,) + ).fetchall() + if _my_sectors: + for (_sn,) in _my_sectors: + for r_name, r_chg in _rows2: + if _sn in r_name or r_name in _sn: + _rank = [r[0] for r in _rows2].index(r_name) if r_name in [x[0] for x in _rows2] else -1 + _total = len(_rows2) + if _rank >= 0: + if _rank < _total * 0.2: + sector_strong = True + if _rank > _total * 0.8: + sector_weak = True + break + _db2.close() + except Exception: + pass + + # 因子3: 基本面估值 + is_value_stock = False + try: + _db3 = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=5) + _fd = _db3.execute( + "SELECT pe, eps FROM stock_fundamentals WHERE code=?", (code,) + ).fetchone() + if _fd: + _pe, _eps = _fd + is_value_stock = (0 < (_pe or 0) < 25 and (_eps or 0) > 0.3) + _db3.close() + except Exception: + pass + + # --- 三维修正规则 --- + # 大盘偏弱时收紧买入信号,大盘偏强时放宽 + # 行业领先加分,行业落后减分 + # 低估值加分(有安全边际) + + def _adjust_timing(signal, market_b, market_bb, sec_s, sec_w, is_val): + """根据三维因子修正 timing_signal""" + # 大盘偏弱时降级买入信号 + if market_b: + if signal in ("买入", "加仓"): + if not sec_s: # 大盘弱+行业不强→降级 + return "关注" + # 大盘偏强时放宽 + if market_bb: + if signal == "关注" and (sec_s or is_val): + return "买入" + # 行业弱势时降级买入信号 + if sec_w: + if signal in ("买入", "加仓"): + return "关注" + # 行业强势+低估时升级关注 + if sec_s and is_val: + if signal == "关注": + return "买入" + return signal + + if is_new_entry: + # 新买入时机 + if volume_signal == "主动买盘占优" and candlestick_sentiment == "bullish": + timing_signal = "买入" + elif volume_signal == "主动卖盘占优": + timing_signal = "观望" + elif volume_signal == "买卖均衡" and ws and price <= ws * 1.03: + timing_signal = "买入" + elif candlestick_sentiment == "bullish": + timing_signal = "买入" + elif ws and price < ws * 1.02: + timing_signal = "关注" + # 新买入时三维修正:大盘向上+行业强→升级,大盘弱→降级 + _pre_signal = timing_signal + timing_signal = _adjust_timing(timing_signal, market_bearish, market_bullish, + sector_strong, sector_weak, is_value_stock) + if timing_signal != _pre_signal: + print(f" 三维修正(新入): {_pre_signal}→{timing_signal} " + f"| 大盘{'弱' if market_bearish else '强' if market_bullish else '中性'}" + f"| 行业{'强' if sector_strong else '弱' if sector_weak else '中性'}" + f"| 估值{'低' if is_value_stock else '一般'}") + else: + # 已持仓时机(用于加仓/减仓参考) + if is_short_term_strong_trend: + # 短炒+强趋势:强趋势持有,禁止加仓信号 + timing_signal = "持有" + elif profit_pct > 5: + # 已盈利 + if volume_signal == "主动买盘占优": + timing_signal = "持有" + elif volume_signal == "主动卖盘占优" and not is_new_entry: + timing_signal = "关注" + else: + timing_signal = "持有" + elif profit_pct > 0: + # 微盈 + if volume_signal == "主动买盘占优": + timing_signal = "持有" + elif ws and price <= ws * 1.02: + timing_signal = "加仓" + else: + timing_signal = "持有" + else: + # 浮亏 + if volume_signal == "主动卖盘占优" and ss and price <= ss * 1.03: + timing_signal = "关注" + elif volume_signal == "主动买盘占优" and sr_resist and price >= sr_resist * 0.97: + timing_signal = "关注" + elif volume_signal == "买卖均衡" and ws and price <= ws * 1.02: + timing_signal = "加仓" + else: + timing_signal = "持有" + + # ----- 【v3.2新增】分类约束:弱势/深套禁止输出买入/加仓类信号 ----- + if stock_category == "弱势" or is_deep_loss: + buy_signals = ["买入", "加仓", "可追"] + if any(s in timing_signal for s in buy_signals): + old_signal = timing_signal + timing_signal = "弱势持有" if stock_category == "弱势" else "深套持有" + print(f" 分类约束: {stock_category} 原信号\"{old_signal}\" → \"{timing_signal}\"") + + # ----- 构造 action 描述(供 cron prompt 使用) ----- + action_parts = [] + if profit_pct < -20: + action_parts.append("深套持有") + elif profit_pct < -10: + action_parts.append("持有观察") + elif profit_pct < 0: + action_parts.append("持有观察") + elif profit_pct < 5: + action_parts.append("盈利持有") + else: + action_parts.append("盈利良好") + + if action_note: + action_parts.append(action_note) + + if is_watchlist: + # 自选股(未入场):有止损参考+买入区,内部算RR需要止盈位 + action_parts.append(f"目标参考{new_target}") + action_parts.append(f"止损参考{new_stop}") + action_parts.append(f"买入区{entry_low}~{entry_high}") + elif is_new_entry: + action_parts.append(f"损{new_stop}") + action_parts.append(f"盈{new_target}") + action_parts.append(f"买{entry_low}~{entry_high}") + else: + action_parts.append(f"止损{new_stop}") + action_parts.append(f"目标{new_target}") + action_parts.append(f"买入区{entry_low}~{entry_high}") + + if timing_signal != "neutral": + action_parts.append(f"信号:{timing_signal}") + + new_action = " | ".join(action_parts) + + # 技术面快照 + tech_snapshot = "" + if candle: + tech_snapshot = (f"形态:{candle.get('pattern','?')}/{candle.get('sentiment','?')} " + f"量价:{vol.get('volume_signal','?')} " + f"强撑:{ss} 弱撑:{ws} 弱压:{wr} 强压:{sr_resist}") + # 加入均线信息(如果可用) + try: + dm = mtf_analysis.get("daily", {}).get("mas", {}) + ma_parts = [] + for m in ['ma5', 'ma10', 'ma20', 'ma60']: + v = dm.get(m) + if v: + ma_parts.append(f"{m.upper()}={v}") + if ma_parts: + tech_snapshot += " | " + " ".join(ma_parts) + except (NameError, AttributeError): + pass + + # 多周期快照(追加到 tech_snapshot) + mtf_context = "" + if mtf_adj: + trend_align = mtf_adj.get("trend_alignment", "") + daily_mas = mtf_analysis.get("daily", {}).get("mas", {}) + ma20 = daily_mas.get("ma20") + ma60 = daily_mas.get("ma60") + stop_ref = mtf_adj.get("stop_loss_reference", {}) + take_ref = mtf_adj.get("take_profit_reference", {}) + + parts = [] + if trend_align: + parts.append(trend_align) + if ma20: + parts.append(f"MA20={ma20}") + if ma60: + parts.append(f"MA60={ma60}") + if stop_ref: + parts.append(f"长撑:{stop_ref.get('source','?')}={stop_ref['level']}") + if take_ref: + parts.append(f"长压:{take_ref.get('source','?')}={take_ref['level']}") + mtf_context = " | ".join(parts) + + now_str = datetime.now().strftime('%Y-%m-%d %H:%M') + return { + 'stop_loss': new_stop, + 'take_profit': new_target, + 'entry_low': entry_low, + 'entry_high': entry_high, + 'action': new_action, + 'status': status, + 'tech_snapshot': tech_snapshot, + 'timing_signal': timing_signal, + 'rr_ratio': round(rr_ratio, 2), + 'action_note': action_note, + 'reassessed_at': now_str, + 'multi_tf_context': mtf_context, # 多周期上下文 + 'stock_category': stock_category, # 股票分类:短炒/中短线/中长线/弱势/深套 + 'time_horizon': time_horizon, # 时间跨度 + 'position_advice': position_advice, # 仓位建议 + } + + +def load_stock_news_sentiment(code): + """加载小果消息面情感""" + try: + path = "/home/hmo/web-dashboard/data/xiaoguo_sentiment.json" + if not os.path.exists(path): + return {} + xg = json.load(open(path)) + return xg.get("stocks", {}).get(code, {}) + except Exception: + return {} + + +def load_fundamentals(code): + """加载个股基本面""" + try: + path = "/home/hmo/web-dashboard/data/multi_tf_cache.json" + if not os.path.exists(path): + return {} + m = json.load(open(path)) + return m.get(code, {}).get("fundamentals", {}) or {} + except Exception: + return {} + + +def _get_portfolio_risk_state(): + """读取 portfolio 组合风险状态(2026-06-23 引擎协调)""" + try: + # 数据一致性检查:警告多副本(2026-06-23 bugfix) + _check_portfolio_consistency() + p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) + pos_pct = p.get('position_pct', 0) + cash = p.get('cash', 0) + holdings = p.get('holdings', []) + weak_cnt = sum(1 for h in holdings if h.get('change_pct', 0) < -15) + total = len(holdings) or 1 + weak_ratio = weak_cnt / total + return { + 'position_pct': pos_pct, + 'cash': cash, + 'is_high_position': pos_pct > 80, + 'is_very_high_position': pos_pct > 90, + 'is_high_weak': weak_ratio > 0.35, + 'weak_ratio': round(weak_ratio * 100), + 'total_holdings': total, + } + except: + return {} + + +def _is_buy_signal(signal): + """判断信号是否为买入/持有类(用于防洗盘)""" + if not signal: + return False + buy_keywords = ['买入', '持有', '加仓', '关注'] + for kw in buy_keywords: + if kw in signal: + return True + return False + + +def _check_portfolio_consistency(): + """数据一致性检查:如果存在多份 portfolio.json 则报警(2026-06-23 bugfix)""" + main = '/home/hmo/web-dashboard/data/portfolio.json' + main_cash = None + try: + import json + main_cash = json.load(open(main)).get('cash') + except Exception: + return + for path in [ + '/home/hmo/data/portfolio.json', + '/home/hmo/projects/MoFin/data/portfolio.json', + '/home/hmo/web-dashboard.bak/data/portfolio.json', + ]: + if os.path.exists(path): + try: + other = json.load(open(path)) + if other.get('cash') != main_cash: + print(f"⚠️ 数据一致性: {os.path.realpath(path)} cash={other.get('cash')} ≠ 主文件 cash={main_cash} (需清理)", file=sys.stderr) + except Exception: + pass + + +def _check_contradiction(code, today_only=True): + """反馈循环核——检查本股是否有刚卖出的记录 + + 返回 dict or None: + - sold_reason: 'portfolio_trim'|'stop_loss' + - sold_at: 卖出日期 + - days_ago: 卖出距今交易日数 + - is_today: 是否今日卖出 + - tag: 追加到信号的标注 + """ + try: + from datetime import datetime, date + dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) + for e in dec.get('decisions', []): + if e.get('code') != code: + continue + sold_at = e.get('sold_at', '') + if not sold_at: + return None + try: + sd = datetime.strptime(sold_at, '%Y-%m-%d').date() + td = date.today() + days = (td - sd).days + except: + return None + + reason = e.get('sold_reason', 'portfolio_trim') + if reason == 'stop_loss': + tag = '止损离场(逻辑破坏,短期不关注)' + else: + tag = '组合减仓后关注(已清仓,等回踩确认)' + + return { + 'sold_reason': reason, + 'sold_at': sold_at, + 'days_ago': days, + 'is_today': days == 0, + 'tag': tag, + } + except: + return None + return None + + +def _get_sell_priority_list(): + """减仓优先级排序:深套>亏损>微盈>盈利(2026-06-23 反馈循环) + + 返回 [(code, name, change_pct, position_pct, priority_label), ...] + 按卖出的优先顺序排列(最先应该卖的在最前) + """ + try: + p = json.load(open('/home/hmo/web-dashboard/data/portfolio.json')) + holdings = p.get('holdings', []) + ranked = [] + for h in holdings: + chg = h.get('change_pct', 0) + pos = h.get('position_pct', 0) + if chg < -30: + label = '深套(>30%),优先减' + rank = 0 + elif chg < -20: + label = '深套(>20%),优先减' + rank = 1 + elif chg < -10: + label = '亏损,建议减' + rank = 2 + elif chg < 0: + label = '微亏,可减' + rank = 3 + elif chg < 10: + label = '微盈,持有' + rank = 4 + else: + label = '盈利,最后减' + rank = 5 + ranked.append((rank, h['code'], h.get('name',''), chg, pos, label)) + ranked.sort(key=lambda x: (x[0], -x[4])) # 优先 rank, 其次仓位大优先 + return [{'code':c,'name':n,'change_pct':chg,'position_pct':pos,'label':l} + for r,c,n,chg,pos,l in ranked] + except: + return [] + + +def enrich_timing_signal(base_signal, macro_desc="", sector_note="", + profit_pct=0, stock_category="", is_new_entry=False, + fundamentals=None, news_sentiment=None, + timing_signal_override=None, + portfolio_context=None, + rr_ratio=0): # 2026-06-24 新参:盈亏比约束 + """多因子合成timing_signal——大盘+行业+基本面+技术+组合风险+盈亏比 + + 返回 (enriched_signal, factors_list) + - enriched_signal: 可读的多因子信号描述 + - factors_list: 各因子的摘要列表(用于后续显示) + """ + # 如果已手动设定,尊重手动 + if timing_signal_override and timing_signal_override != "neutral": + return timing_signal_override, [timing_signal_override] + + factors = [] + + # 1. 大盘因子 + if "偏强" in macro_desc or "大涨" in macro_desc or "bullish" in macro_desc.lower(): + macro_txt = "大盘偏强" + factors.append(macro_txt) + elif "偏弱" in macro_desc or "大跌" in macro_desc or "bearish" in macro_desc.lower(): + macro_txt = "大盘偏弱" + factors.append(macro_txt) + elif macro_desc and macro_desc != "宏观未加载": + factors.append("大盘中性") + + # 2. 行业因子 + if sector_note: + # 把"行业X大跌3%+"简化为"行业偏弱","行业X大涨3%+"简化为"行业偏强" + if "大跌" in sector_note or "下跌" in sector_note: + factors.append("行业偏弱") + elif "大涨" in sector_note: + factors.append("行业偏强") + elif "上涨" in sector_note: + factors.append("行业偏强") + else: + factors.append("行业中性") + + # 3. 基本面因子 + if fundamentals: + pe = fundamentals.get("pe", 0) + eps = fundamentals.get("eps", 0) + profit_growth = fundamentals.get("profit_growth", fundamentals.get("yoy_profit", "")) + revenue_growth = fundamentals.get("revenue_growth", fundamentals.get("yoy_revenue", "")) + mcap = fundamentals.get("mcap_total", 0) + + pe = pe or 0 + eps = eps or 0 + profit_growth_str = str(profit_growth or "") + revenue_growth_str = str(revenue_growth or "") + + # 净利增长 + for val in [profit_growth_str, revenue_growth_str]: + try: + v = float(val.replace("%", "").replace("+", "")) + if v > 50: + factors.append("净利增50%+") + break + elif v > 20: + factors.append(f"净利增{int(v)}%") + break + elif v < -20: + factors.append("净利降20%+") + break + except (ValueError, AttributeError): + continue + + # PE估值 + if 0 < pe < 15: + factors.append("低估值") + elif pe > 100 or pe < 0: + factors.append("高估值") + + # 市值 + if mcap and mcap > 5000: + factors.append("蓝筹") + + # 4. 消息面因子(小果情感) + if news_sentiment: + ns = news_sentiment.get("sentiment", "") + nc = news_sentiment.get("confidence", 0) + if ns == "positive" and nc >= 0.7: + kws = news_sentiment.get("keywords", []) + kw_str = f"({'/'.join(kws[:3])})" if kws else "" + factors.append(f"消息偏多{kw_str}") + elif ns == "negative" and nc >= 0.7: + kws = news_sentiment.get("keywords", []) + kw_str = f"({'/'.join(kws[:3])})" if kws else "" + factors.append(f"消息偏空{kw_str}") + + # 5. 技术面(基础信号) + if base_signal and base_signal != "neutral": + factors.append(base_signal) + + # 5.5 组合风险因子(2026-06-23 双引擎协调) + if portfolio_context and not is_new_entry: + if portfolio_context.get('is_very_high_position'): + factors.append("组合仓位极重(>90%)") + elif portfolio_context.get('is_high_position'): + factors.append("组合仓位偏重(>80%)") + if portfolio_context.get('is_high_weak'): + factors.append(f"弱势占{portfolio_context.get('weak_ratio')}%") + elif portfolio_context and is_new_entry: + # 新买入推荐:注明组合上下文 + if portfolio_context.get('is_high_position'): + factors.append(f"仓{portfolio_context.get('position_pct')}%现金有限") + elif portfolio_context.get('is_high_weak'): + factors.append("组合风险信号") + + # 5.7 盈亏比因子(2026-06-24 新增——RR<1.5降级买入信号) + if rr_ratio > 0: + if rr_ratio < 1.5: + factors.append(f"RR{rr_ratio}过低") + elif rr_ratio >= 3: + factors.append(f"RR{rr_ratio}") + # 1.5~3之间:中性,不特别标注 + + # 如果没有足够因素,返回信号不充分 + if not factors: + return "信号不充分", [] + + # 信号只应包含明确的买卖方向,不能从行业/大盘等上下文因子拼凑 + # base_signal 存在且非 neutral → 用 base_signal + # 否则 → 信号不充分(不拿 factors[-1] 当信号) + if base_signal and base_signal != "neutral": + clean_signal = base_signal + else: + # 从 factors 中找第一个有效的操作方向信号 + valid_direction = {"买入", "加仓", "观望", "持有", "关注", "信号不充分"} + signal_found = "" + for f in reversed(factors): + if f in valid_direction: + signal_found = f + break + clean_signal = signal_found if signal_found else "信号不充分" + + # 6. RR约束降级(2026-06-24 新增) + # 买入/加仓信号但RR<1.5 → 降级为"信号不充分" + buy_signals = {"买入", "加仓"} + if clean_signal in buy_signals and 0 < rr_ratio < 1.5: + clean_signal = "信号不充分" + factors.append("RR过低降级") + + return clean_signal, factors + + +def reassess_with_context(code, name, price, cost, shares, current_action, + volume_signal="", sentiment="neutral", is_watchlist=False): + """reassess_strategy + 多因子信号合成(大盘+行业+技术) + + 为 per_stock_reassess 等单只场景提供一站式多因子分析 + """ + result = reassess_strategy( + code, name, price, cost, shares, + current_action, volume_signal, sentiment, is_watchlist + ) + if not result: + return result + + # 加载宏观+行业+消息+基本面上下文 + try: + macro_bias, macro_desc = load_macro_context() + market_ctx = load_market_context() + stock_sector_map = load_stock_sector_map() + sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) + sector_note = sector_adj.get("note", "") + news_sentiment = load_stock_news_sentiment(code) + fund = load_fundamentals(code) + except Exception: + macro_desc = "" + sector_note = "" + news_sentiment = {} + fund = {} + + # ── DSA 集成:注入大盘复盘 + 新闻情报 ────────────────────────── + try: + from mo_bridge import enrich_analysis_context + region = "hk" if len(str(code)) == 5 and str(code)[0] in ('0','1') else "cn" + dsa_ctx = enrich_analysis_context(stock_code=code, stock_name=name, + region=region, include_news=True) + if dsa_ctx: + macro_desc = (macro_desc + "\n\n" + dsa_ctx).strip() + except Exception: + pass # DSA 不可用时静默跳过 + + enriched, factors = enrich_timing_signal( + base_signal=result.get("timing_signal", ""), + macro_desc=macro_desc, + sector_note=sector_note, + profit_pct=(price - cost) / cost * 100 if cost else 0, + stock_category=result.get("stock_category", ""), + is_new_entry=is_watchlist, + fundamentals=fund, + news_sentiment=news_sentiment, + portfolio_context=_get_portfolio_risk_state(), + rr_ratio=result.get("rr_ratio", 0), + ) + result["timing_signal"] = enriched + result["signal_factors"] = factors + + # 6. 防洗盘:信号不要一天一翻(2026-06-23) + # 如果旧信号是买入/持有类,新信号是谨慎/等待类,但中期趋势未破→维持旧信号 + try: + dec = json.load(open('/home/hmo/web-dashboard/data/decisions.json')) + for e in dec.get('decisions', []): + if e.get('code') == code: + old_signal = e.get('timing_signal', '') + if old_signal and _is_buy_signal(old_signal) and not _is_buy_signal(enriched): + # 中等趋势检查:MA5 > MA20 + 多周期看多 + mtf = result.get('multi_tf_context', '') + if '看多' in mtf or '多头' in mtf: + try: + closes = [float(k.split()[2]) for k in mtf.split('|') if 'MA5' in k] + except: + closes = [] + has_uptrend = 'MA5' in mtf and 'MA20' in mtf + if has_uptrend: + print(f" 防洗盘: {old_signal}→保持旧信号(中期趋势完整)") + result["timing_signal"] = f"{old_signal}(正常回调价稳)" + sf = result.get("signal_factors") or [] + if "正常回调价稳" not in sf: + result["signal_factors"] = sf + ["正常回调价稳"] + break + except Exception as e: + print(f" 防洗盘跳过: {e}") + + # 7. 反馈循环核:检查本股是否有刚卖出的记录(2026-06-23) + contradiction = _check_contradiction(code) + if contradiction and contradiction.get('is_today'): + # 今日刚卖出 → 不屏蔽信号,但必须自标注矛盾 + print(f" 反馈循环: {contradiction.get('tag')} (sold_at={contradiction.get('sold_at')})") + if _is_buy_signal(result.get('timing_signal', '')): + result['action_note'] = contradiction['tag'] + # 在 timing_signal 中追加反馈标注,供报告层可见 + curr_signal = result.get('timing_signal', '') + if '⚠️' not in curr_signal: + result['timing_signal'] = f"⚠️{contradiction['tag']}|{curr_signal}" + elif contradiction: + # 非今日卖出但近期卖出 → 标注已清仓 + print(f" 近期清仓: sold_at={contradiction.get('sold_at')} ({contradiction.get('days_ago')}日前)") + if _is_buy_signal(result.get('timing_signal', '')): + curr_signal = result.get('timing_signal', '') + if '已清仓' not in curr_signal: + result['timing_signal'] = f"已清仓,{curr_signal}" + + # 重建 action 文本(同步多因子信号) + try: + if new_action_needs_refresh(result, {"source": "auto"}, price): + _refresh_action_text(result, price, name) + except Exception: + pass + + return result + + +def new_action_needs_refresh(result, old_entry, price): + """判断宏观/行业调整后是否需要刷新action文本""" + # 自选股和手动策略不做调整,不需要刷新 + if old_entry.get("source") == "manual": + return False + return True + + +def _refresh_action_text(result, price, name): + """根据调整后的止损/止盈重建action文本""" + sl = result.get("stop_loss", 0) + tp = result.get("take_profit", 0) + el = result.get("entry_low", 0) + eh = result.get("entry_high", 0) + ts = result.get("timing_signal", "") + an = result.get("action_note", "") + old_action = result.get("action", "") + + # 保持原action的前缀(持有状态部分不变) + # action格式一般是: "状态 | 止损X | 目标Y | 买入区X~Y | 信号:Z" + parts = old_action.split(" | ") + new_parts = [] + for p in parts: + p = p.strip() + # 替换止损数字 + if p.startswith("止损") or p.startswith("止损参考"): + if sl: + p = f"止损{sl}" if "止损参考" not in old_action.split(" | ")[0] else f"止损参考{sl}" + # 替换目标/止盈数字 + if p.startswith("目标") or p.startswith("止盈"): + if tp: + p = f"目标{tp}" + # 替换买入区数字 + if "买入区" in p and "~" in p: + if el and eh: + p = f"买入区{el}~{eh}" + new_parts.append(p) + result["action"] = " | ".join(new_parts) + + +def check_sector_alerts(market_ctx, stock_sector_map, holdings, wl): + """行业轮动主动预警:检测板块崩盘级别信号→查持仓→输出预警 + + 返回 list of alerts: [{code, name, sector, chg, action}] + """ + alerts = [] + if not market_ctx: + return alerts + + sector_perf = market_ctx.get("sector_perf", {}) + + # 找出所有跌幅>3%的行业 + crashing_sectors = {name: data for name, data in sector_perf.items() + if data.get("change", 0) <= -3} + + if not crashing_sectors: + return alerts + + # 构建 code→持仓信息 的映射 + holding_map = {} + for h in holdings: + c = h.get("code", "") + if c: + holding_map[c] = {"name": h.get("name", c), "type": "持仓"} + for s in wl.get("stocks", []): + c = s.get("code", "") + if c and c not in holding_map: + holding_map[c] = {"name": s.get("name", c), "type": "自选"} + + # 对每个暴跌行业,查持仓中是否有股票属于该行业 + for sec_name, sec_data in sorted(crashing_sectors.items(), + key=lambda x: x[1].get("change", 0)): + chg = sec_data.get("change", 0) + for code, sectors in stock_sector_map.items(): + if code in holding_map and sec_name in sectors: + info = holding_map[code] + alerts.append({ + "code": code, + "name": info["name"], + "sector": sec_name, + "sector_change": chg, + "type": info["type"], + "action": f"行业{sec_name}跌{chg:+.1f}%,{info['type']}需关注", + }) + + alerts.sort(key=lambda a: a["sector_change"]) + return alerts + + +def regenerate_all(stdout=True): + """全量重评所有持仓+自选策略""" + # 优先从 SQLite 读取 + try: + from mofin_db import get_conn, query_holdings, query_watchlist + conn = get_conn() + holdings = query_holdings(conn) + wl_stocks = query_watchlist(conn) + conn.close() + pf = {"holdings": holdings} + wl = {"stocks": wl_stocks} + except Exception: + pf = safe_json_load(PORTFOLIO_PATH, {}) + wl = safe_json_load(WATCHLIST_PATH, {}) + + all_stocks = {} + for item in pf.get("holdings", []): + code = item.get("code", "") + if code: + all_stocks[code] = {"source": "portfolio", "data": item} + for item in wl.get("stocks", []): + code = item.get("code", "") + if code and code not in all_stocks: + all_stocks[code] = {"source": "watchlist", "data": item} + + total = len(all_stocks) + ok = 0 + errors = 0 + results = [] + decisions = [] + + # 加载现有 decisions.json 以便追踪变更 + decisions_path = "/home/hmo/web-dashboard/data/decisions.json" + try: + existing_decisions = {d["code"]: d for d in mo_data.read_decisions().get("decisions", []) if d.get("code")} + except: + existing_decisions = {} + + # 加载宏观上下文(影响策略参数调整) + macro_bias, macro_desc = load_macro_context() + if stdout: + print(f" 宏观参考: {macro_desc} (bias={macro_bias})") + + # 加载市场上下文 — 行业板块表现 + 大盘宽度(策略参数调整用) + market_ctx = load_market_context() + stock_sector_map = load_stock_sector_map() + market_breadth = market_ctx.get("breadth", 50) + market_mood = market_ctx.get("mood", "neutral") + if stdout: + sectors_found = sum(1 for c in all_stocks if stock_sector_map.get(c)) + print(f" 市场参考: {market_mood} 上涨比{market_breadth}% 已匹配{sectors_found}/{total}只个股行业") + + # 批量预取所有价格(一次API调用 vs 之前N次) + prices_map = batch_fetch_prices(list(all_stocks.keys())) + if stdout: + print(f" 批量获取价格: {len(prices_map)}/{total} 成功") + + for code, info in sorted(all_stocks.items()): + stock = info["data"] + name = stock.get("name", code) + cost = stock.get("cost", 0) or 0 + shares = stock.get("shares", 0) or 0 + source = info["source"] + + q = prices_map.get(code) + if not q or not q.get("price"): + results.append({"code": code, "name": name, "error": "腾讯API无数据"}) + errors += 1 + if stdout: + print(f" ❌ {name}({code}): 腾讯API无数据") + continue + + price = q["price"] + profit_pct = (price - cost) / cost * 100 if cost else 0 + current_action = stock.get("analysis", {}).get("action", "") + close_yest = q.get("close", 0) + sentiment = "neutral" + if close_yest and price > close_yest * 1.02: + sentiment = "bullish" + elif close_yest and price < close_yest * 0.98: + sentiment = "bearish" + + try: + is_wl = (source == "watchlist") + result = reassess_strategy( + code, name, price, cost, shares, + current_action, volume_signal="中性", sentiment=sentiment, + is_watchlist=(source == "watchlist"), + ) + + # --- Manual param preservation: 用户手动策略永不覆盖 --- + old_entry = existing_decisions.get(code, {}) + if old_entry.get("source") == "manual": + # 仅覆盖策略参数,技术分析/信号/价格照常保留 + for key in ["entry_low", "entry_high", "stop_loss", "take_profit"]: + if key in old_entry and old_entry[key] is not None: + result[key] = old_entry[key] + # 重算盈亏比(基于手动参数) + manual_stop = result.get("stop_loss", 0) or 0 + manual_target = result.get("take_profit", 0) or 0 + risk = max(price - manual_stop, price * 0.01) if manual_stop > 0 else price * 0.01 + reward = max(manual_target - price, 0) if manual_target > 0 else 0 + result["rr_ratio"] = round(reward / risk, 2) if risk > 0 else 0 + # 重建 action 文本(引用手动参数,不引用自动计算的) + profit_pct = (price - cost) / cost * 100 if cost else 0 + manual_action_parts = [] + if profit_pct < -20: + manual_action_parts.append("深套持有") + elif profit_pct < -10: + manual_action_parts.append("持有观察") + elif profit_pct < 0: + manual_action_parts.append("持有观察") + elif profit_pct < 5: + manual_action_parts.append("盈利持有") + else: + manual_action_parts.append("盈利良好") + if result.get("action_note"): + manual_action_parts.append(result["action_note"]) + if is_wl: + if manual_stop > 0: + manual_action_parts.append(f"止损参考{manual_stop}") + manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") + else: + if manual_stop > 0: + manual_action_parts.append(f"止损{manual_stop}") + if manual_target > 0: + manual_action_parts.append(f"目标{manual_target}") + manual_action_parts.append(f"买入区{result['entry_low']}~{result['entry_high']}") + ts = result.get("timing_signal", "") + if ts and ts != "neutral": + manual_action_parts.append(f"信号:{ts}") + result["action"] = " | ".join(manual_action_parts) + result["status"] = "manual" # 标记为手动管理,变更追踪不受影响 + if stdout: + print(f" [手动保留] {name}({code}) 策略参数未覆盖") + + # 宏观偏差调整:收盘后重评时根据宏观方向微调止损/止盈 + # 自选股不做止盈宏观调整(无持仓) + # 手动策略不做宏观偏差调整(尊重用户设定) + if macro_bias != 1.0 and not is_wl and old_entry.get("source") != "manual": + old_stop = result.get("stop_loss", 0) + old_target = result.get("take_profit", 0) + if macro_bias < 1.0 and old_stop > 0: # 宏观偏弱 → 收紧止损 + # 止损上移(但保留最小3%间距) + adjusted_stop = round(old_stop * (1 + (1 - macro_bias) * 0.3), 2) + min_stop = round(price * 0.97, 2) + result["stop_loss"] = min(adjusted_stop, min_stop) + if old_target > 0: + result["take_profit"] = round(old_target * (1 - (1 - macro_bias) * 0.2), 2) + elif macro_bias > 1.0 and old_target > 0: # 宏观偏强 → 止盈上调让利润跑 + result["take_profit"] = round(old_target * (1 + (macro_bias - 1) * 0.3), 2) + + # 行业偏差调整:根据个股所在行业的市场表现微调止损/止盈 + # 手动策略不做行业调整(尊重用户设定) + sector_adj = compute_sector_adjustment(code, market_ctx, stock_sector_map) + sector_note = sector_adj.get("note", "") + if sector_note and old_entry.get("source") != "manual": + old_stop = result.get("stop_loss", 0) + old_target = result.get("take_profit", 0) + stop_bias = sector_adj.get("stop_bias", 1.0) + target_bias = sector_adj.get("target_bias", 1.0) + if stop_bias != 1.0 and old_stop > 0: + # 行业偏差调整(在宏观调整之后叠加) + adjusted = round(old_stop * stop_bias, 2) + # 保留最小3%间距 + min_stop = round(price * 0.97, 2) + result["stop_loss"] = min(adjusted, min_stop) + if target_bias != 1.0 and old_target > 0 and not is_wl: + result["take_profit"] = round(old_target * target_bias, 2) + + # 加载消息面+基本面(逐个股) + news_sentiment = load_stock_news_sentiment(code) + fund = load_fundamentals(code) + + # 多因子合成 timing_signal:大盘+行业+消息+基本面+技术 + if old_entry.get("source") != "manual": + enriched, _ = enrich_timing_signal( + base_signal=result.get("timing_signal", ""), + macro_desc=macro_desc, + sector_note=sector_note, + profit_pct=profit_pct, + stock_category=result.get("stock_category", ""), + is_new_entry=(source == "watchlist"), + fundamentals=fund, + news_sentiment=news_sentiment, + rr_ratio=result.get("rr_ratio", 0), + ) + result["timing_signal"] = enriched + + # 在宏观/行业/多因子调整后重建 action 文本(同步调整后的止损/止盈数字) + if new_action_needs_refresh(result, old_entry, price): + _refresh_action_text(result, price, name) + + extra = { + "rr_ratio": result.get("rr_ratio"), + "action_note": result.get("action_note", ""), + "timing_signal": result.get("timing_signal", ""), + } + analysis = { + "stop_loss": result["stop_loss"], + "take_profit": result["take_profit"], + "entry_low": result["entry_low"], + "entry_high": result["entry_high"], + "action": result["action"], + "tech_snapshot": result.get("tech_snapshot", ""), + "multi_tf_context": result.get("multi_tf_context", ""), + "reassessed_at": result["reassessed_at"], + "status": result["status"], + **extra, + } + stock["analysis"] = analysis + # 同步 top-level 字段 → zone_breach/price_monitor 依赖这些字段 + # (2026-06-24 bugfix: analysis 子对象有但顶层没有,导致新持仓的止损检测盲区) + stock["stop_loss"] = result.get("stop_loss", 0) + stock["take_profit"] = result.get("take_profit", 0) + stock["entry_low"] = result.get("entry_low", 0) + stock["entry_high"] = result.get("entry_high", 0) + # 同步 trigger 字段 -> price_monitor 依赖 + sl = result.get("stop_loss", 0) + tp = result.get("take_profit", 0) + el = result.get("entry_low", 0) + eh = result.get("entry_high", 0) + trig = {} + if sl and float(sl) > 0: + trig["stop_loss"] = float(sl) + if el and eh and float(el) > 0 and float(eh) > 0: + trig["entry_zone"] = f"{float(el)}~{float(eh)}" + if tp and float(tp) > 0: + trig["take_profit_zone"] = f"0~{float(tp)}" + stock["trigger"] = trig + results.append({ + "code": code, "name": name, + "price": price, "cost": cost, + "action": result["action"], + "stop_loss": result["stop_loss"], + "take_profit": result["take_profit"], + "rr_ratio": result["rr_ratio"], + }) + ok += 1 + if stdout: + rr_str = f" RR={result['rr_ratio']}" if "rr_ratio" in result else "" + print(f" ✅ {name}({code}) {price} {result['action']}{rr_str}") + + # 记录所有股票的决策日志(含变更追踪) + status_display = result.get("status", "active") + # 构建行业上下文 + sector_ctx_str = "" + sec_name = sector_adj.get("sector_name", "") + sec_chg = sector_adj.get("sector_change", 0) + if sec_name: + sector_ctx_str = f"行业{sec_name}{sec_chg:+.1f}%" + if sector_adj.get("note"): + # note 已包含大盘宽度信息 + sector_ctx_str = sector_adj["note"] + elif market_breadth < 40: + # 无行业映射时至少记录大盘宽度 + sector_ctx_str = f"大盘上涨比{market_breadth}%" + new_entry = { + "code": code, "name": name, "price": price, + "cost": old_entry.get("cost", cost) if old_entry else cost, # 优先保留旧成本(holding.xls权威) + "shares": old_entry.get("shares", 0), # 保留持仓股数 + "avg_price": old_entry.get("avg_price", 0), # 保留持仓均价 + "action": result["action"], + "stop_loss": result.get("stop_loss"), + "entry_low": result["entry_low"], + "entry_high": result["entry_high"], + "tech_snapshot": result.get("tech_snapshot", ""), + "timing_signal": result.get("timing_signal", ""), + "rr_ratio": result.get("rr_ratio", 0), + "status": status_display, + "note": result.get("action_note", ""), + "timestamp": result["reassessed_at"], + "updated_at": result["reassessed_at"], + "type": "自选策略" if is_wl else "持仓策略", + "source": old_entry.get("source", "auto"), # manual/auto,继承旧标记 + "sector_context": sector_ctx_str, # 市场上下文:行业表现+大盘宽度 + "stock_category": result.get("stock_category", "中短线"), # 组合监测用 + "position_advice": result.get("position_advice", "中等仓位"), + "time_horizon": result.get("time_horizon", "2周~3月"), + } + new_entry["trigger"] = trig + # created_at: 首次创建时设置,后续 preserve + old_entry = existing_decisions.get(code, {}) + if old_entry.get("created_at"): + new_entry["created_at"] = old_entry["created_at"] + else: + new_entry["created_at"] = result["reassessed_at"] + # 保留 last_reassessed_price(per_stock_reassess 维护的防抖字段) + if old_entry.get("last_reassessed_price"): + new_entry["last_reassessed_price"] = old_entry["last_reassessed_price"] + # 自选股也写止盈位(用于RR校验),但标签用"目标参考"非"止盈" + new_entry["take_profit"] = result.get("take_profit") + + # --- 变更追踪 --- + old_action = old_entry.get("action", "") + old_stop = old_entry.get("stop_loss") + old_target = old_entry.get("take_profit") + + # 构建旧策略摘要和变更理由 + update_reason = "" + changelog_entry = None + + if old_action and old_action != result["action"]: + # 策略有变化 → 记录变更 + old_summary = old_action + new_summary = result["action"] + + # 判断触发原因 + if abs(price - old_entry.get("price", price)) / max(price, 0.01) > 0.03: + trigger = f"价格变动({old_entry.get('price','?')}→{price})" + elif result.get("timing_signal") and result["timing_signal"] != old_entry.get("timing_signal", ""): + trigger = f"技术信号变化: {result['timing_signal']}" + else: + trigger = "技术面重评" + + # 格式化的变更理由(自选股只看止损,不看止盈) + diff_parts = [] + if old_stop and result["stop_loss"] != old_stop: + diff_parts.append(f"止损{old_stop}→{result['stop_loss']}") + if not is_wl and old_target and result.get("take_profit") and result["take_profit"] != old_target: + diff_parts.append(f"止盈{old_target}→{result['take_profit']}") + if diff_parts: + update_reason = f"{trigger}: {', '.join(diff_parts)} | {result.get('tech_snapshot','')[:60]}" + else: + update_reason = f"{trigger}: 策略文字调整" + + changelog_entry = { + "date": result["reassessed_at"], + "old_action": old_action, + "new_action": result["action"], + "reason": update_reason, + "trigger": trigger, + } + new_entry["updated_reason"] = update_reason + + elif not old_action: + # 首次创建策略 + update_reason = f"初始策略创建 | {result.get('tech_snapshot','')[:60]}" + changelog_entry = { + "date": result["reassessed_at"], + "old_action": "", + "new_action": result["action"], + "reason": update_reason, + "trigger": "初始创建", + } + + # 合并changelog + old_changelog = old_entry.get("changelog", []) if old_entry else [] + if changelog_entry: + new_entry["changelog"] = old_changelog + [changelog_entry] + else: + new_entry["changelog"] = old_changelog + + # 保留执行记录 + if old_entry and old_entry.get("execution"): + new_entry["execution"] = old_entry["execution"] + elif stock.get("analysis", {}).get("status") == "executing": + new_entry["execution"] = { + "status": "executing", + "entry_price": cost if cost else 0, + "shares": shares, + "notes": "", + } + + # --- 自动标记 current_recommend --- + # 只在真正执行中的持仓才自动推荐:execution.status 为 executing 或 partial_exit + exec_status = old_entry.get("execution", {}).get("status", "") if old_entry else "" + is_active = exec_status in ("executing", "partial_exit") + + profit_pct = (price - cost) / cost * 100 if cost else 0 + is_deep_loss_stock = profit_pct < -20 + rr = result.get("rr_ratio", 0) + ts = result.get("timing_signal", "") + note = result.get("action_note", "") + + # 计算是否在/接近买入区 + entry_low_val = result.get("entry_low", 0) + entry_high_val = result.get("entry_high", 0) + in_buy_zone = (entry_low_val > 0 and entry_high_val > 0 and + entry_low_val <= price <= entry_high_val) + near_buy_zone_low = (entry_low_val > 0 and + price >= entry_low_val * 0.98 and + price <= entry_high_val) + + # 推荐条件:必须是执行中的持仓 + 基本面条件达标 + is_recommendable = ( + is_active + and not is_deep_loss_stock + and rr >= 1.5 + and ts != "neutral" + and "不建议" not in note + ) + if is_recommendable: + new_entry["tag"] = "current_recommend" + else: + # 不清除 active_manual(用户手动标记),只清除自动推荐的 + old_tag = old_entry.get("tag", "") if old_entry else "" + if old_tag != "active_manual": + new_entry.pop("tag", None) + + decisions.append(new_entry) + + except Exception as e: + results.append({"code": code, "name": name, "error": str(e)}) + errors += 1 + if stdout: + print(f" ❌ {name}({code}): {e}") + + # 写回数据文件 — 保留现有字段(现金、总资产等)不丢 + try: + existing_pf = mo_data.read_portfolio() + except Exception: + existing_pf = {} + # 保留 price/change_pct — price_monitor 维护的实时价,regenerate_all 不应清除 + _existing_holdings_map = {} + for _h in existing_pf.get('holdings', []): + if _h.get('code'): + _existing_holdings_map[_h['code']] = _h + _new_holdings = pf.get("holdings", []) + for _h in _new_holdings: + _code = _h.get('code') + if _code and _code in _existing_holdings_map: + _old = _existing_holdings_map[_code] + _h['price'] = _old.get('price', 0) + _h['change_pct'] = _old.get('change_pct', 0) + existing_pf["holdings"] = _new_holdings + existing_pf["updated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M') + + # ── Watchlist ↔ Holdings 双向自动迁移(2026-06-27 Dad要求)── + # ① 持仓已有 → 从自选移除(买入自动清除) + wl_codes = {s.get("code") for s in wl.get("stocks", []) if s.get("code")} + pf_codes = {h.get("code") for h in _new_holdings if h.get("code") and h.get("shares", 0) > 0} + removed_from_wl = [] + for h_code in wl_codes & pf_codes: + # 持仓>0且量够 → 自选移除 + wl["stocks"] = [s for s in wl.get("stocks", []) if s.get("code") != h_code] + removed_from_wl.append(h_code) + if removed_from_wl and stdout: + print(f" 自选→持仓自动移除: {', '.join(removed_from_wl)}") + + # ② 清仓/卖光 → 加回自选(只要仍有关注价值) + added_to_wl = [] + old_pf_codes = {_h.get("code") for _h in existing_pf.get("holdings", []) if _h.get("code")} + sold_codes = old_pf_codes - pf_codes # 曾持仓但现在没有(或不在了) + for sc in sold_codes: + # 已有自选就不重复加 + if sc in wl_codes: + continue + # 从现有decisions看是否有关注价值 + for d in decisions: + if d.get("code") == sc and d.get("entry_low") and d.get("entry_high"): + wl["stocks"].append({ + "code": sc, "name": d.get("name", sc), + "entry_low": d.get("entry_low"), "entry_high": d.get("entry_high"), + "stop_loss": d.get("stop_loss", 0), + "analysis": {"action": d.get("action", ""), "tech_snapshot": d.get("tech_snapshot", "")} + }) + added_to_wl.append(sc) + break + if added_to_wl and stdout: + print(f" 清仓→自选自动加入: {', '.join(added_to_wl)}") + + # DB 写入(替代 JSON dump — 强制币种约束) + try: + from mofin_db import get_conn, write_holdings_batch, write_portfolio_summary, write_watchlist_stock, write_holding_strategy + conn = get_conn() + write_holdings_batch(conn, existing_pf.get('holdings', [])) + write_portfolio_summary(conn, existing_pf) + for s in wl.get('stocks', []): + s.setdefault('currency', 'CNY') + write_watchlist_stock(conn, s) + for d in decisions: + write_holding_strategy(conn, d.get('code', ''), d.get('name', ''), d) + conn.close() + except Exception as e: + print(f" [DB写入失败] {e}", flush=True) + # JSON 冷备 + json.dump(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2) + json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2) + + # 写 decisions.json + decisions_path = "/home/hmo/web-dashboard/data/decisions.json" + decisions_data = { + "decisions": decisions, # 全部保留 + "total": len(decisions), + "regenerated_at": datetime.now().strftime('%Y-%m-%d %H:%M'), + } + json.dump(decisions_data, open(decisions_path, "w"), ensure_ascii=False, indent=2) + # DB 已在上方写入(和 portfolio/watchlist 一起) + + # 记录策略→提示词版本关联 + if HAS_PROMPT_TRACKING: + try: + for d in decisions: + if d.get("code") and d.get("action"): + record_strategy_generation( + d["code"], d.get("name", ""), d.get("action", "") + ) + except Exception as e: + if stdout: + print(f" ⚠️ 提示词版本追踪失败: {e}", file=sys.stderr) + + # 刷新多周期缓存到磁盘 + try: + import multi_timeframe as _mtf + _mtf.flush_mtf_cache() + except Exception: + pass + + summary = {"total": total, "ok": ok, "errors": errors} + if stdout: + print(f"\n✅ 全量重评完成: {ok}/{total}成功, {errors}错误") + return summary + + +if __name__ == "__main__": + regenerate_all() diff --git a/strategy_tree.py b/strategy_tree.py index 985cea0..99ec864 100644 --- a/strategy_tree.py +++ b/strategy_tree.py @@ -17,6 +17,7 @@ strategy_tree.py — 情景化多分支策略决策引擎 import json, os, sys, re from datetime import datetime, date, timedelta +from mo_data import read_portfolio, read_decisions, read_watchlist DECISIONS_PATH = "/home/hmo/web-dashboard/data/decisions.json" PORTFOLIO_PATH = "/home/hmo/web-dashboard/data/portfolio.json" @@ -141,7 +142,7 @@ def evaluate_branches(code, scenario_id, price, shares, cost): 返回: [{branch_id, action_type, action_detail, priority, applicable}] """ try: - dec = json.load(open(DECISIONS_PATH)) + dec = mo_data.read_decisions() except Exception: return [] @@ -237,7 +238,7 @@ def _check_branch_condition(branch, scenario_id, price, shares, cost): def record_branch_trigger(code, branch_id): """记录分支被触发了一次,用于自成长统计""" try: - dec = json.load(open(DECISIONS_PATH)) + dec = mo_data.read_decisions() for e in dec.get("decisions", []): if e.get("code") == code: st = e.setdefault("strategy_tree", {}) @@ -261,7 +262,7 @@ def prune_low_performance_branches(min_triggers=5, min_success_rate=0.3): 被剪的分支移入 history 字段,不打删除(可追溯) """ try: - dec = json.load(open(DECISIONS_PATH)) + dec = mo_data.read_decisions() except Exception: return [] @@ -382,7 +383,7 @@ def init_default_branches(code, name, entry_low, entry_high, stop_loss, take_pro def check_portfolio_constraint(action_type, amount, cash_remain=None): """组合约束检查:现金够不够?仓位上限?""" try: - pf = json.load(open(PORTFOLIO_PATH)) + pf = mo_data.read_portfolio() except Exception: return True, "无法读取组合"