Discussão do artigo "Implementando uma Estratégia de Negociação com Bandas de Bollinger usando MQL5: Um Guia Passo a Passo"

 

Novo artigo Implementando uma Estratégia de Negociação com Bandas de Bollinger usando MQL5: Um Guia Passo a Passo foi publicado:

Um guia passo a passo para implementar um algoritmo de negociação automatizado em MQL5 baseado na estratégia de Bandas de Bollinger. Um tutorial detalhado sobre a criação de um Expert Advisor que pode ser útil para traders.

Os traders podem criar um Expert Advisor (EA) que usa as Bandas de Bollinger para executar ordens de compra e venda com base em condições específicas do mercado, seguindo este tutorial passo a passo. Tópicos importantes, incluindo a configuração do indicador Bandas de Bollinger, controle das posições de negociação e o gerenciamento da execução de ordens e erros, serão abordados. Independentemente do seu nível de experiência com desenvolvimento ou familiaridade com a negociação algorítmica, este tutorial fornecerá uma base sólida para os traders desenvolverem e aprimorarem seus métodos de negociação.

Esta jornada abordará os seguintes tópicos:

  1. Definição da estratégia de Bandas de Bollinger
  2. Descrição da estratégia de Bandas de Bollinger
  3. Implementação passo a passo com MQL5
  4. Conclusão

Resultados:

De 2016 a 2019, a estratégia executou 1425 negociações, 857 fechadas com lucro, o que representa 20,28% a mais do que as negociações com perdas.


Autor: Kikkih25

 

Estamos em 2024 e seu backtest parou em 2019.

É porque ele não funciona depois de 2019?

 
O EA tem vários erros de compilação.
 

Aqui está um código que pelo menos compila no MT5 :)

Arquivos anexados:
 

Esse código tem muitos erros. Corrigi os erros e estou publicando o código atualizado aqui. De nada!

//+------------------------------------------------------------------+
//|BollingerBands.mq5
//|Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh> // Incluir a biblioteca comercial
CTrade trade; // Criar uma instância da classe CTrade 

// Parâmetros de entrada para a estratégia Bollinger Bands
input int BandPeriod = 30;
input double BandDeviation = 2.0;
input double LotSize = 0.2;
input int Slippage = 3;
input double StopLoss = 70;
input double TakeProfit = 140;

int Bb_Handle; // Alça para o indicador Bollinger Bands 

//+------------------------------------------------------------------+
//| Função de inicialização especializada|
//+------------------------------------------------------------------+
int OnInit()
{
   // Criar a alça do indicador Bollinger Bands
   Bb_Handle = iBands(_Symbol, PERIOD_CURRENT, BandPeriod, 0, BandDeviation, PRICE_CLOSE);
   
   if(Bb_Handle == INVALID_HANDLE)
   {
      Print("Error creating Bollinger Bands indicator"); 
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // Liberar a alça do indicador Bollinger Bands
   IndicatorRelease(Bb_Handle);
}

//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
{
   double upperBand[], lowerBand[], middleBand[];
   
   // Copiar os valores do Bollinger Bands em matrizes
   if(CopyBuffer(Bb_Handle, 0, 0, 1, upperBand) <= 0 ||
      CopyBuffer(Bb_Handle, 1, 0, 1, middleBand) <= 0 ||
      CopyBuffer(Bb_Handle, 2, 0, 1, lowerBand) <= 0)
   {
      Print("Error copying band values");
      return;
   }
   
   double upper = upperBand[0];
   double lower = lowerBand[0];
   double middle = middleBand[0];
   double price = SymbolInfoDouble(_Symbol, SYMBOL_LAST);
   double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   
   // Sinal de compra: o preço está abaixo da banda inferior e não há posições abertas 
   if(price < lower && !IsPositionOpen(_Symbol))
   {
      double sl, tp;
      CalculateSLTP(sl, tp, Ask, true);
      if(trade.Buy(LotSize, _Symbol, Ask, sl, tp, "Buy Order"))
         Print("Buy order opened at price: ", Ask);
      else
         Print("Error opening BUY order:", trade.ResultRetcode());
   }
   // Sinal de venda: o preço está acima da banda superior e não há posições abertas
   else if(price > upper && !IsPositionOpen(_Symbol))
   {
      double sl, tp;
      CalculateSLTP(sl, tp, Bid, false);
      if(trade.Sell(LotSize, _Symbol, Bid, sl, tp, "Sell Order"))
         Print("Sell order opened at price:", Bid);
      else
         Print("Error opening SELL order:", trade.ResultRetcode());
   }
}

//+------------------------------------------------------------------+
//| Verificar se há uma posição aberta para um símbolo
//+------------------------------------------------------------------+
bool IsPositionOpen(string symbol)
{
   for(int i = 0; i < PositionsTotal(); i++)
   {
      if(PositionGetSymbol(i) == symbol)
         return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| Fechar todas as posições de um símbolo|
//+------------------------------------------------------------------+
void CloseAllPositions(string symbol)
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      if(PositionGetSymbol(i) == symbol)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            trade.PositionClose(ticket, Slippage);
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            trade.PositionClose(ticket, Slippage);
         // Aguarde o processamento do pedido antes de continuar
         Sleep(1000);
      }
   }
}

//+------------------------------------------------------------------+
//| Calcular os níveis de Stop Loss e Take Profit
//+------------------------------------------------------------------+
void CalculateSLTP(double &sl, double &tp, double price, bool isBuy)
{
   if(isBuy)
   {
      sl = price - StopLoss * _Point;
      tp = price + TakeProfit * _Point;
   }
   else 
   {
      sl = price + StopLoss * _Point;
      tp = price - TakeProfit * _Point;
   }
}
 
O índice do buffer do copybuffer está incorreto para a banda superior e média; deve ser usado UPPER_BAND, BASE_LINE, LOWER_BAND para iBands.
 
O artigo é excelente. Agradeço ao autor. Vou experimentá-lo em minhas negociações com spreads fixos.
 
É exatamente isso que eu faço....
Estude o código e aplique-o à sua estratégia específica para obter os melhores resultados.