Level Indicator für MetaTrader 5: So optimierst du deine Handelsstrategie

Mike 2022.01.20 22:55 46 0 0
Anhang

Der Level Indicator ist ein hilfreiches Tool für Trader, die ihre Handelsstrategien verfeinern möchten. Wenn der in den Einstellungen festgelegte Triggerebene (trigLv) innerhalb der Abweichung überschritten wird, erhältst du eine Push-Benachrichtigung auf dein mobiles Gerät, vorausgesetzt, der Parameter Benachrichtigung ist aktiviert. Zusätzlich kannst du einen Alarm aktivieren, um sofort informiert zu werden, wenn die Bedingungen erfüllt sind. Die Trigger- und Abweichungsgrenzen werden durch horizontale Linien auf dem Chart angezeigt, deren Stil, Farbe und Dicke du in den Einstellungen anpassen kannst. Diese Funktionalität ermöglicht es dir, mehrere Kopien des Indikators mit unterschiedlichen Ebenen auf dem Chart zu platzieren und Signale aus deren Schnittpunkten zu erhalten.

Wichtig zu beachten ist, dass die Triggerebene trigLv nur einmal pro Kerze aktiv wird. Eine erneute Aktivierung ist erst nach dem Öffnen der nächsten Kerze möglich. So wird vermieden, dass zu viele Trigger bei jedem Tick ausgelöst werden.

Level Indicator

//+------------------------------------------------------------------+//|                                              Level Indicator.mq5 |//|                                               Copyright 2022, © Cyberdev |//|                    https://www.mql5.com/en/users/cyberdev/seller |//+------------------------------------------------------------------+#property copyright"Copyright 2022, © Cyberdev"#property link      "https://www.mql5.com/en/users/cyberdev/seller"#property version   "1.00"#property indicator_chart_window#property indicator_plots0#include <ChartObjects\ChartObjectsLines.mqh>

inputbool alert = true; // Alarm aktiviereninputbool notification = true; // Push-Benachrichtigungen aktiviereninputdouble trigLv = 0.0; // Trigger-Levelinputint deviation = 30; // Abweichung vom trigLv in Punkteninputint lineWidth = 1; // LinienbreiteinputENUM_LINE_STYLE lineStyle = STYLE_SOLID; // Linienstilinputcolor lineColor = clrMediumSpringGreen; // Linienfarbeinputcolor inactivityColor = clrLightGray; // Inaktivitätsfarbe

CChartObjectHLine lv, dvH, dvL; 

bool equal(double _v1, double _v2, double _epsilon) { returnfabs(_v1 - _v2) <= fabs(_epsilon); }

//+------------------------------------------------------------------+//| Eingabefunktion für den benutzerdefinierten Indikator                         |//+------------------------------------------------------------------+intOnInit() {
  string name;
  double dv;
  color color_;
  name = "alert.lv-";
  dv = deviation * SymbolInfoDouble(NULL, SYMBOL_POINT);
  color_ = (alert || notification) ? lineColor : inactivityColor;
  for (int n = 0; n <= INT_MAX && !IsStopped(); n++) {
    if (ObjectFind(0, name + (string)n) != 0) {
      if (!lv.Create(0, name + (string)n, 0, trigLv))
        returnINIT_FAILED;
      lv.Width(lineWidth);
      lv.Style(lineStyle);
      lv.Color(color_);
      dvH.Create(0, "alert.dvH-" + (string)n, 0, trigLv + dv);
      dvH.Width(1);
      dvH.Style(STYLE_DOT);
      dvH.Color(color_);
      dvL.Create(0, "alert.dvL-" + (string)n, 0, trigLv - dv);
      dvL.Width(1);
      dvL.Style(STYLE_DOT);
      dvL.Color(color_);
      break;
    }
  }
  if (!alert && !notification)
    Print("Level Indicator. Level ", lv.Price(0), " ist inaktiv!");
  if (trigLv == 0.0)
    Alert("Level Indicator. Setze den Parameter 'trigLv' auf den gewünschten Wert!");
  return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason) {
  //lv.Delete();
  //dvH.Delete();
  //dvL.Delete();
}
intOnCalculate(constint rates_total,
                 constint prev_calculated,
                 constdatetime &time[],
                 constdouble &open[],
                 constdouble &high[],
                 constdouble &low[],
                 constdouble &close[],
                 constlong &tick_volume[],
                 constlong &volume[],
                 constint &spread[]
) {
  staticbool triggered = false;
  staticdatetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (equal(lv.Price(0), close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) {
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level Indicator. Level ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " ausgelöst!");
      if (notification)
        SendNotification("Level Indicator. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " ausgelöst!");
    }
    triggered = true;
  }
  else
    triggered = false;
  return rates_total;
}
//+------------------------------------------------------------------+
    Liste
    Kommentar 0