Diskussion zum Artikel "Implementierung einer Handelsstrategie der Bollinger Bänder mit MQL5: Ein schrittweiser Leitfaden"

 

Neuer Artikel Implementierung einer Handelsstrategie der Bollinger Bänder mit MQL5: Ein schrittweiser Leitfaden :

Eine Schritt-für-Schritt-Anleitung zur Implementierung eines automatisierten Handelsalgorithmus in MQL5, der auf der Bollinger-Band-Handelsstrategie basiert. Ein detailliertes Tutorial zur Erstellung eines Expert Advisors, der für Händler nützlich sein kann.

Händler können einen Expert Advisor (EA) erstellen, der Bollinger Bänder verwendet, um Kauf- und Verkaufsaufträge basierend auf bestimmten Marktbedingungen auszuführen, indem sie dieser Schritt-für-Schritt-Anleitung folgen. Wichtige Themen wie die Konfiguration des Bollinger-Band-Indikators, die Kontrolle von Handelspositionen, die Auftragsausführung und das Fehlermanagement werden behandelt. Unabhängig von Ihrer Erfahrung mit der Entwicklung oder Ihrer Vertrautheit mit dem algorithmischen Handel bietet dieses Tutorial Händlern eine solide Grundlage, auf der sie ihre Handelsmethoden entwickeln und verbessern können. 

Diese Reise wird die folgenden Themen behandeln:

  1. Definition der Bollinger Band Strategie
  2. Beschreibung der Bollinger Band Strategie
  3. Schritt-für-Schritt-Implementierung mit MQL5
  4. Schlussfolgerung

Ergebnisse:

Von 2016 bis 2019 führte die Strategie 1425 Handelsgeschäfte aus, 857 wurden mit Gewinn geschlossen, was 20,28% mehr ist als die Verlustpositionen.   

Autor: Kikkih25

 

Wir befinden uns im Jahr 2024 und Ihr Backtest endet 2019.

Liegt es daran, dass er nach 2019 nicht mehr funktioniert?

 
Der EA weist zahlreiche Kompilierungsfehler auf.
 

Hier ist ein Code, der zumindest in MT5 kompiliert :)

Dateien:
 

Dieser Code hat zu viele Fehler. Ich habe die Fehler behoben und poste den aktualisierten Code hier. Sie sind herzlich willkommen!

//+------------------------------------------------------------------+
//|BollingerBands.mq5 |
//|Urheberrecht 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> // Einbinden der Handelsbibliothek
CTrade trade; // Erstellen einer Instanz der Klasse CTrade 

// Eingabeparameter für die Bollinger-Band-Strategie
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; // Handle für den Bollinger Bands Indikator 

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
{
   // Erstellen Sie den Indikatorgriff 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);
}

//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // Lösen Sie den Griff des Bollinger Bands Indikators
   IndicatorRelease(Bb_Handle);
}

//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
{
   double upperBand[], lowerBand[], middleBand[];
   
   // Kopieren Sie die Werte der Bollinger-Bänder in Arrays
   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);
   
   // Kaufsignal: Kurs liegt unter dem unteren Band und keine offenen Positionen 
   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());
   }
   // Verkaufssignal: Preis liegt über dem oberen Band und keine offenen Positionen
   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());
   }
}

//+------------------------------------------------------------------+
//| Prüfen Sie, ob es eine offene Position für ein Symbol gibt.
//+------------------------------------------------------------------+
bool IsPositionOpen(string symbol)
{
   for(int i = 0; i < PositionsTotal(); i++)
   {
      if(PositionGetSymbol(i) == symbol)
         return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| Alle Positionen für ein Symbol schließen|
//+------------------------------------------------------------------+
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);
         // Warten Sie auf die Bearbeitung der Bestellung, bevor Sie fortfahren
         Sleep(1000);
      }
   }
}

//+------------------------------------------------------------------+
//| Stop-Loss- und Take-Profit-Levels berechnen |
//+------------------------------------------------------------------+
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;
   }
}