Mucha gente nunca llega a automatizar una estrategia porque construir un robot de trading parece exigir formación como programador. La barrera de entrada es más baja que eso. Tu primer expert advisor en MQL5 son alrededor de cien líneas de código, y este artículo te las entrega todas, junto con los pasos que las convierten en un robot funcionando sobre un gráfico de MetaTrader 5.

El ejemplo desarrollado usa una estrategia de tendencia clásica: el cruce de dos medias móviles exponenciales, EMA 9 y EMA 21. La lógica es lo bastante simple como para no estorbar, lo que deja sitio para entender la estructura que comparten todos los expert advisors, desde el archivo que genera el MQL Wizard hasta el robot compilado colocando su primera operación de prueba.

En resumen
  • El robot opera una sola regla: la EMA 9 cruzando la EMA 21 hacia arriba abre una compra, y cruzando hacia abajo abre una venta.
  • Todo ocurre dentro de MetaEditor 5, que viene con MetaTrader 5, así que no hay software adicional que instalar.
  • El ejemplo usa un lote fijo de 0.10 con un stop-loss y un take-profit adjuntos a cada posición, y evalúa las señales una vez por vela cerrada.
  • Una plantilla lista te da código que puedes leer y verificar. Un chat de IA es la mejor herramienta a partir del momento en que quieras ampliar ese código.
  • Pásalo primero por el probador de estrategias, después por una cuenta demo, y revisa el registro Experts antes de que entre en juego ninguna cuenta real.

El entorno de trabajo: cómo abrir MetaEditor 5

Construir un robot de trading no exige software de terceros. MetaTrader 5 ya incluye MetaEditor 5, el entorno de desarrollo para escribir y editar programas en MQL5.

MetaEditor reúne el editor de código, el compilador, el depurador, la documentación de referencia de MQL5 y el MQL Wizard integrado, que genera plantillas listas de expert advisors, indicadores y scripts.

Dos maneras de abrirlo desde el terminal de trading:

  • Pulsa F4.
  • Elige Tools → MetaQuotes Language Editor en el menú superior.

Crear el archivo del robot con el MQL Wizard

Con MetaEditor abierto, el MQL Wizard construye por ti el esqueleto del programa. Empieza por File → New. El asistente ofrece varios tipos de programa, y el que corresponde a este ejemplo es Expert Advisor (template).

MQL Wizard en MetaEditor con la plantilla Expert Advisor seleccionada
Primer paso del MQL Wizard: elegir el tipo de programa. Fuente: MetaTrader 5.

Después viene la descripción del programa. El campo Name recoge la ruta y el nombre del archivo, por ejemplo Experts\MyFirstRobot. Author y Link son opcionales y pueden quedarse vacíos.

Propiedades generales del MQL Wizard con el nombre del expert advisor rellenado
Segundo paso: dar nombre al expert advisor. Fuente: MetaTrader 5.

El asistente ofrece a continuación manejadores de eventos adicionales, entre ellos OnTimer y OnTrade. Este robot no usa ninguno de los dos, así que los valores por defecto se quedan como están.

Selección de manejadores de eventos del MQL Wizard con OnTimer y OnTrade sin marcar
Tercer paso: manejadores de eventos adicionales, dejados en sus valores por defecto. Fuente: MetaTrader 5.

La última pantalla cubre los eventos de prueba OnTester. Aquí tampoco se usan, así que los parámetros quedan intactos y el asistente termina.

Pantalla de manejadores de eventos del probador en el MQL Wizard
Cuarto paso: eventos del probador, también en sus valores por defecto. Fuente: MetaTrader 5.

MetaEditor contiene ahora un archivo .mq5 nuevo con la estructura básica de un expert advisor. Ese esqueleto es el punto de partida de la lógica de trading.

Plantilla generada de expert advisor MQL5 abierta en la ventana de código de MetaEditor
La plantilla generada, con las funciones OnInit, OnDeinit y OnTick vacías. Fuente: MetaTrader 5.

El código listo del robot en MQL5

