diff --git a/bitmart/交易.py b/bitmart/交易.py index b0aa273..37ffabc 100644 --- a/bitmart/交易.py +++ b/bitmart/交易.py @@ -77,14 +77,14 @@ class BitmartFuturesTransaction: }) formatted.sort(key=lambda x: x['id']) - # 返回最近2根K线:倒数第二根(上一根)和最后一根(当前) + # 返回最近多根K线列表,供主循环按「实体>0.1%」向前选取上一根 if len(formatted) >= 2: - return formatted[-2], formatted[-1] - return None, None + return formatted + return None except Exception as e: logger.error(f"获取K线异常: {e}") self.ding(text="获取K线异常", error=True) - return None, None + return None def get_current_price(self): """获取当前最新价格""" @@ -270,14 +270,9 @@ class BitmartFuturesTransaction: 检查交易信号 返回: ('long', trigger_price) / ('short', trigger_price) / None """ - # 计算上一根K线实体 + # 计算上一根K线实体(主循环已保证所选 prev 实体 > 0.1%) prev_entity = self.calculate_entity(prev_kline) - # 实体过小不交易(实体 < 0.1) - if prev_entity < 0.1: - logger.info(f"上一根K线实体过小: {prev_entity:.4f},跳过信号检测") - return None - # 获取上一根K线的实体上下边 prev_entity_edge = self.get_entity_edge(prev_kline) prev_entity_upper = prev_entity_edge['upper'] # 实体上边 @@ -567,13 +562,27 @@ class BitmartFuturesTransaction: page_start = False try: - # 1. 获取K线数据(当前K线和上一根K线) - prev_kline, current_kline = self.get_klines() - if not prev_kline or not current_kline: + # 1. 获取K线数据,当前K线=最后一根;上一根=从后往前第一根实体>0.1%的K线 + formatted = self.get_klines() + if not formatted or len(formatted) < 2: logger.warning("获取K线失败,等待重试...") time.sleep(5) continue + current_kline = formatted[-1] + prev_kline = None + for i in range(len(formatted) - 2, -1, -1): + k = formatted[i] + entity = abs(k['close'] - k['open']) + entity_pct = entity / k['open'] * 100 if k['open'] else 0 + if entity_pct > 0.1: + prev_kline = k + break + if prev_kline is None: + logger.info("没有实体>0.1%的上一根K线,跳过信号检测") + time.sleep(0.1) + continue + # 记录进入新的K线 current_kline_time = current_kline['id'] if self.last_kline_time != current_kline_time: