Tu propio EA#
VisionAlertEA no es el único que puede pedir análisis. Cualquier EA o indicador, de MT4 o MT5, puede mandar un trabajo con lo mínimo: velas y, si los tiene, niveles. Lo que falte (ATR, tolerancia, patrones, capturas) lo completa el servicio con tu estrategia, y el resto del flujo es el de siempre: visión, Jev, decisión, plan, Telegram y Mini App.
Tu EA decide qué manda y cuándo. El servicio decide qué hacer con ello.
Dos clases de trabajo#
| Trabajo | Qué manda tu EA | Quién decide qué se analiza |
|---|---|---|
bars ("kind": "bars") |
Velas y todos los niveles del par, al cierre de cada vela | El servicio, con las reglas del gatillo. Es lo que hace VisionAlertEA |
Con levels |
Las zonas que tu EA ya eligió (o bias para el gráfico entero) |
Tu EA. El servicio analiza directamente |
Si no tienes una lógica propia para elegir zonas, usa bars: así cambias el gatillo en la Mini App sin tocar el EA.
Un trabajo bars#
{"format_version": 2, "kind": "bars", "source": "mi_ea",
"id": "mi_ea_EURUSD_H1_20260106_1500", "symbol": "EURUSD", "timeframe": "H1",
"context_timeframe": "H4", "bar_time": "2026.01.06 15:00", "digits": 5,
"candles": ["… al menos 30 velas, de la más antigua a la última cerrada …"],
"context_candles": ["… velas de H4, solo para la segunda captura …"],
"all_levels": [
{"name": "demanda", "intent": "BUY", "entry": "STOP,LIMIT", "type": "rectangle",
"zone_low": 1.0872, "zone_high": 1.0879, "origin_tf": "H4", "origin_time": "2026.01.02 08:00",
"instruction": "espero rechazo", "tfs": "M15,H1"},
{"name": "techo", "intent": "CLAVE", "price": 1.105}]}
candles: al menos 30, como[hora, open, high, low, close]o{time, open, high, low, close}. La hora como la escribe MetaTrader ("2026.01.06 15:00", hora del servidor) o en ISO 8601.all_levels: todos los niveles del par ya proyectados al precio de la vela cerrada (las líneas inclinadas también), con su filtrotfs. De aquí sale el objetivo cuandotp_ruleesnext_level.- Sin niveles también vale: entonces solo disparan las reglas que analizan el gráfico entero.
- Si ninguna regla dispara, el servicio borra el trabajo y deja el motivo en
triggers.jsonl.
Un trabajo con levels#
{"format_version": 2, "source": "mi_ea", "id": "mi_ea_GBPUSD_M15_20260106_1500",
"symbol": "GBPUSD", "timeframe": "M15", "bar_time": "2026.01.06 15:00", "digits": 5,
"levels": [{"name": "demanda", "intent": "BUY", "zone_low": 1.2610, "zone_high": 1.2618, "entry": "STOP"}],
"candles": ["… al menos 30 velas …"]}
Sin levels, con "bias": "SELL" y una instruction, la IA analiza el gráfico entero. Las zonas CLAVE nunca se analizan: si tras quitarlas no queda ninguna BUY o SELL, el trabajo se rechaza.
Los campos obligatorios son id (único, letras, números, ., #, _, -), symbol, timeframe, bar_time (la última vela cerrada), digits y candles. La tabla completa está en docs/CONTRATO_EA.md del repositorio.
Dos vías de entrega#
Por archivo#
Para un EA en el mismo VPS que el servicio:
- Escribe
Files\VisionAlert\queue\<id>.tmpy renómbralo a<id>.json, para que el servicio nunca lea un JSON a medias. mt4_files_dir(ojobs_dir) enconfig.yamlapunta a esa carpeta.- El trabajo pasa a
done\<día>\con sus capturas. Si se rechaza, queda como<id>.errorcon el motivo en el registro y endecisions.jsonl.
Por HTTP#
Para un MT5, otra máquina u otro programa. Necesita la Mini App activa (es su servidor) y EA_TOKEN en el .env del servicio.
POST https://app.tudominio.com/api/jobs
Content-Type: application/json
X-EA-Token: <tu EA_TOKEN>
{ …el trabajo… }
| Respuesta | Significado |
|---|---|
202 |
Encolado. Se valida al procesarlo; el resultado llega por Telegram y queda en decisions.jsonl |
400 |
JSON ilegible o sin id |
401 |
Falta el token o no coincide |
409 |
Ya hay un trabajo con ese id en la cola |
413 |
Más de 2 MB (o una captura de más de 3 MB) |
503 |
El servicio no tiene cola: configura mt4_files_dir o jobs_dir |
En MetaTrader, permite la URL en Herramientas › Opciones › Asesores Expertos › Permitir WebRequest. Sin eso, WebRequest devuelve -1.
La plantilla: ea_minimo#
tools/ea_minimo.mq4 y .mq5 (con el cuerpo común en ea_minimo.mqh) son un EA de ejemplo de unas 150 líneas:
- Al cierre de cada vela manda un trabajo
barsconcandles(120 por defecto),context_candlessi ponesInpContextTfy, enall_levels, todos los rectángulos y líneas del gráfico con el formato de ZoneDrawer. - Con
InpUrlvacío escribe enFiles\VisionAlert\queue\; con una URL, hacePOST /api/jobsconInpToken.
Instalación: copia ea_minimo.mq4 (o .mq5) y ea_minimo.mqh en Experts\, con TraderKit en Include\, compila y ponlo en el gráfico que quieras vigilar. Para que tu EA decida él, cambia kind: "bars" por levels (o bias).