MetaTrader5
Level Indicator für MetaTrader 5: So optimierst du deine Handelsstrategie
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.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_plots 0
#include <ChartObjects\ChartObjectsLines.mqh>
input bool alert = true; // Alarm aktivieren
input bool notification = true; // Push-Benachrichtigungen aktivieren
input double trigLv = 0.0; // Trigger-Level
input int deviation = 30; // Abweichung vom trigLv in Punkten
input int lineWidth = 1; // Linienbreite
input ENUM_LINE_STYLE lineStyle = STYLE_SOLID; // Linienstil
input color lineColor = clrMediumSpringGreen; // Linienfarbe
input color inactivityColor = clrLightGray; // Inaktivitätsfarbe
CChartObjectHLine lv, dvH, dvL;
bool equal(double _v1, double _v2, double _epsilon) { return fabs(_v1 - _v2) <= fabs(_epsilon); }
//+------------------------------------------------------------------+
//| Eingabefunktion für den benutzerdefinierten Indikator |
//+------------------------------------------------------------------+
int OnInit() { 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)) return INIT_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);}
void OnDeinit(const int reason) { //lv.Delete(); //dvH.Delete(); //dvL.Delete();}
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { static bool triggered = false; static datetime 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;}
//+------------------------------------------------------------------+
2022.01.20