Indicador de Niveles: Optimiza tus Señales en MetaTrader 5

Mike 2022.01.20 22:55 28 0 0
Archivos adjuntos

El Indicador de Niveles es una herramienta esencial para los traders que utilizan MetaTrader 5. Este indicador te permite establecer un nivel específico, conocido como trigLv, que al ser cruzado dentro de un deviation determinado, activa una notificación en tu dispositivo móvil, siempre y cuando tengas habilitada la opción de notificación. Además, si activas la opción de alert, se reproducirá una alerta sonora. Los niveles de trigLv y los límites de deviation se destacan con líneas horizontales personalizables en cuanto a estilo, color y grosor desde la configuración del indicador. Esto te permite agregar múltiples copias del indicador en el gráfico, cada una con diferentes configuraciones, para recibir señales de sus intersecciones.

Es importante destacar que el nivel trigLv solo se activa una vez por cada barra. La reactivación solo es posible tras la apertura de la siguiente barra, lo que ayuda a evitar activaciones excesivas en cada tick.

Indicador de Niveles

//+------------------------------------------------------------------+//|                                              Indicador de Niveles.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; // usar alertainputbool notification = true; // usar notificaciones pushinputdouble trigLv = 0.0; // nivel de activacióninputint deviation = 30; // desviación desde trigLv en puntosinputint lineWidth = 1; // ancho de líneainputENUM_LINE_STYLE lineStyle = STYLE_SOLID; // estilo de líneainputcolor lineColor = clrMediumSpringGreen; // color de líneainputcolor inactivityColor = clrLightGray; // color de inactividad

CChartObjectHLine lv, dvH, dvL;

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

//+------------------------------------------------------------------+//| Función de inicialización del indicador personalizado                         |//+------------------------------------------------------------------+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("Indicador de Niveles. Nivel ", lv.Price(0), " está inactivo!");
  if (trigLv == 0.0)
    Alert("Indicador de Niveles. ¡Configura el parámetro \"trigLv\" al valor deseado!");
  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("Indicador de Niveles. Nivel ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " activado!");
      if (notification)
        SendNotification("Indicador de Niveles. Nivel " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " activado!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

//+------------------------------------------------------------------+
    Lista
    Comentarios 0