Fix empty recommend list and CTP premarket auto-connect.
Correct main_code order in product refresh, refresh on CTP connect, and limit reconnect to trading or premarket windows. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+31
-19
@@ -13,7 +13,7 @@ import time
|
||||
from typing import Callable
|
||||
|
||||
from ctp_settings import is_ctp_auto_connect_enabled
|
||||
from market_sessions import in_premarket_connect_window
|
||||
from market_sessions import in_premarket_connect_window, is_trading_session
|
||||
from vnpy_bridge import ctp_start_connect, ctp_status
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -22,6 +22,13 @@ CHECK_INTERVAL_SEC = 60
|
||||
DEFAULT_MINUTES_BEFORE = 30
|
||||
|
||||
|
||||
def premarket_minutes_before() -> int:
|
||||
try:
|
||||
return max(5, int(os.getenv("CTP_PREMARKET_MINUTES", str(DEFAULT_MINUTES_BEFORE))))
|
||||
except (TypeError, ValueError):
|
||||
return DEFAULT_MINUTES_BEFORE
|
||||
|
||||
|
||||
def _premarket_enabled() -> bool:
|
||||
return (os.getenv("CTP_PREMARKET_CONNECT", "true") or "true").strip().lower() in (
|
||||
"1",
|
||||
@@ -30,11 +37,14 @@ def _premarket_enabled() -> bool:
|
||||
)
|
||||
|
||||
|
||||
def _minutes_before_open() -> int:
|
||||
try:
|
||||
return max(5, int(os.getenv("CTP_PREMARKET_MINUTES", str(DEFAULT_MINUTES_BEFORE))))
|
||||
except (TypeError, ValueError):
|
||||
return DEFAULT_MINUTES_BEFORE
|
||||
def should_auto_connect_now(*, minutes_before: int | None = None) -> bool:
|
||||
"""交易时段内,或距下一段开盘 <= minutes_before 且尚未开盘。"""
|
||||
mins = premarket_minutes_before() if minutes_before is None else minutes_before
|
||||
if is_trading_session():
|
||||
return True
|
||||
if not _premarket_enabled():
|
||||
return False
|
||||
return in_premarket_connect_window(minutes_before=mins)
|
||||
|
||||
|
||||
def start_ctp_premarket_connect_worker(
|
||||
@@ -48,17 +58,12 @@ def start_ctp_premarket_connect_worker(
|
||||
def _loop() -> None:
|
||||
time.sleep(10)
|
||||
while True:
|
||||
sleep_sec = max(30, interval)
|
||||
try:
|
||||
gs = get_setting_fn
|
||||
if gs is None:
|
||||
from fee_specs import get_setting as gs
|
||||
if (
|
||||
is_ctp_auto_connect_enabled(gs)
|
||||
and _premarket_enabled()
|
||||
and in_premarket_connect_window(
|
||||
minutes_before=_minutes_before_open(),
|
||||
)
|
||||
):
|
||||
if is_ctp_auto_connect_enabled(gs) and should_auto_connect_now():
|
||||
mode = get_mode_fn()
|
||||
st = ctp_status(mode)
|
||||
if (
|
||||
@@ -68,13 +73,20 @@ def start_ctp_premarket_connect_worker(
|
||||
):
|
||||
info = ctp_start_connect(mode, force=False)
|
||||
if info.get("started"):
|
||||
logger.info(
|
||||
"盘前自动连接 CTP [%s](开盘前 %d 分钟)",
|
||||
mode,
|
||||
_minutes_before_open(),
|
||||
)
|
||||
if is_trading_session():
|
||||
logger.info("交易时段内自动连接 CTP [%s]", mode)
|
||||
else:
|
||||
logger.info(
|
||||
"盘前自动连接 CTP [%s](开盘前 %d 分钟)",
|
||||
mode,
|
||||
premarket_minutes_before(),
|
||||
)
|
||||
if not is_trading_session() and in_premarket_connect_window(
|
||||
minutes_before=premarket_minutes_before(),
|
||||
):
|
||||
sleep_sec = 30
|
||||
except Exception as exc:
|
||||
logger.warning("CTP premarket connect worker: %s", exc)
|
||||
time.sleep(max(30, interval))
|
||||
time.sleep(sleep_sec)
|
||||
|
||||
threading.Thread(target=_loop, daemon=True, name="ctp-premarket-connect").start()
|
||||
|
||||
Reference in New Issue
Block a user