Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Asesores Expertos

Code Block for "Trailing Stop" based on current market price. (Ask / Bid) - Asesor Experto para MetaTrader 5

Visualizaciones:
140
Ranking:
(5)
Publicado:
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Este bloque de código funciona tanto si utiliza un Stop Loss como si no.


Requisitos

  • Necesita incluir "Trade.mqh " para tener acceso a la clase CTrade que le permite trabajar con posiciones y órdenes.

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

  • Necesita establecer un parámetro de entrada para ajustar la distancia de arrastre como desee. Esto no es necesario, pero es conveniente.
input double Traling_Step = 3.0;
  • Necesita definir una instancia para la clase CTrade. el nombre puede ser cualquiera. Sería mejor hacerlo después del manejador del evento OnInt .

  • Luego necesita crear una sentencia if para chequear si alguna posición ha estado corriendo en el momento. Esta sentencia llama a la función Check_TrailingStop(); por cada tick. Esto es importante porque el EA debe rastrear de forma nítida y suave. Tenga en cuenta para poner esta declaración en la parte superior del controlador de eventos OnTick para que funcione correctamente.
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- crear temporizador
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }


CTrade trade; // <<------------------------------------------ Declare la calss "CTrade". puede sustituir "trade" ganar cualquier nombre que desee.
void OnTick()
  {
   
   if(PositionsTotal() > 0) // llama a la función trailing stop por cada tick si hay / están corriendo posiciones. 
     {
      Check_TralingStop(); 
     } 
     
       
  }

  • Usted necesita declarar una función personalizada llamada Check_TrailingStop(); ( en este caso) para hacer el resto. Puede utilizar el nombre que desee.
  • La función personalizada recorre todas las posiciones abiertas y las rastrea a la distancia requerida.
void Check_TralingStop()
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // Obtener el número de Ticket de Posición utilizando el 'índice' de la posición.

      if(PositionSelectByTicket(TicketNo)) // Seleccione una posición utilizando el número de ticket (ya hemos elegido el nº de tickt)
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Comprueba la posición Tipo.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------Obtener posición Stop Loss actual
            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) // No stop loss es verdadero.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // Se ejecuta sólo una vez por posición. Establece el primer SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar trailing Stop usando "CTrade.trade"
              }


            if(bidPrice > openPrice && trailingLevel > stopLoss) // comprueba si el nivel final está por encima del nivel anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar 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) // No stop loss es verdadero.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // Se ejecuta sólo una vez por posición. Establece el primer SL.

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar trailing Stop usando "CTrade.trade"
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // comprueba si el nivel final está por encima del nivel anterior.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Modificar trailing Stop usando "CTrade.trade"
              }
           }

        }
     }
  }










    Traducción del inglés realizada por MetaQuotes Ltd.
    Artículo original: https://www.mql5.com/en/code/49021

    ConvertServerTime ConvertServerTime

    Función para convertir la hora del servidor de una zona horaria a otra.

    Bollinger Bands Squeeze Bollinger Bands Squeeze

    Señala un periodo de baja volatilidad del mercado que está a punto de terminar, presagiando un movimiento significativo de los precios.

    Simple Code for Detect  A  "New Bar or New Candle " Received Simple Code for Detect A "New Bar or New Candle " Received

    Este bloque de código detecta una Nueva Barra o una Nueva Vela cuando ha recibido.

    Logarithmic Moving Average Logarithmic Moving Average

    La media móvil logarítmica calcula continuamente la media logarítmica del precio más alto y el precio más bajo dentro de un período.