Un EA que funciona solo en prueba visual necesita comprobar de dónde obtiene su decisión: un valor calculado o algo dibujado en el gráfico. Antes de cambiar estrategia, compara versiones, datos y primera diferencia de los registros. El modelo de esta página no ejecuta MT5 ni coloca operaciones; separa número disponible de lectura ausente.

Qué diferencia documenta MetaQuotes

La documentación del tester MQL5 indica que los objetos gráficos no se dibujan fuera de prueba visual y que consultar propiedades de un objeto creado devuelve valores cero durante pruebas u optimización. La limitación descrita no se aplica al modo visual. Es comportamiento documentado, no un experimento realizado aquí sobre tu asesor ni explicación universal de cualquier discrepancia.

Si el programa lee precio de una línea o estado de un botón, registra esa etapa aparte de un indicador o precio. Primero comprueba si existe un valor utilizable en ese modo. Un estado explícito de indisponibilidad permite detener el cálculo, sin aceptar un cero técnico como precio. Ver un gráfico tampoco demuestra que todas las entradas estén listas.

Número y objeto son caminos diferentes

Simulación propia sin trading: declaramos señal numérica 1,1050 y umbral 1,1040. La regla es «señal mayor que umbral». Los valores son hipotéticos, sin cotizaciones o registros de ejecución reales. La señal explícita supera el umbral y la condición es verdadera.

En el camino de objeto ausente, nuestro modelo usa null y no evalúa la comparación. Esto no afirma que las funciones de objetos de MT5 devuelvan null: la plataforma documenta ceros; null es la representación elegida aquí para razonar sobre indisponibilidad. Comprueba función, éxito y datos esperados en el programa real.

Dato ausente no es precio ceroModelo propio sin órdenes: señal 1,1050, umbral 1,1040 y condición estricta mayor que. No son cotizaciones ni un test ejecutado en MT5.EJEMPLO DE CÁLCULONúmero explícito1,1050 > 1,1040Objeto ausentenullSustitución defectuosa0 > 1,1040Petición de operaciónNinguna
Dato ausente no es precio cero. Modelo propio sin órdenes: señal 1,1050, umbral 1,1040 y condición estricta mayor que. No son cotizaciones ni un test ejecutado en MT5.

Conserva ausencia como desconocido. Sustituirla por cero oculta el estado y no diagnostica la causa real del EA.

Número explícito
1,1050 > 1,1040 – Verdadero en el modelo.
Objeto ausente
null – Sin comparación; desconocido.
Sustitución defectuosa
0 > 1,1040 – Falso aparente: transforma ausencia en número.
Petición de operación
Ninguna – La página no ejecuta MT5 ni conecta con cuenta.

Un tercer camino defectuoso sustituye ausencia por cero: 0 > 1,1040 devuelve falso como si existiera una observación normal. Es otro estado. Para la condición opuesta «menor que», ese cero incluso parecería cumplir el criterio aunque la señal explícita 1,1050 no lo haga. Esta comparación inversa se explica aparte; el formulario mantiene únicamente «mayor que».

Prueba el modelo sin conectar una cuenta

Puedes cambiar dos valores positivos y escoger modo supuesto. En modo visual del modelo, el objeto contiene la señal; en no visual queda ausente. La página no lee gráficos, prueba asesores ni genera recomendaciones. Solo compara números declarados y distingue falso de no evaluable.

Separa datos y objeto gráfico

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.

Simula nuestra regla, no una prueba de EA en MT5. Usa números positivos con punto decimal, entre 10⁻⁸ y 10⁸, hasta quince cifras. En el modelo, un objeto sin datos produce null; otra variante defectuosa sustituye cero. No determina la causa del fallo de tu EA.

El contrato del control exige punto decimal, números entre 10⁻⁸ y 10⁸, hasta quince cifras y sin notación exponencial. Usa, por ejemplo, 1.1050 y 1.1040; la prosa conserva coma española. Se ejecuta localmente sin enviar entradas, conectarse a API o cuenta ni guardarlas persistentemente. Permite comprobar, restablecer y descargar TXT; no introduzcas datos personales.