Abajo está el expert advisor completo construido sobre el cruce de la EMA 9 y la EMA 21. Selecciona todo el contenido de la plantilla generada, bórralo y pega esto en su lugar, de modo que el archivo .mq5 contenga solo el código del robot. Después ya está listo para compilar.

MyFirstRobot.mq5
//+------------------------------------------------------------------+
//|                                                 MyFirstRobot.mq5 |
//|                          EMA 9 / EMA 21 crossover Expert Advisor |
//+------------------------------------------------------------------+
#property copyright "MyFirstRobot"
#property version   "1.00"
#property description "Simple EMA 9/21 crossover Expert Advisor"

#include <Trade/Trade.mqh>
CTrade trade;

//--- Trading parameters
input double InpLotSize    = 0.10;    // Lot size
input int    InpFastEMA    = 9;       // Fast EMA period
input int    InpSlowEMA    = 21;      // Slow EMA period
input int    InpStopLoss   = 200;     // Stop Loss in points
input int    InpTakeProfit = 400;     // Take Profit in points
input ulong  InpMagic      = 123456;  // Magic number

//--- Indicator handles
int fastEMAHandle;
int slowEMAHandle;

//--- Opening time of the last processed bar
datetime lastBarTime = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //--- Create the Fast EMA indicator handle
   fastEMAHandle = iMA(_Symbol, _Period, InpFastEMA, 0, MODE_EMA, PRICE_CLOSE);

   //--- Create the Slow EMA indicator handle
   slowEMAHandle = iMA(_Symbol, _Period, InpSlowEMA, 0, MODE_EMA, PRICE_CLOSE);

   //--- Stop the robot if either handle failed
   if(fastEMAHandle == INVALID_HANDLE || slowEMAHandle == INVALID_HANDLE)
   {
      Print("Failed to create EMA indicators");
      return(INIT_FAILED);
   }

   //--- Tag every order, so the robot only ever manages its own positions
   trade.SetExpertMagicNumber(InpMagic);

   Print("MyFirstRobot started successfully");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   //--- Opening time of the current bar
   datetime currentBarTime = iTime(_Symbol, _Period, 0);

   //--- Work once per bar, on the first tick after a new bar opens
   if(currentBarTime == lastBarTime)
      return;
   lastBarTime = currentBarTime;

   //--- Dynamic arrays: the timeseries flag needs them
   double fastEMA[];
   double slowEMA[];

   //--- Index 0 is the forming bar, 1 the last closed bar, 2 the one before it
   ArraySetAsSeries(fastEMA, true);
   ArraySetAsSeries(slowEMA, true);

   //--- Copy the last three EMA values of each average
   if(CopyBuffer(fastEMAHandle, 0, 0, 3, fastEMA) < 3)
      return;
   if(CopyBuffer(slowEMAHandle, 0, 0, 3, slowEMA) < 3)
      return;

   //--- Both checks read closed bars only, never the forming bar
   bool buySignal  = fastEMA[2] <= slowEMA[2] && fastEMA[1] > slowEMA[1];
   bool sellSignal = fastEMA[2] >= slowEMA[2] && fastEMA[1] < slowEMA[1];

   //+--------------------------------------------------------------+
   //| Buy signal                                                    |
   //+--------------------------------------------------------------+
   if(buySignal)
   {
      //--- Look only at a position this robot opened itself
      if(PositionSelect(_Symbol) &&
         PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)
      {
         long positionType = PositionGetInteger(POSITION_TYPE);

         //--- A buy is already running, nothing to do
         if(positionType == POSITION_TYPE_BUY)
            return;

         //--- Close the opposite position before reversing
         if(positionType == POSITION_TYPE_SELL)
            trade.PositionClose(_Symbol);
      }

      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      double sl  = NormalizeDouble(ask - InpStopLoss   * _Point, _Digits);
      double tp  = NormalizeDouble(ask + InpTakeProfit * _Point, _Digits);

      trade.Buy(InpLotSize, _Symbol, 0, sl, tp, "EMA 9/21 Buy");
   }

   //+--------------------------------------------------------------+
   //| Sell signal                                                   |
   //+--------------------------------------------------------------+
   if(sellSignal)
   {
      if(PositionSelect(_Symbol) &&
         PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)
      {
         long positionType = PositionGetInteger(POSITION_TYPE);

         if(positionType == POSITION_TYPE_SELL)
            return;

         if(positionType == POSITION_TYPE_BUY)
            trade.PositionClose(_Symbol);
      }

      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      double sl  = NormalizeDouble(bid + InpStopLoss   * _Point, _Digits);
      double tp  = NormalizeDouble(bid - InpTakeProfit * _Point, _Digits);

      trade.Sell(InpLotSize, _Symbol, 0, sl, tp, "EMA 9/21 Sell");
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   //--- Release the indicator handles
   if(fastEMAHandle != INVALID_HANDLE)
      IndicatorRelease(fastEMAHandle);
   if(slowEMAHandle != INVALID_HANDLE)
      IndicatorRelease(slowEMAHandle);
}
//+------------------------------------------------------------------+
Prueba este robot en una cuenta demo gratuita
Acceso completo a MetaTrader 5 y condiciones reales de mercado, sin poner en juego fondos propios.

