From 51c53dceb9dc0a548e974fc742970b46fa26e65a Mon Sep 17 00:00:00 2001 From: ddrwode <34234@3来 34> Date: Tue, 10 Feb 2026 15:28:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=93=88=E5=93=88=E5=93=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bitmart/交易.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/bitmart/交易.py b/bitmart/交易.py index f9c1c27..ad60462 100644 --- a/bitmart/交易.py +++ b/bitmart/交易.py @@ -78,6 +78,7 @@ class BitmartFuturesTransaction: self.take_profit_reentry_threshold_short = None # 止盈平空后,价格 <= 此值则开空(同向) self.optimized_params_file = Path(__file__).resolve().parent / "atr_best_params.json" + self.strategy_log_dir = Path(__file__).resolve().parent # 策略开仓日志目录 self.apply_precomputed_params() self.load_optimized_params() @@ -269,6 +270,33 @@ class BitmartFuturesTransaction: time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") logger.info(f"[止盈日志] 时间={time_str} | 操作={operation} | 原因={reason}") + def _write_open_log(self, operation: str, reason: str, current_kline: dict, prev_kline: dict | None): + """写入策略开仓日志文件:时间、参考的两根K线、操作、开仓原因""" + try: + date_str = datetime.now().strftime("%Y%m%d") + log_file = self.strategy_log_dir / f"strategy_log_{date_str}.txt" + time_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cur = current_kline + cur_line = f"id={cur['id']} open={cur['open']:.2f} high={cur['high']:.2f} low={cur['low']:.2f} close={cur['close']:.2f}" + if prev_kline: + prev = prev_kline + prev_line = f"id={prev['id']} open={prev['open']:.2f} high={prev['high']:.2f} low={prev['low']:.2f} close={prev['close']:.2f}" + else: + prev_line = "(无)" + block = ( + f"\n{'='*60}\n" + f"时间: {time_str}\n" + f"操作: {operation}\n" + f"参考K线:\n 当前K线: {cur_line}\n 上一根K线: {prev_line}\n" + f"开仓原因: {reason}\n" + f"{'='*60}\n" + ) + with open(log_file, "a", encoding="utf-8") as f: + f.write(block) + logger.info(f"已写入开仓日志: {log_file.name}") + except Exception as e: + logger.warning(f"写入开仓日志失败: {e}") + def load_optimized_params(self): """从本地优化结果文件加载参数(可选)。""" try: @@ -701,6 +729,7 @@ class BitmartFuturesTransaction: if self.verify_position_direction(1): self.last_open_time = time.time() self.last_open_kline_id = current_kline_time + self._write_open_log("止盈后同向开多", reason, current_kline, prev_kline) logger.success("止盈后再开多成功") page_start = True else: @@ -742,6 +771,7 @@ class BitmartFuturesTransaction: if self.verify_position_direction(-1): self.last_open_time = time.time() self.last_open_kline_id = current_kline_time + self._write_open_log("止盈后同向开空", reason, current_kline, prev_kline) logger.success("止盈后再开空成功") page_start = True else: @@ -776,6 +806,18 @@ class BitmartFuturesTransaction: if trade_success: if signal[0] in ('reverse_long', 'reverse_short'): self.last_reverse_kline_id = current_kline_time # 本 K 线已反手,本 K 线内不再操作 + # 写入开仓日志:参考的两根K线 + 开仓原因 + 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)" + elif sig_type == "short": + 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)" + else: + 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 else: