Trading Sistemático 게시글

Estrategia de Trading Automático con Heikin Ashi y MT4: Crea tu EA de Cruce de Medias Móviles

첨부파일
34176.zip (2.06 KB, 다운로드 0회)

En este artículo, nos enfocaremos en la creación de un sistema de trading automático (EA) utilizando la plataforma MetaTrader 4 (MT4). Esta estrategia se basa en el cruce de dos medias móviles, lo que permite identificar tendencias de mercado con mayor precisión.

Definiendo Variables de Entrada

Comenzamos definiendo las variables de entrada que nuestro EA utilizará:

//--- Parámetros de entrada
input    int      period_ma_fast = 8  //Periodo de la Media Móvil Rápida
input    int      period_ma_slow = 20; //Periodo de la Media Móvil Lenta

input    double   takeProfit  = 20.0;  //Take Profit (pips)
input    double   stopLoss    = 20.0  //Stop Loss (pips)

input    double   lotSize     = 0.10  //Tamaño del Lote
input    double   minEquity   = 100.0; //Equidad Mínima ($)

input    int Slippage = 3;       //Deslizamiento
input    int MagicNumber = 889  //Número Mágico

Definición de Variables Globales

A continuación, definimos variables globales que estarán accesibles en todas las funciones:

//Variables Globales
double   myPoint    = 0.0;
int      mySlippage = 0;
int      BuyTicket   = 0;
int      SellTicket  = 0;

Inicialización del EA

Cuando se ejecuta el EA, la primera función que se llama es OnInit(). Este es un buen momento para validar y inicializar las variables globales.

int OnInit()
{
   //Validación de entradas
   if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){
      Alert("ADVERTENCIA - Datos de entrada no válidos");
      return (INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint = GetPipPoint(Symbol());
   mySlippage = GetSlippage(Symbol(),Slippage);

   return(INIT_SUCCEEDED);
}

Función OnTick

Cuando el precio del mercado se mueve (tick), la función OnTick() se ejecutará, procesando todas las instrucciones dentro de su bloque:

void OnTick()
{
   if (cekMinEquity()){
      
      int signal = -1;
      bool isNewCandle = NewCandle(Period(), Symbol());
      
      signal = getSignal(isNewCandle);
      transaction(isNewCandle, signal);
      setTPSL();
      
      
   }else{
      //Detener trading, porque la equidad no es suficiente
      Print("EA se detendrá debido a insuficiencia de capital");
   }
}

Configuración de Take Profit y Stop Loss

La función setTPSL() se encarga de establecer los niveles de take profit y stop loss para cada operación abierta:

void setTPSL(){
   int   tOrder = 0;
   string   strMN = "", pair = "";
   double sl = 0.0, tp = 0.0;
   
   pair = 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(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){ 
         if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ 
            if (takeProfit > 0) {
               tp = OrderOpenPrice() + (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() - (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ 
               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){ 
                  Print ("Orden Modificada con Éxito");
               }
            }
         }
         if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ 
            if (takeProfit > 0) {
               tp = OrderOpenPrice() - (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() + (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ 
               if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){ 
                  Print ("Orden Modificada con Éxito");
               }
            }
         }
         
      }//fin del ciclo for
}

Únete a Nuestra Comunidad

Para más educación y compartir conocimientos en trading, únete a nuestro grupo de Telegram: t.me/codeMQL

Descarga Nuestra App

Si estás buscando una aplicación para apoyar tu trading, descarga nuestra app SignalForex en la Play Store: SignalForex

연관 포스트

댓글 (0)