Anatomía del código: qué hace cada bloque

El robot se divide en cinco partes funcionales, cada una responsable de una etapa de su trabajo, desde leer sus ajustes hasta enviar una orden. Este es el mapa, seguido del detalle de las partes que conviene entender antes de ponerlo en marcha.

BloqueQué hace
Parámetros inputAjustes que puedes cambiar desde el diálogo del robot en MetaTrader 5, sin tocar el código fuente: periodos de las EMA, tamaño del lote, stop-loss, take-profit y número mágico.
OnInit()Se ejecuta una vez cuando el robot arranca. Crea los dos handles de EMA y se niega a arrancar si alguno de los dos falla.
OnTick(), filtro de barra nuevaSe ejecuta con cada tick entrante y sale de inmediato salvo que se haya abierto una barra nueva, de modo que la estrategia se evalúa una vez por vela.
CopyBuffer() y la comprobación del cruceLee los tres últimos valores de cada EMA y compara las dos barras cerradas para decidir si hubo un cruce.
CTrade, ejecución de la operaciónEnvía la orden, adjunta el stop-loss y el take-profit, y cierra primero una posición contraria cuando la señal se invierte.
OnDeinit()Se ejecuta una vez cuando el robot se retira del gráfico y libera los dos handles de indicador.

Parámetros de entrada

Los ajustes de la parte superior del archivo llevan el modificador input, que los expone en la ventana de parámetros del robot dentro de MetaTrader 5. En este ejemplo son los periodos de la EMA rápida y la lenta, InpFastEMA e InpSlowEMA, junto con InpLotSize, InpStopLoss, InpTakeProfit e InpMagic.

La ventaja está en que cambiar un ajuste no exige tocar el código fuente. Los valores se pueden modificar justo antes de lanzar el robot, y el probador de estrategias puede recorrerlos durante una optimización.

Pestaña Inputs del diálogo del expert advisor en MetaTrader 5 con los parámetros editables
La pestaña Inputs expone todos los parámetros declarados con el modificador input. Fuente: MetaTrader 5.

Inicialización con OnInit()

OnInit() se ejecuta una vez cuando el robot arranca, lo que ocurre al adjuntarlo a un gráfico o al reiniciar el terminal. Prepara los recursos que el robot necesitará después, creando los handles de indicador que suministran los valores de las EMA.

Cuando esa preparación falla, la función devuelve INIT_FAILED y el terminal detiene el robot en lugar de ejecutarlo a medio configurar. También fija el número mágico, la etiqueta que marca cada orden que envía este robot y le permite distinguir sus propias posiciones de cualquier otra cosa sobre el mismo símbolo.

El evento de tick y el filtro de barra nueva

