1、新增SMCPureH1LongStrategy策略

2、修复实盘bug
This commit is contained in:
2025-07-28 14:36:58 +08:00
parent 2fa952a3da
commit 52c5ec18d8
12 changed files with 982 additions and 852 deletions

View File

@@ -269,3 +269,85 @@ class NormalizedATR(Indicator):
def get_name(self):
return f"natr_{self.window}"
class ADX(Indicator):
"""
平均趋向指标 (ADX),用于衡量趋势的强度而非方向。
是区分趋势行情和震荡行情的核心过滤指标。
"""
def __init__(
self,
window: int = 14,
down_bound: float = None, # 例如,设置 down_bound=25 可过滤出强趋势行情
up_bound: float = None, # 例如,设置 up_bound=20 可过滤出震荡行情
shift_window: int = 0,
):
super().__init__(down_bound, up_bound)
self.window = window
self.shift_window = shift_window
def get_values(
self,
close: np.array,
open: np.array, # 不使用
high: np.array,
low: np.array,
volume: np.array, # 不使用
) -> np.array:
"""
根据最高价、最低价和收盘价计算ADX值。
"""
adx_values = talib.ADX(high, low, close, timeperiod=self.window)
return adx_values
def get_name(self):
return f"adx_{self.window}"
class BollingerBandwidth(Indicator):
"""
布林带宽度,计算公式为 (上轨 - 下轨) / 中轨。
这是一个归一化的波动率指标用于识别波动性的收缩Squeeze和扩张。
"""
def __init__(
self,
window: int = 20,
nbdev: float = 2.0, # 标准差倍数
down_bound: float = None,
up_bound: float = None,
shift_window: int = 0,
):
super().__init__(down_bound, up_bound)
self.window = window
self.nbdev = nbdev
self.shift_window = shift_window
def get_values(
self,
close: np.array,
open: np.array, # 不使用
high: np.array, # 不使用
low: np.array, # 不使用
volume: np.array, # 不使用
) -> np.array:
"""
根据收盘价计算布林带宽度。
"""
upper, middle, lower = talib.BBANDS(
close,
timeperiod=self.window,
nbdevup=self.nbdev,
nbdevdn=self.nbdev,
matype=0 # 使用SMA
)
# 为避免除以0在 middle 为0或NaN的地方带宽也设为NaN
bandwidth = np.full_like(middle, np.nan)
mask = (middle > 0)
bandwidth[mask] = (upper[mask] - lower[mask]) / middle[mask] * 100
return bandwidth
def get_name(self):
return f"bbw_{self.window}_{int(self.nbdev*10)}"