diff --git a/open_fifth_strategy/config.py b/open_fifth_strategy/config.py index 232d9ec..1ae42b1 100644 --- a/open_fifth_strategy/config.py +++ b/open_fifth_strategy/config.py @@ -26,8 +26,9 @@ LEVERAGE = "100" OPEN_TYPE = "cross" # 全仓 RISK_PERCENT = 0.01 # 每次开仓占用可用余额的比例 -# 反手信号价格容差(美元) -REVERSE_PRICE_TOLERANCE = 2.0 +# 反手信号价格容差(美元):K线触及触发价后,收盘价需在触发价±容差内才执行 +# 避免“先涨后跌/先跌后涨”追单,适当增大可减少漏单 +REVERSE_PRICE_TOLERANCE = 5.0 # 反手信号检测窗口:3分钟K线的「前1分30秒」内出现反手信号则平仓反手 # 使用前2根1分钟K线近似(覆盖 0:00~2:00,包含 0:00~1:30) diff --git a/open_fifth_strategy/main.py b/open_fifth_strategy/main.py index 07701a5..1752f28 100644 --- a/open_fifth_strategy/main.py +++ b/open_fifth_strategy/main.py @@ -235,7 +235,9 @@ class OpenBasedFifthStrategy: def check_realtime_trigger(self, kline_data, current_position=0): """ - 实时检测信号(基于当前K线开盘价计算触发价) + 实时检测信号 + - 无仓位:基于当前K线开盘价计算触发价 + - 有仓位(反手):基于开仓价计算触发价(1111:开仓价±前一根实体/5) 返回:(方向, 触发价, 有效前一根, 当前K线) 或 (None,...) """ if len(kline_data) < 2: @@ -250,7 +252,20 @@ class OpenBasedFifthStrategy: if prev is None: return None, None, None, None - long_trigger, short_trigger = self.get_open_based_levels(prev, curr_open) + prev_body = self.get_body_size(prev) + reverse_offset = prev_body / 5 + + # 有仓位时反手用开仓价(1111),无仓位用当前K线开盘价 + if current_position != 0: + entry = self.entry_price or (float(self.open_avg_price) if self.open_avg_price else None) + if entry is not None: + long_trigger = entry + reverse_offset + short_trigger = entry - reverse_offset + else: + long_trigger, short_trigger = self.get_open_based_levels(prev, curr_open) + else: + long_trigger, short_trigger = self.get_open_based_levels(prev, curr_open) + if long_trigger is None: return None, None, None, None @@ -558,8 +573,12 @@ class OpenBasedFifthStrategy: curr = kline_data[-1] if not self.get_position_status(): logger.warning("获取仓位失败,使用缓存") + # 有仓位但 entry_price 未设置时(如程序重启),用开仓均价补全 + if self.start != 0 and self.entry_price is None and self.open_avg_price: + self.entry_price = float(self.open_avg_price) + logger.info(f"从API恢复 entry_price={self.entry_price:.2f}") - # 第一分钟反手 + # 前1分30秒反手 if self.start != 0: first_dir, first_trigger = self.check_early_reverse_signal( curr, kline_data