import sys def restore_optuna_web_jobs(): path = "/home/hoon/kis_bot/kis_trader/backtest/optuna_web_jobs.py" with open(path, "r") as f: content = f.read() # Restore mode target1 = ' "web_cmd_full": m.get("web_cmd_full") or "",\n "join_study":' repl1 = ' "web_cmd_full": m.get("web_cmd_full") or "",\n "mode": m.get("mode"),\n "join_study":' content = content.replace(target1, repl1) # Restore fields target2 = ' "source": m.get("source"),\n }' repl2 = ' "source": m.get("source"),\n "sort_by": m.get("sort_by"),\n "symbol": m.get("symbol"),\n "universe_history_source": m.get("universe_history_source"),\n "candle_source": m.get("candle_source"),\n "tick_source": m.get("tick_source"),\n "ob_source": m.get("ob_source"),\n "tail_entry_modes": m.get("tail_entry_modes"),\n "breakout_sl_modes": m.get("breakout_sl_modes"),\n "breakout_ob_modes": m.get("breakout_ob_modes"),\n "tpe_includes_orderbook": (m.get("result_summary") or {}).get("tpe_includes_orderbook"),\n }' content = content.replace(target2, repl2) # Restore sort_by target3 = ' "mode": mode,\n "start": start,' repl3 = ' "mode": mode,\n "sort_by": data.get("sort_by") or meta.get("sort_by"),\n "start": start,' content = content.replace(target3, repl3) with open(path, "w") as f: f.write(content) print("optuna_web_jobs.py restored") def restore_backtest_web(): path = "/home/hoon/kis_bot/backtest_web.py" with open(path, "r") as f: content = f.read() target1 = ' db.close()\n\n\n@app.route("/api/feed_collect_stats", methods=["GET"])' repl1 = ' db.close()\n\n\n_feed_stats_cache = {}\n\n@app.route("/api/feed_collect_stats", methods=["GET"])' content = content.replace(target1, repl1) target2 = ' from kis_trader.web.feed_collect_stats import build_feed_collect_stats\n\n day = (request.args.get("date") or request.args.get("day") or "").strip()[:10]' repl2 = ' from kis_trader.web.feed_collect_stats import build_feed_collect_stats\n import time\n\n day = (request.args.get("date") or request.args.get("day") or "").strip()[:10]' content = content.replace(target2, repl2) target3 = ' heavy = heavy_raw in ("1", "true", "yes", "y", "on")\n db = _db()\n try:\n payload = build_feed_collect_stats(db, day=day, heavy=heavy)\n return jsonify({"ok": True, **payload})' repl3 = ' heavy = heavy_raw in ("1", "true", "yes", "y", "on")\n \n cache_key = f"{day}_{heavy}"\n now = time.time()\n \n if cache_key in _feed_stats_cache:\n cached = _feed_stats_cache[cache_key]\n is_today = (day.replace("-", "") == _default_trading_day_ymd().replace("-", ""))\n if not is_today or (now - cached["ts"] < 60):\n return jsonify({"ok": True, **cached["data"]})\n\n db = _db()\n try:\n payload = build_feed_collect_stats(db, day=day, heavy=heavy)\n _feed_stats_cache[cache_key] = {"ts": now, "data": payload}\n return jsonify({"ok": True, **payload})' content = content.replace(target3, repl3) target4 = 'def api_optuna_jobs():' topn = '''@app.route("/api/optuna/topn/", methods=["GET"]) def api_optuna_topn(job_id: str): from kis_trader.backtest import optuna_web_jobs as owj meta = owj.load_job(job_id) if not meta: return jsonify({"ok": False, "error": "없는 job_id"}), 404 rs = meta.get("result_summary") or {} return jsonify({ "ok": True, "job_id": job_id, "label": meta.get("label") or meta.get("strategy") or job_id, "strategy": meta.get("strategy"), "sort_by": meta.get("sort_by"), "mode": meta.get("mode"), "start": meta.get("start"), "end": meta.get("end"), "study_short": meta.get("study_short"), "tpe_includes_orderbook": rs.get("tpe_includes_orderbook"), "period_info": meta.get("period_info"), "top5_gated": rs.get("top5_gated") or [], "n_trading_days": rs.get("n_trading_days") }) ''' content = content.replace(target4, topn + target4) with open(path, "w") as f: f.write(content) print("backtest_web.py restored") restore_optuna_web_jobs() restore_backtest_web()