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
- Crea tu Asesor Experto: Señales de Trading con Líneas de Reunión y Estocástico en MQL5
- Señales de Trading con MQL5: Patrones de Estrellas y MFI
- Crea tu Asesor Experto con MQL5: Señales de Trading Basadas en Dark Cloud Cover y Piercing Line
- Cómo Crear un Asesor Experto con MQL5: Señales de Trading Basadas en Estrellas y Estocástico
- MQL5 Wizard: Crea un Asesor Experto con Señales de Bullish Harami y Bearish Harami + CCI