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