Inicio Trading Sistemático Publicación

Crossover de 2 MA: Tu Asesor Experto para MetaTrader 4

Archivos adjuntos
34176.zip (2.06 KB, Descargar 2 veces)

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

    Comentarios (0)