OnTick() es la función principal. El terminal la llama cada vez que llega un tick nuevo, es decir, cualquier cambio en la cotización. Evaluar la estrategia en cada tick sería trabajo desperdiciado aquí, así que un filtro de barra nueva reduce el procesamiento a una vez por vela.

El robot lee la hora de apertura de la barra actual con iTime() y la compara con la hora que procesó la última vez:

if(currentBarTime == lastBarTime)
   return;

Cuando se abre una vela nueva, esa hora cambia y el robot continúa. La estrategia reacciona por tanto una vez por vela, y deja de seguir cada cambio de precio dentro de ella.

Tras el filtro, el robot copia ambas EMA con CopyBuffer() y comprueba si hubo un cruce. El índice 1 contiene la última barra cerrada y el índice 2 la anterior, de modo que la comparación nunca toca la vela que aún se está formando. La EMA 9 cruzando por encima de la EMA 21 activa buySignal, cruzando por debajo activa sellSignal, y solo entonces toma el relevo el bloque de ejecución.

Dónde ve una señal el robot
Mueve el control para avanzar el gráfico barra a barra. El robot compara las dos últimas barras cerradas, los mismos dos valores que su código lee como índice 1 e índice 2.
EMA 9 EMA 21 Precio de cierre
EMA 9, última barra cerrada
0
EMA 21, última barra cerrada
0
Qué hace el robot
Espera
No hay cruce en las dos últimas barras cerradas, así que el robot mantiene su posición y espera a la vela siguiente.
Por qué los arrays se declaran vacíos

Los dos arrays se declaran como double fastEMA[] sin tamaño y después se pasan a ArraySetAsSeries(). Ese flag invierte la indexación, de modo que el índice 0 es la barra más reciente, que es como lee el resto del código. MQL5 se niega a aplicar ese flag a un array cuyo tamaño está fijado en el código fuente, así que una declaración con tamaño como double fastEMA[3] dejaría la indexación invertida en silencio y convertiría cada señal de compra en una de venta.

Ejecución de las operaciones

Las órdenes pasan por CTrade, una clase de la librería estándar de MQL5 que envuelve el trabajo de montar a mano una petición de operación. Según la señal, el robot llama a trade.Buy() o a trade.Sell() y le pasa el volumen de la posición junto con los niveles de stop-loss y take-profit.

Ambos niveles se calculan en puntos desde el precio actual y después se pasan por NormalizeDouble(), que los recorta al número de decimales que el símbolo usa de verdad. Los servidores rechazan precios con más precisión de la que el instrumento admite, y es aquí donde eso aparece.

Antes de abrir nada, el robot comprueba si una posición sobre el símbolo ya le pertenece, comparando POSITION_MAGIC con su propio número mágico. Esa comprobación evita que cierre una operación que abriste a mano o una que pertenece a otro robot sobre el mismo instrumento.

Plantilla lista y código generado por IA

Las herramientas de IA han facilitado mucho el arranque con los expert advisors. Un trader sin experiencia en programación puede describir una idea de trading con palabras corrientes y recibir la base de un robot en MQL5.

Sigue habiendo una diferencia entre partir de una plantilla y generar código desde cero. Un modelo produce rápido una lógica de trading complicada, y ese código todavía hay que leerlo, compilarlo y probarlo. MQL5 es un objetivo más estrecho que los lenguajes de uso general, así que un modelo tiene más probabilidades de inventarse la firma de una función, mezclar hábitos de MQL4 dentro de código MQL5 o dejar fuera una salvaguarda que nadie pidió.

