优化前改动
This commit is contained in:
@@ -29,7 +29,11 @@ class BitmartFuturesTransaction:
|
||||
self.pbar = tqdm(total=30, desc="等待K线", ncols=80)
|
||||
|
||||
self.last_kline_time = None # 上一次处理的K线时间戳,用于判断是否是新K线
|
||||
self.reverse_executed_this_kline = False # 当前K线是否已执行过反手,防止同一根K线多次反手
|
||||
|
||||
# 反手频率控制
|
||||
self.reverse_cooldown_seconds = 2 * 60 # 反手冷却时间(秒)
|
||||
self.reverse_min_move_pct = 0.15 # 反手最小价差过滤(百分比)
|
||||
self.last_reverse_time = None # 上次反手时间
|
||||
|
||||
self.leverage = "100" # 高杠杆(全仓模式下可开更大仓位)
|
||||
self.open_type = "cross" # 全仓模式
|
||||
@@ -319,6 +323,22 @@ class BitmartFuturesTransaction:
|
||||
|
||||
return None
|
||||
|
||||
def can_reverse(self, current_price, trigger_price):
|
||||
"""反手前过滤:冷却时间 + 最小价差"""
|
||||
now = time.time()
|
||||
if self.last_reverse_time and now - self.last_reverse_time < self.reverse_cooldown_seconds:
|
||||
remain = self.reverse_cooldown_seconds - (now - self.last_reverse_time)
|
||||
logger.info(f"反手冷却中,剩余 {remain:.0f} 秒")
|
||||
return False
|
||||
|
||||
if trigger_price and trigger_price > 0:
|
||||
move_pct = abs(current_price - trigger_price) / trigger_price * 100
|
||||
if move_pct < self.reverse_min_move_pct:
|
||||
logger.info(f"反手价差不足: {move_pct:.4f}% < {self.reverse_min_move_pct}%")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def verify_no_position(self, max_retries=5, retry_interval=3):
|
||||
"""
|
||||
验证当前无持仓
|
||||
@@ -420,6 +440,7 @@ class BitmartFuturesTransaction:
|
||||
# 验证开仓是否成功
|
||||
if self.verify_position_direction(1):
|
||||
logger.success("反手做多成功")
|
||||
self.last_reverse_time = time.time()
|
||||
time.sleep(20) # 额外等待避免频繁交易
|
||||
return True
|
||||
else:
|
||||
@@ -440,6 +461,7 @@ class BitmartFuturesTransaction:
|
||||
# 验证开仓是否成功
|
||||
if self.verify_position_direction(-1):
|
||||
logger.success("反手做空成功")
|
||||
self.last_reverse_time = time.time()
|
||||
time.sleep(20) # 额外等待避免频繁交易
|
||||
return True
|
||||
else:
|
||||
@@ -488,11 +510,10 @@ class BitmartFuturesTransaction:
|
||||
time.sleep(5)
|
||||
continue
|
||||
|
||||
# 检查是否进入新的K线,如果是则重置反手标记
|
||||
# 记录进入新的K线
|
||||
current_kline_time = current_kline['id']
|
||||
if self.last_kline_time != current_kline_time:
|
||||
self.last_kline_time = current_kline_time
|
||||
self.reverse_executed_this_kline = False
|
||||
logger.info(f"进入新K线: {current_kline_time}")
|
||||
|
||||
# 2. 获取当前价格
|
||||
@@ -513,20 +534,16 @@ class BitmartFuturesTransaction:
|
||||
# 4. 检查信号
|
||||
signal = self.check_signal(current_price, prev_kline, current_kline)
|
||||
|
||||
# 5. 如果是反手信号且当前K线已执行过反手,则跳过
|
||||
if signal and signal[0].startswith('reverse_') and self.reverse_executed_this_kline:
|
||||
logger.info(f"当前K线已执行过反手,跳过信号: {signal[0]}")
|
||||
signal = None
|
||||
# 5. 反手过滤:冷却时间 + 最小价差
|
||||
if signal and signal[0].startswith('reverse_'):
|
||||
if not self.can_reverse(current_price, signal[1]):
|
||||
signal = None
|
||||
|
||||
# 6. 有信号则执行交易
|
||||
if signal:
|
||||
trade_success = self.execute_trade(signal, size=1)
|
||||
if trade_success:
|
||||
logger.success(f"交易执行完成: {signal[0]}, 当前持仓状态: {self.start}")
|
||||
# 如果是反手操作成功,标记当前K线已执行反手
|
||||
if signal[0].startswith('reverse_'):
|
||||
self.reverse_executed_this_kline = True
|
||||
logger.info("已标记当前K线反手完成,同一K线内不再反手")
|
||||
page_start = True
|
||||
else:
|
||||
logger.warning(f"交易执行失败或被阻止: {signal[0]}")
|
||||
|
||||
Reference in New Issue
Block a user