Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

Level Indicator - индикатор для MetaTrader 5

Просмотров:
2614
Рейтинг:
(7)
Опубликован:
2022.01.19 00:54
Обновлен:
2022.01.20 18:48
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

При пересечении заданного в настройках уровня trigLv, в пределах отклонения deviation, индикатор отправляет push-уведомление на мобильное устройство, если включен входной параметр notification, а также воспроизводит алерт, при включенном входном параметре alert. Уровень срабатывания trigLv, а также пределы отклонения deviation, подсвечиваются горизонтальными линиями, стиль, цвет и толщину которых также можно задать в настройках индикатора. Данное исполнение позволяет добавить в чарт несколько копий индикатора с разными уровнями и получать сигналы в результате их пересечения.

Заданный уровень trigLv срабатывает только один раз на одном баре. Повторное срабатывание возможно только после открытия следующего бара. Таким образом удалось добиться устранения слишком частых срабатываний на каждом тике.

Level indicator

//+------------------------------------------------------------------+
//|                                              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; // use alert
input bool notification = true; // use push notifications
input double trigLv = 0.0; // actuation level
input int deviation = 30; // deviation from trigLv in points
input int lineWidth = 1; // line width
input ENUM_LINE_STYLE lineStyle = STYLE_SOLID; // line style
input color lineColor = clrMediumSpringGreen; // line color
input color inactivityColor = clrLightGray; // inactivity color

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
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), " is inactive!");
  if (trigLv == 0.0)
    Alert("Level Indicator. Set parameter \"trigLv\" to the desired value!");
  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)), " triggered!");
      if (notification)
        SendNotification("Level Indicator. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

//+------------------------------------------------------------------+

При отключенных alert и notification индикатор окрашивает линии в цвет inactivityColor. В журнал выводится соответствующее уведомление, как показано на скриншоте:

Level is inactive!

Если пользователь забудет задать параметр trigLv, то вылетит алерт следующего содержания:

Set parameter trigLv to the desired value! 

    Difference of two bars MA Color Difference of two bars MA Color

    Не сглаженная разница показаний iMA (Moving Average, MA) с двух соседних баров в виде цветной линии

    Separate Trade New Separate Trade New

    Стратегия на отдельных параметрах для BUY и SELL позиций (Стоп лосс, Тейк профит, iATR, iStdDev) и расстоянии между двумя iMA

    Volume Extremes Volume Extremes

    Изменённый индикатор iVolumes - цветная гистограмма выше и ниже нуля, отображение экстремумов индикатора

    Same High Or Low Alert Same High Or Low Alert

    Индикатор ищет две соседние свечи у которых одинаковые 'High' или 'Low'.