MetaTrader4
Crossover de 2 MA: Tu Asesor Experto para MetaTrader 4
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
2021.03.30