O trailing stop é uma ferramenta incrível que ajuda a proteger nossos lucros, ajustando automaticamente o stop loss para a área de lucro. Isso garante que possamos sempre garantir nossas operações com mais segurança.
Vamos começar definindo os parâmetros de entrada para o trailing stop no código.
input bool isTrailingStop = true; //Ativar Trailing Stop input int trailingStart = 15; //Início do Trailing (pips) input int trailingStep = 5; //Passo do Trailing (pips) input int MagicNumber = 0; //Número Mágico
Agora, vamos definir uma variável global:
//Variável Global double myPoint = 0.0;
Quando executamos este Expert Advisor, a função OnInit() será chamada pela primeira vez, onde validaremos e inicializaremos as variáveis de entrada.
int OnInit() { if (isTrailingStop && trailingStart <= 0){ Alert ("Parâmetros incorretos"); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); return(INIT_SUCCEEDED); }
A cada movimento de preço (tick) no gráfico onde este EA está emparelhado, a função OnTick() será executada. Dentro dela, chamaremos a função setTrailingStop().
void OnTick() { //--- setTrailingStop(MagicNumber); }
A função setTrailingStop() é onde a mágica acontece:
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(), " falha ao atualizar 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(), " falha ao atualizar sl"); } } } } //fim do if magicNumber }//fim do for }
Outra função padrão necessária é a GetPipPoint():
// Função 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); }
Se você tiver alguma dúvida, fique à vontade para deixar nos comentários ou junte-se ao nosso grupo de compartilhamento t.me/codeMQL (em português).
Não se esqueça de conferir o nosso aplicativo SignalForex!
Você pode nos apoiar baixando e usando o aplicativo SignalForex para tornar suas operações ainda mais lucrativas.
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Comentário 0