diff --git a/bitmart/三分之一策略交易.py b/bitmart/三分之一策略交易.py index ac0d47d..7b6bb07 100644 --- a/bitmart/三分之一策略交易.py +++ b/bitmart/三分之一策略交易.py @@ -1,6 +1,5 @@ import time - from tqdm import tqdm from loguru import logger from bit_tools import openBrowser @@ -169,7 +168,7 @@ class BitmartFuturesTransaction: return False ele.scroll.to_see(center=True) time.sleep(sleep) - ele.click() + ele.click(by_js=True) return True except: return False @@ -238,7 +237,7 @@ class BitmartFuturesTransaction: # 阴线(收盘<开盘):实体上边=开盘价,实体下边=收盘价 return { 'upper': max(kline['open'], kline['close']), # 实体上边 - 'lower': min(kline['open'], kline['close']) # 实体下边 + 'lower': min(kline['open'], kline['close']) # 实体下边 } def check_signal(self, current_price, prev_kline, current_kline): @@ -260,7 +259,7 @@ class BitmartFuturesTransaction: prev_entity_lower = prev_entity_edge['lower'] # 实体下边 # 计算触发价(基于上一根K线实体位置) - long_trigger = prev_entity_lower + prev_entity / 3 # 做多触发价 = 实体下边 + 实体/3(下三分之一处) + long_trigger = prev_entity_lower + prev_entity / 3 # 做多触发价 = 实体下边 + 实体/3(下三分之一处) short_trigger = prev_entity_upper - prev_entity / 3 # 做空触发价 = 实体上边 - 实体/3(上三分之一处) logger.info(f"当前价格: {current_price:.2f}, 上一根实体: {prev_entity:.4f}") @@ -287,7 +286,7 @@ class BitmartFuturesTransaction: upper_shadow_pct = self.calculate_upper_shadow(prev_kline) if upper_shadow_pct > 0.01 and current_price <= prev_entity_lower: logger.info(f"持多反手做空!上阴线涨幅 {upper_shadow_pct:.4f}% > 0.01%," - f"价格 {current_price:.2f} <= 实体下边 {prev_entity_lower:.2f}") + f"价格 {current_price:.2f} <= 实体下边 {prev_entity_lower:.2f}") return ('reverse_short', prev_entity_lower) elif self.start == -1: # 持空仓 @@ -300,7 +299,7 @@ class BitmartFuturesTransaction: lower_shadow_pct = self.calculate_lower_shadow(prev_kline) if lower_shadow_pct > 0.01 and current_price >= prev_entity_upper: logger.info(f"持空反手做多!下阴线跌幅 {lower_shadow_pct:.4f}% > 0.01%," - f"价格 {current_price:.2f} >= 实体上边 {prev_entity_upper:.2f}") + f"价格 {current_price:.2f} >= 实体上边 {prev_entity_upper:.2f}") return ('reverse_long', prev_entity_upper) return None @@ -316,12 +315,13 @@ class BitmartFuturesTransaction: logger.info(f"确认无持仓,可以开仓") return True else: - logger.warning(f"仍有持仓 (方向: {self.start}),等待 {retry_interval} 秒后重试 ({i+1}/{max_retries})") + logger.warning( + f"仍有持仓 (方向: {self.start}),等待 {retry_interval} 秒后重试 ({i + 1}/{max_retries})") time.sleep(retry_interval) else: - logger.warning(f"查询持仓状态失败,等待 {retry_interval} 秒后重试 ({i+1}/{max_retries})") + logger.warning(f"查询持仓状态失败,等待 {retry_interval} 秒后重试 ({i + 1}/{max_retries})") time.sleep(retry_interval) - + logger.error(f"经过 {max_retries} 次重试仍有持仓或查询失败,放弃开仓") return False @@ -346,7 +346,7 @@ class BitmartFuturesTransaction: """执行交易""" signal_type, trigger_price = signal size = 25 - + if signal_type == 'long': # 开多前先确认无持仓 logger.info(f"准备开多,触发价: {trigger_price:.2f}") @@ -356,11 +356,11 @@ class BitmartFuturesTransaction: if self.start != 0: logger.warning(f"开多前发现已有持仓 (方向: {self.start}),放弃开仓避免双向持仓") return False - + logger.info(f"确认无持仓,执行开多") self.开单(marketPriceLongOrder=1, size=size) time.sleep(3) # 等待订单执行 - + # 验证开仓是否成功 if self.verify_position_direction(1): logger.success("开多成功") @@ -378,11 +378,11 @@ class BitmartFuturesTransaction: if self.start != 0: logger.warning(f"开空前发现已有持仓 (方向: {self.start}),放弃开仓避免双向持仓") return False - + logger.info(f"确认无持仓,执行开空") self.开单(marketPriceLongOrder=-1, size=size) time.sleep(3) # 等待订单执行 - + # 验证开仓是否成功 if self.verify_position_direction(-1): logger.success("开空成功") @@ -396,17 +396,17 @@ class BitmartFuturesTransaction: logger.info(f"执行反手做多,触发价: {trigger_price:.2f}") self.平仓() logger.info("反手等待平仓完成...") - time.sleep(15) - + # time.sleep(15) + # 验证平仓是否成功(必须无持仓才能开新仓) if not self.verify_no_position(max_retries=5, retry_interval=3): logger.error("平仓未完成,放弃开多避免双向持仓") return False - + logger.info("平仓完成,执行开多") self.开单(marketPriceLongOrder=1, size=size) time.sleep(3) # 等待订单执行 - + # 验证开仓是否成功 if self.verify_position_direction(1): logger.success("反手做多成功") @@ -421,17 +421,17 @@ class BitmartFuturesTransaction: logger.info(f"执行反手做空,触发价: {trigger_price:.2f}") self.平仓() logger.info("反手等待平仓完成...") - time.sleep(15) - + # time.sleep(15) + # 验证平仓是否成功(必须无持仓才能开新仓) if not self.verify_no_position(max_retries=5, retry_interval=3): logger.error("平仓未完成,放弃开空避免双向持仓") return False - + logger.info("平仓完成,执行开空") self.开单(marketPriceLongOrder=-1, size=size) time.sleep(3) # 等待订单执行 - + # 验证开仓是否成功 if self.verify_position_direction(-1): logger.success("反手做空成功") @@ -440,7 +440,7 @@ class BitmartFuturesTransaction: else: logger.error("反手做空后持仓验证失败") return False - + return False def action(self): @@ -483,7 +483,7 @@ class BitmartFuturesTransaction: logger.warning("获取持仓状态失败,等待重试...") time.sleep(2) continue - + logger.debug(f"当前持仓状态: {self.start} (0=无, 1=多, -1=空)") # 4. 检查信号 @@ -496,7 +496,7 @@ class BitmartFuturesTransaction: logger.success(f"交易执行完成: {signal[0]}, 当前持仓状态: {self.start}") else: logger.warning(f"交易执行失败或被阻止: {signal[0]}") - + # 交易后等待一段时间再继续监控(无论成功失败) time.sleep(3) continue # 立即进入下一次循环继续监控