Обсуждение статьи "Реализация торговой стратегии на основе полос Боллинджера с помощью MQL5: Пошаговое руководство"

 

Опубликована статья Реализация торговой стратегии на основе полос Боллинджера с помощью MQL5: Пошаговое руководство:

Пошаговое руководство по реализации на MQL5 алгоритма автоматической торговли, основанной на торговой стратегии «Полосы Боллинджера». Подробное учебное пособие на основе создания советника, который может быть полезен трейдерам.

Следуя этому пошаговому руководству, трейдеры могут создать советник, использующий полосы Боллинджера для исполнения ордеров на покупку и продажу в зависимости от конкретных условий на рынке. Будут рассматриваться важные темы, такие как настройка индикатора «Полосы Боллинджера» (Bollinger Bands), контроль торговых позиций и управление обработкой ошибок. Независимо от уровня вашего опыта в разработке или знакомства с алгоритмической торговлей, это руководство даст трейдерам прочную основу для разработки и совершенствования методов торговли. 

Результат:

В период с 2016 по 2019 гг. стратегия совершила 1425 сделок, из которых 857 закрылись с прибылью, что на 20.28% больше, чем убыточных сделок. 

Автор: Kikkih25

 

Мы находимся в 2024 году, а ваш бэктест останавливается в 2019 году.

Это потому, что он не работает после 2019 года?

 
Советник содержит многочисленные ошибки компиляции.
 

Вот один код, который, по крайней мере, компилируется в MT5 :)

Файлы:
 

В этом коде слишком много ошибок. Я исправил ошибки и выкладываю обновленный код здесь. Пожалуйста!

//+------------------------------------------------------------------+
//|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> // Включите торговую библиотеку
CTrade trade; // Создайте экземпляр класса CTrade 

// Входные параметры для стратегии 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; // Ручка для индикатора Bollinger Bands 

//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
int OnInit()
{
   // Создайте ручку индикатора 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);
}

//+------------------------------------------------------------------+
//| Функция деинициализации эксперта|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // Отпустите ручку индикатора Bollinger Bands
   IndicatorRelease(Bb_Handle);
}

//+------------------------------------------------------------------+
//| Функция экспертного тика|
//+------------------------------------------------------------------+
void OnTick()
{
   double upperBand[], lowerBand[], middleBand[];
   
   // Скопируйте значения полос Боллинджера в массивы
   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);
   
   // Сигнал к покупке: цена находится ниже нижней полосы и нет открытых позиций 
   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());
   }
   // Сигнал на продажу: цена находится выше верхней полосы и нет открытых позиций
   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());
   }
}

//+------------------------------------------------------------------+
//| Проверьте, есть ли открытая позиция для символа |
//+------------------------------------------------------------------+
bool IsPositionOpen(string symbol)
{
   for(int i = 0; i < PositionsTotal(); i++)
   {
      if(PositionGetSymbol(i) == symbol)
         return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| Закрыть все позиции для символа|
//+------------------------------------------------------------------+
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);
         // Подождите, пока заказ будет обработан, прежде чем продолжить
         Sleep(1000);
      }
   }
}

//+------------------------------------------------------------------+
//| Рассчитайте уровни стоп-лосса и тейк-профита |
//+------------------------------------------------------------------+
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;
   }
}