En este artículo, vamos a iniciar la creación de un Asesor Experto (EA) en MetaTrader 4, enfocándonos en el cruce de dos medias móviles. Comenzaremos definiendo las variables de entrada.
//--- parámetros de entrada input int periodo_ma_rapida = 8; //Periodo MA Rápida input int periodo_ma_lenta = 20; //Periodo MA Lenta input double takeProfit = 20.0; //Take Profit (pips) input double stopLoss = 20.0 //Stop Loss (pips) input double tamañoLote = 0.10; //Tamaño del Lote input double capitalMinimo = 100.0; //Capital Mínimo ($) input int Deslizamiento = 3; //Deslizamiento input int NumeroMagico = 889; //Número Mágico
A continuación, definimos las variables globales. Estas variables tendrán un alcance global y serán accesibles en todas las funciones.
//Variables Globales double miPunto = 0.0; int miDeslizamiento = 0; int TicketCompra = 0; int TicketVenta = 0;
Cuando se ejecuta el EA, la primera función que se ejecuta es OnInit(). Por lo general, utilizamos esta función para validar e inicializar las variables globales que se utilizarán.
int OnInit() { //validación de entrada, siempre debemos validar la inicialización de datos de entrada if (periodo_ma_rapida >= periodo_ma_lenta || takeProfit < 0.0 || stopLoss < 0.0 || tamañoLote < 0.01 || capitalMinimo < 10){ Alert("ATENCIÓN - Los datos de entrada no son válidos"); return (INIT_PARAMETERS_INCORRECT); } double volumen_minimo=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(tamañoLote<volumen_minimo) { string mensaje =StringFormat("El volumen es menor que el límite permitido de %.2f",volumen_minimo); Alert (mensaje); return(INIT_PARAMETERS_INCORRECT); } miPunto = GetPipPoint(Symbol()); miDeslizamiento = GetSlippage(Symbol(),Deslizamiento); return(INIT_SUCCEEDED); }
Cuando el precio del mercado se mueve (tick), se llamará a la función OnTick() y se ejecutarán todas las instrucciones y funciones contenidas en este bloque.
Dentro de la función OnTick(), llamaremos a varias otras funciones.
Empezaremos llamando a la función checkMinEquity() para controlar la suficiencia de la equidad de trading. Si los fondos de equidad son suficientes (superando la equidad mínima), se procederá a declarar la variable de señal y luego se llamará a la función NewCandle(), que indica cuando se forma una nueva vela.
La función getSignal() leerá los valores de ambos indicadores de medias móviles y devolverá información sobre si ocurre un cruce ascendente o descendente como señal para comprar o vender.
Basado en esta información de señal, se pasará a la función transaction() para abrir posiciones de compra o venta.
A continuación, se llamará a la función setTPSL(), que se encarga de establecer los precios de take profit y stop loss.
Si la equidad no cumple con el requisito de equidad mínima, se mostrará una alerta y este EA se detendrá.
void OnTick() { if (checkMinEquity()){ int signal = -1; bool esNuevaVela = NewCandle(Period(), Symbol()); signal = getSignal(esNuevaVela); transaction(esNuevaVela, signal); setTPSL(); }else{ //Detener trading, porque la equidad no es suficiente Print("El EA se detendrá porque la equidad no es suficiente"); } }
Función para setTPSL()
void setTPSL(){ int tOrder = 0; string strMN = "", par = ""; double sl = 0.0, tp = 0.0; par = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--){ bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(NumeroMagico), 0) == 0 && StringFind(OrderSymbol(), par, 0) == 0 ){ if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * miPunto); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * miPunto); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){ Print ("Modificación de Orden Exitosa"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * miPunto); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * miPunto); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){ Print ("Modificación de Orden Exitosa"); } } } }//fin if número mágico && par } //fin for }
Para más educación y compartir conocimientos, puedes unirte a nuestro grupo de Telegram t.me/codeMQL
Si estás buscando una aplicación que apoye tu trading, descarga nuestra app SignalForex en la tienda de aplicaciones.
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Publicaciones relacionadas
- Procesamiento Visual de Órdenes: Mejora tu Trading en MetaTrader 4
- Señales de Trading con Patrón Hammer/Hanging Man y Estocástico en MetaTrader 5
- Gestión Automática de Órdenes Pendientes con RSI en MetaTrader 4
- Schnick: Herramienta de Aprendizaje Automático para MetaTrader 5
- My Line Order 2.1: Mejora tu Trading en MetaTrader 4