Início Negociação Sistemática Postagem

Como Implementar um Trailing Stop Eficiente no MetaTrader 5

Anexo
49021.zip (1.31 KB, Baixar 0 vezes)

Este bloco de código funciona tanto se você usar um Stop Loss quanto se não usar.

Requisitos

  • Você precisa incluir "Trade.mqh" para acessar a classe CTrade, que permite trabalhar com posições e ordens.

#include <Trade\Trade.mqh> // <<------------------------------------------ Inclua este "Trade.mqh" para acessar a classe CTrade 

  • Você deve definir um parâmetro de entrada para ajustar a distância do trailing como desejar. Isso não é obrigatório, mas é conveniente.
input double Traling_Step = 3.0;
  • É necessário definir uma instância da classe CTrade; o nome pode ser o que você quiser. É melhor defini-la após o manipulador de eventos OnInit.

  • Em seguida, crie uma estrutura if para verificar se há alguma posição em execução no momento. Esta estrutura chama a função Check_TrailingStop(); a cada tick. Isso é importante porque o EA deve fazer o trailing de forma rápida e suave. Lembre-se de colocar essa estrutura no início do manipulador de eventos OnTick para que funcione corretamente.
//+------------------------------------------------------------------+ //| Função de inicialização do Expert | //+------------------------------------------------------------------+ int OnInit() { //--- cria o timer EventSetTimer(60); //--- return(INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ Declare a classe "CTrade"; você pode substituir "trade" por qualquer nome que desejar 
void OnTick() { if (PositionsTotal() > 0) { // chama a função de trailing stop a cada tick se houver posições em execução. Check_TralingStop(); } }

  • Agora, você precisa declarar uma função personalizada chamada Check_TrailingStop(); (você pode usar qualquer nome que desejar) para realizar o restante da tarefa. Essa função personalizada irá percorrer todas as posições abertas e ajustá-las na distância que você definiu.
void Check_TralingStop() { int totalPositions = PositionsTotal(); for (int count = 0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // Obter o número do ticket da posição usando o 'índice' da posição. if (PositionSelectByTicket(TicketNo)) { // Seleciona uma posição usando o número do ticket (já pegamos o número do ticket) if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { // Verifica o tipo da posição. double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<-------------------Obter o Stop Loss atual da posição 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) { // Sem stop loss é verdadeiro. if (bidPrice > openPrice && trailingLevel > openPrice) { // Executa apenas uma vez por posição. Define o primeiro SL. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifica o trailing Stop usando "CTrade.trade" } } if (bidPrice > openPrice && trailingLevel > stopLoss) { // verifica se o nível de trailing está acima do nível anterior. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifica o 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) { // Sem stop loss é verdadeiro. if (askPrice < openPrice && trailingLevel < openPrice) { // Executa apenas uma vez por posição. Define o primeiro SL. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifica o trailing Stop usando "CTrade.trade" } } if (askPrice < openPrice && trailingLevel < stopLoss) { // verifica se o nível de trailing está acima do nível anterior. trade.PositionModify(ticket, trailingLevel, takeProfit); // Modifica o trailing Stop usando "CTrade.trade" } } } } }










    Publicações relacionadas

    Comentário (0)