diff --git a/main.py b/main.py index 76b67c6..59335c6 100644 --- a/main.py +++ b/main.py @@ -13,6 +13,21 @@ from src.strategy.touch_turn import TouchTurnStrategy from src.execution.manager import ExecutionManager from scripts.find_isa_candidates import find_best_isa_tickers from scripts.backtest import backtest_ticker +import sys + +# Stream redirector to capture print() statements from sub-scripts into the log file +class StreamToLogger: + def __init__(self, logger, log_level=logging.INFO): + self.logger = logger + self.log_level = log_level + self.linebuf = '' + + def write(self, buf): + for line in buf.rstrip().splitlines(): + self.logger.log(self.log_level, line.rstrip()) + + def flush(self): + pass # Force flush handler to ensure bot logs are written to disk immediately class FlushHandler(logging.FileHandler): @@ -24,8 +39,8 @@ class FlushHandler(logging.FileHandler): os.makedirs("logs", exist_ok=True) log_filename = datetime.now().strftime("logs/bot_%Y-%m-%d.log") -# Configure logging to both console and file -file_handler = FlushHandler(log_filename) +# Configure logging +file_handler = FlushHandler(log_filename, mode='a') stream_handler = logging.StreamHandler() logging.basicConfig( @@ -35,11 +50,15 @@ logging.basicConfig( ) logger = logging.getLogger(__name__) -# Force flush helper to ensure bot logs are written to disk before thread exit +# Redirect stdout and stderr +sys.stdout = StreamToLogger(logger, logging.INFO) +sys.stderr = StreamToLogger(logger, logging.ERROR) + def flush_logs(): for handler in logging.getLogger().handlers: handler.flush() + PNL_FILE = "pnl_tracking.csv" def record_pnl(ticker, direction, entry_price, exit_price, reason, pnl_r, trading_ticker=None):