Indicador de Nivel: Mejora tu Trading en MetaTrader 4

Mike 2022.01.21 03:40 10 0 0
Archivos adjuntos

Cuando el nivel trigLv especificado en la configuración es cruzado dentro de la deviación, el indicador envía una notificación a tu dispositivo móvil si el parámetro de entrada notificación está habilitado, y también reproduce una alerta si el parámetro de entrada alerta está activado. El nivel de activación trigLv, así como los límites de deviación, están marcados con líneas horizontales, cuyo estilo, color y grosor también se pueden configurar en los ajustes del indicador. Este diseño permite agregar varias copias del indicador con diferentes niveles al gráfico y recibir señales como resultado de sus intersecciones.

El nivel trigLv se activa solo una vez por cada barra. La reactivación solo es posible después de la apertura de la siguiente barra. De esta manera, se elimina la posibilidad de activaciones demasiado frecuentes en cada tick.

Indicador de Nivel

//+------------------------------------------------------------------+//|                                               IndicadorNivel.mq4 |//|                                       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 strict#property indicator_chart_window#property indicator_plots0#include <ChartObjects\ChartObjectsLines.mqh>

inputbool alerta = true; // activar alertainputbool notificacion = true; // usar notificaciones pushinputdouble trigLv = 0.0; // nivel de activacióninputint desviacion = 30; // desviación de trigLv en puntosinputint anchoLinea = 1; // ancho de líneainputENUM_LINE_STYLE estiloLinea = STYLE_SOLID; // estilo de líneainputcolor colorLinea = clrMediumSpringGreen; // color de líneainputcolor colorInactividad = clrLightGray; // color de inactividad

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+//| Función de inicialización del indicador personalizado |//+------------------------------------------------------------------+intOnInit() {
  string nombre;
  double dv;
  color color_;
  nombre = "alert.lv-";
  dv = desviacion * SymbolInfoDouble(NULL, SYMBOL_POINT);
  color_ = (alerta || notificacion) ? colorLinea : colorInactividad;
  for (int n = 0; n <= INT_MAX && !IsStopped(); n++) {
    if (ObjectFind(0, nombre + (string)n) != 0) {
      if (!lv.Create(0, nombre + (string)n, 0, trigLv))
        returnINIT_FAILED;
      lv.Width(anchoLinea);
      lv.Style(estiloLinea);
      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 (!alerta && !notificacion) 
    Print("Indicador de Nivel. Nivel ", lv.Price(0), " está inactivo!");
  if (trigLv == 0.0)
    Alert("Indicador de Nivel. Ajusta el parámetro 'trigLv' al valor deseado!");
  return(INIT_SUCCEEDED);
}

voidOnDeinit(constint reason) {
  //lv.Delete();
  //dvH.Delete();
  //dvL.Delete();
}

//+------------------------------------------------------------------+//| Función de iteración del indicador personalizado |//+------------------------------------------------------------------+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 activado = false;
  staticdatetime time_ = 0;
  if (!alerta && !notificacion)
    return rates_total;
  if (igual(lv.Price(0), close[0], desviacion * SymbolInfoDouble(NULL, SYMBOL_POINT))) { 
    if (time_ != time[0])
      time_ = time[0];
    else
      return rates_total;
    if (!activado) {
      if (alerta)
        Alert("Indicador de Nivel. Nivel ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " activado!");
      if (notificacion)
        SendNotification("Indicador de Nivel. Nivel " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " activado!");
    }
    activado = true;
  }
  else
    activado = false;
    
  return(rates_total);
}
//+------------------------------------------------------------------+
Lista
Comentarios 0