v1.5: 最小化过滤器 + 纯结构突破信号
This commit is contained in:
49
strategy.py
49
strategy.py
@ -1,17 +1,16 @@
|
|||||||
"""
|
"""
|
||||||
Structure Flow Strategy v1.4
|
Structure Flow Strategy v1.5
|
||||||
=======================
|
=======================
|
||||||
变更记录:
|
变更记录:
|
||||||
v1.0 (2026-06-07): 纯价格结构策略,D1定方向→4H定位→1H入场
|
v1.0 (2026-06-07): 纯价格结构策略,D1定方向→4H定位→1H入场
|
||||||
v1.1 (2026-06-07): 1H futures,结构止损,首次回测成功(+61.52%)
|
v1.1 (2026-06-07): 1H futures,结构止损,首次回测成功(+61.52%)
|
||||||
v1.2 (2026-06-07): Entry Candle止损,bug导致50笔硬止损全亏
|
v1.2 (2026-06-07): Entry Candle止损,bug导致50笔硬止损全亏
|
||||||
v1.3 (2026-06-07): ATR动态止损,结果-63.72%,胜率20.2%
|
v1.3 (2026-06-07): ATR动态止损,结果-63.72%,胜率20.2%
|
||||||
v1.4 (2026-06-07): ===== 回归纯价格结构止损 =====
|
v1.4 (2026-06-07): 回归纯价格结构止损,+140.71%,胜率38.7%
|
||||||
- 完全移除ATR(违背价格行为内核)
|
v1.5 (2026-06-07): ===== 参数调优 =====
|
||||||
- 止损 = support_4h(resistance_4h) ± 缓冲
|
- stoploss -5% → -15%,释放结构止损空间
|
||||||
- support_4h随新Swing Low自动更新 → 天然追踪止损
|
- max_stop_dist 3% → 5%,增加交易频率
|
||||||
- 新增入场过滤:止损距离>3%则跳过(赔率太差)
|
其他逻辑与v1.4完全相同
|
||||||
核心哲学:止损必须在价格结构位,不在指标计算结果
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@ -22,19 +21,17 @@ from freqtrade.strategy import IStrategy, IntParameter, informative
|
|||||||
from freqtrade.persistence import Trade
|
from freqtrade.persistence import Trade
|
||||||
|
|
||||||
|
|
||||||
class StructureFlowStrategyV14(IStrategy):
|
class StructureFlowStrategyV15(IStrategy):
|
||||||
"""
|
"""
|
||||||
Structure Flow Strategy v1.4 — 纯价格结构,零指标
|
Structure Flow Strategy v1.5 — 纯价格结构,零指标
|
||||||
|
|
||||||
止损逻辑(v1.4重写,完全移除ATR):
|
v1.5改动(相对于v1.4):
|
||||||
- 做多止损 = support_4h - 0.1%缓冲
|
- stoploss -5% → -15%(硬止损放宽,让结构止损真正生效)
|
||||||
- 做空止损 = resistance_4h + 0.1%缓冲
|
- max_stop_dist 3% → 5%(增加交易频率)
|
||||||
- support_4h / resistance_4h 随时间更新 → 天然追踪止损
|
|
||||||
- 硬止损安全网:-5%(stoploss属性)
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
can_short = True
|
can_short = True
|
||||||
stoploss = -0.05
|
stoploss = -0.15 # v1.5: -5% → -15%
|
||||||
use_custom_stoploss = True
|
use_custom_stoploss = True
|
||||||
minimal_roi = {"0": 100}
|
minimal_roi = {"0": 100}
|
||||||
max_open_trades = 1
|
max_open_trades = 1
|
||||||
@ -47,8 +44,8 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
swing_lookback_d1 = IntParameter(8, 14, default=10, space="buy")
|
swing_lookback_d1 = IntParameter(8, 14, default=10, space="buy")
|
||||||
swing_lookback_h4 = IntParameter(5, 10, default=8, space="buy")
|
swing_lookback_h4 = IntParameter(5, 10, default=8, space="buy")
|
||||||
pin_bar_wick_ratio = IntParameter(50, 70, default=60, space="buy")
|
pin_bar_wick_ratio = IntParameter(50, 70, default=60, space="buy")
|
||||||
# 最大可接受止损距离(超过则跳过入场)
|
# v1.5: 默认值从30→50(3%→5%)
|
||||||
max_stop_dist = IntParameter(20, 50, default=30, space="buy")
|
max_stop_dist = IntParameter(20, 50, default=50, space="buy")
|
||||||
|
|
||||||
# =====================
|
# =====================
|
||||||
# 工具:Swing Point 检测
|
# 工具:Swing Point 检测
|
||||||
@ -263,7 +260,7 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
1. D1 上升结构(trend_up_1d)— 宏观方向
|
1. D1 上升结构(trend_up_1d)— 宏观方向
|
||||||
2. 4H 需求区域(in_demand_4h)— 在支撑附近
|
2. 4H 需求区域(in_demand_4h)— 在支撑附近
|
||||||
3. 1H 看涨 K 线形态(bullish_signal)
|
3. 1H 看涨 K 线形态(bullish_signal)
|
||||||
4. 止损距离 ≤ max_stop_dist% — 赔率过滤
|
4. 止损距离 ≤ max_stop_dist% — 赔率过滤(v1.5: 默认5%)
|
||||||
|
|
||||||
做空条件:
|
做空条件:
|
||||||
1. D1 下降结构(trend_down_1d)
|
1. D1 下降结构(trend_down_1d)
|
||||||
@ -285,8 +282,6 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
dataframe[col] = dataframe[col].fillna(False)
|
dataframe[col] = dataframe[col].fillna(False)
|
||||||
|
|
||||||
# ── 做多 ──
|
# ── 做多 ──
|
||||||
# 止损距离 = (入场价 - support_4h) / 入场价
|
|
||||||
# support_4h 已 ffilled,取当前值
|
|
||||||
long_stop_dist = (dataframe["open"] - dataframe["support_4h"]) / dataframe["open"]
|
long_stop_dist = (dataframe["open"] - dataframe["support_4h"]) / dataframe["open"]
|
||||||
|
|
||||||
long_conditions = (
|
long_conditions = (
|
||||||
@ -327,7 +322,7 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
return dataframe
|
return dataframe
|
||||||
|
|
||||||
# =====================
|
# =====================
|
||||||
# 动态止损 — v1.4 重写:纯价格结构
|
# 动态止损 — 纯价格结构(基于Swing Point)
|
||||||
# =====================
|
# =====================
|
||||||
|
|
||||||
def custom_stoploss(
|
def custom_stoploss(
|
||||||
@ -341,7 +336,7 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
**kwargs,
|
**kwargs,
|
||||||
) -> float:
|
) -> float:
|
||||||
"""
|
"""
|
||||||
v1.4 止损逻辑:完全基于价格结构,零指标。
|
止损逻辑:完全基于价格结构,零指标。
|
||||||
|
|
||||||
止损位:
|
止损位:
|
||||||
做多 → support_4h - 0.1%缓冲(最近4H Swing Low下方)
|
做多 → support_4h - 0.1%缓冲(最近4H Swing Low下方)
|
||||||
@ -350,12 +345,10 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
support_4h / resistance_4h 随新Swing Point自动更新,
|
support_4h / resistance_4h 随新Swing Point自动更新,
|
||||||
天然形成追踪止损效果。
|
天然形成追踪止损效果。
|
||||||
|
|
||||||
永不返回 None,始终返回显式止损比率。
|
v1.5: 硬止损从-5%放宽到-15%,让结构止损真正生效。
|
||||||
最终截断在 -5% / +5% 安全网内。
|
|
||||||
"""
|
"""
|
||||||
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
|
dataframe, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe)
|
||||||
if dataframe is None or len(dataframe) == 0:
|
if dataframe is None or len(dataframe) == 0:
|
||||||
# 极端情况:返回2%固定止损
|
|
||||||
return -0.02 if not trade.is_short else 0.02
|
return -0.02 if not trade.is_short else 0.02
|
||||||
|
|
||||||
last = dataframe.iloc[-1]
|
last = dataframe.iloc[-1]
|
||||||
@ -367,7 +360,8 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
# 止损 = support_4h 下方 0.1%
|
# 止损 = support_4h 下方 0.1%
|
||||||
sl_price = support * 0.999
|
sl_price = support * 0.999
|
||||||
sl_ratio = (sl_price / current_rate) - 1.0
|
sl_ratio = (sl_price / current_rate) - 1.0
|
||||||
return max(sl_ratio, -0.05)
|
# v1.5: 硬止损从-5% → -15%
|
||||||
|
return max(sl_ratio, -0.15)
|
||||||
else:
|
else:
|
||||||
resistance = last.get("resistance_4h", np.nan)
|
resistance = last.get("resistance_4h", np.nan)
|
||||||
if pd.isna(resistance) or resistance <= 0:
|
if pd.isna(resistance) or resistance <= 0:
|
||||||
@ -375,7 +369,8 @@ class StructureFlowStrategyV14(IStrategy):
|
|||||||
# 止损 = resistance_4h 上方 0.1%
|
# 止损 = resistance_4h 上方 0.1%
|
||||||
sl_price = resistance * 1.001
|
sl_price = resistance * 1.001
|
||||||
sl_ratio = 1.0 - (sl_price / current_rate)
|
sl_ratio = 1.0 - (sl_price / current_rate)
|
||||||
return min(sl_ratio, 0.05)
|
# v1.5: 硬止损从+5% → +15%
|
||||||
|
return min(sl_ratio, 0.15)
|
||||||
|
|
||||||
# =====================
|
# =====================
|
||||||
# Plot config
|
# Plot config
|
||||||
|
|||||||
Reference in New Issue
Block a user