日志展示优化
This commit is contained in:
@@ -40,9 +40,11 @@ class BitmartFuturesTransaction:
|
||||
self.last_kline_time = None # 上一次处理的K线时间戳,用于判断是否是新K线
|
||||
|
||||
# 反手频率控制
|
||||
self.reverse_cooldown_seconds = 1.5 * 60 # 反手冷却时间(秒)
|
||||
self.reverse_cooldown_seconds = 60 # 反手冷却时间(秒)
|
||||
self.last_reverse_time = None # 上次反手时间
|
||||
self.last_reverse_kline_id = None # 已反手过的 K 线 id,该 K 线内不再操作仓位
|
||||
self.max_reverse_times_per_kline = 2 # 同一根 K 线最多反手次数
|
||||
self.reverse_count_kline_id = None # 反手计数对应的 K 线 id
|
||||
self.reverse_count_in_kline = 0 # 当前 K 线已反手次数
|
||||
|
||||
# 开仓频率控制
|
||||
self.open_cooldown_seconds = 60 # 开仓冷却时间(秒),两次开仓至少间隔此时长
|
||||
@@ -504,14 +506,24 @@ class BitmartFuturesTransaction:
|
||||
return False
|
||||
return True
|
||||
|
||||
def can_reverse(self, current_price, trigger_price):
|
||||
"""反手前过滤:冷却时间"""
|
||||
def can_reverse(self, current_kline_id):
|
||||
"""反手前过滤:冷却时间 + 同一根 K 线最多反手次数。"""
|
||||
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 self.reverse_count_kline_id != current_kline_id:
|
||||
self.reverse_count_kline_id = current_kline_id
|
||||
self.reverse_count_in_kline = 0
|
||||
|
||||
if self.reverse_count_in_kline >= self.max_reverse_times_per_kline:
|
||||
logger.info(
|
||||
f"本 K 线({current_kline_id})反手次数已达上限({self.max_reverse_times_per_kline}),跳过"
|
||||
)
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def verify_no_position(self, max_retries=5, retry_interval=3):
|
||||
@@ -717,6 +729,9 @@ class BitmartFuturesTransaction:
|
||||
if self.last_kline_time != current_kline_time:
|
||||
self.last_kline_time = current_kline_time
|
||||
logger.info(f"进入新K线: {current_kline_time}")
|
||||
# 新K线重置反手计数(同一根K线最多允许 2 次反手)
|
||||
self.reverse_count_kline_id = current_kline_time
|
||||
self.reverse_count_in_kline = 0
|
||||
# 新K线内重新判断多/空止盈触发
|
||||
if self.start == 1:
|
||||
self.take_profit_triggered_kline_id = None
|
||||
@@ -858,7 +873,7 @@ class BitmartFuturesTransaction:
|
||||
|
||||
# 6. 反手过滤:冷却时间
|
||||
if signal and signal[0].startswith('reverse_'):
|
||||
if not self.can_reverse(current_price, signal[1]):
|
||||
if not self.can_reverse(current_kline_time):
|
||||
signal = None
|
||||
|
||||
# 6.5 开仓频率过滤:同一根 K 线只开一次 + 开仓冷却
|
||||
@@ -868,17 +883,15 @@ class BitmartFuturesTransaction:
|
||||
else:
|
||||
self._current_kline_id_for_open = current_kline_time # 供 execute_trade 成功后记录
|
||||
|
||||
# 6.6 当前 K 线已反手过则本 K 线内不再操作仓位
|
||||
if signal and self.last_reverse_kline_id == current_kline_time:
|
||||
logger.info(f"本 K 线({current_kline_time})已反手过,本 K 线内不再操作仓位")
|
||||
signal = None
|
||||
|
||||
# 7. 有信号则执行交易
|
||||
if signal:
|
||||
trade_success = self.execute_trade(signal)
|
||||
if trade_success:
|
||||
if signal[0] in ('reverse_long', 'reverse_short'):
|
||||
self.last_reverse_kline_id = current_kline_time # 本 K 线已反手,本 K 线内不再操作
|
||||
if self.reverse_count_kline_id != current_kline_time:
|
||||
self.reverse_count_kline_id = current_kline_time
|
||||
self.reverse_count_in_kline = 0
|
||||
self.reverse_count_in_kline += 1
|
||||
# 写入开仓日志:参考的两根K线 + 开仓原因
|
||||
sig_type, trigger_price = signal
|
||||
op_name = {"long": "开多", "short": "开空", "reverse_long": "反手做多", "reverse_short": "反手做空"}.get(sig_type, sig_type)
|
||||
|
||||
Reference in New Issue
Block a user