加入一个回测,
This commit is contained in:
@@ -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)
|
||||
|
||||
4584
bb_sweep_results.csv
4584
bb_sweep_results.csv
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user