日志展示优化

This commit is contained in:
ddrwode
2026-02-11 11:30:24 +08:00
parent 17c6876d5d
commit 26cdc54d21

View File

@@ -67,7 +67,7 @@ class BitmartFuturesTransaction:
self.current_open = None # 当前K线开盘价
# 策略优化参数
self.min_prev_entity_pct = 0.1 # 上一根K线实体涨幅%),仅当实体涨幅 > 此值才用作“上一根”
self.min_prev_entity_pct = 0.1 # 上一根K线实体涨幅%),仅当实体涨幅 >= 此值才用作“上一根”
# 自动止盈基于当前K线振幅四等分多仓用 open~high空仓用 open~low
self.take_profit_close_quartile = 3 # 达到极值后,回到 3/4 位置平仓
@@ -108,7 +108,7 @@ class BitmartFuturesTransaction:
})
formatted.sort(key=lambda x: x['id'])
# 返回最近多根K线列表供主循环按「实体涨幅>0.1%」向前选取上一根
# 返回最近多根K线列表供主循环按「实体涨幅>=min_prev_entity_pct」向前选取上一根
if len(formatted) >= 2:
return formatted
return None
@@ -411,85 +411,46 @@ class BitmartFuturesTransaction:
检查交易信号
返回: ('long', trigger_price) / ('short', trigger_price) / None
"""
# 计算上一根K线实体主循环已保证所选 prev 实体涨幅 > 0.1%
# 计算上一根K线实体主循环已保证所选 prev 实体涨幅 >= min_prev_entity_pct
prev_entity = self.calculate_entity(prev_kline)
# 获取上一根K线的实体上下边
prev_entity_edge = self.get_entity_edge(prev_kline)
prev_entity_upper = prev_entity_edge['upper'] # 实体上边
prev_entity_lower = prev_entity_edge['lower'] # 实体下边
# 基础规则始终以当前K线开盘价为基准
# 开仓与反手阈值统一为「当前开盘价 ± 上一根实体/3」
base_open = current_kline['open']
long_trigger = base_open + prev_entity / 3
short_trigger = base_open - prev_entity / 3
long_breakout = long_trigger
short_breakout = short_trigger
# 优化:以下两种情况以当前这根的开盘价作为计算基准
# 1) 上一根阳线 且 当前开盘价 > 上一根收盘价(跳空高开)
# 2) 上一根阴线 且 当前开盘价 < 上一根收盘价(跳空低开)
prev_is_bullish_for_calc = prev_kline['close'] > prev_kline['open']
prev_is_bearish_for_calc = prev_kline['close'] < prev_kline['open']
current_open_above_prev_close = current_kline['open'] > prev_kline['close']
current_open_below_prev_close = current_kline['open'] < prev_kline['close']
use_current_open_as_base = (prev_is_bullish_for_calc and current_open_above_prev_close) or (prev_is_bearish_for_calc and current_open_below_prev_close)
if use_current_open_as_base:
# 以当前K线开盘价为基准计算跳空时用当前开盘价参与计算
calc_lower = current_kline['open']
calc_upper = current_kline['open'] # 同一基准,上下三分之一对称
long_trigger = calc_lower + prev_entity / 3
short_trigger = calc_upper - prev_entity / 3
long_breakout = calc_upper + prev_entity / 3
short_breakout = calc_lower - prev_entity / 3
else:
# 原有计算方式
long_trigger = prev_entity_lower + prev_entity / 3 # 做多触发价 = 实体下边 + 实体/3下三分之一处
short_trigger = prev_entity_upper - prev_entity / 3 # 做空触发价 = 实体上边 - 实体/3上三分之一处
long_breakout = prev_entity_upper + prev_entity / 3 # 做多突破价 = 实体上边 + 实体/3
short_breakout = prev_entity_lower - prev_entity / 3 # 做空突破价 = 实体下边 - 实体/3
# 上一根阴线 + 当前阳线做多形态不按上一根K线上三分之一做空
prev_is_bearish = prev_kline['close'] < prev_kline['open']
current_is_bullish = current_kline['close'] > current_kline['open']
skip_short_by_upper_third = prev_is_bearish and current_is_bullish
# 上一根阳线 + 当前阴线做空形态不按上一根K线下三分之一做多
prev_is_bullish = prev_kline['close'] > prev_kline['open']
current_is_bearish = current_kline['close'] < current_kline['open']
skip_long_by_lower_third = prev_is_bullish and current_is_bearish
if use_current_open_as_base:
if prev_is_bullish_for_calc and current_open_above_prev_close:
logger.info(f"上一根阳线且当前开盘价({current_kline['open']:.2f})>上一根收盘价({prev_kline['close']:.2f}),以当前开盘价为基准计算")
else:
logger.info(f"上一根阴线且当前开盘价({current_kline['open']:.2f})<上一根收盘价({prev_kline['close']:.2f}),以当前开盘价为基准计算")
logger.info(f"当前价格: {current_price:.2f}, 上一根实体: {prev_entity:.4f}")
logger.info(f"上一根实体上边: {prev_entity_upper:.2f}, 下边: {prev_entity_lower:.2f}")
logger.info(f"做多触发价(1/3): {long_trigger:.2f}, 做空触发价(1/3): {short_trigger:.2f}")
logger.info(f"突破做多价(上1/3外): {long_breakout:.2f}, 突破做空价(下1/3外): {short_breakout:.2f}")
if skip_short_by_upper_third:
logger.info("上一根阴线+当前阳线(做多形态),不按上三分之一做空")
if skip_long_by_lower_third:
logger.info("上一根阳线+当前阴线(做空形态),不按下三分之一做多")
logger.info(f"当前K线开盘价: {base_open:.2f}")
logger.info(f"做多触发价(开盘+实体1/3): {long_trigger:.2f}, 做空触发价(开盘-实体1/3): {short_trigger:.2f}")
logger.info(f"开仓做多价: {long_breakout:.2f}, 开仓做空价: {short_breakout:.2f}")
# 无持仓时检查开仓信号
if self.start == 0:
if current_price >= long_breakout and not skip_long_by_lower_third:
if current_price >= long_breakout:
logger.info(
f"触发做多信号!价格 {current_price:.2f} >= 突破价(上1/3) {long_breakout:.2f}"
f"触发做多信号!价格 {current_price:.2f} >= 开仓做多价(开盘+实体1/3) {long_breakout:.2f}"
)
return ('long', long_breakout)
elif current_price <= short_breakout and not skip_short_by_upper_third:
elif current_price <= short_breakout:
logger.info(
f"触发做空信号!价格 {current_price:.2f} <= 突破价(下1/3) {short_breakout:.2f}"
f"触发做空信号!价格 {current_price:.2f} <= 开仓做空价(开盘-实体1/3) {short_breakout:.2f}"
)
return ('short', short_breakout)
# 持仓时检查反手信号
elif self.start == 1: # 持多仓
# 反手条件: 价格跌到上一根K线的上三分之一处做空触发价上一根阴线+当前阳线做多时跳过
if current_price <= short_trigger and not skip_short_by_upper_third:
logger.info(f"持多反手做空!价格 {current_price:.2f} <= 触发价(1/3) {short_trigger:.2f}")
# 反手条件: 价格跌到 当前开盘价-上一根实体/3做空触发价
if current_price <= short_trigger:
logger.info(f"持多反手做空!价格 {current_price:.2f} <= 触发价(开盘-实体1/3) {short_trigger:.2f}")
return ('reverse_short', short_trigger)
elif self.start == -1: # 持空仓
# 反手条件: 价格涨到上一根K线的下三分之一处做多触发价上一根阳线+当前阴线做空时跳过
if current_price >= long_trigger and not skip_long_by_lower_third:
logger.info(f"持空反手做多!价格 {current_price:.2f} >= 触发价(1/3) {long_trigger:.2f}")
# 反手条件: 价格涨到 当前开盘价+上一根实体/3做多触发价
if current_price >= long_trigger:
logger.info(f"持空反手做多!价格 {current_price:.2f} >= 触发价(开盘+实体1/3) {long_trigger:.2f}")
return ('reverse_long', long_trigger)
return None
@@ -703,7 +664,7 @@ class BitmartFuturesTransaction:
page_start = False
try:
# 1. 获取K线数据当前K线=最后一根;上一根=从后往前第一根实体涨幅>0.1%的K线
# 1. 获取K线数据当前K线=最后一根;上一根=从后往前第一根实体涨幅>=min_prev_entity_pct 的K线
formatted = self.get_klines()
if not formatted or len(formatted) < 2:
logger.warning("获取K线失败等待重试...")
@@ -716,11 +677,11 @@ class BitmartFuturesTransaction:
k = formatted[i]
entity = abs(k['close'] - k['open'])
entity_pct = entity / k['open'] * 100 if k['open'] else 0
if entity_pct > self.min_prev_entity_pct:
if entity_pct >= self.min_prev_entity_pct:
prev_kline = k
break
if prev_kline is None:
logger.info(f"没有实体涨幅>{self.min_prev_entity_pct:.3f}%的上一根K线跳过信号检测")
logger.info(f"没有实体涨幅>={self.min_prev_entity_pct:.3f}%的上一根K线跳过信号检测")
time.sleep(0.1)
continue
@@ -892,13 +853,13 @@ class BitmartFuturesTransaction:
sig_type, trigger_price = signal
op_name = {"long": "开多", "short": "开空", "reverse_long": "反手做多", "reverse_short": "反手做空"}.get(sig_type, sig_type)
if sig_type == "long":
open_reason = f"三分之一策略:当前价{current_price:.2f}>=突破做多价{trigger_price:.2f}(实体上边+1/3)"
open_reason = f"三分之一策略:当前价{current_price:.2f}>=开仓做多价{trigger_price:.2f}(当前开盘+上一根实体1/3)"
elif sig_type == "short":
open_reason = f"三分之一策略:当前价{current_price:.2f}<=突破做空价{trigger_price:.2f}(实体下边-1/3)"
open_reason = f"三分之一策略:当前价{current_price:.2f}<=开仓做空价{trigger_price:.2f}(当前开盘-上一根实体1/3)"
elif sig_type == "reverse_long":
open_reason = f"持空反手做多:当前价{current_price:.2f}>=做多触发价{trigger_price:.2f}(1/3)"
open_reason = f"持空反手做多:当前价{current_price:.2f}>=做多触发价{trigger_price:.2f}(当前开盘+上一根实体1/3)"
else:
open_reason = f"持多反手做空:当前价{current_price:.2f}<=做空触发价{trigger_price:.2f}(1/3)"
open_reason = f"持多反手做空:当前价{current_price:.2f}<=做空触发价{trigger_price:.2f}(当前开盘-上一根实体1/3)"
self._write_open_log(op_name, open_reason, current_kline, prev_kline)
logger.success(f"交易执行完成: {signal[0]}, 当前持仓状态: {self.start}")
page_start = True