Los 12 errores que comete una IA escribiendo MQL5 y Pine Script
Si has pedido un Expert Advisor a un modelo de lenguaje y MetaEditor te ha devuelto una pared roja, no es mala suerte: son casi siempre los mismos doce fallos. Esta lista no está escrita de memoria ni recopilada de foros — cada entrada salió de generar el código y compilarlo de verdad, los de MQL5 con MetaEditor y los de Pine en el editor de TradingView.
Cómo se obtuvo esta lista
Se generaron decenas de indicadores y EAs con un modelo, se compilaron uno a uno, y se leyó el log. Las listas de constantes válidas que hay detrás se derivaron probando cada candidata con el compilador; los métodos de CTrade se sacaron de MQL5/Include/Trade/Trade.mqh, que es la fuente autoritativa. Por eso cada error lleva el mensaje literal: es lo que vas a pegar en un buscador.
Los que no dan error son los caros
De los doce, estos fallan en silencio: compilan, se ejecutan y hacen algo distinto de lo que crees. No hay línea roja que seguir, así que se descubren tarde o no se descubren.
1 de 12.
- 1 · MQL5
PLOT_COLOR_INDEX: una constante que no existe, por una letra
Lo que sale
PlotIndexSetInteger(0, PLOT_COLOR_INDEX, clrRed);Lo que hay que escribir
PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);Qué dice el compilador: 'PLOT_COLOR_INDEX' - undeclared identifier. Con tres apariciones fueron 9 errores de compilación.
Por qué lo escribe una IA: Sí existe PLOT_COLOR_INDEXES, en plural, pero significa otra cosa: cuántos colores tiene el plot, no cuál. Para el color de la línea la propiedad es PLOT_LINE_COLOR. El singular suena tan razonable que el modelo lo escribe sin dudar, y un validador que solo busque mezclas de MQL4 lo da por bueno.
- 2 · MQL5
trade.SetMagicNumber(): el método que suena bien y no existe
Lo que sale
CTrade trade; trade.SetMagicNumber(20260806);Lo que hay que escribir
CTrade trade; trade.SetExpertMagicNumber(20260806);Qué dice el compilador: 'SetMagicNumber' - no member of 'CTrade'.
Por qué lo escribe una IA: Es el ejemplo perfecto de por qué esto no se caza generando una vez: en la misma tanda, 10 de 11 archivos usaron el nombre correcto. Es un fallo INTERMITENTE de alrededor del 15%, y el resto del EA suele ser impecable, así que se cuela en la revisión.
- 3 · MQL5
Leer una propiedad del símbolo con la función de la familia equivocada
Lo que sale
double stops = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);Lo que hay que escribir
long stops = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); // Si lo necesitas como double: (double)SymbolInfoInteger(...)Qué dice el compilador: cannot convert enum, acompañado de wrong parameters count. Dos apariciones dieron 4 errores.
Por qué lo escribe una IA: Cada propiedad del símbolo pertenece a UNA familia (double, integer o string) y hay que leerla con su función. La distancia mínima al stop es entera, aunque uno la piense en precio. Este caso salió en una ITERACIÓN —«cambia el stop fijo por uno de 2×ATR»—, que es donde el modelo toca código existente y presta menos atención al tipo.
- 4 · MQL5
Usar iMA() o iRSI() como en MQL4, sin CopyBuffer
Lo que sale
double ma = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 1);Lo que hay que escribir
// En OnInit(), UNA vez: int maHandle = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE); // Al leer: double buf[]; ArraySetAsSeries(buf, true); CopyBuffer(maHandle, 0, 1, 1, buf); double ma = buf[0];Qué dice el compilador: wrong parameters count, o un double que en realidad contiene un número de handle y produce cifras absurdas.
Por qué lo escribe una IA: En MQL4 estas funciones devolvían el VALOR y llevaban un parámetro de desplazamiento. En MQL5 devuelven un HANDLE que hay que crear una sola vez y leer con CopyBuffer. Es el error más frecuente de todos, porque la mayor parte del material de trading que existe en internet es MQL4.
- 5 · MQL5
Ask y Bid como variables globales
Lo que sale
double price = Ask;Lo que hay que escribir
double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // o, mejor, un tick completo: MqlTick tick; SymbolInfoTick(_Symbol, tick);Qué dice el compilador: 'Ask' - undeclared identifier.
Por qué lo escribe una IA: Estaban predefinidas en MQL4 y desaparecieron en MQL5. Misma causa que el anterior: el corpus de entrenamiento está lleno de MQL4.
- 6 · MQL5
El modelo de órdenes de MQL4 entero: OP_BUY, OrderLots(), OrderTicket()
Lo que sale
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0); double lots = OrderLots();Lo que hay que escribir
CTrade trade; // #include <Trade/Trade.mqh> trade.Buy(0.1, _Symbol); if (PositionSelect(_Symbol)) double lots = PositionGetDouble(POSITION_VOLUME);Qué dice el compilador: 'OP_BUY' - undeclared identifier, 'OrderLots' - undeclared identifier, y una cascada de errores detrás.
Por qué lo escribe una IA: MQL5 cambió el modelo entero: ya no hay una lista de órdenes que se recorre con OrderSelect, sino posiciones, órdenes e historial por separado. Cuando un modelo empieza por aquí, el archivo entero sale en MQL4 y no se salva con retoques.
- 7 · MQL5
CTrade sin su #include
Lo que sale
CTrade trade; // y ninguna directiva arribaLo que hay que escribir
#include <Trade/Trade.mqh> CTrade trade;Qué dice el compilador: 'CTrade' - undeclared identifier.
Por qué lo escribe una IA: El modelo escribe la clase porque la ha visto mil veces, pero el include vive en la primera línea del archivo y él está generando por la mitad. Es el fallo más fácil de arreglar de la lista y uno de los más comunes.
- 8 · Pine ScriptFalla sin dar error
Pine v6: el backtest sale con CERO operaciones y sin un solo error
Lo que sale
strategy("Mi estrategia", overlay = true)Lo que hay que escribir
strategy("Mi estrategia", overlay = true, margin_long = 0, margin_short = 0)Qué dice el compilador: Ninguno. Compila, se aplica al gráfico y la lista de operaciones está vacía.
Por qué lo escribe una IA: En Pine v5 el margen por defecto era 0 y bastaba con no tocarlo. En v6 el defecto pasó a 100, que exige el 100% de margen y RECHAZA cualquier posición apalancada. Es el error más caro de la lista precisamente porque no avisa: te deja concluir que tu estrategia no tiene señales cuando lo que pasa es que ninguna orden se acepta.
- 9 · Pine Script
El mensaje de alertcondition() tiene que ser una cadena CONSTANTE
Lo que sale
alertcondition(cruce, "RSI", "RSI cruzó " + str.tostring(nivel))Lo que hay que escribir
alertcondition(cruce, "RSI", "RSI cruzó el nivel en {{ticker}} {{interval}}") // Para texto realmente calculado: alert(), dentro de un if.Qué dice el compilador: An argument of "simple string" type was used but a "const string" is expected (CE10123).
Por qué lo escribe una IA: Lo irónico del caso real: el modelo YA usaba los marcadores correctos de TradingView y además concatenaba, que es justo lo que rompe. La alerta se registra al compilar el script, así que su texto tiene que conocerse en ese momento; alert() se evalúa en ejecución y sí admite cadenas calculadas.
- 10 · Pine Script
Indicadores sin el namespace ta.
Lo que sale
media = sma(close, 20) señal = crossover(close, media)Lo que hay que escribir
media = ta.sma(close, 20) señal = ta.crossover(close, media)Qué dice el compilador: Could not find function or function reference 'sma'.
Por qué lo escribe una IA: Los indicadores se movieron al namespace ta. en la v5. Como con MQL4, casi todos los ejemplos que hay por ahí son de v4, así que el modelo los reproduce.
- 11 · Pine Script
Parámetros retirados en v6: when= y transp=
Lo que sale
strategy.entry("L", strategy.long, when = cruce) plot(media, color = color.blue, transp = 40)Lo que hay que escribir
if cruce strategy.entry("L", strategy.long) plot(media, color = color.new(color.blue, 40))Qué dice el compilador: Unknown argument 'when' / Unknown argument 'transp'.
Por qué lo escribe una IA: Un modelo entrenado sobre v5 los sigue escribiendo. Ojo además con los otros cambios de v6 que NO dan error: and/or pasaron a ser perezosos, así que un ta.* dentro de una condición puede dejar de ejecutarse en algunas velas y descuadrar la serie entera. Se evita asignando los ta.* a variables ANTES de la condición.
- 12 · Pine Script
Un argumento con nombre al que le falta el =
Lo que sale
entrada = input.source(close, title "Fuente de precio")Lo que hay que escribir
entrada = input.source(close, title = "Fuente de precio")Qué dice el compilador: Syntax error at input '...'.
Por qué lo escribe una IA: Aparece casi siempre en llamadas partidas en varias líneas, que es donde el ojo no lo ve. Un solo signo igual perdido en un script de 300 líneas, y el mensaje de error apunta a la línea pero no dice qué falta.
Lo que esta guía no hace
No te dice si tu estrategia es buena, ni si va a ganar dinero. Trata solo de que el código haga lo que dice que hace: son errores de programación, no de trading. Y no es una lista cerrada — es la que hemos podido demostrar compilando. Si te encuentras uno que no está, escríbenos y lo comprobamos.
De dónde sale esto
Estos doce fallos son las reglas de un validador que corre sobre todo el código que genera SuaVar, antes de enseñártelo. La lista es tuya y no hay que registrarse para usarla. Si quieres probar la herramienta, el plan gratuito incluye una generación al mes de indicador y otra de EA, sin tarjeta.