CriterioPlantilla listaCódigo generado por IA
FiabilidadLa estructura es fija y la lógica del ejemplo está documentada. Compilar y probar siguen siendo obligatorios.Depende del prompt y del modelo. El código necesita el mismo paso de compilación y prueba, partiendo de más abajo.
SalvaguardasEl filtro de barra nueva y la comprobación del número mágico ya están puestos.Las salvaguardas aparecen cuando el prompt las pide. Un prompt que describe solo la regla de entrada tiende a devolver solo la regla de entrada.
Rapidez hasta tener el robot en marchaAlta. Pegar, compilar, probar.Alta en una tarea simple. Una lógica compleja suele llevar varias rondas de generar y corregir.
FlexibilidadLimitada a la lógica de este robot y a los parámetros que expone.Alta. La estrategia se puede moldear en torno a tus propias reglas, indicadores y filtros.
Complejidad de la estrategiaEncaja con modelos de trading simples y legibles.Admite conceptos más elaborados, y cuanto más elaborado sea el código, más pesa la verificación.
VerificaciónObligatoria. Una compilación limpia no dice nada sobre si la lógica de trading es sólida.Obligatoria por partida doble: la sintaxis, y si el código se corresponde con la idea que describiste.

Una plantilla lista es la vía más rápida para ver cómo está montado un expert advisor. La IA se vuelve realmente útil en el paso siguiente, cuando ya tienes código funcionando delante y quieres que te lo expliquen, lo amplíen o lo adapten. La mayoría de principiantes saca partido de las dos cosas: partir de un ejemplo que funciona y después usar un chat de IA para recorrer bloques concretos y añadir condiciones propias.

Cómo compilar y lanzar el robot en MetaTrader 5

Con la lógica de trading en el archivo, tres pasos lo convierten en un robot funcionando sobre un gráfico.

Paso 1. Pon el código en el archivo

Aquí se usa el archivo .mq5 que creó antes el MQL Wizard. La plantilla generada contiene código de relleno, y todo él se sustituye por el listado de arriba, de modo que el archivo contenga el robot y nada más.

Paso 2. Compila

Compilar convierte el código fuente MQL5 en el formato ejecutable que corre el terminal, y produce un archivo .ex5. Lánzalo con el botón Compile de la barra de MetaEditor o con F7.

El resultado aparece en la parte inferior de la ventana. Sin errores de sintaxis, el mensaje dice:

0 error(s), 0 warning(s)
Toolbox de MetaEditor mostrando una compilación correcta con cero errores y cero advertencias
Una compilación limpia produce el archivo .ex5 que el terminal puede ejecutar. Fuente: MetaTrader 5.

Una compilación limpia confirma que el código es válido para el compilador. No dice nada sobre si la estrategia gana dinero ni sobre si la lógica hace lo que pretendías, que es para lo que está el probador de estrategias.

Paso 3. Adjunta el robot a un gráfico

El robot compilado aparece ya en MetaTrader 5. Abre la ventana Navigator, entra en Expert Advisors y localiza MyFirstRobot. Arrástralo sobre el gráfico del instrumento con el que quieras que opere.

Se abre la ventana de parámetros. Revisa aquí los ajustes de entrada, incluidos el volumen de trading, los periodos de las EMA y los niveles de stop-loss y take-profit. En la pestaña Common, confirma que Allow Algo Trading está marcado y acepta el diálogo.

Diálogo del expert advisor en MetaTrader 5 con Allow Algo Trading activado en la pestaña Common
La pestaña Common, donde el robot recibe permiso para operar. Fuente: MetaTrader 5.

Cuando el botón Algo Trading de la barra del terminal también está activo, el robot puede enviar órdenes según su lógica y empieza a seguir el mercado con los parámetros que le has puesto.

Pruebas en el probador de estrategias

Antes de que un robot se acerque siquiera a una cuenta real, su sitio está en el probador de estrategias integrado en MetaTrader 5. Una prueba sobre datos históricos muestra cómo habría ejecutado el robot sus reglas en condiciones de mercado distintas, y saca a la luz fallos técnicos mucho antes de que haya dinero de por medio.

Cómo lanzar la prueba

Abre el probador con Ctrl + R. En sus ajustes, selecciona el expert advisor MyFirstRobot, el instrumento, por ejemplo GBPUSD, y el marco temporal H1 para el que está escrito este ejemplo. Para la simulación más realista, elige el modo de modelado Every tick based on real ticks y fija el periodo histórico.

