//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+