Indicador de Nível para MetaTrader 4: Como Funciona e Como Usar

Mike 2022.01.21 03:40 28 0 0
Anexo

Se você ainda não conheceu o Indicador de Nível, está perdendo uma ferramenta poderosa para suas operações no MetaTrader 4. Quando o nível de ativação (trigLv) que você definiu nas configurações é cruzado dentro de um determinado intervalo (deviation), o indicador enviará uma notificação para o seu dispositivo móvel, desde que a opção de notificação esteja ativada. Além disso, ele emite um alerta sonoro se a opção de alerta estiver habilitada. Os níveis de ativação e os limites de desvio são destacados com linhas horizontais, que você pode personalizar em termos de estilo, cor e espessura. Isso permite que você adicione várias cópias do indicador no gráfico e receba sinais com base em suas interseções.

Vale lembrar que o nível trigLv é acionado apenas uma vez por barra. Para que o acionamento ocorra novamente, é necessário que a próxima barra abra. Essa mecânica ajuda a evitar gatilhos excessivos a cada tick.

Indicador de Nível

//+------------------------------------------------------------------+//|                                               LevelIndicator.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 alert = true; // usar alertainputbool notification = true; // usar notificações pushinputdouble trigLv = 0.0; // nível de ativaçãoinputint deviation = 30; // desvio em pontos a partir de trigLvinputint lineWidth = 1; // espessura da linhainputENUM_LINE_STYLE lineStyle = STYLE_SOLID; // estilo da linhainputcolor lineColor = clrMediumSpringGreen; // cor da linhainputcolor inactivityColor = clrLightGray; // cor de inatividade

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+//| Função de inicialização do 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 Nível. Nível ", lv.Price(0), " está inativo!");
  if (trigLv == 0.0)
    Alert("Indicador de Nível. Defina o parâmetro \"trigLv\" para o valor desejado!");
  return(INIT_SUCCEEDED);
}

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

//+------------------------------------------------------------------+//| Função de iteração do 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 triggered = false;
  staticdatetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (equal(lv.Price(0), close[0], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { 
    if (time_ != time[0])
      time_ = time[0];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Indicador de Nível. Nível ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " acionado!");
      if (notification)
        SendNotification("Indicador de Nível. Nível " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " acionado!");
    }
    triggered = true;
  }
  else
    triggered = false;
    
  return(rates_total);
}
//+------------------------------------------------------------------+
    Lista
    Comentário 0