MetaTrader4
Cómo implementar un Trailing Stop con MagicNumber en MetaTrader 4
El trailing stop es una herramienta esencial para nuestros trades, ya que nos permite mover el stop loss a la zona de ganancias, asegurando así nuestros beneficios de forma automática. Comencemos a codificar especificando los parámetros de entrada del trailing stop. input bool isTrailingStop = true; //Trailing Stop
input int trailingStart = 15; //Inicio del Trailing (pips)
input int trailingStep = 5 //Paso del Trailing (pips)
input int MagicNumber = 0; //Número Mágico Variable Global //Variable Global
double myPoint = 0.0; Cuando ejecutamos este EA, la función OnInit() se ejecutará por primera vez y aquí validaremos e inicializaremos las variables de entrada. int OnInit()
{
if (isTrailingStop && trailingStart <= 0){
Alert ("Parámetros incorrectos");
return(INIT_PARAMETERS_INCORRECT);
}
myPoint = GetPipPoint(Symbol());
return(INIT_SUCCEEDED);
} Cada vez que ocurre un movimiento de precio (tick) en el gráfico donde se ha emparejado este EA, se ejecutará la función OnTick(). Dentro de esta función, llamaremos a la función setTrailingStop(). void OnTick()
{
//---
setTrailingStop(MagicNumber);
} Función setTrailingStop() void setTrailingStop(int magicNumber=0){
if (isTrailingStop==false) return;
int tOrder = 0;
string 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);
if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){
if (OrderType() == OP_BUY){
if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice()
&& (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() )
){
sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
Print ("#", OrderTicket(), " no se actualizó el SL");
}
}
}
if (OrderType() == OP_SELL){
if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice()
&& ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0)
)
{
sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );
if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
Print ("#", OrderTicket(), " no se actualizó el SL");
}
}
}
} //fin if magicNumber
}//fin for
} Otras funciones estándar necesarias son GetPipPoint() // Función GetPipPoint
double GetPipPoint(string pair)
{
double point= 0.0;
int digits = (int) MarketInfo(pair, MODE_DIGITS);
if(digits == 2 || digits== 3) point= 0.01;
else if(digits== 4 || digits== 5) point= 0.0001;
return(point);
} Si tienes alguna pregunta, no dudes en dejarla en los comentarios. También puedes unirte a nuestro grupo de intercambio (en Español) t.me/codeMQL También te invitamos a descargar nuestra app SignalForex Apóyanos descargando y utilizando la app SignalForex para mejorar tus resultados en el trading. Descargar SignalForex
2021.03.30