Ajustes del probador de estrategias en MetaTrader 5 con el expert advisor, el símbolo y el marco temporal seleccionados
Configuración del probador: expert advisor, símbolo, marco temporal, periodo y modo de modelado. Fuente: MetaTrader 5.

MetaTrader 5 reproduce entonces el movimiento histórico del precio y simula el robot: las señales apareciendo, las posiciones abriéndose y cerrándose, y el resultado financiero acumulado. Vigila que las posiciones se abran y se cierren como esperas y que el stop-loss y el take-profit caigan donde deben.

Informe del probador de estrategias en MetaTrader 5 con la curva de balance y las métricas de resultado
El informe del probador tras una pasada completa. Fuente: MetaTrader 5. Los resultados pasados no garantizan el rendimiento futuro.

Un backtest muestra cómo se comportaron las reglas sobre un historial de precios que ya se conoce. Es una comprobación de que el robot ejecuta su lógica correctamente, y no lleva ningún pronóstico de ingresos futuros. Cuanto más compleja sea una estrategia y más ajustada esté a los datos históricos, más tienden sus resultados en real a quedarse por debajo de la prueba.

Para la configuración completa de pruebas con ticks, consulta Un backtest de 15 minutos: cómo probar un robot de trading en MetaTrader 5.

Qué cifras leer en el informe

MetaTrader 5 produce un informe detallado. Cuatro cifras bastan para una primera valoración.

MétricaQué muestraQué vigilar
Profit FactorEl beneficio total dividido entre la pérdida total en toda la prueba. Por encima de 1 significa que las operaciones ganadoras pesaron más que las perdedoras.Un valor bajo apunta a una estadística floja. Los valores por encima de 1.2 o 1.5 son un primer filtro habitual, y no existe un umbral universal.
Max DrawdownLa caída más profunda del balance desde un máximo anterior.Un drawdown grande significa mucha presión sobre el depósito. Léelo junto con la rentabilidad y el tamaño de la posición.
Total TradesCuántas operaciones hizo el robot en el periodo probado.Una muestra pequeña tiene poco peso estadístico. Unas pocas decenas de buenas operaciones no sostienen ninguna conclusión firme sobre fiabilidad.
Win RateLa proporción de operaciones rentables sobre el total.Por sí sola no resuelve nada. Léela frente a la ganancia media, la pérdida media y el stop-loss y el take-profit en uso.

Qué muestra el informe más allá de la línea de beneficio

Leer solo el beneficio final es el atajo más común entre los algo traders nuevos. Una estrategia puede exhibir una rentabilidad llamativa mientras carga con un drawdown profundo o se apoya en un puñado de operaciones. Pondera el factor de beneficio y el beneficio final junto con el drawdown máximo, el número de operaciones, la forma de la curva de equity y cómo se reparten los resultados en el tiempo.

Hay algo más que merece atención: hasta qué punto el resultado sobrevive a un cambio del periodo de prueba o a un cambio pequeño de parámetros. Cuando un ajuste menor convierte una estrategia rentable en una perdedora, lo más probable es que esté amoldada a su historial.

Para qué sirve un primer backtest

El objetivo de un primer backtest es confirmar que el robot implementa correctamente la lógica de trading y no produce nada visiblemente roto. Encontrar una estrategia ideal viene después, sobre otros periodos históricos y luego en una cuenta demo.

Del probador a un gráfico en vivo
Una cuenta cent permite al robot operar el lote mínimo sobre precios en vivo, así que la primera pasada supervisada cuesta una fracción de lo que costaría en una cuenta estándar.

La lista de comprobación previa al lanzamiento

Una compilación correcta no significa que el robot esté listo para una cuenta real. Repasa estos puntos antes de activar el trading automatizado.

0 de 5 marcados
✓ Los cinco marcados. El robot está listo para su primera pasada supervisada.
Botón Algo Trading en la barra de MetaTrader 5 en estado activado
El interruptor Algo Trading a nivel de terminal, el segundo de los dos permisos. Fuente: MetaTrader 5.
Pestaña Experts del Toolbox de MetaTrader 5 con los mensajes de registro del expert advisor
La pestaña Experts informa del arranque, las operaciones y los fallos, y muestra MyFirstRobot (EURUSD,H1): initialized en un arranque limpio. Fuente: MetaTrader 5.

