diff --git a/.gitignore b/.gitignore index 652d250..3ce5d29 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ optimization_results_*.json .ea.lock .hermes/ realtime_trades_* +.optimizer.lock diff --git a/scripts/daily_optimize.py b/scripts/daily_optimize.py index f5f3a41..fa78cd2 100755 --- a/scripts/daily_optimize.py +++ b/scripts/daily_optimize.py @@ -267,6 +267,17 @@ def restart_ea(): def main(): + # ★ 单实例锁:防止 cron 每20分钟时上一轮还没跑完 + import fcntl + lock_path = PROJECT_DIR / ".optimizer.lock" + lock_fd = os.open(str(lock_path), os.O_CREAT | os.O_RDWR, 0o644) + try: + fcntl.flock(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError: + logger.warning("⚠️ 上一轮优化仍在运行,跳过本轮") + os.close(lock_fd) + return 0 + logger.info("=" * 60) logger.info("📅 每日自动优化启动") logger.info(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")