research: 结构止损对照(step58),止损确实太紧但不是主因

用户提出 B1 做多的止损可能挂在 B2 低点上方,于是在那次正常回抽处被打掉。
观察成立且比预估严重:入场价到结构极值中位 2.90 ATR,2ATR 止损落在结构位
内侧 0.90 ATR,88.6% 的一类做多价格不用回踩到前低就已出局。

修掉有改善但救不活:结构位外侧 1.5ATR 止损把胜率从 16.7% 抬到 33.1%、
PF 从 0.22 到 0.36,仍深度为负。同口径下反手做空 PF 2.15~2.53。

做这个对照时目标必须随止损等比放大(恒定 1.5R 减半/4R 收尾),否则放宽止损
却不放大目标会把盈亏比压到 1 以下,测出来的「放宽无效」是自证的。故
walk_exits 不能用,自带了逐笔止损的模拟器。

最有说服力的读法是结构+1.5 那档:止损宽达 4.4 ATR 仍有 67% 被打掉,即
三分之二的一类信号会在 48 根内跌破结构低点再多走 1.5 ATR。缠论里「B2 回踩
不破前低」在本市场多数时候不成立,趋势确实越过第二类买卖点继续走原方向。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-28 20:31:06 +08:00
co-authored by Cursor
parent be3602f5ba
commit 9efbae6ade
3 changed files with 228 additions and 0 deletions
+6
View File
@@ -126,6 +126,10 @@ def collect(sym: str, rows: int, tf: str = "1m") -> pd.DataFrame | None:
"i_ext": i_ext, "i_sure": i_sure,
"lag_bars": i_sure - i_ext,
"atr_bp": a / px_ideal * 1e4,
# 结构位:笔末 KLC 的实际极值,不是收盘。止损要挂在它外面
# 才谈得上「守住结构」,用收盘价会把插针那一段漏掉
"ext_px": float(b.klc.low if d == 1 else b.klc.high),
"entry_px": px_real,
# 等待期间价格顺着信号方向跑掉了多少(正 = 你追高/追空,吃亏)
"drift_atr": (px_real - px_ideal) * d / a,
"drift_bp": (px_real - px_ideal) * d / px_ideal * 1e4,
@@ -161,6 +165,8 @@ def collect(sym: str, rows: int, tf: str = "1m") -> pd.DataFrame | None:
for k in ("g", "r", "c", "b"):
r["f_" + k] = rf[f"{cfg}_{k}"].to_numpy()
r["atr_pct"] = atr[r.i_sure.values] / cl[r.i_sure.values]
# 原始 ATR,供结构止损换算用。atr_pct 除过价格,换不回来
r["atr_at_entry"] = atr[r.i_sure.values]
return r
except Exception as e:
print(f" {sym} 失败: {e!r}", flush=True)