diegobeyl/backtesting
2
1#!/usr/bin/env python32"""3Test rápido para validar que el timeframe validator funciona correctamente4Prueba los límites que el usuario mencionó:5- 1h → máximo 1 mes6- 4h → máximo 3 meses 7- 1d → máximo 10 años8"""9 10from datetime import datetime, timedelta11from backtesting_app.core.validator import DataValidator, LIMIT_DESCRIPTIONS12 13print("=" * 80)14print("TEST DE VALIDACIÓN DE TIMEFRAME Y PERÍODO")15print("=" * 80)16 17test_cases = [18 # (symbol, timeframe, días, debería_pasar, descripción)19 ('BTC-USDT', '1h', 30, True, "1h por 1 mes - DEBERÍA PASAR"),20 ('BTC-USDT', '1h', 90, True, "1h por 3 meses - DEBERÍA PASAR"),21 ('BTC-USDT', '1h', 180, True, "1h por 6 meses - DEBERÍA PASAR"),22 ('BTC-USDT', '1h', 365, True, "1h por 1 año - DEBERÍA PASAR"),23 ('BTC-USDT', '1h', 365*2, True, "1h por 2 años - DEBERÍA PASAR"),24 ('BTC-USDT', '1h', 365*3, True, "1h por 3 años - DEBERÍA PASAR (LÍMITE)"),25 ('BTC-USDT', '1h', 365*4, False, "1h por 4 años - DEBERÍA FALLAR ❌"),26 ('BTC-USDT', '1h', 365*10, False, "1h por 10 años - DEBERÍA FALLAR ❌"),27 28 ('BTC-USDT', '4h', 90, True, "4h por 3 meses - DEBERÍA PASAR"),29 ('BTC-USDT', '4h', 365*3, True, "4h por 3 años - DEBERÍA PASAR"),30 ('BTC-USDT', '4h', 365*10, True, "4h por 10 años - DEBERÍA PASAR (LÍMITE)"),31 ('BTC-USDT', '4h', 365*11, False, "4h por 11 años - DEBERÍA FALLAR ❌"),32 33 ('BTC-USDT', '1d', 365*50, True, "1d por 50 años - DEBERÍA PASAR"),34]35 36passed = 037failed = 038 39for symbol, timeframe, days, should_pass, description in test_cases:40 start = datetime.now() - timedelta(days=days)41 end = datetime.now()42 43 is_valid, error = DataValidator.validate_request(symbol, timeframe, start, end)44 45 # Verificar que el resultado sea el esperado46 success = is_valid == should_pass47 48 status = "✅ PASS" if success else "❌ FAIL"49 passed += success50 failed += not success51 52 print(f"\n{status}: {description}")53 print(f" Resultado: {'VÁLIDO ✅' if is_valid else 'INVÁLIDO ❌'}")54 55 if not success:56 print(f" ⚠️ Se esperaba: {'VÁLIDO' if should_pass else 'INVÁLIDO'}")57 58 # Mostrar información del validador59 info = DataValidator.get_download_info(symbol, timeframe, start, end)60 print(f" Días: {info['days']}, Años: {info['years']}, Velas: {info['candles']:,}/{info['max_candles']:,} ({info['usage_percent']:.1f}%)")61 62print("\n" + "=" * 80)63print(f"RESUMEN: {passed} PASADOS, {failed} FALLIDOS")64print("=" * 80)65 66if failed == 0:67 print("✅ ¡TODOS LOS TESTS PASARON!")68else:69 print(f"❌ {failed} tests fallaron")70 71# Mostrar límites configurados72print("\n" + "=" * 80)73print("LÍMITES CONFIGURADOS POR TIMEFRAME:")74print("=" * 80)75for tf in ['1m', '5m', '15m', '30m', '1h', '4h', '1d', '1wk', '1mo']:76 desc = LIMIT_DESCRIPTIONS.get(tf, {})77 max_days = desc.get('max_days', 'N/A')78 print(f" {tf:5} → máximo {max_days:6.0f} días ({max_days/365:.1f} años) - {desc.get('reason', 'N/A')}")79 