Dedica las primeras semanas a observar cómo se comporta el robot en condiciones reales: que recibe cotizaciones, que abre posiciones solo cuando se cumplen sus condiciones, que adjunta sus órdenes de protección y que no toma operaciones con las que no contabas.

Dos situaciones que resolver en el primer lanzamiento

Un primer lanzamiento puede sacar a la luz problemas que ni el compilador ni la primera prueba mostraron. El código compila, el robot está sobre el gráfico, Algo Trading está activo, y aun así no pasa nada. En la práctica la causa suele estar en las condiciones de la cuenta, en los ajustes del instrumento o en la manera en que corre el terminal. Dos casos aparecen con más frecuencia que el resto.

El robot se queda callado por culpa del margen

Imagina un robot sobre GBPUSD H1. La EMA 9 cruza la EMA 21 y no aparece ninguna posición. El primer sitio donde mirar es la pestaña Journal y los mensajes bajo Experts. Una línea que diga Not enough money apunta al margen libre.

Abrir una posición hace que el bróker reserve parte de la cuenta como garantía de margen. La cantidad depende del volumen de la operación, del precio del instrumento, del tipo de contrato, del apalancamiento y de las condiciones de la cuenta. Un InpLotSize = 0.1 fijo puede resultar demasiado grande para un depósito pequeño en algunos instrumentos, así que el tamaño del lote solo cobra sentido leído frente al balance y al margen disponible.

Comprueba que la cuenta tiene fondos libres suficientes para el volumen que has configurado. El margen requerido por lote figura en la especificación del instrumento en MetaTrader 5. En una cuenta pequeña, el volumen mínimo permitido es el punto de partida sensato. Tener margen suficiente y tener un tamaño de posición prudente son cuestiones separadas: que te llegue el margen para abrir una operación no dice nada sobre lo que esa operación puede costarte.

¿Podrá el robot abrir esta posición?
Introduce tus propias cifras para ver cuánto margen inmovilizaría el volumen de InpLotSize. El precio, tómalo de tu terminal.
Esto cambia según el instrumento. Un lote estándar de divisas son 100,000 unidades de la divisa base, mientras que los metales, los índices y otros CFDs usan cada uno su propio valor. Lee el tuyo en la especificación del instrumento en MetaTrader 5: clic derecho sobre el símbolo en Market Watch y abre Specification.
Tamaño de la posición
0
Margen requerido
0
Fondos libres restantes
0
✓ La orden sale adelante.
Una estimación para un instrumento cotizado contra el dólar estadounidense, con la fórmula estándar: lotes multiplicados por el tamaño del contrato y por el precio, dividido entre el apalancamiento. Los instrumentos no cotizados contra el dólar llevan una conversión que el terminal resuelve por ti, y el swap, el spread y la comisión van aparte. Tu tipo de cuenta y la especificación del símbolo son la autoridad sobre todo esto. Que el margen cubra la operación es además una cuestión distinta de que la posición tenga un tamaño sensato para la cuenta.
Consejo práctico

Cuando el robot se salte una señal, lee las pestañas Experts y Journal antes de tocar el código. El mensaje del terminal suele nombrar el motivo por el que se rechazó la petición de operación.

El robot solo funciona mientras funciona el terminal

El segundo caso es dar por supuesto que un robot sobre un gráfico sigue trabajando pase lo que pase con el ordenador. En una instalación local, no. Un expert advisor de MQL5 corre dentro de una copia de MetaTrader 5 en marcha. Cierra el terminal o apaga la máquina, y el robot local deja de recibir ticks y deja de ejecutar su lógica.

Si la EMA 9 y la EMA 21 se cruzan durante ese tiempo, la señal queda sin procesar hasta que el terminal vuelva a estar en marcha. Lo mismo vale para gestionar una posición ya abierta, siempre que esa lógica viva dentro del robot.

