Inicio Indicador técnico Publicación

Indicador de Nivel: Mejora tu Trading en MetaTrader 4

Archivos adjuntos
37912.zip (1.61 KB, Descargar 0 veces)

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_plots 0

#include <ChartObjects\ChartObjectsLines.mqh>

input bool alerta = true; // activar alerta
input bool notificacion = true; // usar notificaciones push
input double trigLv = 0.0; // nivel de activación
input int desviacion = 30; // desviación de trigLv en puntos
input int anchoLinea = 1; // ancho de línea
input ENUM_LINE_STYLE estiloLinea = STYLE_SOLID; // estilo de línea
input color colorLinea = clrMediumSpringGreen; // color de línea
input color colorInactividad = clrLightGray; // color de inactividad

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizado |
//+------------------------------------------------------------------+
int OnInit() {
  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))
        return INIT_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);
}

void OnDeinit(const int reason) {
  //lv.Delete();
  //dvH.Delete();
  //dvL.Delete();
}

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado |
//+------------------------------------------------------------------+
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 activado = false;
  static datetime 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);
}
//+------------------------------------------------------------------+

Publicaciones relacionadas

Comentarios (0)