simple-RL-ONNX / data_fetcher.py
algorembrant's picture
Upload 7 files
13c3b17 verified
import os
import pytz
import numpy as np
import pandas as pd
import ta
import MetaTrader5 as mt5
from datetime import datetime
def fetch_data():
if not mt5.initialize():
print(f"MT5 initialize() failed, error code: {mt5.last_error()}")
return None
symbol = "XAUUSDc"
# Direct M3 fetch (Terminal was likely stalled before)
timeframe = mt5.TIMEFRAME_M3
# Use 2026 dates (updated methodologies)
# Fetching from March 1st to current (approx 19th)
utc_from = datetime(2026, 3, 1)
utc_to = datetime(2026, 3, 19)
print(f"Fetching data for {symbol} on M3 timeframe...")
rates = mt5.copy_rates_range(symbol, timeframe, utc_from, utc_to)
if rates is None or len(rates) == 0:
print(f"Failed to fetch rates for {symbol}, error code: {mt5.last_error()}")
mt5.shutdown()
return None
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
# Ensure standard OHLCV names
df = df[['open', 'high', 'low', 'close', 'tick_volume', 'spread', 'real_volume']]
print(f"Fetched and resampled {len(df)} rows. Calculating 100+ vectorized indicators...")
# Generate 90+ indicators automatically using the 'ta' library
df = ta.add_all_ta_features(df, open="open", high="high", low="low", close="close", volume="tick_volume", fillna=True)
# Add EXTRA indicators to exceed 100 count (approx 110-120 total)
# 1. Rolling statistics (10-step windows)
for col in ['open', 'high', 'low', 'close']:
df[f'{col}_roll_mean_10'] = df[col].rolling(10).mean()
df[f'{col}_roll_std_10'] = df[col].rolling(10).std()
# 2. Lags (1-5)
for i in range(1, 6):
df[f'close_lag_{i}'] = df['close'].shift(i)
# 3. RSI Variants
df['rsi_fast'] = ta.momentum.rsi(df['close'], window=7)
df['rsi_slow'] = ta.momentum.rsi(df['close'], window=21)
# 4. Volatility Helpers
df['atr_custom'] = ta.volatility.average_true_range(df['high'], df['low'], df['close'], window=14)
# Drop rows with NaN from new indicators
df.dropna(inplace=True)
# Drop columns that have all NaNs
df.dropna(axis=1, how='all', inplace=True)
# Drop rows with any NaN values resulting from indicator lookbacks
df.dropna(inplace=True)
output_filename = "XAUUSD_M3_Data.csv"
print(f"Saving {len(df)} clean rows to {output_filename} (Columns: {len(df.columns)})...")
df.to_csv(output_filename)
print("Data extraction and indicator generation complete!")
mt5.shutdown()
if __name__ == "__main__":
fetch_data()