Backtesting.py中Strategy对象内判断持仓方向以避免重复下单
解决均线交叉策略中的持仓状态判断与重复下单问题
关键问题修正
你之前的代码中访问持仓状态变量的方式有误,正确写法是通过点语法访问:self.position.is_long(判断是否持有多头仓位)和self.position.is_short(判断是否持有空头仓位),而非空格分隔的self.position is_long。
修正后的完整策略代码
class example(Strategy): def init(self): super().init() self.ma = self.I(SMA, self.data.Close, self.n1) def next(self): price = self.data.Close current_condition = self.data.Condition lookback_conditions = self.data.Condition[-self.lookback:] # 多头信号处理:Condition == -1.0 if current_condition == -1.0: # 若当前持有空头仓位,先平仓 if self.position.is_short: self.position.close() # 若当前未持有多头仓位,执行开多 if not self.position.is_long: self.buy(size=0.9999) # 空头信号处理:Condition == 1.0 且价格低于均线,或回溯期内出现过1.0信号且价格低于均线 elif (current_condition == 1.0 and price < self.ma) or (1.0 in lookback_conditions and price < self.ma): # 若当前持有多头仓位,先平仓 if self.position.is_long: self.position.close() # 若当前未持有空头仓位,执行开空 if not self.position.is_short: self.sell(size=0.9999)
核心逻辑说明
- 持仓状态判断:通过
self.position.is_long和self.position.is_short精准识别当前持仓方向,避免无意义的重复平仓/开仓操作 - 多头开仓逻辑:仅在触发多头信号且当前未持有多头仓位时执行开仓;若持有空头则先平仓再开多
- 空头开仓逻辑:仅在触发空头信号且当前未持有空头仓位时执行开仓;若持有多头则先平仓再开空
- 重复下单规避:通过仓位状态判断,确保同一方向的信号不会重复触发开仓指令,解决平多后立即重新开多的问题
内容的提问来源于stack exchange,提问作者C.J. Teas
相关产品推荐
相关产品推荐

