Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MetaTrader 5
Ejemplos
Indicadores
Guía paso a paso para escribir un Expert
Asesores Expertos Advisor en MQL5 para principiantes
Probador
MetaTrader 5 — Sistemas comerciales | 17 diciembre 2013, 15:49
Trading
42 076 9
Sistemas comerciales
Integración
Indicadores
Samuel Olowoyo
Asesores Expertos Introducción
Aprendizaje automático Este artículo está dirigido a los principiantes que quieren aprender
a escribir Expert Advisors sencillos en el nuevo lenguaje MQL5. En
Estadística y análisis 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.
Entrevista
MetaTrader 4
1. Estrategia de trading
Ejemplos
Lo que va hacer nuestro EA:
Indicadores
Hará el seguimiento de un indicador concreto, y cuando se
cumpla una determinada condición (o condiciones), hará una
Asesores Expertos operación de trading (ya sea de Compra/Corto o
Venta/Largo), dependiendo de la condición que se haya
Probador cumplido.
Trading A esto se le conoce como estrategia de trading. Antes de que
puedas escribir un EA, debes primero desarrollar la estrategia que
Sistemas comerciales quieres automatizar en un EA. Así que vamos a modificar, en este
caso, la afirmación anterior para que refleje la estrategia que
Integración queremos desarrollar en un EA.
LEARN MORE
2. Escribir un Expert Advisor
Estrategia comercial de
reversión a la media simple
Desarrollando un canal de
Donchian personalizado con la
ayuda de MQL5
// Otros parámetros …
/*
*/
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 Moving
maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA
// Qué pasa si el identificador devuelve un valor no
if(adxHandle<0 || maHandle<0)
{
Alert("Ha ocurrido un error al crear los identific
}
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 del
símbolo
ENUM_TIMEFRAMES period, // período
int ma_period, // período de
promedio
int ma_shift, // desplazami
horizontal
ENUM_MA_METHOD ma_method, // tipo de
suavizado
suavizado
ENUM_APPLIED_PRICE applied_price // tipo de pr
o identificador
);
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 barra
{
Alert("Tenemos menos de 60 barras, EA va a salir a
return;
}
// Usaremos la variable estática Old_Time para el tiempo
// A cada ejecución de OnTick compararemos el tiempo de
// Si el tiempo de barra no es igual al tiempo guardado,
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
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
};
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Tipo
de operación de trading
ulong magic; // ID
del Expert Advisor (magic number)
ulong order; // Ticket
de orden
string symbol; // Símbol
de la operación de trading
double volume; // El
volumen solicitado en lotes
volumen solicitado en lotes
double price; // Precio
double stoplimit; // nivel
StopLimit de la orden
double sl; // Nivel
Stop Loss de la orden
double tp; // Nivel
Take Profit de la orden
ulong deviation; // Desvia
máxima aceptable del precio de venta
ENUM_ORDER_TYPE type; // Tipo
de orden
ENUM_ORDER_TYPE_FILLING type_filling; // Tipo
de ejecución de orden
ENUM_ORDER_TYPE_TIME type_time; // Momen
de ejecución de la orden
datetime expiration; // Momen
de expiración de la orden (para ordenes del
tipo ORDER_TIME_SPECIFIED)
string comment; // Comen
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)
};
/*
Vamos a asegurarnos de que los valores de nuestros
*/
// 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 MA8
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.
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 donde
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
inicio
int count, // cantidad a
copiar
double buffer[] // array donde
se copiarán los datos
);
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.
bool PositionSelect(
string symbol // Nombre del Símbolo
);
long PositionGetInteger(
ENUM_POSITION_PROPERTY property_id // Identific
);
/*
1. Configuración de búsqueda de Compra (long/Buy): M
el precio de cierre anterior lo supera, ADX > 22, +D
el precio de cierre anterior lo supera, ADX > 22, +D
*/
// Declarar variables de tipo booleano para almacenar
bool Buy_Condition_1 = (maVal[0]>maVal[1]) && (maVal[
bool Buy_Condition_2 = (p_close > maVal[1]);
bool Buy_Condition_3 = (adxVal[0]>Adx_Min);
bool Buy_Condition_4 = (plsDI[0]>minDI[0]);
bool OrderSend(
MqlTradeRequest& request // estructura de la pe
MqlTradeResult& result // estructura de la re
);
/*
2. Comprobación de la condición de Venta (Short/Sell
el precio de cierre anterior inferior a él, ADX > 22
*/
// Declarar variables de tipo booleano para almacenar
bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (maVal
bool Sell_Condition_2 = (p_close <maVal[1]);
bool Sell_Condition_3 = (adxVal[0]>Adx_Min);
bool Sell_Condition_4 = (plsDI[0]<minDI[0]);
if(mresult.retcode==10009 || mresult.retcode==
{
Alert("Se ha colocado con éxito una orden de
}
else
{
Alert("No se ha podido completar la orden de
ResetLastError();
return;
}
}
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.
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.
Figura 27. El Expert Advisor coloca una operación de trading durante la depuración
Figura 27. El Expert Advisor coloca una operación de trading durante la depuración
La pestaña Diario
Es aquí donde se muestran todas las actividades durante la prueba.
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.
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda
Salida:
2020.05.06 20:35:16.141 Core 1 2020.04.20
20:25:00 failed market sell 0.10 EURUSD sl: 1.08965
tp: 1.07665 [Invalid request]
mrequest.action = TRADE_ACTION_DEAL;
mrequest.price = NormalizeDouble
mrequest.sl = NormalizeDouble(latest_
mrequest.tp = NormalizeDouble(latest_
mrequest.symbol = _Symbol;
mrequest.volume = Lot;
mrequest.magic = EA_Magic;
mrequest.type = ORDER_TYPE_BUY;
mrequest.type_filling = ORDER_FILLING
mrequest.deviation=100;
Tambien he probado este codigo:
Libni Colina:
Salida:
2020.05.06 20:35:16.141 Core 1 2020.04.20
20:25:00 failed market sell 0.10 EURUSD sl:
1.08965 tp: 1.07665 [Invalid request]
#include <Trade\Trade.mqh>
m_trade.Buy(volumen); // Compra
m_trade.Sell(volumen); // Vende
mrequest.type_filling = ORDER_FILLING_IOC
if (PositionSelect(_Symbol) ==true)
{
if (PositionGetInteger(POSITION_TYPE
{
Buy_opened = true; // Es una Comp
}
else if(PositionGetInteger(POSITION_T
{
Sell_opened = true; // Es una Vent
}
}
Por este...
if(PositionGetInteger(POSITION_TYPE) ==
{
Buy_opened = true; // es una c
}
else if(PositionGetInteger(POSITION_T
{
Sell_opened = true; // es una v
}
}
i
Join the t
u
updated a
LEARN MORE
Chats t
i