4kk4.MQL5/Indicators/hari-hari.mq5
clarissya 2394964283 Scripts
2026-04-27 07:14:01 +07:00

167 行
无行尾
14 KiB
MQL5

//+------------------------------------------------------------------+
//| hari-hari.mq5 |
//| Copyright © 2007, 4kk4 |
//| |
//+------------------------------------------------------------------+
//---- Copyright
#property copyright "Copyright © 2007, 4kk4"
//---- link to the website of the author
#property link ""
//---- Indicator version number
#property version "4.42"
#property indicator_chart_window
#property indicator_buffers 0 // Tidak ada buffer yang digunakan untuk plotting
#property indicator_plots 0 // Tidak ada plot garis
//--- Input dari pengguna
//input group "Tampilan Teks"
input int fontsize = 16; // Ukuran Font
input string fontstyle = "Verdana"; // Jenis Font
input int jarak = 10; // Jarak di bawah harga terendah (dalam poin)
input double angle = 0; // Kemiringan tulisan (derajat)
input color daycolor = clrAqua; // Warna teks hari
//input group "Nama Hari"
input string d1 = "1"; // "Senin"
input string d2 = "2"; // "Selasa"
input string d3 = "3"; // "Rabu"
input string d4 = "4"; // "Kamis"
input string d5 = "5"; // "Jumat"
//--- Variabel Global
string hari[6];
bool lihat[6];
string obj_prefix = "hari_"; // Awalan nama objek untuk memudahkan pengelolaan
//int days_to_scan = 220; // Sesuai dengan gi_96 pada kode asli
//+------------------------------------------------------------------+
//| Fungsi inisialisasi indikator |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Mengisi array dengan input nama hari
hari[0] = "0";
hari[1] = d1;
hari[2] = d2;
hari[3] = d3;
hari[4] = d4;
hari[5] = d5;
//--- Mengisi array untuk menampilkan hari (default semua TRUE)
lihat[0] = false;
for(int i=1; i<=5; i++)
{
lihat[i] = true;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fungsi deinisialisasi indikator |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- Hapus semua objek yang dibuat oleh indikator ini
ClearObjects();
}
//+------------------------------------------------------------------+
//| Fungsi utama perhitungan indikator |
//+------------------------------------------------------------------+
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[])
{
//--- Hanya berjalan pada timeframe H1 atau lebih rendah
if(Period() > PERIOD_H1)
{
ClearObjects(); // Hapus objek jika timeframe diubah ke yang lebih tinggi
return(rates_total);
}
//--- Tentukan jumlah bar yang akan dihitung untuk efisiensi
int start_bar;
if(prev_calculated > 1)
start_bar = rates_total - prev_calculated;
else
start_bar = rates_total - 1; // Hitung ulang semua bar saat pertama kali dijalankan
// Menambahkan beberapa bar ekstra untuk memastikan perbatasan hari terdeteksi
start_bar = MathMin(rates_total - 2, start_bar + 2);
ShowDayLabels(start_bar, time, low);
return(rates_total);
}
//+------------------------------------------------------------------+
//| Fungsi untuk menampilkan label hari |
//+------------------------------------------------------------------+
void ShowDayLabels(const int start_pos, const datetime &time[], const double &low[])
{
//--- Loop dari bar terbaru ke yang lebih lama
for(int i = start_pos; i > 0; i--)
{
//--- Struktur untuk menampung informasi waktu
MqlDateTime current_bar_dt, prev_bar_dt;
//--- Ambil informasi waktu untuk bar saat ini dan bar sebelumnya
TimeToStruct(time[i], current_bar_dt);
TimeToStruct(time[i-1], prev_bar_dt);
//--- Deteksi jika hari dalam seminggu berubah (awal hari baru)
if(current_bar_dt.day_of_week != prev_bar_dt.day_of_week)
{
//--- Dapatkan hari dalam format angka (1=Senin, 2=Selasa, ..., 5=Jumat)
int harian = current_bar_dt.day_of_week;
//--- Hanya proses untuk hari Senin hingga Jumat
if(harian >= 1 && harian <= 5)
{
//--- Buat nama objek yang unik berdasarkan tanggal
string obj_name = obj_prefix + TimeToString(time[i], TIME_DATE);
//--- Cek apakah objek sudah ada untuk menghindari pembuatan duplikat
if(ObjectFind(0, obj_name) == -1)
{
//--- Cek apakah hari ini diizinkan untuk ditampilkan
if(lihat[harian])
{
//--- Buat objek teks
if(ObjectCreate(0, obj_name, OBJ_TEXT, 0, time[i], low[i] - (jarak * _Point)))
{
//--- Atur properti teks
ObjectSetString(0, obj_name, OBJPROP_TEXT, hari[harian]);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, daycolor);
ObjectSetInteger(0, obj_name, OBJPROP_FONTSIZE, fontsize);
ObjectSetString(0, obj_name, OBJPROP_FONT, fontstyle);
ObjectSetDouble(0, obj_name, OBJPROP_ANGLE, angle);
ObjectSetInteger(0, obj_name, OBJPROP_ANCHOR, ANCHOR_TOP); // Anchor text di bagian atas
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Fungsi untuk membersihkan semua objek teks yang dibuat |
//+------------------------------------------------------------------+
void ClearObjects()
{
//--- Menghapus semua objek yang namanya dimulai dengan awalan yang ditentukan
//--- Ini jauh lebih efisien daripada looping melalui bar
ObjectsDeleteAll(0, obj_prefix);
}
//+------------------------------------------------------------------+