Para un robot pensado para trabajar las 24 horas, la respuesta es un servidor privado virtual. MetaTrader 5 incluye un servicio de alojamiento virtual que traslada el entorno de trading del robot a una infraestructura remota, y RoboForex ofrece un VPS para el mismo trabajo. Una vez trasladado, el robot sigue funcionando esté o no encendido tu propio ordenador.

Un VPS resuelve la continuidad del entorno de trading. No hace más fiable ninguna estrategia ni corrige ningún fallo del código.

Antes de pasar a una cuenta real

Revisa el flujo entero, y no solo la estrategia: el margen libre, los permisos de trading automatizado, el símbolo seleccionado, si el robot está recibiendo cotizaciones, y las pestañas Experts y Journal. Recorrer esa lista separa un problema de la estrategia de un fallo corriente de lanzamiento.

Conclusión

Construir un primer expert advisor en MQL5 cubre el ciclo de desarrollo entero de una sentada: la lógica de trading, la compilación, la prueba y el lanzamiento. El cruce de la EMA 9 y la EMA 21 es deliberadamente sencillo, y eso es lo que hace visible la estructura que hay debajo, una estructura que es la misma en robots mucho más complejos que este.

El paso siguiente es práctico. Abre MetaEditor, pega el código, compílalo, pásalo por el probador de estrategias y después ponlo en una cuenta demo y observa cómo se comporta sin capital en juego. Después de eso, el sistema que funciona se puede refinar o sustituir por el tuyo propio, llevar a una cuenta cent de RoboForex con el lote mínimo y conectar a un VPS para que trabaje las 24 horas.

Mantén el foco en si el robot hace lo que dicen las reglas, en lo estable que es el algoritmo y en cómo se controla el dimensionamiento de las posiciones. Ese es el cimiento sobre el que se construye el resto de un sistema de trading automatizado.

FAQ

¿Hacen falta conocimientos de programación para usar este robot?
No. Copiar el código en el archivo que crea el MQL Wizard y seguir los pasos de compilación basta para ponerlo en marcha. La programación se vuelve útil a partir del momento en que quieras cambiar cómo decide operar el robot.
¿Por qué el robot comprueba si hay barra nueva en vez de operar en cada tick?
La estrategia está definida sobre velas cerradas. Sin el filtro de barra nueva, el mismo cruce se evaluaría cientos de veces dentro de una vela, y el robot actuaría sobre valores que todavía están cambiando.
¿Puedo ejecutarlo en cualquier instrumento y marco temporal?
Sí, el código lee el símbolo y el marco temporal del gráfico sobre el que está. El ejemplo desarrollado usa GBPUSD H1. Los resultados cambian según el instrumento, así que pruébalo en el probador de estrategias antes de ejecutarlo en un sitio nuevo. Unos niveles de protección fijos de 200 y 400 puntos también se comportan de otra manera en instrumentos con un spread amplio.
¿Qué diferencia hay entre MetaEditor y MetaTrader 5?
MetaEditor es donde se escribe y se compila el código. MetaTrader 5 es donde el robot compilado corre sobre un gráfico en vivo. Son dos partes de la misma instalación, y F4 lleva de una a la otra.
El robot está en el gráfico y no pasa nada. ¿Qué reviso primero?
Comprueba que los dos permisos de Algo Trading están activos y después lee las pestañas Experts y Journal del Toolbox. La mayoría de casos de primer lanzamiento se explican ahí con palabras claras, y el margen libre insuficiente es el más habitual.
Toda la información publicada en los artículos de este sitio se basa exclusivamente en las opiniones personales de los autores. Estos artículos no deben interpretarse como recomendaciones de trading ni como una llamada a la acción. Los autores y RoboForex no asumen responsabilidad alguna por los resultados de las operaciones realizadas a partir de estas recomendaciones y análisis. Los resultados pasados no son indicativos de resultados futuros. Operar con acciones y CFDs conlleva un riesgo alto de pérdida del capital.