From d81d1dedacb5530690f98832487bd3525cf5fe3b Mon Sep 17 00:00:00 2001 From: BizzleBot Date: Thu, 19 Mar 2026 22:25:40 +0000 Subject: [PATCH] fix: replace unicode chars that break Windows cp1252 encoding --- config/current_config.json | 84 ++++++++++++++++++ .../__pycache__/analyzer.cpython-313.pyc | Bin 0 -> 10236 bytes ml_engine/train_and_backtest.py | 8 +- 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 config/current_config.json create mode 100644 llm_client/__pycache__/analyzer.cpython-313.pyc diff --git a/config/current_config.json b/config/current_config.json new file mode 100644 index 0000000..65d2da6 --- /dev/null +++ b/config/current_config.json @@ -0,0 +1,84 @@ +{ + "model_type": "xgboost", + "features": { + "technical_indicators": [ + "RSI_14", + "RSI_7", + "RSI_21", + "MACD_line", + "MACD_signal", + "MACD_hist", + "BB_upper", + "BB_lower", + "BB_width", + "ATR_14", + "SMA_5", + "SMA_10", + "SMA_20", + "SMA_50", + "SMA_200", + "EMA_5", + "EMA_10", + "EMA_20", + "EMA_50", + "OBV", + "stoch_k", + "stoch_d", + "williams_r", + "CCI_20", + "ROC_10", + "keltner_upper", + "keltner_lower" + ], + "lookback_periods": [ + 3, + 5, + 10, + 20 + ], + "use_volume_features": true, + "use_volatility_features": true, + "use_candle_patterns": true, + "use_lag_features": true, + "lag_periods": [ + 1, + 2, + 3, + 5 + ] + }, + "target": { + "type": "classification", + "direction": "long", + "horizon_candles": 6, + "threshold_pct": 1.0 + }, + "hyperparameters": { + "learning_rate": 0.05, + "max_depth": 6, + "n_estimators": 500, + "subsample": 0.8, + "colsample_bytree": 0.8, + "min_child_weight": 5, + "gamma": 0.1, + "reg_alpha": 0.1, + "reg_lambda": 1.0 + }, + "strategy": { + "entry_threshold": 0.6, + "exit_type": "trailing_stop", + "stop_loss_pct": 2.0, + "take_profit_pct": 4.0, + "trailing_stop_pct": 1.5, + "position_sizing": "confidence_scaled", + "max_position_pct": 100, + "min_confidence_to_trade": 0.55 + }, + "training": { + "walk_forward_windows": 5, + "train_pct": 0.7, + "validation_pct": 0.15, + "test_pct": 0.15 + }, + "timeframe": "4h" +} \ No newline at end of file diff --git a/llm_client/__pycache__/analyzer.cpython-313.pyc b/llm_client/__pycache__/analyzer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e5dfd597c6c73a34fc807898dc07384e5fcf50a GIT binary patch literal 10236 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 R&yF`txZOW@dnf$m{||NWku(4R literal 0 HcmV?d00001 diff --git a/ml_engine/train_and_backtest.py b/ml_engine/train_and_backtest.py index 8853ab2..d856b35 100755 --- a/ml_engine/train_and_backtest.py +++ b/ml_engine/train_and_backtest.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -BTC ML Trading Strategy — Train & Backtest Engine +BTC ML Trading Strategy -- Train & Backtest Engine Self-contained script that runs on the Windows PC with GPU. Usage: @@ -280,7 +280,7 @@ def walk_forward_train_test(df: pd.DataFrame, feature_cols: list, config: dict) try: model.fit(X_train, y_train) except Exception as e: - print(f" Window {w+1}: training failed — {e}", file=sys.stderr) + print(f" Window {w+1}: training failed -- {e}", file=sys.stderr) continue # Get predictions on test set @@ -492,7 +492,7 @@ def compile_results(trades: list, per_window_sharpe: list, # --------------------------------------------------------------------------- def main(): - parser = argparse.ArgumentParser(description="BTC ML Trading — Train & Backtest") + parser = argparse.ArgumentParser(description="BTC ML Trading -- Train & Backtest") parser.add_argument("--config", required=True, help="Path to config JSON") parser.add_argument("--data", required=True, help="Path to OHLCV CSV") parser.add_argument("--output", required=True, help="Path to output results JSON") @@ -505,7 +505,7 @@ def main(): # Load data print(f"Loading data from {args.data}...") df = pd.read_csv(args.data, parse_dates=["timestamp"]) - print(f" {len(df)} rows, {df['timestamp'].iloc[0]} → {df['timestamp'].iloc[-1]}") + print(f" {len(df)} rows, {df['timestamp'].iloc[0]} -> {df['timestamp'].iloc[-1]}") # Compute features print("Computing features...")