Beranda Indikator Teknis Postingan

Indikator Level untuk MetaTrader 5: Panduan Lengkap dan Praktis

Lampiran
37907.zip (1.59 KB, Unduh 0 kali)

Halo para trader! Kali ini kita akan membahas tentang Indikator Level yang bisa digunakan di MetaTrader 5. Indikator ini sangat berguna untuk membantu kita menerima sinyal trading yang lebih akurat.

Ketika level trigLv yang telah ditentukan dalam pengaturan terlampaui dalam batas deviation, indikator ini akan mengirimkan notifikasi push ke perangkat mobile kita jika parameter input notification diaktifkan. Selain itu, indikator ini juga akan memutar suara alert jika parameter alert diaktifkan. Level trigger trigLv dan batas deviation ditandai dengan garis horizontal, yang gaya, warna, dan ketebalannya bisa disesuaikan dalam pengaturan indikator. Desain ini memungkinkan kita untuk menambahkan beberapa salinan indikator dengan level yang berbeda pada grafik dan menerima sinyal ketika level tersebut terinterseksi.

Perlu diingat, level trigLv hanya akan berfungsi sekali dalam satu bar. Pengaktifan kembali hanya mungkin setelah bar berikutnya dibuka. Dengan cara ini, kita bisa menghindari terlalu banyak sinyal yang muncul pada setiap tick.

Indikator Level

//+------------------------------------------------------------------+
//|                                              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; // aktifkan alert
input bool notification = true; // aktifkan notifikasi push
input double trigLv = 0.0; // level aktivasi
input int deviation = 30; // deviasi dari trigLv dalam poin
input int lineWidth = 1; // ketebalan garis
input ENUM_LINE_STYLE lineStyle = STYLE_SOLID; // gaya garis
input color lineColor = clrMediumSpringGreen; // warna garis
input color inactivityColor = clrLightGray; // warna tidak aktif

CChartObjectHLine lv, dvH, dvL; 

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

//+------------------------------------------------------------------+
//| Fungsi inisialisasi indikator kustom                         |
//+------------------------------------------------------------------+
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), " tidak aktif!");
  if (trigLv == 0.0)
    Alert("Level Indicator. Atur parameter \"trigLv\" ke nilai yang diinginkan!");
  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)), " terpicu!");
      if (notification)
        SendNotification("Level Indicator. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " terpicu!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

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

Postingan terkait

Komentar (0)