""" DCA ML Optimizer - Machine Learning DCA Parameter Optimization ================================================================ Phân tích dữ liệu nến lịch sử XAUUSD, tìm khoảng cách DCA + lot tối ưu theo volatility regime, phát hiện pattern "blow-up". Usage: python dca_ml_optimizer.py --data XAUUSD_M5.csv python dca_ml_optimizer.py --data XAUUSD_M5.csv --export-mt5 python dca_ml_optimizer.py --test (chạy với sample data) Output: - ml_params.mqh (hardcoded params cho MQ5) - optimization_log.csv (log chi tiết) Author: Comarai (https://comarai.com) - AI-powered trading optimization """ import argparse import os import sys import csv import json import math from datetime import datetime, timedelta from collections import defaultdict import numpy as np # Try import sklearn, fallback to simple heuristic if not available try: from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import cross_val_score HAS_SKLEARN = True except ImportError: HAS_SKLEARN = False print("[WARN] scikit-learn not installed. Using heuristic optimization.") print(" Install: pip install scikit-learn numpy pandas") # ============================================================================= # CONSTANTS # ============================================================================= PIP_VALUE_XAUUSD = 0.1 # 1 pip = 0.1 cho XAUUSD (2 or 3 digit broker) # Default settings from 2-2-test.set (reference) DEFAULT_DCA_DISTANCE = 10.0 # pips DEFAULT_DCA_DIST_MULTI = 1.2 DEFAULT_LOT = 0.19 DEFAULT_LOT_MULTI = 1.0 # lot cố định DEFAULT_MAX_DCA = 5 DEFAULT_TP_DCA = 50.0 # pips # Regime thresholds (will be refined by ML) ATR_PERCENTILES = [25, 50, 75, 90] # Low, Medium, High, Extreme # ============================================================================= # DATA LOADING # ============================================================================= def load_candle_data(filepath): """Load candle data from CSV exported by MT5. Supports formats: - MT5 default export: Date, Time, Open, High, Low, Close, TickVolume, Volume, Spread - Custom: datetime, open, high, low, close, volume """ candles = [] with open(filepath, 'r', encoding='utf-8-sig') as f: # Detect delimiter first_line = f.readline() f.seek(0) delimiter = '\t' if '\t' in first_line else ',' reader = csv.reader(f, delimiter=delimiter) # Try to detect header header = next(reader) header_lower = [h.strip().lower() for h in header] # Map columns col_map = {} for i, h in enumerate(header_lower): if h in ('date', 'datetime', ''): col_map['date'] = i elif h in ('time', '