Un asesor puede descargar datos de una API en demo y no recibir respuestas equivalentes en el tester. Antes de culpar al servidor, comprueba si la función está disponible en ese entorno. Descargar el valor actual y asignarlo a decisiones pasadas crea otra prueba, aunque las cotizaciones no cambien.

WebRequest no es un archivo histórico

La documentación MQL5 indica que WebRequest no puede ejecutarse en Strategy Tester. Añadir el endpoint a las URL permitidas del terminal no elimina esa restricción. Distingue función no disponible, problema de red, autorización fallida y respuesta recibida durante operación ordinaria del EA.

Si falta una observación externa, no sustituyas el fallo por cero: cero puede ser un valor legítimo, mientras ausencia significa que no tienes esa entrada. Tampoco basta cambiar HTTP por lectura de archivo si este contiene revisiones que aún no existían al decidir. Define observación, versión, valor y disponibilidad antes de unir señal y descarga.

Dos adaptadores, un significado común

El adaptador en línea interpreta la respuesta del proveedor. El de pruebas selecciona un registro conservado disponible entonces. Ambos deben entregar a la lógica una categoría clara: valor válido, indisponibilidad explícita o error. Esta organización propuesta separa datos, decisiones y ejecución; no constituye un robot completo ni garantiza compatibilidad con cualquier API.

Conserva respuestas originales aparte de registros preparados para test. Registra fuente, versión de esquema, hora de recuperación y evidencia de disponibilidad. El periodo que describe una observación no es la hora en que se conoció. Si solo tienes fecha de vintage, no inventes una hora precisa: una tabla diaria no acredita disponibilidad dentro de ese día.

FRED distingue información sobre el pasado disponible hoy de información conocida en un periodo histórico. Es un ejemplo de datos versionados, no API universal de forex. Su fecha de vintage tampoco aporta automáticamente hora UTC de publicación. Comprueba la cronología del proveedor antes de construir entradas intradía.

FileOpen trabaja dentro de áreas definidas. Durante pruebas, una ruta relativa puede corresponder al directorio del agente y no al terminal ordinario; FILE_COMMON tiene otro alcance. Verifica apertura, lectura y contenido. Un archivo ausente debe producir indisponibilidad reconocida, no una tabla vacía tratada como historia completa.

La versión disponible entonces

Historia ficticia de GDP-model el 1 de octubre de 2026, sin relación con publicaciones reales de PIB ni un endpoint. Todas las horas son UTC. availableAt declara cuándo el modelo puede acceder al registro; no determina momento de ejecución de una orden.

A las 12:00 aparece revisión initial con texto numérico «1.0»; a las 13:00, revised con «1.4»; a las 14:00, unavailable con null. A las 12:30 se elige 1.0; a las 13:30, 1.4; a las 14:30 el registro más reciente elegible es null y no hay valor disponible. No se recupera automáticamente el 1.4 anterior.

Una revisión posterior no cambia el conocimiento anteriorGDP-model ficticio del 1 de octubre de 2026. Marcas UTC declaradas; no son publicaciones reales ni momentos de ejecución.EJEMPLO DE CÁLCULODisponible a las 12:00initial: «1.0»Disponible a las 13:00revised: «1.4»Disponible a las 14:00unavailable: nullLímite de selecciónavailableAt ≤ decisionAt
Una revisión posterior no cambia el conocimiento anterior. GDP-model ficticio del 1 de octubre de 2026. Marcas UTC declaradas; no son publicaciones reales ni momentos de ejecución.

La última versión elegible se conserva incluso si es null. No se sustituye por cero ni por una lectura anterior.

Disponible a las 12:00
initial: «1.0» – A las 12:30 se selecciona 1.0.
Disponible a las 13:00
revised: «1.4» – A las 13:30 se selecciona 1.4.
Disponible a las 14:00
unavailable: null – A las 14:30 no hay valor disponible.
Límite de selección
availableAt ≤ decisionAt – Declaraciones a comprobar contra la procedencia real.

Una regla ficticia que exige valor superior a 1,2 sería falsa a las 12:30. Introducir la revisión posterior 1,4 invertiría esa decisión. El ejemplo examina disponibilidad informativa, sin medir rentabilidad. La herramienta selecciona un registro; no calcula una señal de trading ni un rendimiento.

Si tu estrategia conserva el último valor conocido cuando falla otro, diseña esa política aparte, con antigüedad máxima y motivo de ausencia definidos previamente. Nuestro null explícito bloquea evaluar una señal nueva. Añadir recuperación retrospectivamente porque mejora el resultado cambia la prueba.

