Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2 25 062
SAMUEL OLOWOYO
Introducción
Este artículo está dirigido a los principiantes que quieren aprender
a escribir Expert Advisors sencillos en el nuevo lenguaje MQL5. En
primer lugar, vamos a definir lo que se requiere de nuestro EA (de
sus siglas en inglés, Expert Advisor), y luego a cómo queremos que
lo haga.
1. Estrategia de trading
Lo que va hacer nuestro EA:
https://www.mql5.com/es/articles/100 2/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 3/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 4/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 5/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 6/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
// Otros parámetros …
/*
https://www.mql5.com/es/articles/100 8/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Es un comentario de varias líneas
*/
double b7 = 0.09876;
int OnInit()
{
//--- Obtener el identificador para el indicador ADX
adxHandle=iADX(NULL,0,ADX_Period);
//--- Obtener el identificador para el indicador Mov
maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA
//--- Qué pasa si el identificador devuelve un valor
if(adxHandle<0 || maHandle<0)
{
Alert("Ha ocurrido un error al crear los ident
}
int iADX(
string symbol, // nombre del
símbolo
ENUM_TIMEFRAMES period, // período
int adx_period // período del
promedio
);
int iMA(
string symbol, // nombre
símbolo
ENUM_TIMEFRAMES period, // períod
int ma_period, // períod
promedio
int ma_shift, // despla
horizontal
ENUM_MA_METHOD ma_method, // tipo d
suavizado
ENUM_APPLIED_PRICE applied_price // tipo d
o identificador
);
Puesto que se llama a esta función siempre que se desactiva el EA
o se quita de un gráfico, lanzaremos todos los identificadores de
indicadores que se crearon durante el proceso de inicialización.
Hemos creado dos identificadores, uno para el indicador ADX y el
otro para el indicador Moving Average.
https://www.mql5.com/es/articles/100 11/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
bool IndicatorRelease(
int indicator_handle, // identificador
del indicador
);
//+-------------------------------------------------
//| Función Expert tick
//+-------------------------------------------------
void OnTick()
{
// ¿Tenemos bastantes barras para trabajar con ellas
if(Bars(_Symbol,_Period)<60) // si el número de b
{
Alert("Tenemos menos de 60 barras, EA va a sal
return;
}
// Usaremos la variable estática Old_Time para el ti
// A cada ejecución de OnTick compararemos el tiempo
// Si el tiempo de barra no es igual al tiempo guard
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
https://www.mql5.com/es/articles/100 12/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
}
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Tenemos u
https://www.mql5.com/es/articles/100 13/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Como puedes ver, lo hemos hecho otra vez aquí, pero de manera
distinta. Decidimos almacenar el número total de barras en el
historial que obtenemos de la expresión
int Mybars=Bars(_Symbol,_Period);
struct MqlTick
{
datetime time; // Momento de la
última actualización de precio
double bid; // Precio de Venta
"Bid" actual
double ask; // Precio de Compra
"Ask" actual
double last; // Precio de la
última transacción (Last)
ulong volume; // Volumen del
precio "Last" actual
};
MqlTradeRequest
Se utiliza esta estructura para llevar a cabo todas las peticiones de
trading para una operación de trading. En su estructura, contiene
todos los campos necesarios para realizar una transacción de
trading.
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Tip
de operación de trading
ulong magic; // ID
del Expert Advisor (magic number)
ulong order; // Ti
de orden
string symbol; // Sím
de la operación de trading
https://www.mql5.com/es/articles/100 14/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
double volume; // El
volumen solicitado en lotes
double price; // Pr
double stoplimit; // niv
StopLimit de la orden
double sl; // Niv
Stop Loss de la orden
double tp; // Niv
Take Profit de la orden
ulong deviation; // De
máxima aceptable del precio de venta
ENUM_ORDER_TYPE type; // T
de orden
ENUM_ORDER_TYPE_FILLING type_filling; // T
de ejecución de orden
ENUM_ORDER_TYPE_TIME type_time; // M
de ejecución de la orden
datetime expiration; // M
de expiración de la orden (para ordenes del
tipo ORDER_TIME_SPECIFIED)
string comment; // C
de la orden
};
struct MqlTradeResult
{
uint retcode; // Código del
resultado de la operación
ulong deal; // Ticket de la
transacción, si se hace
ulong order; // Ticket de la
orden, si se coloca
double volume; // Volumen de
transacciones, confirmado por el broker
double price; // Precio de la
transacción, confirmado por el broker
double bid; // Precio Venta "Bid"
actual
double ask; // Precio de Compra
"Ask" actual
string comment; // Comentario del
broker de la operación (por defecto, se pone la
descripción de la operación)
};
https://www.mql5.com/es/articles/100 15/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
struct MqlRates
{
datetime time; // Inicio del período
double open; // Precio de apertura
double high; // El precio más alto del
período
double low; // El Precio más bajo del
período
double close; // Precio de cierre
long tick_volume; // Volumen del tick
int spread; // Diferencial
long real_volume; // Volumen de trading
};
/*
Vamos a asegurarnos de que los valores de nuest
*/
// los arrays de tasas
ArraySetAsSeries(mrate,true);
// el array de los valores de ADX DI+
ArraySetAsSeries(plsDI,true);
// el array de los valores de ADX DI-
ArraySetAsSeries(minDI,true);
// los arrays de los valores de ADX
ArraySetAsSeries(adxVal,true);
// los arrays de los valores de MA-8
ArraySetAsSeries(maVal,true);
bool ArraySetAsSeries(
void array[], // array por referencia
bool set // true indica inversión del
orden de indexación
);
Cabe señalar que esto también se puede hacer sólo una vez, en la
sección de inicialización de nuestro código. Sin embargo, y para
simplificar la explicación, he decidido mostrarlo en este punto.
https://www.mql5.com/es/articles/100 16/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
int CopyRates(
string symbol_name, // nombre
del símbolo
ENUM_TIMEFRAMES timeframe, // período
int start_pos, // posición
de inicio
int count, // número de
datos que se desea copiar
MqlRates rates_array[] // array dond
se copia
);
mrate[bar_number].bar_property
int CopyBuffer(
int indicator_handle, // identificador
del indicador
int buffer_num, // número de
buffer del indicador
int start_pos, // posición de
inicio
int count, // cantidad a
copiar
https://www.mql5.com/es/articles/100 17/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
0 - MAIN_LINE,
1 - PLUSDI_LINE,
2 - MINUSDI_LINE.
0 – MAIN_LINE.
Copiamos desde la barra actual (0) hasta las dos últimas barras. De
esta manera, el número total de barras a copiar es 3 (barras 0,1 y
2). buffer[] es el array dinámico de destino que habíamos
declarado anteriormente – adxVal, plsDI, minDI y maVal.
Como puedes observar de nuevo aquí, intentamos capturar
cualquier error que pueda ocurrir durante el proceso de copia. Si
hay un error, no hace falta seguir.
Es importante señalar que las funciones CopyBuffer() y CopyRates()
devuelven el número total de los registros copiados con éxito, y
devuelven -1 en caso de error. Es por eso que estamos
comprobando los valores inferiores a 0 (cero), en las siguientes
funciones de comprobación de error.
https://www.mql5.com/es/articles/100 18/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Buy_opened = true; // Es una Compra
}
else if(PositionGetInteger(POSITION_TYPE) =
{
Sell_opened = true; // Es una Venta
}
}
bool PositionSelect(
string symbol // Nombre del Símbolo
);
long PositionGetInteger(
ENUM_POSITION_PROPERTY property_id // Ident
);
/*
1. Configuración de búsqueda de Compra (long/Buy
el precio de cierre anterior lo supera, ADX > 22
*/
//--- Declarar variables de tipo booleano para almac
bool Buy_Condition_1 = (maVal[0]>maVal[1]) && (maV
bool Buy_Condition_2 = (p_close > maVal[1]);
bool Buy_Condition_3 = (adxVal[0]>Adx_Min);
bool Buy_Condition_4 = (plsDI[0]>minDI[0]);
https://www.mql5.com/es/articles/100 20/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
bool OrderSend(
MqlTradeRequest& request // estructura de l
MqlTradeResult& result // estructura de l
);
https://www.mql5.com/es/articles/100 21/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
/*
2. Comprobación de la condición de Venta (Short/
el precio de cierre anterior inferior a él, ADX
*/
//--- Declarar variables de tipo booleano para almac
bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (m
bool Sell_Condition_2 = (p_close <maVal[1]);
bool Sell_Condition_3 = (adxVal[0]>Adx_Min);
bool Sell_Condition_4 = (plsDI[0]<minDI[0]);
https://www.mql5.com/es/articles/100 23/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
if(mresult.retcode==10009 || mresult.retcod
{
Alert("Se ha colocado con éxito una orde
}
else
{
Alert("No se ha podido completar la orde
ResetLastError();
return;
}
}
https://www.mql5.com/es/articles/100 24/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 25/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 26/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 27/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Por otra parte, Paso sin entrada no entra en las funciones a las que
se llama en esta línea de código. Para ejecutar este comando, haz
clic en el botón o pulsa F10.
https://www.mql5.com/es/articles/100 28/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Haz clic en el botón o pulsa Shift+F11 para ejecutar una etapa del
programa que está en un nivel superior.
También verás en la parte baja del Editor la ventana Caja de
Herramientas. La pestaña Depurar de esta ventana tiene las
siguientes columnas:
Puedes añadir más variables, como los valores de ADX, los valores
de MA-8, etc.
Para añadir una expresión/variable, haz doble clic debajo del título
Expresión o un clic derecho en la columna Expresión y selecciona
Add , como se indica en la figura de abajo.
Introduce la expresión/variable a controlar u observar.
https://www.mql5.com/es/articles/100 29/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 30/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 31/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
https://www.mql5.com/es/articles/100 32/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Figura 27. El Expert Advisor coloca una operación de trading durante la depuración
https://www.mql5.com/es/articles/100 33/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Figura 30. La Pestaña de Agentes del Simulador de Estrategias durante una prueba
La pestaña Diario
Es aquí donde se muestran todas las actividades durante la prueba.
https://www.mql5.com/es/articles/100 35/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
La pestaña Resultados
Una vez finalizada la prueba, verás otra pestaña, llamada
Resultados. Al cambiar a la pestaña Resultados, verás el informe
de la prueba.
https://www.mql5.com/es/articles/100 36/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Figura 36. Gráfico de los resultados de la prueba
https://www.mql5.com/es/articles/100 37/38
3/20/2019 Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes - Artículos sobre MQL5
Conclusión
En esta guía paso a paso, hemos podido ver cuáles son los pasos
básicos para escribir un Expert Advisor sencillo, basándonos en una
elaborada estrategia de trading. También hemos visto cómo se hace
la comprobación de errores de nuestro EA mediante el depurador.
Además, hemos explicado la forma de probar el rendimiento de
nuestro EA mediante el Simulador de Estrategias. Con esto, hemos
podido ver el potencial y la solidez del nuevo lenguaje MQL5.
Nuestro EA aún no es perfecto ni completo, ya que todavía se le
deben aplicar muchas mejoras antes de poder utilizarlo en
condiciones reales.
Aún queda mucho por aprender y te recomiendo leer el artículo de
nuevo, junto al manual de MQL5, y probar todo lo que has
aprendido en este artículo, y te aseguro que podrás escribir Expert
Advisors en un futuro no muy lejano.
Feliz codificación.
Advertencia: todos los derechos de estos materiales pertenecen a MQL5 Ltd. Queda
https://www.mql5.com/es/articles/100 38/38