MetaTrader5
Indikator Level untuk MetaTrader 5: Panduan Lengkap
Hai semua trader! Hari ini kita akan membincangkan tentang Indikator Level yang sangat berguna untuk platform MetaTrader 5. Indikator ini membantu kita untuk memantau tahap tertentu dalam carta dan memberi isyarat apabila tahap tersebut dilanggar. Apabila tahap yang ditetapkan dalam parameter trigLv 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. Tahap trigLv serta had deviation akan ditandakan dengan garis mendatar, dan anda boleh mengubah gaya, warna, dan ketebalan garis tersebut dalam tetapan indikator. Ini membolehkan anda menambah beberapa salinan indikator dengan tahap yang berbeza pada carta dan menerima isyarat hasil daripada persimpangan tersebut. Perlu diingat bahawa tahap trigLv ini hanya berfungsi sekali dalam satu bar. Pengaktifan semula hanya boleh dilakukan selepas pembukaan bar seterusnya. Dengan cara ini, kita dapat mengelakkan terlalu banyak pemicu pada setiap tick. Berikut adalah gambar rajah indikator level: //+------------------------------------------------------------------+
//| Indikator Level.mq5 |
//| Hak Cipta 2022, © Cyberdev |
//| https://www.mql5.com/en/users/cyberdev/seller |
//+------------------------------------------------------------------+
#property copyright "Hak Cipta 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; // gunakan amaran
input bool notification = true; // gunakan notifikasi push
input double trigLv = 0.0; // tahap pengaktifan
input int deviation = 30; // penyimpangan dari trigLv dalam titik
input int lineWidth = 1; // lebar 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 pengaktifan 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();
}
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("Indikator Level. Level ", NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " telah dicetuskan!");
if (notification)
SendNotification("Indikator Level. Level " + (string)NormalizeDouble(lv.Price(0), (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " telah dicetuskan!");
}
triggered = true;
}
else
triggered = false;
return rates_total;
}
//+------------------------------------------------------------------+
2022.01.20