You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

核心逻辑说明

  1. 持仓状态判断:通过self.position.is_long和self.position.is_short精准识别当前持仓方向,避免无意义的重复平仓/开仓操作
  2. 多头开仓逻辑:仅在触发多头信号且当前未持有多头仓位时执行开仓;若持有空头则先平仓再开多
  3. 空头开仓逻辑:仅在触发空头信号且当前未持有空头仓位时执行开仓;若持有多头则先平仓再开空
  4. 重复下单规避:通过仓位状态判断,确保同一方向的信号不会重复触发开仓指令,解决平多后立即重新开多的问题

内容的提问来源于stack exchange,提问作者C.J. Teas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:27:40