{"id":18219,"date":"2026-09-08T10:40:00","date_gmt":"2026-09-08T07:40:00","guid":{"rendered":"https:\/\/roboforex.com\/es\/blog\/?p=18219"},"modified":"2026-09-09T16:34:18","modified_gmt":"2026-09-09T13:34:18","slug":"first-mql5-expert-advisor","status":"publish","type":"post","link":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/","title":{"rendered":"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Mucha gente nunca llega a automatizar una estrategia porque construir un robot de trading parece exigir formaci&oacute;n como programador. La barrera de entrada es m&aacute;s baja que eso. Tu primer expert advisor en MQL5 son alrededor de cien l&iacute;neas de c&oacute;digo, y este art&iacute;culo te las entrega todas, junto con los pasos que las convierten en un robot funcionando sobre un gr&aacute;fico de <a href=\"https:\/\/roboforex.com\/es\/forex-trading\/platforms\/metatrader5-mt5\/\" data-internallinksmanager029f6b8e52c=\"41\" title=\"metatrader 5\">MetaTrader 5<\/a>.<\/p>\n\n\n\n<div class=\"ea-wrap\">\n<div class=\"ea\">\n<p>El ejemplo desarrollado usa una estrategia de tendencia cl&aacute;sica: el cruce de dos <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2023\/04\/28\/como-operar-con-la-estrategia-dos-medias-moviles-fractales\/\" data-internallinksmanager029f6b8e52c=\"119\" title=\"medias m\u00f3viles\">medias m&oacute;viles<\/a> exponenciales, EMA 9 y EMA 21. La l&oacute;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&oacute;n de prueba.<\/p>\n<div class=\"ea-kratko\">\n<div class=\"ea-kratko-label\">En resumen<\/div>\n<ul>\n<li>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.<\/li>\n<li>Todo ocurre dentro de MetaEditor 5, que viene con MetaTrader 5, as&iacute; que no hay software adicional que instalar.<\/li>\n<li>El ejemplo usa un <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2019\/09\/17\/how-to-calculate-a-trading-lot-in-forex-market\/\" data-internallinksmanager029f6b8e52c=\"65\" title=\"lote\">lote<\/a> fijo de 0.10 con un stop-loss y un take-profit adjuntos a cada posici&oacute;n, y eval&uacute;a las <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2019\/11\/28\/signals-on-forex-where-to-search-how-to-find-filter-and-create\/\" data-internallinksmanager029f6b8e52c=\"76\" title=\"Se\u00f1ales\">se&ntilde;ales<\/a> una vez por vela cerrada.<\/li>\n<li>Una plantilla lista te da c&oacute;digo que puedes leer y verificar. Un chat de IA es la mejor herramienta a partir del momento en que quieras ampliar ese c&oacute;digo.<\/li>\n<li>P&aacute;salo primero por el probador de estrategias, despu&eacute;s por una <a href=\"https:\/\/roboforex.com\/es\/forex-trading\/trading\/demo\/\" data-internallinksmanager029f6b8e52c=\"46\" title=\"forex demo\">cuenta demo<\/a>, y revisa el <a href=\"https:\/\/my.roboforex.com\/es\/register\/\" data-internallinksmanager029f6b8e52c=\"200\" title=\"Cuenta\">registro<\/a> Experts antes de que entre en juego ninguna cuenta real.<\/li>\n<\/ul>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"El_entorno_de_trabajo_como_abrir_MetaEditor_5\"><\/span>El entorno de trabajo: c&oacute;mo abrir MetaEditor 5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>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.<\/p>\n<p>MetaEditor re&uacute;ne el editor de c&oacute;digo, el compilador, el depurador, la documentaci&oacute;n de referencia de MQL5 y el MQL Wizard integrado, que genera plantillas listas de expert advisors, <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2019\/11\/19\/top-10-forex-indicators-that-every-trader-needs\/\" data-internallinksmanager029f6b8e52c=\"75\" title=\"indicadores de Forex\">indicadores<\/a> y scripts.<\/p>\n<p>Dos maneras de abrirlo desde el terminal de trading:<\/p>\n<ul>\n<li>Pulsa <strong>F4<\/strong>.<\/li>\n<li>Elige <strong>Tools &rarr; MetaQuotes Language Editor<\/strong> en el men&uacute; superior.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Crear_el_archivo_del_robot_con_el_MQL_Wizard\"><\/span>Crear el archivo del robot con el MQL Wizard<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Con MetaEditor abierto, el MQL Wizard construye por ti el esqueleto del programa. Empieza por <strong>File &rarr; New<\/strong>. El asistente ofrece varios tipos de programa, y el que corresponde a este ejemplo es <strong>Expert Advisor (template)<\/strong>.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_1.png\"><img alt=\"MQL Wizard en MetaEditor con la plantilla Expert Advisor seleccionada\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_1.png\"><\/a><figcaption class=\"wp-element-caption\">Primer paso del MQL Wizard: elegir el tipo de programa. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>Despu&eacute;s viene la descripci&oacute;n del programa. El campo <strong>Name<\/strong> recoge la ruta y el nombre del archivo, por ejemplo <code>Experts\\MyFirstRobot<\/code>. <strong>Author<\/strong> y <strong>Link<\/strong> son opcionales y pueden quedarse vac&iacute;os.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_2.png\"><img alt=\"Propiedades generales del MQL Wizard con el nombre del expert advisor rellenado\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_2.png\"><\/a><figcaption class=\"wp-element-caption\">Segundo paso: dar nombre al expert advisor. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>El asistente ofrece a continuaci&oacute;n manejadores de eventos adicionales, entre ellos <strong>OnTimer<\/strong> y <strong>OnTrade<\/strong>. Este robot no usa ninguno de los dos, as&iacute; que los valores por defecto se quedan como est&aacute;n.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_3.png\"><img alt=\"Selecci&oacute;n de manejadores de eventos del MQL Wizard con OnTimer y OnTrade sin marcar\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_3.png\"><\/a><figcaption class=\"wp-element-caption\">Tercer paso: manejadores de eventos adicionales, dejados en sus valores por defecto. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>La &uacute;ltima pantalla cubre los eventos de prueba <strong>OnTester<\/strong>. Aqu&iacute; tampoco se usan, as&iacute; que los par&aacute;metros quedan intactos y el asistente termina.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_4.png\"><img alt=\"Pantalla de manejadores de eventos del probador en el MQL Wizard\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_4.png\"><\/a><figcaption class=\"wp-element-caption\">Cuarto paso: eventos del probador, tambi&eacute;n en sus valores por defecto. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>MetaEditor contiene ahora un archivo <code>.mq5<\/code> nuevo con la estructura b&aacute;sica de un expert advisor. Ese esqueleto es el punto de partida de la l&oacute;gica de trading.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_5.png\"><img alt=\"Plantilla generada de expert advisor MQL5 abierta en la ventana de c&oacute;digo de MetaEditor\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_5.png\"><\/a><figcaption class=\"wp-element-caption\">La plantilla generada, con las funciones OnInit, OnDeinit y OnTick vac&iacute;as. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<h2><span class=\"ez-toc-section\" id=\"El_codigo_listo_del_robot_en_MQL5\"><\/span>El c&oacute;digo listo del robot en MQL5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Abajo est&aacute; 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&oacute;rralo y pega esto en su lugar, de modo que el archivo <code>.mq5<\/code> contenga solo el c&oacute;digo del robot. Despu&eacute;s ya est&aacute; listo para compilar.<\/p>\n<div class=\"ea-code-wrap\">\n<div class=\"ea-code-label\">MyFirstRobot.mq5<\/div>\n<pre class=\"ea-code\"><code>\/\/+------------------------------------------------------------------+\n\/\/|                                                 MyFirstRobot.mq5 |\n\/\/|                          EMA 9 \/ EMA 21 crossover Expert Advisor |\n\/\/+------------------------------------------------------------------+\n#property copyright \"MyFirstRobot\"\n#property version   \"1.00\"\n#property description \"Simple EMA 9\/21 crossover Expert Advisor\"\n\n#include &lt;Trade\/Trade.mqh&gt;\nCTrade trade;\n\n\/\/--- Trading parameters\ninput double InpLotSize    = 0.10;    \/\/ Lot size\ninput int    InpFastEMA    = 9;       \/\/ Fast EMA period\ninput int    InpSlowEMA    = 21;      \/\/ Slow EMA period\ninput int    InpStopLoss   = 200;     \/\/ Stop Loss in points\ninput int    InpTakeProfit = 400;     \/\/ <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2019\/07\/12\/what-is-stop-loss-and-take-profit\/\" data-internallinksmanager029f6b8e52c=\"54\" title=\"take profit\">Take Profit<\/a> in points\ninput ulong  InpMagic      = 123456;  \/\/ Magic number\n\n\/\/--- Indicator handles\nint fastEMAHandle;\nint slowEMAHandle;\n\n\/\/--- Opening time of the last processed bar\ndatetime lastBarTime = 0;\n\n\/\/+------------------------------------------------------------------+\n\/\/| Expert initialization function                                   |\n\/\/+------------------------------------------------------------------+\nint OnInit()\n{\n   \/\/--- Create the Fast EMA indicator handle\n   fastEMAHandle = iMA(_Symbol, _Period, InpFastEMA, 0, MODE_EMA, PRICE_CLOSE);\n\n   \/\/--- Create the Slow EMA indicator handle\n   slowEMAHandle = iMA(_Symbol, _Period, InpSlowEMA, 0, MODE_EMA, PRICE_CLOSE);\n\n   \/\/--- Stop the robot if either handle failed\n   if(fastEMAHandle == INVALID_HANDLE || slowEMAHandle == INVALID_HANDLE)\n   {\n      Print(\"Failed to create EMA indicators\");\n      return(INIT_FAILED);\n   }\n\n   \/\/--- Tag every order, so the robot only ever manages its own positions\n   trade.SetExpertMagicNumber(InpMagic);\n\n   Print(\"MyFirstRobot started successfully\");\n   return(INIT_SUCCEEDED);\n}\n\n\/\/+------------------------------------------------------------------+\n\/\/| Expert tick function                                             |\n\/\/+------------------------------------------------------------------+\nvoid OnTick()\n{\n   \/\/--- Opening time of the current bar\n   datetime currentBarTime = iTime(_Symbol, _Period, 0);\n\n   \/\/--- Work once per bar, on the first tick after a new bar opens\n   if(currentBarTime == lastBarTime)\n      return;\n   lastBarTime = currentBarTime;\n\n   \/\/--- Dynamic arrays: the timeseries flag needs them\n   double fastEMA[];\n   double slowEMA[];\n\n   \/\/--- Index 0 is the forming bar, 1 the last closed bar, 2 the one before it\n   ArraySetAsSeries(fastEMA, true);\n   ArraySetAsSeries(slowEMA, true);\n\n   \/\/--- Copy the last three EMA values of each average\n   if(CopyBuffer(fastEMAHandle, 0, 0, 3, fastEMA) &lt; 3)\n      return;\n   if(CopyBuffer(slowEMAHandle, 0, 0, 3, slowEMA) &lt; 3)\n      return;\n\n   \/\/--- Both checks read closed bars only, never the forming bar\n   bool buySignal  = fastEMA[2] &lt;= slowEMA[2] &amp;&amp; fastEMA[1] &gt; slowEMA[1];\n   bool sellSignal = fastEMA[2] &gt;= slowEMA[2] &amp;&amp; fastEMA[1] &lt; slowEMA[1];\n\n   \/\/+--------------------------------------------------------------+\n   \/\/| Buy signal                                                    |\n   \/\/+--------------------------------------------------------------+\n   if(buySignal)\n   {\n      \/\/--- Look only at a position this robot opened itself\n      if(PositionSelect(_Symbol) &amp;&amp;\n         PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)\n      {\n         long positionType = PositionGetInteger(POSITION_TYPE);\n\n         \/\/--- A buy is already running, nothing to do\n         if(positionType == POSITION_TYPE_BUY)\n            return;\n\n         \/\/--- Close the opposite position before reversing\n         if(positionType == POSITION_TYPE_SELL)\n            trade.PositionClose(_Symbol);\n      }\n\n      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);\n      double sl  = NormalizeDouble(ask - InpStopLoss   * _Point, _Digits);\n      double tp  = NormalizeDouble(ask + InpTakeProfit * _Point, _Digits);\n\n      trade.Buy(InpLotSize, _Symbol, 0, sl, tp, \"EMA 9\/21 Buy\");\n   }\n\n   \/\/+--------------------------------------------------------------+\n   \/\/| Sell signal                                                   |\n   \/\/+--------------------------------------------------------------+\n   if(sellSignal)\n   {\n      if(PositionSelect(_Symbol) &amp;&amp;\n         PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)\n      {\n         long positionType = PositionGetInteger(POSITION_TYPE);\n\n         if(positionType == POSITION_TYPE_SELL)\n            return;\n\n         if(positionType == POSITION_TYPE_BUY)\n            trade.PositionClose(_Symbol);\n      }\n\n      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);\n      double sl  = NormalizeDouble(bid + InpStopLoss   * _Point, _Digits);\n      double tp  = NormalizeDouble(bid - InpTakeProfit * _Point, _Digits);\n\n      trade.Sell(InpLotSize, _Symbol, 0, sl, tp, \"EMA 9\/21 Sell\");\n   }\n}\n\n\/\/+------------------------------------------------------------------+\n\/\/| Expert deinitialization function                                 |\n\/\/+------------------------------------------------------------------+\nvoid OnDeinit(const int reason)\n{\n   \/\/--- Release the indicator handles\n   if(fastEMAHandle != INVALID_HANDLE)\n      IndicatorRelease(fastEMAHandle);\n   if(slowEMAHandle != INVALID_HANDLE)\n      IndicatorRelease(slowEMAHandle);\n}\n\/\/+------------------------------------------------------------------+<\/code><\/pre>\n<\/div>\n<div class=\"ea-promo\">\n<div>\n<div class=\"ea-promo-title\">Prueba este robot en una cuenta demo gratuita<\/div>\n<div class=\"ea-promo-sub\">Acceso completo a MetaTrader 5 y condiciones reales de mercado, sin poner en juego fondos propios.<\/div>\n<\/div>\n<div class=\"ea-promo-actions\">\n<a class=\"ea-promo-btn\" href=\"https:\/\/my.roboforex.com\/es\/register\/\" rel=\"nofollow nofollow\" target=\"_blank\">Abrir una cuenta demo<\/a>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Anatomia_del_codigo_que_hace_cada_bloque\"><\/span>Anatom&iacute;a del c&oacute;digo: qu&eacute; hace cada bloque<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>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.<\/p>\n<div class=\"ea-table-wrap\">\n<table class=\"rf\">\n<thead>\n<tr><th>Bloque<\/th><th>Qu&eacute; hace<\/th><\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-label=\"Bloque\">Par&aacute;metros <strong>input<\/strong><\/td>\n<td data-label=\"Qu&eacute; hace\">Ajustes que puedes cambiar desde el di&aacute;logo del robot en MetaTrader 5, sin tocar el c&oacute;digo fuente: periodos de las EMA, tama&ntilde;o del lote, stop-loss, take-profit y n&uacute;mero m&aacute;gico.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Bloque\"><strong>OnInit()<\/strong><\/td>\n<td data-label=\"Qu&eacute; hace\">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.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Bloque\"><strong>OnTick()<\/strong>, filtro de barra nueva<\/td>\n<td data-label=\"Qu&eacute; hace\">Se ejecuta con cada tick entrante y sale de inmediato salvo que se haya abierto una barra nueva, de modo que la estrategia se eval&uacute;a una vez por vela.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Bloque\"><strong>CopyBuffer()<\/strong> y la comprobaci&oacute;n del cruce<\/td>\n<td data-label=\"Qu&eacute; hace\">Lee los tres &uacute;ltimos valores de cada EMA y compara las dos barras cerradas para decidir si hubo un cruce.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Bloque\"><strong>CTrade<\/strong>, ejecuci&oacute;n de la operaci&oacute;n<\/td>\n<td data-label=\"Qu&eacute; hace\">Env&iacute;a la orden, adjunta el stop-loss y el take-profit, y cierra primero una posici&oacute;n contraria cuando la se&ntilde;al se invierte.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Bloque\"><strong>OnDeinit()<\/strong><\/td>\n<td data-label=\"Qu&eacute; hace\">Se ejecuta una vez cuando el robot se retira del gr&aacute;fico y libera los dos handles de indicador.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Parametros_de_entrada\"><\/span>Par&aacute;metros de entrada<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Los ajustes de la parte superior del archivo llevan el modificador <code>input<\/code>, que los expone en la ventana de par&aacute;metros del robot dentro de MetaTrader 5. En este ejemplo son los periodos de la EMA r&aacute;pida y la lenta, <code>InpFastEMA<\/code> e <code>InpSlowEMA<\/code>, junto con <code>InpLotSize<\/code>, <code>InpStopLoss<\/code>, <code>InpTakeProfit<\/code> e <code>InpMagic<\/code>.<\/p>\n<p>La ventaja est&aacute; en que cambiar un ajuste no exige tocar el c&oacute;digo fuente. Los valores se pueden modificar justo antes de lanzar el robot, y el probador de estrategias puede recorrerlos durante una optimizaci&oacute;n.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_7.png\"><img alt=\"Pesta&ntilde;a Inputs del di&aacute;logo del expert advisor en MetaTrader 5 con los par&aacute;metros editables\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_7.png\"><\/a><figcaption class=\"wp-element-caption\">La pesta&ntilde;a Inputs expone todos los par&aacute;metros declarados con el modificador input. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"Inicializacion_con_OnInit\"><\/span>Inicializaci&oacute;n con OnInit()<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>OnInit() se ejecuta una vez cuando el robot arranca, lo que ocurre al adjuntarlo a un gr&aacute;fico o al reiniciar el terminal. Prepara los recursos que el robot necesitar&aacute; despu&eacute;s, creando los handles de indicador que suministran los valores de las EMA.<\/p>\n<p>Cuando esa preparaci&oacute;n falla, la funci&oacute;n devuelve <code>INIT_FAILED<\/code> y el terminal detiene el robot en lugar de ejecutarlo a medio configurar. Tambi&eacute;n fija el n&uacute;mero m&aacute;gico, la etiqueta que marca cada orden que env&iacute;a este robot y le permite distinguir sus propias posiciones de cualquier otra cosa sobre el mismo s&iacute;mbolo.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"El_evento_de_tick_y_el_filtro_de_barra_nueva\"><\/span>El evento de tick y el filtro de barra nueva<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>OnTick() es la funci&oacute;n principal. El terminal la llama cada vez que llega un tick nuevo, es decir, cualquier cambio en la cotizaci&oacute;n. Evaluar la estrategia en cada tick ser&iacute;a trabajo desperdiciado aqu&iacute;, as&iacute; que un filtro de barra nueva reduce el procesamiento a una vez por vela.<\/p>\n<p>El robot lee la hora de apertura de la barra actual con <code>iTime()<\/code> y la compara con la hora que proces&oacute; la &uacute;ltima vez:<\/p>\n<div class=\"ea-code-wrap ea-code-inline\">\n<pre class=\"ea-code\"><code>if(currentBarTime == lastBarTime)\n   return;<\/code><\/pre>\n<\/div>\n<p>Cuando se abre una vela nueva, esa hora cambia y el robot contin&uacute;a. La estrategia reacciona por tanto una vez por vela, y deja de seguir cada cambio de precio dentro de ella.<\/p>\n<p>Tras el filtro, el robot copia ambas EMA con <code>CopyBuffer()<\/code> y comprueba si hubo un cruce. El &iacute;ndice 1 contiene la &uacute;ltima barra cerrada y el &iacute;ndice 2 la anterior, de modo que la comparaci&oacute;n nunca toca la vela que a&uacute;n se est&aacute; formando. La EMA 9 cruzando por encima de la EMA 21 activa <code>buySignal<\/code>, cruzando por debajo activa <code>sellSignal<\/code>, y solo entonces toma el relevo el bloque de ejecuci&oacute;n.<\/p>\n<!-- WIDGET: EMA crossover visualiser -->\n<div class=\"ea-widget\" id=\"ea-ema-widget\">\n<div class=\"ea-widget-title\">D&oacute;nde ve una se&ntilde;al el robot<\/div>\n<div class=\"ea-widget-sub\">Mueve el control para avanzar el gr&aacute;fico barra a barra. El robot compara las dos &uacute;ltimas barras cerradas, los mismos dos valores que su c&oacute;digo lee como &iacute;ndice 1 e &iacute;ndice 2.<\/div>\n<div class=\"ea-ema-chart\">\n<svg aria-label=\"Precio con EMA 9 y EMA 21, avanzando barra a barra\" id=\"ea-ema-svg\" role=\"img\" viewbox=\"0 0 720 250\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<path class=\"ea-ema-line-price\" d=\"\" fill=\"none\" id=\"ea-ema-price\"><\/path>\n<path class=\"ea-ema-line-slow\" d=\"\" fill=\"none\" id=\"ea-ema-slow\"><\/path>\n<path class=\"ea-ema-line-fast\" d=\"\" fill=\"none\" id=\"ea-ema-fast\"><\/path>\n<g id=\"ea-ema-marks\"><\/g>\n<circle class=\"ea-ema-dot\" cx=\"-10\" cy=\"-10\" id=\"ea-ema-dot\" r=\"5\"><\/circle>\n<\/svg>\n<\/div>\n<div class=\"ea-ema-legend\">\n<span class=\"ea-leg ea-leg-fast\">EMA 9<\/span>\n<span class=\"ea-leg ea-leg-slow\">EMA 21<\/span>\n<span class=\"ea-leg ea-leg-price\">Precio de cierre<\/span>\n<\/div>\n<label class=\"ea-range-label\" for=\"ea-ema-range\">Barra en el gr&aacute;fico<\/label>\n<input class=\"ea-range\" id=\"ea-ema-range\" max=\"55\" min=\"21\" step=\"1\" type=\"range\" value=\"21\">\n<div class=\"ea-ema-stats\">\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">EMA 9, &uacute;ltima barra cerrada<\/div><div class=\"ea-stat-val\" id=\"ea-ema-fastval\">0<\/div><\/div>\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">EMA 21, &uacute;ltima barra cerrada<\/div><div class=\"ea-stat-val\" id=\"ea-ema-slowval\">0<\/div><\/div>\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">Qu&eacute; hace el robot<\/div><div class=\"ea-stat-val\" id=\"ea-ema-signal\">Espera<\/div><\/div>\n<\/div>\n<div class=\"ea-ema-verdict\" id=\"ea-ema-verdict\">No hay cruce en las dos &uacute;ltimas barras cerradas, as&iacute; que el robot mantiene su posici&oacute;n y espera a la vela siguiente.<\/div>\n<\/div>\n<script>\n  (function() {\n    var range = document.getElementById('ea-ema-range');\n    var svg   = document.getElementById('ea-ema-svg');\n    if(!range || !svg) return;\n\n    var pricePath = document.getElementById('ea-ema-price');\n    var fastPath  = document.getElementById('ea-ema-fast');\n    var slowPath  = document.getElementById('ea-ema-slow');\n    var marks     = document.getElementById('ea-ema-marks');\n    var dot       = document.getElementById('ea-ema-dot');\n    var fastOut   = document.getElementById('ea-ema-fastval');\n    var slowOut   = document.getElementById('ea-ema-slowval');\n    var sigOut    = document.getElementById('ea-ema-signal');\n    var verdict   = document.getElementById('ea-ema-verdict');\n\n    \/\/ Deterministic sample path: a decline, a rally, then a decline again,\n    \/\/ so the reader sees one upward crossover and one downward crossover.\n    var close = [\n      1.2700,1.2712,1.2695,1.2680,1.2688,1.2665,1.2650,1.2658,1.2640,1.2622,\n      1.2630,1.2610,1.2595,1.2602,1.2585,1.2570,1.2578,1.2560,1.2566,1.2555,\n      1.2572,1.2590,1.2585,1.2604,1.2620,1.2612,1.2635,1.2650,1.2644,1.2668,\n      1.2685,1.2678,1.2700,1.2715,1.2708,1.2730,1.2745,1.2738,1.2758,1.2770,\n      1.2762,1.2780,1.2795,1.2788,1.2770,1.2740,1.2745,1.2715,1.2690,1.2695,\n      1.2665,1.2640,1.2648,1.2620,1.2600,1.2608\n    ];\n\n    function ema(src, period) {\n      var out = [], k = 2 \/ (period + 1), seed = 0, i;\n      for(i = 0; i < period; i++) seed += src[i];\n      seed = seed \/ period;\n      for(i = 0; i < src.length; i++) {\n        if(i < period - 1) { out.push(null); continue; }\n        if(i === period - 1) { out.push(seed); continue; }\n        out.push(src[i] * k + out[i - 1] * (1 - k));\n      }\n      return out;\n    }\n\n    var fast = ema(close, 9);\n    var slow = ema(close, 21);\n\n    \/\/ Fixed vertical scale, so the lines stay put as the slider moves.\n    var lo = Math.min.apply(null, close);\n    var hi = Math.max.apply(null, close);\n    var pad = (hi - lo) * 0.12;\n    lo -= pad; hi += pad;\n\n    var W = 720, H = 250, PX = 12, PY = 14;\n\n    function x(i) { return PX + (i \/ (close.length - 1)) * (W - 2 * PX); }\n    function y(v) { return H - PY - ((v - lo) \/ (hi - lo)) * (H - 2 * PY); }\n\n    function line(series, upto) {\n      var d = '', started = false;\n      for(var i = 0; i <= upto; i++) {\n        if(series[i] === null || series[i] === undefined) continue;\n        d += (started ? 'L' : 'M') + x(i).toFixed(1) + ' ' + y(series[i]).toFixed(1) + ' ';\n        started = true;\n      }\n      return d;\n    }\n\n    \/\/ A crossover is read exactly the way the robot reads it: the bar before\n    \/\/ the last closed one, then the last closed one.\n    function crossAt(i) {\n      if(i < 21 || fast[i] === null || fast[i - 1] === null) return 0;\n      if(fast[i - 1] <= slow[i - 1] && fast[i] > slow[i]) return 1;\n      if(fast[i - 1] >= slow[i - 1] && fast[i] < slow[i]) return -1;\n      return 0;\n    }\n\n    function render() {\n      var i = parseInt(range.value, 10);\n\n      pricePath.setAttribute('d', line(close, i));\n      fastPath.setAttribute('d', line(fast, i));\n      slowPath.setAttribute('d', line(slow, i));\n\n      dot.setAttribute('cx', x(i).toFixed(1));\n      dot.setAttribute('cy', y(close[i]).toFixed(1));\n\n      \/\/ Every crossover already passed stays marked on the chart.\n      var m = '';\n      for(var j = 21; j <= i; j++) {\n        var c = crossAt(j);\n        if(c !== 0) {\n          m += '<circle class=\"' + (c === 1 ? 'ea-ema-cross-up' : 'ea-ema-cross-down') +\n               '\" cx=\"' + x(j).toFixed(1) + '\" cy=\"' + y(fast[j]).toFixed(1) + '\" r=\"6\">';\n        }\n      }\n      marks.innerHTML = m;\n\n      fastOut.innerHTML = fast[i].toFixed(4);\n      slowOut.innerHTML = slow[i].toFixed(4);\n\n      var state = crossAt(i);\n      if(state === 1) {\n        sigOut.innerHTML = 'Abre una compra';\n        sigOut.className = 'ea-stat-val ea-stat-buy';\n        verdict.innerHTML = 'La EMA 9 estaba en o por debajo de la EMA 21 en la barra anterior y cerr&oacute; por encima en la &uacute;ltima. Eso activa <strong>buySignal, y el robot abre una compra, cerrando antes una venta abierta.';\n        verdict.className = 'ea-ema-verdict ea-ema-verdict-buy';\n      } else if(state === -1) {\n        sigOut.innerHTML = 'Abre una venta';\n        sigOut.className = 'ea-stat-val ea-stat-sell';\n        verdict.innerHTML = 'La EMA 9 estaba en o por encima de la EMA 21 en la barra anterior y cerr&oacute; por debajo en la &uacute;ltima. Eso activa <strong>sellSignal, y el robot abre una venta, cerrando antes una compra abierta.';\n        verdict.className = 'ea-ema-verdict ea-ema-verdict-sell';\n      } else {\n        sigOut.innerHTML = 'Espera';\n        sigOut.className = 'ea-stat-val';\n        verdict.innerHTML = 'No hay cruce en las dos &uacute;ltimas barras cerradas, as&iacute; que el robot mantiene su posici&oacute;n y espera a la vela siguiente.';\n        verdict.className = 'ea-ema-verdict';\n      }\n    }\n\n    range.addEventListener('input', render);\n    render();\n  })();\n  <\/script>\n<div class=\"ea-callout\">\n<div class=\"ea-callout-label\">Por qu&eacute; los arrays se declaran vac&iacute;os<\/div>\n<p>Los dos arrays se declaran como <code>double fastEMA[]<\/code> sin tama&ntilde;o y despu&eacute;s se pasan a <code>ArraySetAsSeries()<\/code>. Ese flag invierte la indexaci&oacute;n, de modo que el &iacute;ndice 0 es la barra m&aacute;s reciente, que es como lee el resto del c&oacute;digo. MQL5 se niega a aplicar ese flag a un array cuyo tama&ntilde;o est&aacute; fijado en el c&oacute;digo fuente, as&iacute; que una declaraci&oacute;n con tama&ntilde;o como <code>double fastEMA[3]<\/code> dejar&iacute;a la indexaci&oacute;n invertida en silencio y convertir&iacute;a cada se&ntilde;al de compra en una de venta.<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Ejecucion_de_las_operaciones\"><\/span>Ejecuci&oacute;n de las operaciones<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Las &oacute;rdenes pasan por <code>CTrade<\/code>, una clase de la librer&iacute;a est&aacute;ndar de MQL5 que envuelve el trabajo de montar a mano una petici&oacute;n de operaci&oacute;n. Seg&uacute;n la se&ntilde;al, el robot llama a <code>trade.Buy()<\/code> o a <code>trade.Sell()<\/code> y le pasa el volumen de la posici&oacute;n junto con los niveles de stop-loss y take-profit.<\/p>\n<p>Ambos niveles se calculan en puntos desde el precio actual y despu&eacute;s se pasan por <code>NormalizeDouble()<\/code>, que los recorta al n&uacute;mero de decimales que el s&iacute;mbolo usa de verdad. Los servidores rechazan precios con m&aacute;s precisi&oacute;n de la que el instrumento admite, y es aqu&iacute; donde eso aparece.<\/p>\n<p>Antes de abrir nada, el robot comprueba si una posici&oacute;n sobre el s&iacute;mbolo ya le pertenece, comparando <code>POSITION_MAGIC<\/code> con su propio n&uacute;mero m&aacute;gico. Esa comprobaci&oacute;n evita que cierre una operaci&oacute;n que abriste a mano o una que pertenece a otro robot sobre el mismo instrumento.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Plantilla_lista_y_codigo_generado_por_IA\"><\/span>Plantilla lista y c&oacute;digo generado por IA<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Las herramientas de IA han facilitado mucho el arranque con los expert advisors. Un trader sin experiencia en programaci&oacute;n puede describir una idea de trading con palabras corrientes y recibir la base de un robot en MQL5.<\/p>\n<p>Sigue habiendo una diferencia entre partir de una plantilla y generar c&oacute;digo desde cero. Un modelo produce r&aacute;pido una l&oacute;gica de trading complicada, y ese c&oacute;digo todav&iacute;a hay que leerlo, compilarlo y probarlo. MQL5 es un objetivo m&aacute;s estrecho que los lenguajes de uso general, as&iacute; que un modelo tiene m&aacute;s probabilidades de inventarse la firma de una funci&oacute;n, mezclar h&aacute;bitos de MQL4 dentro de c&oacute;digo MQL5 o dejar fuera una salvaguarda que nadie pidi&oacute;.<\/p>\n<div class=\"ea-table-wrap ea-table-wide\">\n<table class=\"rf\">\n<thead>\n<tr><th>Criterio<\/th><th>Plantilla lista<\/th><th>C&oacute;digo generado por IA<\/th><\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-label=\"Criterio\"><strong>Fiabilidad<\/strong><\/td>\n<td data-label=\"Plantilla lista\">La estructura es fija y la l&oacute;gica del ejemplo est&aacute; documentada. Compilar y probar siguen siendo obligatorios.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">Depende del prompt y del modelo. El c&oacute;digo necesita el mismo paso de compilaci&oacute;n y prueba, partiendo de m&aacute;s abajo.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Criterio\"><strong>Salvaguardas<\/strong><\/td>\n<td data-label=\"Plantilla lista\">El filtro de barra nueva y la comprobaci&oacute;n del n&uacute;mero m&aacute;gico ya est&aacute;n puestos.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">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.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Criterio\"><strong>Rapidez hasta tener el robot en marcha<\/strong><\/td>\n<td data-label=\"Plantilla lista\">Alta. Pegar, compilar, probar.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">Alta en una tarea simple. Una l&oacute;gica compleja suele llevar varias rondas de generar y corregir.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Criterio\"><strong>Flexibilidad<\/strong><\/td>\n<td data-label=\"Plantilla lista\">Limitada a la l&oacute;gica de este robot y a los par&aacute;metros que expone.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">Alta. La estrategia se puede moldear en torno a tus propias reglas, indicadores y filtros.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Criterio\"><strong>Complejidad de la estrategia<\/strong><\/td>\n<td data-label=\"Plantilla lista\">Encaja con modelos de trading simples y legibles.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">Admite conceptos m&aacute;s elaborados, y cuanto m&aacute;s elaborado sea el c&oacute;digo, m&aacute;s pesa la verificaci&oacute;n.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Criterio\"><strong>Verificaci&oacute;n<\/strong><\/td>\n<td data-label=\"Plantilla lista\">Obligatoria. Una compilaci&oacute;n limpia no dice nada sobre si la l&oacute;gica de trading es s&oacute;lida.<\/td>\n<td data-label=\"C&oacute;digo generado por IA\">Obligatoria por partida doble: la sintaxis, y si el c&oacute;digo se corresponde con la idea que describiste.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Una plantilla lista es la v&iacute;a m&aacute;s r&aacute;pida para ver c&oacute;mo est&aacute; montado un expert advisor. La IA se vuelve realmente &uacute;til en el paso siguiente, cuando ya tienes c&oacute;digo funcionando delante y quieres que te lo expliquen, lo ampl&iacute;en o lo adapten. La mayor&iacute;a de principiantes saca partido de las dos cosas: partir de un ejemplo que funciona y despu&eacute;s usar un chat de IA para recorrer bloques concretos y a&ntilde;adir condiciones propias.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Como_compilar_y_lanzar_el_robot_en_MetaTrader_5\"><\/span>C&oacute;mo compilar y lanzar el robot en MetaTrader 5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Con la l&oacute;gica de trading en el archivo, tres pasos lo convierten en un robot funcionando sobre un gr&aacute;fico.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Paso_1_Pon_el_codigo_en_el_archivo\"><\/span>Paso 1. Pon el c&oacute;digo en el archivo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Aqu&iacute; se usa el archivo <code>.mq5<\/code> que cre&oacute; antes el MQL Wizard. La plantilla generada contiene c&oacute;digo de relleno, y todo &eacute;l se sustituye por el listado de arriba, de modo que el archivo contenga el robot y nada m&aacute;s.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Paso_2_Compila\"><\/span>Paso 2. Compila<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Compilar convierte el c&oacute;digo fuente MQL5 en el formato ejecutable que corre el terminal, y produce un archivo <code>.ex5<\/code>. L&aacute;nzalo con el bot&oacute;n Compile de la barra de MetaEditor o con <strong>F7<\/strong>.<\/p>\n<p>El resultado aparece en la parte inferior de la ventana. Sin errores de sintaxis, el mensaje dice:<\/p>\n<div class=\"ea-code-wrap ea-code-inline\">\n<pre class=\"ea-code\"><code>0 error(s), 0 warning(s)<\/code><\/pre>\n<\/div>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_10.png\"><img alt=\"Toolbox de MetaEditor mostrando una compilaci&oacute;n correcta con cero errores y cero advertencias\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_10.png\"><\/a><figcaption class=\"wp-element-caption\">Una compilaci&oacute;n limpia produce el archivo .ex5 que el terminal puede ejecutar. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>Una compilaci&oacute;n limpia confirma que el c&oacute;digo es v&aacute;lido para el compilador. No dice nada sobre si la estrategia gana dinero ni sobre si la l&oacute;gica hace lo que pretend&iacute;as, que es para lo que est&aacute; el probador de estrategias.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Paso_3_Adjunta_el_robot_a_un_grafico\"><\/span>Paso 3. Adjunta el robot a un gr&aacute;fico<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>El robot compilado aparece ya en MetaTrader 5. Abre la ventana <strong>Navigator<\/strong>, entra en <strong>Expert Advisors<\/strong> y localiza <strong>MyFirstRobot<\/strong>. Arr&aacute;stralo sobre el gr&aacute;fico del instrumento con el que quieras que opere.<\/p>\n<p>Se abre la ventana de par&aacute;metros. Revisa aqu&iacute; 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&ntilde;a <strong>Common<\/strong>, confirma que <strong>Allow Algo Trading<\/strong> est&aacute; marcado y acepta el di&aacute;logo.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_11.png\"><img alt=\"Di&aacute;logo del expert advisor en MetaTrader 5 con Allow Algo Trading activado en la pesta&ntilde;a Common\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_11.png\"><\/a><figcaption class=\"wp-element-caption\">La pesta&ntilde;a Common, donde el robot recibe permiso para operar. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>Cuando el bot&oacute;n <strong>Algo Trading<\/strong> de la barra del terminal tambi&eacute;n est&aacute; activo, el robot puede enviar &oacute;rdenes seg&uacute;n su l&oacute;gica y empieza a seguir el mercado con los par&aacute;metros que le has puesto.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Pruebas_en_el_probador_de_estrategias\"><\/span>Pruebas en el probador de estrategias<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Antes de que un robot se acerque siquiera a una cuenta real, su sitio est&aacute; en el probador de estrategias integrado en MetaTrader 5. Una prueba sobre datos hist&oacute;ricos muestra c&oacute;mo habr&iacute;a ejecutado el robot sus reglas en condiciones de mercado distintas, y saca a la luz fallos t&eacute;cnicos mucho antes de que haya dinero de por medio.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Como_lanzar_la_prueba\"><\/span>C&oacute;mo lanzar la prueba<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Abre el probador con <strong>Ctrl + R<\/strong>. En sus ajustes, selecciona el expert advisor <strong>MyFirstRobot<\/strong>, el instrumento, por ejemplo GBPUSD, y el <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2020\/05\/21\/how-to-choose-a-timeframe-for-trading\/\" data-internallinksmanager029f6b8e52c=\"90\" title=\"marco temporal\">marco temporal<\/a> H1 para el que est&aacute; escrito este ejemplo. Para la simulaci&oacute;n m&aacute;s realista, elige el modo de modelado <strong>Every tick based on real ticks<\/strong> y fija el periodo hist&oacute;rico.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_14.png\"><img alt=\"Ajustes del probador de estrategias en MetaTrader 5 con el expert advisor, el s&iacute;mbolo y el marco temporal seleccionados\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_14.png\"><\/a><figcaption class=\"wp-element-caption\">Configuraci&oacute;n del probador: expert advisor, s&iacute;mbolo, marco temporal, periodo y modo de modelado. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>MetaTrader 5 reproduce entonces el movimiento hist&oacute;rico del precio y simula el robot: las se&ntilde;ales apareciendo, las posiciones abri&eacute;ndose y cerr&aacute;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.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_15.png\"><img alt=\"Informe del probador de estrategias en MetaTrader 5 con la curva de balance y las m&eacute;tricas de resultado\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_15.png\"><\/a><figcaption class=\"wp-element-caption\">El informe del probador tras una pasada completa. Fuente: MetaTrader 5. Los resultados pasados no garantizan el rendimiento futuro.<\/figcaption><\/figure>\n<p>Un backtest muestra c&oacute;mo se comportaron las reglas sobre un historial de precios que ya se conoce. Es una comprobaci&oacute;n de que el robot ejecuta su l&oacute;gica correctamente, y no lleva ning&uacute;n pron&oacute;stico de ingresos futuros. Cuanto m&aacute;s compleja sea una estrategia y m&aacute;s ajustada est&eacute; a los datos hist&oacute;ricos, m&aacute;s tienden sus resultados en real a quedarse por debajo de la prueba.<\/p>\n<p><em>Para la configuraci&oacute;n completa de pruebas con ticks, consulta <a href=\"https:\/\/roboforex.com\/es\/blog\/2026\/07\/31\/a-15-minute-backtest-how-to-test-a-trading-robot-in-metatrader-5\/\">Un backtest de 15 minutos: c&oacute;mo probar un robot de trading en MetaTrader 5<\/a>.<\/em><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Que_cifras_leer_en_el_informe\"><\/span>Qu&eacute; cifras leer en el informe<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>MetaTrader 5 produce un informe detallado. Cuatro cifras bastan para una primera valoraci&oacute;n.<\/p>\n<div class=\"ea-table-wrap ea-table-wide\">\n<table class=\"rf\">\n<thead>\n<tr><th>M&eacute;trica<\/th><th>Qu&eacute; muestra<\/th><th>Qu&eacute; vigilar<\/th><\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-label=\"M&eacute;trica\"><strong>Profit Factor<\/strong><\/td>\n<td data-label=\"Qu&eacute; muestra\">El beneficio total dividido entre la p&eacute;rdida total en toda la prueba. Por encima de 1 significa que las operaciones ganadoras pesaron m&aacute;s que las perdedoras.<\/td>\n<td data-label=\"Qu&eacute; vigilar\">Un valor bajo apunta a una estad&iacute;stica floja. Los valores por encima de 1.2 o 1.5 son un primer filtro habitual, y no existe un umbral universal.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"M&eacute;trica\"><strong>Max <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2019\/11\/14\/drawdown-what-is-it-and-how-to-escape-it\/\" data-internallinksmanager029f6b8e52c=\"73\" title=\"drawdown\">Drawdown<\/a><\/strong><\/td>\n<td data-label=\"Qu&eacute; muestra\">La ca&iacute;da m&aacute;s profunda del balance desde un m&aacute;ximo anterior.<\/td>\n<td data-label=\"Qu&eacute; vigilar\">Un drawdown grande significa mucha presi&oacute;n sobre el dep&oacute;sito. L&eacute;elo junto con la rentabilidad y el tama&ntilde;o de la posici&oacute;n.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"M&eacute;trica\"><strong>Total Trades<\/strong><\/td>\n<td data-label=\"Qu&eacute; muestra\">Cu&aacute;ntas operaciones hizo el robot en el periodo probado.<\/td>\n<td data-label=\"Qu&eacute; vigilar\">Una muestra peque&ntilde;a tiene poco peso estad&iacute;stico. Unas pocas decenas de buenas operaciones no sostienen ninguna conclusi&oacute;n firme sobre fiabilidad.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"M&eacute;trica\"><strong>Win Rate<\/strong><\/td>\n<td data-label=\"Qu&eacute; muestra\">La proporci&oacute;n de operaciones rentables sobre el total.<\/td>\n<td data-label=\"Qu&eacute; vigilar\">Por s&iacute; sola no resuelve nada. L&eacute;ela frente a la ganancia media, la p&eacute;rdida media y el stop-loss y el take-profit en uso.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"Que_muestra_el_informe_mas_alla_de_la_linea_de_beneficio\"><\/span>Qu&eacute; muestra el informe m&aacute;s all&aacute; de la l&iacute;nea de beneficio<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Leer solo el beneficio final es el atajo m&aacute;s com&uacute;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&ntilde;ado de operaciones. Pondera el factor de beneficio y el beneficio final junto con el drawdown m&aacute;ximo, el n&uacute;mero de operaciones, la forma de la curva de equity y c&oacute;mo se reparten los resultados en el tiempo.<\/p>\n<p>Hay algo m&aacute;s que merece atenci&oacute;n: hasta qu&eacute; punto el resultado sobrevive a un cambio del periodo de prueba o a un cambio peque&ntilde;o de par&aacute;metros. Cuando un ajuste menor convierte una estrategia rentable en una perdedora, lo m&aacute;s probable es que est&eacute; amoldada a su historial.<\/p>\n<div class=\"ea-callout\">\n<div class=\"ea-callout-label\">Para qu&eacute; sirve un primer backtest<\/div>\n<p>El objetivo de un primer backtest es confirmar que el robot implementa correctamente la l&oacute;gica de trading y no produce nada visiblemente roto. Encontrar una estrategia ideal viene despu&eacute;s, sobre otros periodos hist&oacute;ricos y luego en una cuenta demo.<\/p>\n<\/div>\n<div class=\"ea-promo\">\n<div>\n<div class=\"ea-promo-title\">Del probador a un gr&aacute;fico en vivo<\/div>\n<div class=\"ea-promo-sub\">Una cuenta cent permite al robot operar el lote m&iacute;nimo sobre precios en vivo, as&iacute; que la primera pasada supervisada cuesta una fracci&oacute;n de lo que costar&iacute;a en una cuenta est&aacute;ndar.<\/div>\n<\/div>\n<div class=\"ea-promo-actions\">\n<a class=\"ea-promo-btn\" href=\"https:\/\/my.roboforex.com\/es\/register\/\" rel=\"nofollow nofollow\" target=\"_blank\">Abrir una cuenta<\/a>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"La_lista_de_comprobacion_previa_al_lanzamiento\"><\/span>La lista de comprobaci&oacute;n previa al lanzamiento<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Una compilaci&oacute;n correcta no significa que el robot est&eacute; listo para una cuenta real. Repasa estos puntos antes de activar el trading automatizado.<\/p>\n<!-- WIDGET: interactive checklist -->\n<div class=\"ea-checklist\" id=\"ea-checklist\">\n<div class=\"ea-check-head\">\n<div class=\"ea-check-count\" id=\"ea-check-count\">0 de 5 marcados<\/div>\n<div class=\"ea-check-track\"><div class=\"ea-check-bar\" id=\"ea-check-bar\"><\/div><\/div>\n<\/div>\n<button class=\"ea-check-item\" data-ea-check=\"tester\" type=\"button\">El robot ha pasado por el probador de estrategias con el instrumento y el marco temporal con los que piensas operar, como se explica en la secci&oacute;n anterior.<\/button>\n<button class=\"ea-check-item\" data-ea-check=\"algo\" type=\"button\">El bot&oacute;n <strong>Algo Trading<\/strong> de la barra del terminal est&aacute; activo, y <strong>Allow Algo Trading<\/strong> est&aacute; marcado en el propio di&aacute;logo del robot. Ambos hacen falta antes de que pueda salir una sola orden.<\/button>\n<button class=\"ea-check-item\" data-ea-check=\"log\" type=\"button\">La pesta&ntilde;a <strong>Experts<\/strong> del Toolbox muestra el mensaje de arranque y ning&uacute;n fallo. La pesta&ntilde;a <strong>Journal<\/strong> tambi&eacute;n merece un vistazo.<\/button>\n<button class=\"ea-check-item\" data-ea-check=\"lot\" type=\"button\">El tama&ntilde;o del lote en la pesta&ntilde;a Inputs est&aacute; fijado en el m&iacute;nimo que permita tu br&oacute;ker, habitualmente 0.01 en los instrumentos de <a href=\"https:\/\/roboforex.com\/es\/\" data-internallinksmanager029f6b8e52c=\"1\" title=\"br\u00f3ker de forex\">divisas<\/a> est&aacute;ndar, y no en el 0.10 con el que viene el ejemplo.<\/button>\n<button class=\"ea-check-item\" data-ea-check=\"account\" type=\"button\">La cuenta es demo, o bien una cuenta real que solo contiene el dinero que has apartado para esta prueba.<\/button>\n<div class=\"ea-check-done\" id=\"ea-check-done\">&#10003; Los cinco marcados. El robot est&aacute; listo para su primera pasada supervisada.<\/div>\n<\/div>\n<script>\n  (function() {\n    var box = document.getElementById('ea-checklist');\n    if(!box) return;\n\n    var items = box.querySelectorAll('[data-ea-check]');\n    var count = document.getElementById('ea-check-count');\n    var bar   = document.getElementById('ea-check-bar');\n    var done  = document.getElementById('ea-check-done');\n    var KEY   = 'ea-mql5-checklist';\n\n    function load() {\n      try { return JSON.parse(localStorage.getItem(KEY)) || {}; }\n      catch(e) { return {}; }\n    }\n    function save(state) {\n      try { localStorage.setItem(KEY, JSON.stringify(state)); }\n      catch(e) { \/* modo privado, la lista sigue funcionando durante esta visita *\/ }\n    }\n\n    var state = load();\n\n    function render() {\n      var n = 0;\n      for(var i = 0; i < items.length; i++) {\n        var key = items[i].getAttribute('data-ea-check');\n        var on  = state[key] === true;\n        items[i].className = 'ea-check-item' + (on ? ' ea-is-done' : '');\n        items[i].setAttribute('aria-pressed', on ? 'true' : 'false');\n        if(on) n++;\n      }\n      count.innerHTML = n + ' de ' + items.length + ' marcados';\n      bar.style.width = (n \/ items.length * 100) + '%';\n      done.style.display = (n === items.length) ? 'block' : 'none';\n    }\n\n    for(var i = 0; i < items.length; i++) {\n      items[i].addEventListener('click', function() {\n        var key = this.getAttribute('data-ea-check');\n        state[key] = !state[key];\n        save(state);\n        render();\n      });\n    }\n\n    render();\n  })();\n  <\/script>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_12.png\"><img alt=\"Bot&oacute;n Algo Trading en la barra de MetaTrader 5 en estado activado\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_12.png\"><\/a><figcaption class=\"wp-element-caption\">El interruptor Algo Trading a nivel de terminal, el segundo de los dos permisos. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_13.png\"><img alt=\"Pesta&ntilde;a Experts del Toolbox de MetaTrader 5 con los mensajes de registro del expert advisor\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/2026\/09\/MQL5_expert_Advisor_13.png\"><\/a><figcaption class=\"wp-element-caption\">La pesta&ntilde;a Experts informa del arranque, las operaciones y los fallos, y muestra MyFirstRobot (EURUSD,H1): initialized en un arranque limpio. Fuente: MetaTrader 5.<\/figcaption><\/figure>\n<p>Dedica las primeras semanas a observar c&oacute;mo se comporta el robot en condiciones reales: que recibe cotizaciones, que abre posiciones solo cuando se cumplen sus condiciones, que adjunta sus &oacute;rdenes de protecci&oacute;n y que no toma operaciones con las que no contabas.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Dos_situaciones_que_resolver_en_el_primer_lanzamiento\"><\/span>Dos situaciones que resolver en el primer lanzamiento<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Un primer lanzamiento puede sacar a la luz problemas que ni el compilador ni la primera prueba mostraron. El c&oacute;digo compila, el robot est&aacute; sobre el gr&aacute;fico, Algo Trading est&aacute; activo, y aun as&iacute; no pasa nada. En la pr&aacute;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&aacute;s frecuencia que el resto.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"El_robot_se_queda_callado_por_culpa_del_margen\"><\/span>El robot se queda callado por culpa del margen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Imagina un robot sobre GBPUSD H1. La EMA 9 cruza la EMA 21 y no aparece ninguna posici&oacute;n. El primer sitio donde mirar es la pesta&ntilde;a <strong>Journal<\/strong> y los mensajes bajo <strong>Experts<\/strong>. Una l&iacute;nea que diga <code>Not enough money<\/code> apunta al margen libre.<\/p>\n<p>Abrir una posici&oacute;n hace que el br&oacute;ker reserve parte de la cuenta como garant&iacute;a de margen. La cantidad depende del volumen de la operaci&oacute;n, del precio del instrumento, del tipo de contrato, del <a href=\"https:\/\/roboforex.com\/es\/clients\/services\/2000-up-leverage\/\" data-internallinksmanager029f6b8e52c=\"28\" title=\"apalancamiento bolsa\">apalancamiento<\/a> y de las condiciones de la cuenta. Un <code>InpLotSize = 0.1<\/code> fijo puede resultar demasiado grande para un dep&oacute;sito peque&ntilde;o en algunos instrumentos, as&iacute; que el tama&ntilde;o del lote solo cobra sentido le&iacute;do frente al balance y al margen disponible.<\/p>\n<p>Comprueba que la cuenta tiene fondos libres suficientes para el volumen que has configurado. El margen requerido por lote figura en la especificaci&oacute;n del instrumento en MetaTrader 5. En una cuenta peque&ntilde;a, el volumen m&iacute;nimo permitido es el punto de partida sensato. Tener margen suficiente y tener un tama&ntilde;o de posici&oacute;n prudente son cuestiones separadas: que te llegue el margen para abrir una operaci&oacute;n no dice nada sobre lo que esa operaci&oacute;n puede costarte.<\/p>\n<!-- WIDGET: margin calculator -->\n<div class=\"ea-widget\" id=\"ea-margin-widget\">\n<div class=\"ea-widget-title\">&iquest;Podr&aacute; el robot abrir esta posici&oacute;n?<\/div>\n<div class=\"ea-widget-sub\">Introduce tus propias cifras para ver cu&aacute;nto margen inmovilizar&iacute;a el volumen de <code>InpLotSize<\/code>. El precio, t&oacute;malo de tu terminal.<\/div>\n<div class=\"ea-calc-grid\">\n<div class=\"ea-calc-field\">\n<label class=\"ea-calc-lbl\" for=\"ea-calc-balance\">Fondos libres en la cuenta, USD<\/label>\n<input class=\"ea-calc-in\" id=\"ea-calc-balance\" min=\"1\" step=\"10\" type=\"number\" value=\"100\">\n<\/div>\n<div class=\"ea-calc-field\">\n<label class=\"ea-calc-lbl\" for=\"ea-calc-lots\">Tama&ntilde;o del lote, InpLotSize<\/label>\n<input class=\"ea-calc-in\" id=\"ea-calc-lots\" min=\"0.01\" step=\"0.01\" type=\"number\" value=\"0.10\">\n<\/div>\n<div class=\"ea-calc-field\">\n<label class=\"ea-calc-lbl\" for=\"ea-calc-lev\">Apalancamiento<\/label>\n<select class=\"ea-calc-in\" id=\"ea-calc-lev\">\n<option value=\"5\">1:5<\/option>\n<option value=\"10\">1:10<\/option>\n<option value=\"20\">1:20<\/option>\n<option value=\"50\">1:50<\/option>\n<option selected value=\"100\">1:100<\/option>\n<option value=\"200\">1:200<\/option>\n<option value=\"500\">1:500<\/option>\n<option value=\"1000\">1:1000<\/option>\n<\/select>\n<\/div>\n<div class=\"ea-calc-field\">\n<label class=\"ea-calc-lbl\" for=\"ea-calc-price\">Precio del instrumento<\/label>\n<input class=\"ea-calc-in\" id=\"ea-calc-price\" min=\"0.0001\" step=\"0.0001\" type=\"number\" value=\"1.2700\">\n<\/div>\n<div class=\"ea-calc-field ea-calc-field-wide\">\n<label class=\"ea-calc-lbl\" for=\"ea-calc-contract\">Tama&ntilde;o del contrato, unidades en un lote<\/label>\n<input class=\"ea-calc-in\" id=\"ea-calc-contract\" min=\"0.01\" step=\"1\" type=\"number\" value=\"100000\">\n<div class=\"ea-calc-hint\">Esto cambia seg&uacute;n el instrumento. Un lote est&aacute;ndar de divisas son 100,000 unidades de la divisa base, mientras que los metales, los &iacute;ndices y otros CFDs usan cada uno su propio valor. Lee el tuyo en la especificaci&oacute;n del instrumento en MetaTrader 5: clic derecho sobre el s&iacute;mbolo en Market Watch y abre <strong>Specification<\/strong>.<\/div>\n<\/div>\n<\/div>\n<div class=\"ea-calc-out\">\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">Tama&ntilde;o de la posici&oacute;n<\/div><div class=\"ea-stat-val\" id=\"ea-calc-notional\">0<\/div><\/div>\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">Margen requerido<\/div><div class=\"ea-stat-val\" id=\"ea-calc-margin\">0<\/div><\/div>\n<div class=\"ea-stat\"><div class=\"ea-stat-lbl\">Fondos libres restantes<\/div><div class=\"ea-stat-val\" id=\"ea-calc-left\">0<\/div><\/div>\n<\/div>\n<div class=\"ea-calc-verdict\" id=\"ea-calc-verdict\">&#10003; La orden sale adelante.<\/div>\n<div class=\"ea-calc-note\">Una estimaci&oacute;n para un instrumento cotizado contra <a href=\"https:\/\/roboforex.com\/es\/blog\/blog\/2023\/08\/08\/prevision-usd\/\" data-internallinksmanager029f6b8e52c=\"187\" title=\"Previsi\u00f3n EUR\/USD\">el d&oacute;lar<\/a> estadounidense, con la f&oacute;rmula est&aacute;ndar: lotes multiplicados por el tama&ntilde;o del contrato y por el precio, dividido entre el apalancamiento. Los instrumentos no cotizados contra el d&oacute;lar llevan una conversi&oacute;n que el terminal resuelve por ti, y el swap, el <a href=\"https:\/\/roboforex.com\/es\/blog\/glossary-terms\/spread\/\" data-internallinksmanager029f6b8e52c=\"124\" title=\"que es el spread\">spread<\/a> y la comisi&oacute;n van aparte. Tu tipo de cuenta y la especificaci&oacute;n del s&iacute;mbolo son la autoridad sobre todo esto. Que el margen cubra la operaci&oacute;n es adem&aacute;s una cuesti&oacute;n distinta de que la posici&oacute;n tenga un tama&ntilde;o sensato para la cuenta.<\/div>\n<\/div>\n<script>\n  (function() {\n    var bal = document.getElementById('ea-calc-balance');\n    var lot = document.getElementById('ea-calc-lots');\n    var lev = document.getElementById('ea-calc-lev');\n    var prc = document.getElementById('ea-calc-price');\n    var con = document.getElementById('ea-calc-contract');\n    if(!bal || !lot || !lev || !prc || !con) return;\n\n    var outNotional = document.getElementById('ea-calc-notional');\n    var outMargin   = document.getElementById('ea-calc-margin');\n    var outLeft     = document.getElementById('ea-calc-left');\n    var outVerdict  = document.getElementById('ea-calc-verdict');\n\n    function money(v) {\n      return v.toFixed(2).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',') + ' USD';\n    }\n\n    function render() {\n      var balance  = parseFloat(bal.value) || 0;\n      var lots     = parseFloat(lot.value) || 0;\n      var leverage = parseFloat(lev.value) || 1;\n      var price    = parseFloat(prc.value) || 0;\n      \/\/ Unidades en un lote. 100,000 en un lote est&aacute;ndar de divisas, y otra cifra\n      \/\/ en metales, &iacute;ndices y otros CFDs, as&iacute; que la aporta el lector.\n      var contract = parseFloat(con.value) || 0;\n\n      var notional = lots * contract * price;\n      var margin   = notional \/ leverage;\n      var left     = balance - margin;\n\n      outNotional.innerHTML = money(notional);\n      outMargin.innerHTML   = money(margin);\n\n      if(left >= 0) {\n        outLeft.innerHTML   = money(left);\n        outLeft.className   = 'ea-stat-val';\n        outVerdict.innerHTML = '&#10003; El margen encaja. El robot abre la posici&oacute;n y ' +\n                               money(margin) + ' quedan reservados mientras siga abierta.';\n        outVerdict.className = 'ea-calc-verdict ea-calc-ok';\n      } else {\n        outLeft.innerHTML   = money(left);\n        outLeft.className   = 'ea-stat-val ea-stat-sell';\n        outVerdict.innerHTML = '&#10007; Faltan ' + money(Math.abs(left)) +\n                               '. El terminal rechaza la petici&oacute;n y la pesta&ntilde;a Journal informa de ' +\n                               '<strong>Not enough money. Baja el tama&ntilde;o del lote, o ingresa fondos en la cuenta.';\n        outVerdict.className = 'ea-calc-verdict ea-calc-bad';\n      }\n    }\n\n    [bal, lot, prc, con].forEach(function(el) { el.addEventListener('input', render); });\n    lev.addEventListener('change', render);\n    render();\n  })();\n  <\/script>\n<div class=\"ea-callout\">\n<div class=\"ea-callout-label\">Consejo pr&aacute;ctico<\/div>\n<p>Cuando el robot se salte una se&ntilde;al, lee las pesta&ntilde;as Experts y Journal antes de tocar el c&oacute;digo. El mensaje del terminal suele nombrar el motivo por el que se rechaz&oacute; la petici&oacute;n de operaci&oacute;n.<\/p>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"El_robot_solo_funciona_mientras_funciona_el_terminal\"><\/span>El robot solo funciona mientras funciona el terminal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>El segundo caso es dar por supuesto que un robot sobre un gr&aacute;fico sigue trabajando pase lo que pase con el ordenador. En una instalaci&oacute;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&aacute;quina, y el robot local deja de recibir ticks y deja de ejecutar su l&oacute;gica.<\/p>\n<p>Si la EMA 9 y la EMA 21 se cruzan durante ese tiempo, la se&ntilde;al queda sin procesar hasta que el terminal vuelva a estar en marcha. Lo mismo vale para gestionar una posici&oacute;n ya abierta, siempre que esa l&oacute;gica viva dentro del robot.<\/p>\n<p>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 <a href=\"https:\/\/roboforex.com\/es\/clients\/services\/forex-vps\/\" data-internallinksmanager029f6b8e52c=\"29\" title=\"forex vps\">VPS<\/a> para el mismo trabajo. Una vez trasladado, el robot sigue funcionando est&eacute; o no encendido tu propio ordenador.<\/p>\n<p>Un VPS resuelve la continuidad del entorno de trading. No hace m&aacute;s fiable ninguna estrategia ni corrige ning&uacute;n fallo del c&oacute;digo.<\/p>\n<div class=\"ea-callout\">\n<div class=\"ea-callout-label\">Antes de pasar a una cuenta real<\/div>\n<p>Revisa el flujo entero, y no solo la estrategia: el margen libre, los permisos de trading automatizado, el s&iacute;mbolo seleccionado, si el robot est&aacute; recibiendo cotizaciones, y las pesta&ntilde;as Experts y Journal. Recorrer esa lista separa un problema de la estrategia de un fallo corriente de lanzamiento.<\/p>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusi&oacute;n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Construir un primer expert advisor en MQL5 cubre el ciclo de desarrollo entero de una sentada: la l&oacute;gica de trading, la compilaci&oacute;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&aacute;s complejos que este.<\/p>\n<p>El paso siguiente es pr&aacute;ctico. Abre MetaEditor, pega el c&oacute;digo, comp&iacute;lalo, p&aacute;salo por el probador de estrategias y despu&eacute;s ponlo en una cuenta demo y observa c&oacute;mo se comporta sin capital en juego. Despu&eacute;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&iacute;nimo y conectar a un VPS para que trabaje las 24 horas.<\/p>\n<p>Mant&eacute;n el foco en si el robot hace lo que dicen las reglas, en lo estable que es el algoritmo y en c&oacute;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.<\/p>\n<div class=\"ea-cta\">\n<a href=\"https:\/\/my.roboforex.com\/es\/register\/\" rel=\"nofollow nofollow\" target=\"_blank\">Abre una cuenta de trading con RoboForex<\/a>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span>FAQ<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"ea-faq\">\n<details class=\"ea-faq-item\">\n<summary class=\"ea-faq-q\">&iquest;Hacen falta conocimientos de programaci&oacute;n para usar este robot?<\/summary>\n<div class=\"ea-faq-a\">No. Copiar el c&oacute;digo en el archivo que crea el MQL Wizard y seguir los pasos de compilaci&oacute;n basta para ponerlo en marcha. La programaci&oacute;n se vuelve &uacute;til a partir del momento en que quieras cambiar c&oacute;mo decide operar el robot.<\/div>\n<\/details>\n<details class=\"ea-faq-item\">\n<summary class=\"ea-faq-q\">&iquest;Por qu&eacute; el robot comprueba si hay barra nueva en vez de operar en cada tick?<\/summary>\n<div class=\"ea-faq-a\">La estrategia est&aacute; definida sobre velas cerradas. Sin el filtro de barra nueva, el mismo cruce se evaluar&iacute;a cientos de veces dentro de una vela, y el robot actuar&iacute;a sobre valores que todav&iacute;a est&aacute;n cambiando.<\/div>\n<\/details>\n<details class=\"ea-faq-item\">\n<summary class=\"ea-faq-q\">&iquest;Puedo ejecutarlo en cualquier instrumento y marco temporal?<\/summary>\n<div class=\"ea-faq-a\">S&iacute;, el c&oacute;digo lee el s&iacute;mbolo y el marco temporal del gr&aacute;fico sobre el que est&aacute;. El ejemplo desarrollado usa GBPUSD H1. Los resultados cambian seg&uacute;n el instrumento, as&iacute; que <a href=\"https:\/\/roboforex.com\/es\/beginners\/info\/charts\/stocks\/PRU\/\" data-internallinksmanager029f6b8e52c=\"167\" title=\"Prudential Financial Inc\">pru<\/a>&eacute;balo en el probador de estrategias antes de ejecutarlo en un sitio nuevo. Unos niveles de protecci&oacute;n fijos de 200 y 400 puntos tambi&eacute;n se comportan de otra manera en instrumentos con un spread amplio.<\/div>\n<\/details>\n<details class=\"ea-faq-item\">\n<summary class=\"ea-faq-q\">&iquest;Qu&eacute; diferencia hay entre MetaEditor y MetaTrader 5?<\/summary>\n<div class=\"ea-faq-a\">MetaEditor es donde se escribe y se compila el c&oacute;digo. MetaTrader 5 es donde el robot compilado corre sobre un gr&aacute;fico en vivo. Son dos partes de la misma instalaci&oacute;n, y F4 lleva de una a la otra.<\/div>\n<\/details>\n<details class=\"ea-faq-item\">\n<summary class=\"ea-faq-q\">El robot est&aacute; en el gr&aacute;fico y no pasa nada. &iquest;Qu&eacute; reviso primero?<\/summary>\n<div class=\"ea-faq-a\">Comprueba que los dos permisos de Algo Trading est&aacute;n activos y despu&eacute;s lee las pesta&ntilde;as Experts y Journal del Toolbox. La mayor&iacute;a de casos de primer lanzamiento se explican ah&iacute; con palabras claras, y el margen libre insuficiente es el m&aacute;s habitual.<\/div>\n<\/details>\n<\/div>\n<div class=\"ea-disclaimer\">\n<em>Toda la informaci&oacute;n publicada en los art&iacute;culos de este sitio se basa exclusivamente en las opiniones personales de los autores. Estos art&iacute;culos no deben interpretarse como recomendaciones de trading ni como una llamada a la acci&oacute;n. Los autores y RoboForex no asumen responsabilidad alguna por los resultados de las operaciones realizadas a partir de estas recomendaciones y an&aacute;lisis. Los resultados pasados no son indicativos de resultados futuros. Operar con <a href=\"https:\/\/roboforex.com\/es\/forex-trading\/assets\/stocks\/\" data-internallinksmanager029f6b8e52c=\"36\" title=\"invertir acciones\">acciones<\/a> y CFDs conlleva un riesgo alto de p&eacute;rdida del capital.<\/em>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<style>\n:root {\n  --green:        #5ab02b;\n  --green-hover:  #489022;\n  --green-bg:     #f0f7eb;\n  --text:         #2E3A59;\n  --text-light:   #666666;\n  --heading:      #2E3A59;\n  --dark:         #1a2535;\n  --border:       #e0e0e0;\n  --table-head:   #f5f5f5;\n  --table-stripe: #fafafa;\n  --promo-bg:     #f8f8f8;\n  --promo-border: #e8e8e8;\n  --toc-bg:       #f9f9f9;\n  --link:         #0384c6;\n  --radius:       4px;\n  --font:         'Roboto', Arial, sans-serif;\n  --max-w:        1160px;\n}\n\n\/* &#9472;&#9472; Outer wrapper &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;\n   No side padding. The theme's own container already provides it, and 20px\n   of padding here made every pasted block 1120px wide against the 1160px of\n   a text block added in the editor.\n   See docs\/decisions\/0014-wrapper-carries-no-side-padding.md *\/\n.ea-wrap { box-sizing: border-box; max-width: 1160px; margin: 0 auto; padding: 0; }\n\n\/* &#9472;&#9472; Base prose &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea {\n  font-family: var(--font);\n  font-size: 20px;\n  line-height: 1.7;\n  color: var(--text);\n  max-width: var(--max-w);\n}\n.ea.ea, .ea.ea * {\n  font-family: 'Roboto', Arial, sans-serif !important;\n}\n.ea p { margin: 0 0 20px; }\n\/* Text links: --link, never underlined, hover included. Scoped so buttons\n   keep their own colour. See docs\/decisions\/0012-text-link-colour.md *\/\n.ea p a, .ea li a, .ea figcaption a, .ea td a,\n.ea .ea-faq-a a, .ea .ea-disclaimer a {\n  color: var(--link); text-decoration: none;\n}\n.ea p a:hover, .ea li a:hover, .ea figcaption a:hover, .ea td a:hover,\n.ea .ea-faq-a a:hover, .ea .ea-disclaimer a:hover { text-decoration: none; }\n.ea strong { color: var(--heading); font-weight: 700; }\n.ea em { font-style: italic; }\n.ea code { background: var(--toc-bg); border-radius: 3px; padding: 1px 6px; font-size: 0.9em; }\n.ea ul { padding-left: 22px; margin: 0 0 18px; display: flex; flex-direction: column; gap: 6px; }\n.ea li { font-size: 20px; line-height: 1.7; color: var(--text); }\n\n\/* &#9472;&#9472; Headings &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea h2 { font-size: 32px; font-weight: 700; color: var(--heading); margin: 40px 0 16px; scroll-margin-top: 68px; }\n.ea h3 { font-size: 22px; font-weight: 700; color: var(--heading); margin: 28px 0 12px; scroll-margin-top: 68px; }\n\n\/* &#9472;&#9472; Key takeaways &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n\/* No background fill. The border alone separates the block from body text.\n   See docs\/decisions\/0013-in-brief-no-background.md *\/\n.ea-kratko { border: 1px solid var(--border); border-radius: var(--radius); padding: 20px 24px 0; margin: 28px 0; }\n.ea-kratko-label { font-size: 18px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--text-light); margin-bottom: 0; }\n.ea-kratko ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0; }\n.ea-kratko li { font-size: 16px; line-height: 1.65; color: var(--text); padding: 10px 0 10px 28px; border-bottom: 1px solid var(--border); position: relative; }\n.ea-kratko li:last-child { border-bottom: none; }\n.ea-kratko li::before { content: none !important; }\n.ea-kratko li::after { content: \"\\2713\"; position: absolute; left: 0; top: 50%; transform: translateY(-50%); color: var(--green); font-weight: 700; }\n\n\/* &#9472;&#9472; MetaEditor navigation diagram &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-nav { display: flex; flex-direction: column; gap: 0; border: 1px solid var(--border); border-radius: var(--radius); margin: 24px 0; overflow: hidden; }\n.ea-nav-item { display: flex; gap: 16px; align-items: flex-start; padding: 16px 20px; border-bottom: 1px solid var(--border); background: #fff; }\n.ea-nav-item:last-child { border-bottom: none; }\n.ea-nav-item:nth-child(even) { background: var(--table-stripe); }\n.ea-nav-num { flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%; background: var(--green); color: #fff !important; font-weight: 700; font-size: 15px; display: flex; align-items: center; justify-content: center; }\n.ea-nav-title { font-size: 17px; font-weight: 700; color: var(--heading); margin-bottom: 4px; }\n.ea-nav-desc { font-size: 15px; color: var(--text-light); line-height: 1.55; }\n\n\/* &#9472;&#9472; Code block &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-code-wrap { border: 1px solid var(--border); border-radius: var(--radius); margin: 24px 0; overflow: hidden; background: #1a2535; }\n.ea-code-label { background: #0f1622; color: #9aa5b8 !important; font-size: 13px; font-weight: 700; padding: 8px 16px; font-family: 'Roboto Mono', 'Consolas', monospace !important; }\n.ea-code { margin: 0; padding: 18px 20px; overflow-x: auto; font-size: 14px; line-height: 1.6; }\n.ea-code code { background: none; padding: 0; color: #d7dde5 !important; font-family: 'Roboto Mono', 'Consolas', monospace !important; }\n\/* Short inline listings: no filename bar, tighter padding. *\/\n.ea-code-wrap.ea-code-inline { max-width: 720px; }\n.ea-code-wrap.ea-code-inline .ea-code { padding: 14px 20px; }\n@media (max-width: 600px) { .ea-code { font-size: 12px; padding: 14px 16px; } }\n\n\/* &#9472;&#9472; Images. Native WordPress block, overflow guard only. &#9472; *\/\n.wp-block-image { margin: 24px 0; }\n.wp-block-image img { max-width: 100%; height: auto; display: block; }\n.ea .wp-element-caption { font-size: 14px; color: var(--text-light); line-height: 1.5; margin: 8px 0 0; }\n\n\/* &#9472;&#9472; Callout &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-callout { background: var(--toc-bg); border-left: 3px solid var(--green); border-radius: var(--radius); padding: 18px 22px; margin: 24px 0; max-width: 900px; }\n.ea-callout-label { font-size: 15px; font-weight: 700; color: var(--heading); margin-bottom: 6px; }\n.ea-callout p { font-size: 17px; line-height: 1.6; margin: 0; color: var(--text); }\n\n\/* &#9472;&#9472; Table. Two columns cap at 720px, three columns at 900. &#9472;&#9472; *\/\n.ea-table-wrap { max-width: 720px; overflow-x: auto; margin: 24px 0; border: 1px solid var(--border); border-radius: var(--radius); }\n.ea-table-wrap.ea-table-wide { max-width: 900px; }\n.ea table.rf { width: 100%; border-collapse: collapse; font-size: 16px; margin-bottom: 0; }\n.ea table.rf thead tr { background: var(--table-head); }\n.ea table.rf th { padding: 10px 14px; text-align: left; font-size: 16px; font-weight: 700; color: var(--heading); border-bottom: 2px solid var(--border); }\n.ea table.rf td { padding: 10px 14px; border-bottom: 1px solid var(--border); vertical-align: middle; line-height: 1.4; color: var(--text); }\n.ea table.rf tr:last-child td { border-bottom: none; }\n.ea table.rf tr:nth-child(even) td { background: var(--table-stripe); }\n.ea-table-wrap thead th { background: var(--table-head) !important; color: var(--heading) !important; }\n\n@media (max-width: 600px) {\n  .ea table.rf thead { display: none; }\n  .ea table.rf tr { display: block; margin-bottom: 12px; border: 1px solid var(--border); border-radius: var(--radius); }\n  .ea table.rf td { display: flex; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--border); text-align: right; }\n  .ea table.rf td::before { content: attr(data-label); font-weight: 700; color: var(--text-light); text-align: left; }\n}\n\n\/* &#9472;&#9472; Promo &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-promo { background: var(--promo-bg); border: 1px solid var(--promo-border); border-radius: var(--radius); margin: 36px 0; padding: 24px 28px; display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 24px; }\n@media (max-width: 600px) { .ea-promo { grid-template-columns: 1fr; } }\n.ea-promo-title { font-size: 20px; font-weight: 700; color: var(--heading); margin-bottom: 5px; line-height: 1.3; }\n.ea-promo-sub { font-size: 15px; color: var(--text-light); line-height: 1.5; }\n.ea-promo-actions { display: flex; gap: 8px; flex-wrap: wrap; }\n.ea-promo-btn { display: inline-block; background: var(--green) !important; color: #fff !important; text-decoration: none !important; font-size: 15px; font-weight: 700; padding: 10px 15px; border-radius: 3px; white-space: nowrap; transition: background .15s; }\n.ea-promo-btn:hover { background: var(--green-hover) !important; }\n\n\/* &#9472;&#9472; Step-by-step diagram &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-steps { display: flex; flex-direction: column; gap: 12px; margin: 24px 0; }\n.ea-step { display: flex; gap: 16px; align-items: center; padding: 14px 18px; background: var(--toc-bg); border: 1px solid var(--border); border-radius: var(--radius); }\n.ea-step-num { flex-shrink: 0; width: 32px; height: 32px; border-radius: 50%; background: var(--green); color: #fff !important; font-weight: 700; font-size: 16px; display: flex; align-items: center; justify-content: center; }\n.ea-step-text { font-size: 17px; color: var(--text); line-height: 1.5; }\n\n\/* &#9472;&#9472; Interactive checklist &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;\n   Items are buttons, so they are keyboard reachable and carry aria-pressed.\n   The tick only appears once an item is actually checked. *\/\n.ea-checklist { display: flex; flex-direction: column; gap: 0; margin: 24px 0; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; max-width: 900px; }\n\n.ea-check-head { padding: 14px 20px; background: var(--promo-bg); border-bottom: 1px solid var(--border); }\n.ea-check-count { font-size: 14px; font-weight: 700; color: var(--text-light); margin-bottom: 8px; }\n.ea-check-track { height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; }\n.ea-check-bar { height: 100%; width: 0; background: var(--green); border-radius: 3px; transition: width .2s ease; }\n\n.ea-check-item {\n  position: relative; display: block; width: 100%; box-sizing: border-box;\n  text-align: left; padding: 14px 20px 14px 50px; font-size: 17px;\n  color: var(--text); line-height: 1.5; border: none;\n  border-bottom: 1px solid var(--border); background: #fff;\n  cursor: pointer; -webkit-appearance: none; appearance: none;\n  transition: background .15s;\n}\n.ea-check-item:nth-of-type(even) { background: var(--table-stripe); }\n.ea-check-item:hover { background: var(--green-bg); }\n.ea-check-item:focus-visible { outline: 2px solid var(--link); outline-offset: -2px; }\n\/* Empty box by default. The tick is drawn only on a checked item. *\/\n.ea-check-item::before {\n  content: \"\"; position: absolute; left: 18px; top: 50%;\n  transform: translateY(-50%); width: 19px; height: 19px;\n  border: 2px solid #c3c9d4; border-radius: 3px; background: #fff;\n  transition: border-color .15s, background .15s;\n}\n.ea-check-item.ea-is-done::before { border-color: var(--green); background: var(--green); }\n.ea-check-item.ea-is-done::after {\n  content: \"\\2713\"; position: absolute; left: 22.5px; top: 50%;\n  transform: translateY(-54%); color: #fff; font-weight: 700; font-size: 13px;\n}\n.ea-check-item.ea-is-done { color: var(--text-light); }\n\n.ea-check-done { display: none; padding: 14px 20px; font-size: 16px; font-weight: 700; color: #2e7d1e; background: rgba(90,176,43,0.1); border-top: 1px solid var(--border); }\n\n\/* &#9472;&#9472; Trap cards &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-traps { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 24px 0; }\n@media (max-width: 600px) { .ea-traps { grid-template-columns: 1fr; } }\n.ea-trap { border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; background: #fff; border-left: 3px solid #e6a800; }\n.ea-trap-title { font-size: 17px; font-weight: 700; color: var(--heading); margin-bottom: 6px; }\n.ea-trap-desc { font-size: 15px; color: var(--text-light); line-height: 1.55; }\n\n\/* &#9472;&#9472; Widgets, shared shell &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;\n   Single responsive layout, collapsing at 600px, instead of the\n   ea-desktop \/ ea-mobile pair. Both widgets are simple grids, and a second\n   DOM copy would duplicate every input id the scripts look up. *\/\n.ea-widget { border: 1px solid var(--border); border-radius: var(--radius); padding: 22px 24px; margin: 28px 0; background: #fff; max-width: 900px; }\n.ea-widget-title { font-size: 19px; font-weight: 700; color: var(--heading); margin-bottom: 6px; }\n.ea-widget-sub { font-size: 15px; color: var(--text-light); line-height: 1.55; margin-bottom: 18px; }\n@media (max-width: 600px) { .ea-widget { padding: 18px 16px; } }\n\n\/* Stat strip shared by both widgets *\/\n.ea-stat { flex: 1; min-width: 0; text-align: center; padding: 10px 8px; background: var(--table-stripe); border: 1px solid var(--border); border-radius: var(--radius); }\n.ea-stat-lbl { font-size: 12px; color: var(--text-light); line-height: 1.35; margin-bottom: 4px; }\n.ea-stat-val { font-size: 17px; font-weight: 700; color: var(--heading); word-break: break-word; }\n.ea-stat-buy { color: #2e7d1e; }\n.ea-stat-sell { color: #c0392b; }\n\n\/* &#9472;&#9472; EMA crossover visualiser &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-ema-chart { border: 1px solid var(--border); border-radius: var(--radius); background: var(--table-stripe); padding: 8px; margin-bottom: 12px; }\n.ea-ema-chart svg { display: block; width: 100%; height: auto; }\n.ea-ema-line-price { stroke: #b9c0cc; stroke-width: 1.5; }\n.ea-ema-line-fast { stroke: var(--green); stroke-width: 2.5; }\n.ea-ema-line-slow { stroke: #2E3A59; stroke-width: 2.5; }\n.ea-ema-dot { fill: #fff; stroke: #2E3A59; stroke-width: 2.5; }\n.ea-ema-cross-up { fill: rgba(90,176,43,0.25); stroke: var(--green); stroke-width: 2.5; }\n.ea-ema-cross-down { fill: rgba(192,57,43,0.2); stroke: #c0392b; stroke-width: 2.5; }\n\n.ea-ema-legend { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }\n.ea-leg { font-size: 13px; font-weight: 600; padding: 3px 10px; border-radius: 12px; border: 1px solid var(--border); }\n.ea-leg-fast { color: #3f7d1e; border-color: var(--green); background: rgba(90,176,43,0.1); }\n.ea-leg-slow { color: #2E3A59; border-color: #2E3A59; background: rgba(46,58,89,0.07); }\n.ea-leg-price { color: var(--text-light); }\n\n.ea-range-label { display: block; font-size: 13px; font-weight: 600; color: var(--text-light); margin-bottom: 6px; }\n.ea-range { width: 100%; margin: 0 0 18px; accent-color: #5ab02b; }\n\n.ea-ema-stats { display: flex; gap: 10px; margin-bottom: 14px; }\n@media (max-width: 600px) { .ea-ema-stats { flex-direction: column; } }\n\n.ea-ema-verdict { font-size: 16px; line-height: 1.55; color: var(--text); padding: 14px 16px; border-radius: var(--radius); background: var(--toc-bg); border-left: 3px solid var(--border); }\n.ea-ema-verdict-buy { background: rgba(90,176,43,0.08); border-left-color: var(--green); }\n.ea-ema-verdict-sell { background: rgba(192,57,43,0.07); border-left-color: #c0392b; }\n\n\/* &#9472;&#9472; Margin calculator &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 18px; }\n@media (max-width: 600px) { .ea-calc-grid { grid-template-columns: 1fr; } }\n.ea-calc-lbl { display: block; font-size: 13px; font-weight: 600; color: var(--text-light); margin-bottom: 5px; }\n.ea-calc-in { width: 100%; box-sizing: border-box; font-size: 16px; color: var(--text); padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius); background: #fff; font-family: 'Roboto', Arial, sans-serif; }\n.ea-calc-in:focus { outline: none; border-color: var(--green); }\n.ea-calc-out { display: flex; gap: 10px; margin-bottom: 14px; }\n@media (max-width: 600px) { .ea-calc-out { flex-direction: column; } }\n.ea-calc-verdict { font-size: 16px; line-height: 1.55; padding: 14px 16px; border-radius: var(--radius); background: var(--toc-bg); border-left: 3px solid var(--border); margin-bottom: 12px; }\n.ea-calc-ok { background: rgba(90,176,43,0.08); border-left-color: var(--green); color: var(--text); }\n.ea-calc-bad { background: rgba(192,57,43,0.07); border-left-color: #c0392b; color: var(--text); }\n.ea-calc-note { font-size: 13px; color: var(--text-light); line-height: 1.5; }\n.ea-calc-field-wide { grid-column: 1 \/ -1; }\n.ea-calc-hint { font-size: 13px; color: var(--text-light); line-height: 1.5; margin-top: 6px; }\n\n\/* &#9472;&#9472; CTA &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-cta { text-align: center; margin: 36px 0; }\n.ea-cta a { display: inline-block; background: var(--green) !important; color: #fff !important; text-decoration: none !important; font-size: 20px; font-weight: 700; padding: 13px 32px; border-radius: 3px; transition: background .15s; }\n.ea-cta a:hover { background: var(--green-hover) !important; }\n\n\/* &#9472;&#9472; FAQ &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-faq { margin: 8px 0; max-width: 900px; }\n.ea-faq details.ea-faq-item { border-bottom: 1px solid var(--border); }\n.ea-faq details.ea-faq-item:last-child { border-bottom: none; }\n.ea-faq details.ea-faq-item summary.ea-faq-q { list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 0; margin: 0; font-size: 18px; font-weight: 700; color: var(--heading); user-select: none; }\n.ea-faq details.ea-faq-item summary.ea-faq-q::-webkit-details-marker { display: none; }\n.ea-faq details.ea-faq-item summary.ea-faq-q::after { content: '+'; flex-shrink: 0; font-size: 22px; font-weight: 300; color: var(--green); line-height: 1; }\n.ea-faq details.ea-faq-item[open] summary.ea-faq-q::after { content: '-'; }\n.ea-faq .ea-faq-a { font-size: 18px; color: var(--text); line-height: 1.65; margin: 0 0 16px; padding: 0; animation: ea-faq-open .18s ease; }\n@keyframes ea-faq-open { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }\n@media (max-width: 600px) {\n  .ea-faq details.ea-faq-item summary.ea-faq-q { font-size: 17px; }\n  .ea-faq .ea-faq-a { font-size: 17px; }\n}\n\n\/* &#9472;&#9472; Disclaimer &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; *\/\n.ea-disclaimer { font-size: 12px; color: var(--text-light); line-height: 1.65; margin-top: 32px; padding-top: 20px; border-top: 1px solid var(--border); }\n.ea-disclaimer em { font-style: italic; }\n<\/style>\n<\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>Mucha gente nunca llega a automatizar una estrategia porque construir un robot de trading parece exigir formaci&oacute;n como programador. La barrera de entrada es m&aacute;s baja que eso. Tu primer expert advisor en MQL5 son alrededor de cien l&iacute;neas de c&oacute;digo, y este art&iacute;culo te las entrega todas, junto con los pasos que las convierten [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":18220,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[250],"class_list":["post-18219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-education","tag-trading-robot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tu primer expert advisor en MQL5: c\u00f3digo listo<\/title>\n<meta name=\"description\" content=\"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tu primer expert advisor en MQL5: c\u00f3digo listo\" \/>\n<meta property=\"og:description\" content=\"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/\" \/>\n<meta property=\"og:site_name\" content=\"R Blog ES - RoboForex\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-08T07:40:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-09T13:34:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1160\" \/>\n\t<meta property=\"og:image:height\" content=\"652\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrey Goilov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/\"},\"headline\":\"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy\",\"datePublished\":\"2026-09-08T07:40:00+00:00\",\"dateModified\":\"2026-09-09T13:34:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/\"},\"wordCount\":4830,\"publisher\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2026\\\/09\\\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp\",\"keywords\":[\"robot de trading\"],\"articleSection\":[\"Educaci\u00f3n\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/\",\"url\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/\",\"name\":\"Tu primer expert advisor en MQL5: c\u00f3digo listo\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2026\\\/09\\\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp\",\"datePublished\":\"2026-09-08T07:40:00+00:00\",\"dateModified\":\"2026-09-09T13:34:18+00:00\",\"description\":\"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#primaryimage\",\"url\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2026\\\/09\\\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp\",\"contentUrl\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2026\\\/09\\\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp\",\"width\":1160,\"height\":652,\"caption\":\"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/2026\\\/09\\\/08\\\/first-mql5-expert-advisor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Principales\",\"item\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Educaci\u00f3n\",\"item\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/blog\\\/category\\\/education\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/\",\"name\":\"R Blog ES - RoboForex\",\"description\":\"Blog RoboForex para traders: Noticias de trading, An\u00e1lisis, Pron\u00f3sticos - forex y acciones | R-Blog\",\"publisher\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#organization\",\"name\":\"RoboForex Ltd\",\"url\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/roboforex.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2018\\\/10\\\/rf-logo_square.png\",\"contentUrl\":\"https:\\\/\\\/roboforex.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/11\\\/2018\\\/10\\\/rf-logo_square.png\",\"width\":512,\"height\":512,\"caption\":\"RoboForex Ltd\"},\"image\":{\"@id\":\"https:\\\/\\\/roboforex.com\\\/es\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tu primer expert advisor en MQL5: c\u00f3digo listo","description":"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/","og_locale":"es_ES","og_type":"article","og_title":"Tu primer expert advisor en MQL5: c\u00f3digo listo","og_description":"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.","og_url":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/","og_site_name":"R Blog ES - RoboForex","article_published_time":"2026-09-08T07:40:00+00:00","article_modified_time":"2026-09-09T13:34:18+00:00","og_image":[{"width":1160,"height":652,"url":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Andrey Goilov","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#article","isPartOf":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/"},"headline":"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy","datePublished":"2026-09-08T07:40:00+00:00","dateModified":"2026-09-09T13:34:18+00:00","mainEntityOfPage":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/"},"wordCount":4830,"publisher":{"@id":"https:\/\/roboforex.com\/es\/blog\/#organization"},"image":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#primaryimage"},"thumbnailUrl":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","keywords":["robot de trading"],"articleSection":["Educaci\u00f3n"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/","url":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/","name":"Tu primer expert advisor en MQL5: c\u00f3digo listo","isPartOf":{"@id":"https:\/\/roboforex.com\/es\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#primaryimage"},"image":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#primaryimage"},"thumbnailUrl":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","datePublished":"2026-09-08T07:40:00+00:00","dateModified":"2026-09-09T13:34:18+00:00","description":"C\u00f3digo listo para tu primer expert advisor en MQL5, explicado bloque a bloque, con los pasos para compilarlo, probarlo y lanzarlo en MT5.","breadcrumb":{"@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#primaryimage","url":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","contentUrl":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","width":1160,"height":652,"caption":"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy"},{"@type":"BreadcrumbList","@id":"https:\/\/roboforex.com\/es\/blog\/2026\/09\/08\/first-mql5-expert-advisor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Principales","item":"https:\/\/roboforex.com\/es\/blog\/"},{"@type":"ListItem","position":2,"name":"Educaci\u00f3n","item":"https:\/\/roboforex.com\/es\/blog\/blog\/category\/education\/"},{"@type":"ListItem","position":3,"name":"Tu primer expert advisor en MQL5: un robot listo para copiar y lanzar hoy"}]},{"@type":"WebSite","@id":"https:\/\/roboforex.com\/es\/blog\/#website","url":"https:\/\/roboforex.com\/es\/blog\/","name":"R Blog ES - RoboForex","description":"Blog RoboForex para traders: Noticias de trading, An\u00e1lisis, Pron\u00f3sticos - forex y acciones | R-Blog","publisher":{"@id":"https:\/\/roboforex.com\/es\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/roboforex.com\/es\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/roboforex.com\/es\/blog\/#organization","name":"RoboForex Ltd","url":"https:\/\/roboforex.com\/es\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/roboforex.com\/es\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/sites\/11\/2018\/10\/rf-logo_square.png","contentUrl":"https:\/\/roboforex.com\/blog\/wp-content\/uploads\/sites\/11\/2018\/10\/rf-logo_square.png","width":512,"height":512,"caption":"RoboForex Ltd"},"image":{"@id":"https:\/\/roboforex.com\/es\/blog\/#\/schema\/logo\/image\/"}}]}},"jetpack_featured_media_url":"https:\/\/roboforex.com\/es\/blog\/wp-content\/uploads\/sites\/11\/2026\/09\/Your-First-MQL5-Expert-Advisor-A-Ready-Made-Robot.webp","views":"","_links":{"self":[{"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/posts\/18219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/comments?post=18219"}],"version-history":[{"count":3,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/posts\/18219\/revisions"}],"predecessor-version":[{"id":18223,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/posts\/18219\/revisions\/18223"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/media\/18220"}],"wp:attachment":[{"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/media?parent=18219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/categories?post=18219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/roboforex.com\/es\/blog\/wp-json\/wp\/v2\/tags?post=18219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}