Step 3 y 4 medio preparados. Ha habido una decision es separar en dos step distintos la eleccion de estrategias y luego su optimizacion. A partir de aqui vamos a hacer una refactorizacion quirurgica de los Steps 3 y 4.

Prompt para Char GPT:
Estamos trabajando en un Trading Bot con arquitectura backend/frontend separada.

Stack:
- Backend: FastAPI (Python 3.12)
- Frontend: HTML + Vanilla JS + Tabler UI
- DB: PostgreSQL
- Cache opcional: Redis
- Proyecto estructurado bajo /src
- Carpeta /reports fuera de src

Wizard actual:

Step 1 · Data
Step 2 · Risk & Stops
Step 3 · Strategies (actualmente mezcla validación y optimización)
Step 4 · Optimization (renombrado pero no 100% ajustado aún)

Decisión arquitectónica ya tomada:
- Step 3 será Strategy Validation (parámetros fijos, sin grid)
- Step 4 será Parameter Optimization (grid min/max/step)

Importante:
- Ya he duplicado los archivos para separar Step 3 y Step 4.
- No queremos rehacer desde cero.
- Queremos hacer una refactorización quirúrgica.
- Queremos eliminar lógica de grid del Step 3.
- Queremos mantener infraestructura WF, async jobs, ranking y reporting.

Objetivo de esta sesión:
Refactorizar Step 3 (Validation) de forma limpia y profesional partiendo del código actual.

Reglas:
- No romper Step 4.
- No reescribir todo desde cero.
- Simplificar quirúrgicamente.
- Mantener coherencia de arquitectura.
- Mantener compatibilidad con Step 2 (risk snapshot heredado).
- Mantener generación de PDF.
- Mantener botón Promote to Optimization.

Te adjunto el zip completo de la carpeta src.

Analiza la estructura primero.
No escribas código todavía.
Primero dame:
1. Un diagnóstico estructural.
2. Qué archivos tocar.
3. Qué eliminar.
4. Qué simplificar.
5. Qué mantener.
6. Orden de refactorización seguro.

Después empezaremos la refactorización paso a paso.
Despues empezaremos la refactorizacion paso a paso.
This commit is contained in:
DaM
2026-02-15 17:01:00 +01:00
parent 4365366e7d
commit 547a909965
13 changed files with 2852 additions and 93 deletions

View File

@@ -89,6 +89,10 @@ async function inspectCalibrationRisk() {
const data = await res.json();
console.log("[calibration_risk] inspect response:", data);
if (data.status === "ok" || data.status === "warning") {
persistRiskParametersForStep3();
}
renderRiskResult(payload, data);
// --------------------------------------------------
@@ -189,6 +193,10 @@ async function validateCalibrationRisk() {
const data = await res.json();
console.log("[calibration_risk] inspect response:", data);
if (data.status === "ok" || data.status === "warning") {
persistRiskParametersForStep3();
}
renderRiskResult(payload, data);
// --------------------------------------------------
@@ -698,6 +706,13 @@ function num(id) {
return Number.isFinite(n) ? n : null;
}
function str(id) {
const el = document.getElementById(id);
if (!el) return null;
const v = el.value;
return v === null || v === undefined ? null : String(v);
}
function buildRiskPayload() {
const symbol = localStorage.getItem("calibration.symbol");
const timeframe = localStorage.getItem("calibration.timeframe");
@@ -742,6 +757,34 @@ function buildRiskPayload() {
return payload;
}
function persistRiskParametersForStep3() {
try {
const dataToPersist = {
risk_fraction: num("risk_fraction"),
max_position_fraction: num("max_position_fraction"),
stop_type: str("stop_type"),
stop_fraction: num("stop_fraction"),
atr_period: num("atr_period"),
atr_multiplier: num("atr_multiplier"),
max_drawdown_pct: num("max_drawdown_pct"),
daily_loss_limit_pct: num("daily_loss_limit_pct"),
max_consecutive_losses: num("max_consecutive_losses"),
cooldown_bars: num("cooldown_bars"),
};
Object.entries(dataToPersist).forEach(([key, value]) => {
localStorage.setItem(`calibration.${key}`, value ?? "");
});
console.log("[calibration_risk] Parameters saved for Step 3 ✅");
} catch (err) {
console.error("[calibration_risk] Persist failed ❌", err);
}
}
// =================================================
// INIT
// =================================================