fix: add missing random import and ensure cleanup on thread crash

This commit is contained in:
pie
2026-05-11 16:18:25 +01:00
parent 0f5d00e292
commit 5a4c99d0d1
2 changed files with 98 additions and 92 deletions
+7 -2
View File
@@ -62,6 +62,7 @@ def run_ticker_lifecycle(client, yf_ticker, t212_ticker, tz):
logger.info(f"Bot thread started for {yf_ticker} ({t212_ticker}).") logger.info(f"Bot thread started for {yf_ticker} ({t212_ticker}).")
try:
now = datetime.now(tz) now = datetime.now(tz)
target_entry_time = now.replace(hour=9, minute=45, second=0, microsecond=0) target_entry_time = now.replace(hour=9, minute=45, second=0, microsecond=0)
@@ -142,10 +143,14 @@ def run_ticker_lifecycle(client, yf_ticker, t212_ticker, tz):
logger.info(f"Waiting {wait_seconds:.0f} seconds until 11:00 EST forced exit...") logger.info(f"Waiting {wait_seconds:.0f} seconds until 11:00 EST forced exit...")
time.sleep(wait_seconds) time.sleep(wait_seconds)
except Exception as e:
logger.error(f"Unexpected error in {yf_ticker} lifecycle: {e}", exc_info=True)
finally:
# 3. 11:00 EST - Cleanup (with jitter to prevent 429s) # 3. 11:00 EST - Cleanup (with jitter to prevent 429s)
# We put this in finally to ensure it runs even on crash
time.sleep(random.uniform(0.1, 5.0)) time.sleep(random.uniform(0.1, 5.0))
logger.info(f"Time exit reached for {yf_ticker}. Cleaning up.") logger.info(f"Cleanup phase reached for {yf_ticker}.")
if execution.is_in_position: if execution.is_in_position:
exit_price = execution.close_all(t212_ticker) exit_price = execution.close_all(t212_ticker)
if hasattr(execution, 'params') and exit_price > 0: if hasattr(execution, 'params') and exit_price > 0:
@@ -154,7 +159,7 @@ def run_ticker_lifecycle(client, yf_ticker, t212_ticker, tz):
trading_ticker = execution.params.get('trading_ticker', yf_ticker) trading_ticker = execution.params.get('trading_ticker', yf_ticker)
pnl_r = calculate_r_multiple("BUY" if execution.is_etp else execution.params['direction'], final_entry, exit_price, final_sl) pnl_r = calculate_r_multiple("BUY" if execution.is_etp else execution.params['direction'], final_entry, exit_price, final_sl)
record_pnl(yf_ticker, execution.params['direction'], final_entry, exit_price, "11:00 Time Exit", pnl_r, trading_ticker=trading_ticker) record_pnl(yf_ticker, execution.params['direction'], final_entry, exit_price, "Forced Exit (Final)", pnl_r, trading_ticker=trading_ticker)
else: else:
execution.close_all(t212_ticker) execution.close_all(t212_ticker)
+1
View File
@@ -1,6 +1,7 @@
import time import time
import logging import logging
import os import os
import random
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
from src.api.client import Trading212Client from src.api.client import Trading212Client
from src.strategy.inverse_mapping import INVERSE_TICKER_MAP, LEVERAGE_MAP from src.strategy.inverse_mapping import INVERSE_TICKER_MAP, LEVERAGE_MAP