Diagnóstico añadido con umbral fijo 1,1040: señal 1,1050 da verdadero; igual a 1,1040, falso; 1,1030, falso. En los tres casos no visuales el objeto protegido sigue desconocido. En modo visual supuesto, su resultado coincide con el del número. Igualdad no cumple una desigualdad estricta y no resuelve ausencia.

Registra entorno sin enviar órdenes

MQL_TESTER, MQL_VISUAL_MODE y MQL_OPTIMIZATION describen el entorno del programa. TERMINAL_BUILD identifica build del terminal. Registra lecturas reales, sin deducir modo por apariencia de una ventana. Esos datos no acreditan historia o parámetros idénticos entre ejecuciones.

Este EA diagnóstico independiente registra configuración en OnInit y deja OnTick vacío. No envía ni modifica órdenes, calcula señal o gestiona posiciones. Guarda un archivo MQ5 separado, compílalo en MetaEditor y conserva resultado y diario propios. Los nombres de campos del registro son identificadores técnicos que se mantienen para comparar.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

No añadas otro OnInit a un asesor existente ni sustituyas su inicialización con este fragmento. Incorporar un registro requiere preservar su flujo original. La documentación del tester contempla excepción para PrintFormat dentro de OnInit durante optimización; ausencia de mensajes desde otras etapas no prueba que nunca se ejecutaran.

Busca la primera diferencia, no solo el beneficio

Conserva una ficha pareada: modo, versiones de terminal y código, parámetros, símbolo, temporalidad, modelo de ticks, inicio solicitado y real, datos, costes y estado inicial. Guarda archivos de configuración e identificadores. Si cambian, no atribuyas todo a activar o desactivar la ventana. El comparador de manifiestos ayuda a organizar declaraciones, sin verificarlas automáticamente.

Busca primera diferencia de lectura, marca temporal, preparación de indicador, señal, condición o decisión. Anotar «beneficio 120 en vez de 80» no identifica etapa ni causa. Conserva registros originales y añade una tabla pequeña de observaciones comparables; no inventes valores que antes no registraste.

Usa identificador de observación, entrada solicitada, hora o secuencia y estado aceptado. Registrar absolutamente todo sin una clave estable puede ocultar la primera divergencia. Dos precios parecidos no prueban que correspondan al mismo evento. Es una decisión práctica de trazabilidad, sin prometer que el diario descubra automáticamente toda dependencia.

Devuelve valor y disponibilidad por separado

El cálculo debe entregar un valor explícito junto a su estado disponible; la capa gráfica puede dibujarlo. Así, apagar el dibujo no necesita cambiar deliberadamente la fuente de la señal. Comprueba módulo con entradas controladas, incluyendo ausencia e igualdad al umbral.

Quitar esa dependencia aborda una causa posible, pero no garantiza igualdad de la prueba entera: versiones, datos, costes y otras dependencias permanecen. Si careces de código, entrega al autor ficha pareada y primera divergencia documentada. No sustituyas diagnóstico por órdenes reales de prueba. La guía MT4 y MT5 cubre preparación general.

Tres acciones para documentar el fallo

  1. Completa una ficha de ambas ejecuciones con modo, versiones, parámetros, datos y periodo efectivo, conservando archivos originales. Marca condiciones sin confirmar; compartir nombre de asesor no demuestra que todas las entradas y circunstancias de ambas pruebas sean iguales.
  2. Prueba el modelo con señal superior, igual e inferior al umbral y compara resultado numérico con disponibilidad del objeto. Conserva null como ausencia del modelo, sin atribuirlo a una función MT5 ni sustituirlo por un precio cero arbitrario.
  3. Recoge entradas diagnósticas sin órdenes y alinea observaciones por identificador y secuencia. Localiza si primero cambió dato, disponibilidad o condición; entrega esa evidencia al desarrollador antes de modificar varias partes o juzgar una corrección por beneficio final más alto.