Files
trading_bot_v4/cluster/import_results.py
mindesbunister 2993bc8895 feat: Update v9 with optimal parameters from exhaustive sweep + consolidate files
Parameter updates (from 4,096 config sweep analysis):
- flipThreshold: 0.6 → 0.5 (optimal for reversal confirmation)
- adxMin: 18 → 21 (stronger trend filter)
- longPosMax: 85 → 75 (prevent chasing tops)
- shortPosMin: 15 → 20 (catch momentum shorts)
- volMin: 0.7 → 1.0 (stronger conviction requirement)

File consolidation:
- Archived moneyline_v9_ma_gap_clean.pinescript (suboptimal defaults)
- Archived moneyline_v9_test.pinescript (suboptimal defaults, missing MA gap)
- Kept moneyline_v9_ma_gap.pinescript as canonical v9 (optimal + MA gap analysis)

Result: Single v9 file with optimal defaults producing 19.44% returns
over 4 months (194.4% annualized) from sweep validation.
2025-12-01 16:04:42 +01:00

123 lines
4.0 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Import CSV results from workers into exploration.db
"""
import sqlite3
import csv
import json
import sys
from datetime import datetime
def import_results(csv_file, chunk_id, db_path='cluster/exploration.db'):
"""Import results CSV into strategies table"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Read CSV and insert rows
imported = 0
skipped = 0
with open(csv_file, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
# Skip header or invalid rows
if row.get('trades') == '0':
skipped += 1
continue
# Build params JSON
params_json = json.dumps({
'flip_threshold': float(row['flip_threshold']),
'ma_gap': float(row['ma_gap']),
'adx_min': int(row['adx_min']),
'long_pos_max': int(row['long_pos_max']),
'short_pos_min': int(row['short_pos_min']),
'cooldown': int(row['cooldown']),
'position_size': int(row['position_size']),
'tp1_mult': float(row['tp1_mult']),
'tp2_mult': float(row['tp2_mult']),
'sl_mult': float(row['sl_mult']),
'tp1_close_pct': int(row['tp1_close_pct']),
'trailing_mult': float(row['trailing_mult']),
'vol_min': float(row['vol_min']),
'max_bars': int(row['max_bars']),
})
try:
cursor.execute('''
INSERT INTO strategies (
chunk_id, params_json, trades, win_rate,
total_pnl, pnl_per_1k, profit_factor,
max_drawdown, sharpe_ratio
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
chunk_id,
params_json,
int(row['trades']),
float(row['win_rate']),
float(row['total_pnl']),
float(row['pnl_per_1k']),
float(row['profit_factor']),
float(row['max_drawdown']),
float(row['sharpe_ratio'])
))
imported += 1
except Exception as e:
print(f"Error importing row: {e}")
print(f"Row data: {row}")
skipped += 1
conn.commit()
conn.close()
print(f"✅ Imported {imported} strategies from {csv_file}")
print(f"⏭️ Skipped {skipped} rows (0 trades or errors)")
return imported
def update_chunk_status(chunk_id, db_path='cluster/exploration.db'):
"""Mark chunk as completed"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Get completion time from file system or use now
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
cursor.execute('''
UPDATE chunks
SET status='completed', completed_at=?
WHERE id=?
''', (now, chunk_id))
conn.commit()
conn.close()
print(f"✅ Updated chunk {chunk_id} status to completed")
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Usage: python3 import_results.py <csv_file> [chunk_id]")
sys.exit(1)
csv_file = sys.argv[1]
# Extract chunk_id from filename if not provided
if len(sys.argv) >= 3:
chunk_id = sys.argv[2]
else:
# Parse from filename: chunk_v9_chunk_000000_results.csv -> v9_chunk_000000
import os
basename = os.path.basename(csv_file)
chunk_id = basename.replace('chunk_', '').replace('_results.csv', '')
print(f"📥 Importing {csv_file} as chunk {chunk_id}")
count = import_results(csv_file, chunk_id)
if count > 0:
update_chunk_status(chunk_id)
print(f"\n🎉 Import complete! {count} strategies added to database")
else:
print(f"\n⚠️ No strategies imported from {csv_file}")