변경 사항 ---- - _test_kiwoom_condition_list.py: 키움 웹소켓 조건검색 '목록조회' 기능을 단독으로 테스트하는 스크립트 추가 - _test_kiwoom_condition_realtime.py: 'momentum' 조건식을 실시간으로 등록하고 초기 매칭 종목 리스트 및 실시간 편입/이탈을 수신하는 테스트 스크립트 추가 - _verify_columnar_bitid.py, _verify_shared_e2e_breakout.py, _verify_shared_e2e.py: 공유 메모리 및 dict 간의 데이터 일관성을 검증하는 테스트 추가 영향 ---- - 신규 테스트 스크립트 추가로 키움 웹소켓 API의 기능 검증 및 안정성을 높임 - 기존 기능에 대한 영향 없음 Co-authored-by: Cursor <cursoragent@cursor.com>
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
"""
|
|
kis_trader/backtest/backtest_web.py — 기존 ``backtest_web.py`` 재사용 엔트리.
|
|
|
|
실행 예:
|
|
python -m kis_trader.backtest.backtest_web
|
|
|
|
내부에서 프로젝트 루트의 ``backtest_web.py`` 를 import 해서 main 을 호출한다.
|
|
전략별 엔진(scalping / momentum / tail / breakout)이 실매와 동일 판정 함수를 공유한다.
|
|
체결·유니버스·틱 폴링 차이로 거래 내역은 1:1 일치하지 않을 수 있다.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
|
|
def _ensure_root_on_path() -> None:
|
|
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
if root not in sys.path:
|
|
sys.path.insert(0, root)
|
|
|
|
|
|
def main() -> None:
|
|
_ensure_root_on_path()
|
|
import backtest_web as _bw # type: ignore
|
|
|
|
# 1순위: 루트 backtest_web 에 main() 이 정의되어 있으면 그대로 호출
|
|
fn = getattr(_bw, "main", None)
|
|
if callable(fn):
|
|
fn()
|
|
return
|
|
|
|
# 2순위: Flask `app` 객체가 있으면 직접 기동 (원본의 `if __name__ == "__main__":`
|
|
# 블록은 import 경로에서 동작하지 않으므로 여기서 명시적으로 실행)
|
|
app = getattr(_bw, "app", None)
|
|
if app is not None and hasattr(app, "run"):
|
|
host = os.environ.get("BT_WEB_HOST", "0.0.0.0")
|
|
port = int(os.environ.get("BT_WEB_PORT", "5050"))
|
|
print(f"🚀 Backtest Web 기동: http://{host}:{port}", flush=True)
|
|
app.run(host=host, port=port, debug=False)
|
|
return
|
|
|
|
# 3순위(fallback): 스크립트 스타일 파일을 `__main__` 으로 재실행
|
|
import runpy
|
|
runpy.run_path(_bw.__file__, run_name="__main__")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|