1、新增SMCPureH1LongStrategy策略
2、修复实盘bug
This commit is contained in:
@@ -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)}"
|
||||
|
||||
Reference in New Issue
Block a user