/
eugenesic
/
MetaStream-Flask
Обзор
Документация
Войти
/
eugenesic
/
MetaStream-Flask
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
chart/app.py
102 строки
3 KB
Evgenii Zagorodskikh
refresh
04 дек 2025, 12:34
04 дек 2025, 12:34
e3f1346
Код
Авторство
О чём код?
""" chart/app.py - Browser-based chart viewer for MT5 data. Independent module: reads CSVs from data/csv and visualizes with Plotly. """ import os import pandas as pd from flask import Flask, render_template, request, jsonify app = Flask(__name__, template_folder='templates', static_folder='static') BASE_CSV_FOLDER = os.path.join(os.path.dirname(__file__), '..', 'data', 'csv') def get_available_symbols(): """List all symbols (folders) in data/csv""" if not os.path.exists(BASE_CSV_FOLDER): return [] symbols = [d.upper() for d in os.listdir(BASE_CSV_FOLDER) if os.path.isdir(os.path.join(BASE_CSV_FOLDER, d))] return sorted(symbols) def get_available_timeframes(symbol): """List all timeframes (CSV files) for a symbol""" symbol_folder = os.path.join(BASE_CSV_FOLDER, symbol.lower()) if not os.path.exists(symbol_folder): return [] files = os.listdir(symbol_folder) timeframes = [] for f in sorted(files): if f.endswith('.csv'): # Extract TF from EURUSD_M5.csv -> M5 parts = f.replace('.csv', '').split('_') if len(parts) == 2: timeframes.append(parts[1]) return timeframes def load_csv_data(symbol, timeframe): """Load CSV data for a symbol/timeframe pair""" csv_path = os.path.join(BASE_CSV_FOLDER, symbol.lower(), f'{symbol}_{timeframe}.csv') if not os.path.exists(csv_path): return None try: df = pd.read_csv(csv_path) if df.empty: return None df['time'] = pd.to_datetime(df['time']) return df.sort_values('time') except Exception as e: print(f"Error loading {csv_path}: {e}") return None @app.route('/') def index(): """Main page""" symbols = get_available_symbols() default_symbol = symbols[0] if symbols else 'EURUSD' default_timeframes = get_available_timeframes(default_symbol) default_tf = default_timeframes[0] if default_timeframes else 'M1' return render_template('chart.html', symbols=symbols, default_symbol=default_symbol, default_timeframes=default_timeframes, default_tf=default_tf) @app.route('/api/symbols') def api_symbols(): """Get all available symbols""" return jsonify(get_available_symbols()) @app.route('/api/timeframes/<symbol>') def api_timeframes(symbol): """Get timeframes for a symbol""" return jsonify(get_available_timeframes(symbol)) @app.route('/api/data/<symbol>/<timeframe>') def api_data(symbol, timeframe): """Get chart data (JSON) for symbol/timeframe""" df = load_csv_data(symbol, timeframe) if df is None: return jsonify({'error': 'No data'}), 404 # Return as JSON for Plotly return jsonify({ 'time': df['time'].dt.strftime('%Y-%m-%d %H:%M:%S').tolist(), 'open': df['open'].tolist(), 'high': df['high'].tolist(), 'low': df['low'].tolist(), 'close': df['close'].tolist(), 'volume': df['tick_volume'].tolist(), }) if __name__ == '__main__': app.run(debug=True, port=5000)