Qué puedes comprobar en el reproductor local

Pega un objeto JSON con version numérica 1 y array events. Cada evento contiene exactamente availableAt, observation, value y revision. Los nombres forman el contrato y se conservan sin traducir. availableAt exige YYYY-MM-DDTHH: mm: ssZ, sin fracciones de segundo ni otros desfases. observation y revision son cadenas, no contadores cronológicos.

value es una cadena numérica con punto decimal o null, sin convertirla a Number. Por eso el ejemplo técnico conserva «1.0» y «1.4», aunque la explicación española use coma. Límites: de uno a doscientos eventos y 64 KiB por JSON; observation y value admiten hasta 128 caracteres, revision hasta 64. Los límites generales son ocho niveles y dos mil valores.

Reproduce la información disponible al decidir

El ejemplo didáctico funciona localmente en tu navegador: no conecta con cuentas o API, no envía tus entradas ni las guarda de forma persistente. No introduzcas contraseñas ni datos personales.

Formato y límites del modelo

version: 1; events: entre uno y doscientos objetos con exactamente los campos availableAt, observation, value, revision. availableAt: YYYY-MM-DDTHH:mm:ssZ. observation: cadena de hasta 128 caracteres; revision: cadena de hasta 64 caracteres; value: cadena numérica con punto decimal (hasta 128 caracteres), o null. Ausencia no significa cero.

Se selecciona la última versión cuyo availableAt no supera el momento de decisión. Dos registros con la misma observation y availableAt son ambiguos y bloquean el análisis. Límites JSON: 64 KiB, ocho niveles, dos mil valores. Las horas son declaraciones: la página no verifica la publicación real.

Introduce decisionAt por separado en el mismo formato UTC. Se selecciona, para cada observación, la versión más reciente cuyo availableAt no supere esa hora. Antes del primer registro no existe valor disponible. Dos registros con igual observation y availableAt son ambiguos y bloquean análisis; ordenarlos de otra manera en el texto no resuelve esa contradicción.

Funciona sobre entradas pegadas en tu navegador: no descarga publicaciones, conecta a cuenta, envía entradas ni las guarda persistentemente. Puedes comprobar, restablecer y descargar resultado TXT. No introduzcas credenciales o datos personales. Sin JavaScript quedan explicación y ejemplos, sin enviar el formulario como alternativa.

Límites temporales, cero y trazabilidad

Diagnóstico añadido: 12:59:59 sigue seleccionando 1.0; un segundo después, a las 13:00:00, selecciona 1.4. El límite incluye la hora declarada. Una selección correcta sobre horas inventadas no acredita el archivo real. Si atribuyes a una revisión posterior la fecha inicial, el algoritmo reproduce ese supuesto erróneo.

Otro caso independiente añade a las 15:00 un registro de GDP-model con value «0» y revision cero-valido. A las 15:00 hay un valor disponible igual a cero: no está bloqueado por ausencia. Una regla superior a 1,2 sería falsa, pero «falsa con datos» y «no evaluable por null» son estados distintos. El formulario selecciona el registro; la comparación de señal se explica aquí por separado.

En pruebas paralelas utiliza una copia fija de datos, sin sobrescribirla con respuesta en vivo. Los agentes tienen entornos y archivos propios. Conserva dataset real o hash vinculado, no solo nombre del endpoint, en el manifiesto de ejecución.

La guía de backtesting Python desarrolla uniones temporales. Reproducir datos no reproduce ejecución: Bid, Ask, cargos, cantidad y respuestas de servidor siguen separados. Comienza trazando unas decisiones sin operar antes de atribuir diferencias a la estrategia. Datos válidos y una selección correcta no demuestran ventaja futura.

Tres comprobaciones antes de juzgar resultados

  1. Define contrato de datos y separa adaptadores en línea y sin conexión, conservando respuestas originales y evidencia temporal. Marca versiones históricas ausentes como límite; nunca asignes la respuesta actual a una fecha anterior para presentarla como conocimiento archivado.
  2. Traza una observación antes del primer registro, entre publicación y revisión y después de null, además del límite exacto y un cero válido. Compara selección esperada con resultado y resuelve marcas temporales ambiguas antes de ampliar la prueba.
  3. Confirma qué archivo lee el agente y cómo representa ausencia, conserva su versión con informe y registra entradas seleccionadas. Después comprueba señales, precios, costes y estado de posiciones por separado; un replay correcto no valida automáticamente la totalidad del backtest.