加入一个回测,

This commit is contained in:
ddrwode
2026-03-05 18:29:05 +08:00
parent 79f4e03d6a
commit c473c738a3
2 changed files with 4654 additions and 41 deletions

View File

@@ -168,6 +168,7 @@ class BBDelayReversalTrader:
self.position_count = 0
self.entry_price = 0
self.current_amount = 0
self.mid_closed_half = False
return True
pos = positions[0]
self.position = 1 if pos['position_type'] == 1 else -1
@@ -323,6 +324,56 @@ class BBDelayReversalTrader:
def update_trade_time(self):
"""更新最后交易时间"""
self.last_trade_time = time.time()
def close_all_and_confirm(self, timeout_seconds: int = 15, poll_seconds: float = 1.0) -> bool:
"""执行全平仓并确认仓位归零"""
if self.position == 0:
return True
if not self.browser_close_position(1.0):
logger.error("全平仓指令发送失败")
return False
deadline = time.time() + timeout_seconds
while time.time() < deadline:
time.sleep(poll_seconds)
if not self.get_position_status():
continue
if self.position == 0:
logger.success("✓ 全平仓确认完成")
return True
logger.error(f"全平仓确认超时,当前仓位={self.position}")
return False
def open_with_balance_and_confirm(self, direction: str) -> bool:
"""按余额比例开仓并确认方向正确"""
balance = self.get_balance()
if not balance:
logger.error("余额获取失败,无法开仓")
return False
usdt_amount = round(balance * self.cfg.MARGIN_PCT, 2)
if usdt_amount <= 0:
logger.error(f"开仓金额无效: {usdt_amount}")
return False
if not self.browser_open_position(direction, usdt_amount):
logger.error("开仓指令发送失败")
return False
time.sleep(3)
if not self.get_position_status():
logger.error("开仓后持仓查询失败")
return False
expected_pos = 1 if direction == 'long' else -1
if self.position != expected_pos:
logger.error(f"开仓结果不一致: 期望={expected_pos}, 实际={self.position}")
return False
logger.success(f"✓ 开{'' if direction == 'long' else ''}成功")
return True
# ========== 延迟反转逻辑 ==========
@@ -552,31 +603,18 @@ class BBDelayReversalTrader:
new_direction, reversal_price, reason = reversal
logger.warning(f"🔄 延迟反转确认: {reason} @ {reversal_price:.2f}")
# 平仓
logger.info("执行平仓...")
self.browser_close_position(1.0)
time.sleep(3)
self.get_position_status()
if self.position == 0:
# 反向开仓
logger.info("执行全平仓...")
if self.close_all_and_confirm():
logger.info(f"执行反向开{'' if new_direction == 'long' else ''}...")
balance = self.get_balance()
if balance:
usdt_amount = round(balance * self.cfg.MARGIN_PCT, 2)
self.browser_open_position(new_direction, usdt_amount)
time.sleep(3)
self.get_position_status()
if self.position != 0:
self.position_count = 1
self.mid_closed_half = False
self.clear_delay_reversal()
self.last_kline_id = kline_id
self.update_trade_time()
logger.success(f"✓ 延迟反转完成!")
if self.open_with_balance_and_confirm(new_direction):
self.position_count = 1
self.mid_closed_half = False
self.clear_delay_reversal()
self.last_kline_id = kline_id
self.update_trade_time()
logger.success("✓ 延迟反转完成!")
else:
logger.error(f"平仓后仍有持仓: {self.position}")
logger.error("延迟反转取消:全平仓未确认")
# 更新历史
kline_history.append(current_kline)
@@ -619,24 +657,15 @@ class BBDelayReversalTrader:
old_direction = 'long' if self.position > 0 else 'short'
new_direction = 'short' if old_direction == 'long' else 'long'
self.browser_close_position(1.0)
time.sleep(3)
self.get_position_status()
if self.position == 0:
balance = self.get_balance()
if balance:
usdt_amount = round(balance * self.cfg.MARGIN_PCT, 2)
self.browser_open_position(new_direction, usdt_amount)
time.sleep(3)
self.get_position_status()
if self.position != 0:
self.position_count = 1
self.mid_closed_half = False
self.last_kline_id = kline_id
self.update_trade_time()
logger.success(f"✓ 反手完成!")
if self.close_all_and_confirm():
if self.open_with_balance_and_confirm(new_direction):
self.position_count = 1
self.mid_closed_half = False
self.last_kline_id = kline_id
self.update_trade_time()
logger.success("✓ 反手完成!")
else:
logger.error("反手取消:全平仓未确认")
# 更新历史
kline_history.append(current_kline)

File diff suppressed because it is too large Load Diff