[Guía gratuita]

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. 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. 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. 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. 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. 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. 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. 7 · MQL5

    CTrade sin su #include

    Lo que sale

    CTrade trade;   // y ninguna directiva arriba

    Lo 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. 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. 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. 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. 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. 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.

Los 12 errores de MQL5 y Pine Script que comete una IA · SuaVar