Halo para trader! Kali ini kita nak bincangkan tentang Indikator Level yang sangat berguna untuk platform MetaTrader 4. Indikator ini berfungsi dengan cara yang sangat mudah; apabila trigLv yang ditetapkan dalam tetapan dilanggar dalam jarak deviation, indikator ini akan menghantar notifikasi push ke peranti mudah alih anda jika parameter notification diaktifkan. Selain itu, ia juga akan memainkan amaran jika parameter alert diaktifkan. Garis horizontal yang menunjukkan tahap trigLv dan deviation juga boleh disesuaikan dengan tetapan warna, gaya dan ketebalan dalam indikator.
Dengan reka bentuk ini, anda boleh menambah beberapa salinan indikator dengan tahap yang berbeza pada carta dan menerima isyarat berdasarkan persilangan mereka. Anda tidak perlu risau, kerana tahap trigLv ini hanya akan berfungsi sekali pada satu bar. Pengaktifan semula hanya boleh berlaku selepas pembukaan bar seterusnya, jadi anda tak perlu risau tentang terlalu banyak isyarat yang sering muncul.

//+------------------------------------------------------------------+ //| 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_plots 0 #include <ChartObjects\ChartObjectsLines.mqh> input bool alert = true; // gunakan amaran input bool notification = true; // gunakan notifikasi push input double trigLv = 0.0; // tahap pengaktifan 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 ketidakaktifan CChartObjectHLine lv, dvH, dvL; bool equal(double _v1, double _v2, double _epsilon) { return fabs(_v1 - _v2) <= fabs(_epsilon); } //+------------------------------------------------------------------+ //| Fungsi inisialisasi indikator khusus | //+------------------------------------------------------------------+ 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("Indikator Level. Level ", lv.Price(0), " tidak aktif!"); if (trigLv == 0.0) Alert("Indikator Level. Tetapkan parameter \"trigLv\" kepada nilai yang diingini!"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { //lv.Delete(); //dvH.Delete(); //dvL.Delete(); } //+------------------------------------------------------------------+ //| Fungsi pengiraan indikator khusus | //+------------------------------------------------------------------+ 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[0], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { if (time_ != time[0]) time_ = time[0]; else return rates_total; if (!triggered) { if (alert) Alert("Indikator Level. Level ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " terpicu!"); if (notification) SendNotification("Indikator Level. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " terpicu!"); } triggered = true; } else triggered = false; return(rates_total); } //+------------------------------------------------------------------+
Komen 0