MetaTrader4
Como Usar o Take Profit Baseado no Lucro Atual no MetaTrader 4
Introdução Olá, trader! Se você é daquelas pessoas que costumam usar EAs (Robôs de Trading) para gerenciar suas operações, provavelmente já percebeu que muitos deles fecham ordens com take profit baseado na distância em pips do preço de compra. Mas hoje, quero te apresentar uma abordagem diferente, que pode facilitar bastante a sua vida: usar o lucro atual como base para o take profit. O EA Perceptron faz isso e eu vou te explicar como! Esse método permite gerenciar o take profit de várias posições abertas, monitorando o lucro total em função do número mágico, especialmente se você estiver utilizando várias instâncias de robôs ou EAs diferentes ao mesmo tempo. Me adicione como amigo e fique por dentro das novidades! Além disso, usar essa abordagem pode te ajudar a evitar alguns problemas comuns que surgem ao usar o take profit baseado em pips. Por exemplo, o take profit em pips pode variar dependendo do slippage do seu corretor, o que pode limitar seus lucros. Com o lucro atual, você ganha mais controle sobre suas operações. Se você quiser aprender mais sobre como configurar um take profit baseado no lucro atual, pode usar o código do EA SwingBot como referência. Total de Ordens Vamos começar com o código que calcula o total de ordens abertas com o mesmo número mágico. O número mágico é um identificador único atribuído a uma ordem pelo trader ou pelo EA. O código inicializa uma variável total_orders como zero e, em seguida, usa um loop para percorrer todas as ordens abertas, selecionando cada uma com a função OrderSelect(). Se a ordem for selecionada com sucesso, a variável total_orders é incrementada em um. //-----------------
int total_orders = 0;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == MagicNumber)
{
total_orders++;
}
}
} Calculando o Lucro Atual O código inicializa duas variáveis: ProfittoMinimo e Profit. A variável ProfittoMinimo é usada para ativar o take profit nesse nível, sendo o valor expresso na moeda da conta. A variável Profit acumula o lucro atual de todas as posições abertas com o mesmo número mágico. Em seguida, o código usa um loop para iterar por todas as posições abertas com a função OrdersTotal(). Para cada posição, a ordem correspondente é selecionada com a função OrderSelect(). Se a ordem for selecionada com sucesso e tiver o mesmo número mágico, o lucro da ordem é adicionado à variável Profit. double ProfittoMinimo = 3; // lucro alvo
double Profit = 0; // lucro atual
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == MagicNumber) // Se você estiver usando múltiplos EAs, pode remover o filtro MagicNumber para manter a função em todas as ordens abertas
{
Profit += OrderProfit();
}
}
} A variável de lucro mínimo pode ser configurada como uma variável externa nas opções do EA: Fechando Posições ao Alcançar o Lucro Agora, vamos falar sobre como fechar as posições assim que o lucro desejado for atingido. O código utiliza um loop para iterar por todas as ordens abertas com a função OrdersTotal(). O loop começa pela última ordem e vai até a primeira. Para cada ordem, a operação correspondente é selecionada com a função OrderSelect(). Se a operação selecionada tiver o mesmo símbolo que o gráfico atual, for do tipo OP_BUY e tiver o mesmo número mágico conforme o código, ele verifica se o Profit da operação é maior ou igual ao ProfittoMinimo. Caso positivo, a operação é fechada no preço de venda usando a função OrderClose(), e uma mensagem é impressa indicando que a ordem de compra foi fechada. Da mesma forma, se a operação selecionada tiver o mesmo símbolo que o gráfico atual, for do tipo OP_SELL e tiver o mesmo número mágico, verifica se o Profit é maior ou igual ao ProfittoMinimo. Se sim, a operação é fechada no preço de compra usando a função OrderClose(), e uma mensagem é impressa indicando que a ordem de venda foi fechada. for(int e = OrdersTotal() - 1; e >= 0; e--)
{
if(OrderSelect(e, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber) // A ordem só será modificada se o número mágico corresponder ao da ordem atual.
{
if(Profit >= ProfittoMinimo)
{
OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // Preço de venda
Print("Ordem de compra fechada", Profit, " - Stoploss mínimo: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
}
}
if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
{
if(Profit >= ProfittoMinimo)
{
OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // Preço de compra
Print("Ordem de venda fechada", Profit, " - Stoploss mínimo: ",MarketInfo(Symbol(), MODE_STOPLEVEL));
}
}
}
} Conclusão Esse código pode ser útil para todas aquelas estratégias de fechamento de posições baseadas em take profit, mas também pode ser combinado com um trailing stop baseado no aumento do lucro atual. O sistema é especialmente útil se você estiver usando vários EAs. Se você remover a condição if relacionada ao MagicNumber, pode definir níveis de take profit gerais para controlar simultaneamente todas as posições abertas de todos os EAs ativos.
2023.10.27