Inicio Trading Sistemático Publicación

Crea un Trailing Stop Dinámico en MetaTrader 5: Guía Práctica

Archivos adjuntos
49021.zip (1.31 KB, Descargar 0 veces)

Este bloque de código funciona si utilizas un Stop Loss o no.

Requisitos

  • Necesitas incluir "Trade.mqh" para acceder a la clase CTrade, que te permite trabajar con posiciones y órdenes.

#include <Trade\Trade.mqh> // <<------------------------------------------ Incluye "Trade.mqh" para acceder a la clase CTrade

  • Debes establecer un parámetro de entrada para ajustar la distancia del trailing stop como desees. Esto no es obligatorio, pero es conveniente.
input double Traling_Step = 3.0;
  • Necesitas definir una instancia de la clase CTrade. El nombre puede ser cualquier nombre que elijas. Es recomendable definirla después del manejador de eventos OnInit.

  • Luego, debes crear una sentencia if para verificar si hay alguna posición activa en ese momento. Esta sentencia llama a la función Check_TrailingStop(); para cada tick. Esto es importante porque el EA debe hacer el trailing de manera rápida y suave. Recuerda colocar esta sentencia al inicio del manejador de eventos OnTick para que funcione correctamente.
//+------------------------------------------------------------------+ //| Función de inicialización del Expert                                   | //+------------------------------------------------------------------+ int OnInit() 
  {
   //--- crea un temporizador
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }

// <<------------------------------------------ Declara la clase "CTrade". Puedes reemplazar "trade" por cualquier nombre que quieras
CTrade trade;
void OnTick() 
  {
   if(PositionsTotal() > 0) // llama a la función de trailing stop para cada tick si hay posiciones en ejecución.
     {
      Check_TralingStop();
     }
    
      
  }

  • Necesitas declarar una función personalizada llamada Check_TrailingStop(); (en este caso) para realizar el resto. Puedes usar cualquier nombre que desees.
  • La función personalizada recorre todas las posiciones abiertas y las ajusta a la distancia que necesites.
void Check_TralingStop() 
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // Obtiene el número de ticket de la posición usando el 'índice' de la posición.

      if(PositionSelectByTicket(TicketNo)) // Selecciona una posición usando el número de ticket (ya hemos obtenido el ticket).
        {
           if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Verifica el tipo de posición.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------Obtiene el Stop Loss actual de la posición
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Si el Stop Loss es nulo.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // Se ejecuta solo una vez por posición. Establece el primer SL.
                trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica el Trailing Stop usando "CTrade.trade"
              }

            if(bidPrice > openPrice && trailingLevel > stopLoss) // Verifica si el nivel de trailing está por encima del nivel anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica el Trailing Stop usando "CTrade.trade"
              }

           }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double askPrice  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Si el Stop Loss es nulo.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // Se ejecuta solo una vez por posición. Establece el primer SL.
                trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica el Trailing Stop usando "CTrade.trade"
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // Verifica si el nivel de trailing está por debajo del nivel anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modifica el Trailing Stop usando "CTrade.trade"
              }
           }

      }
     }
  }


    Publicaciones relacionadas

    Comentarios (0)