167 行
无行尾
14 KiB
MQL5
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);
|
|
}
|
|
//+------------------------------------------------------------------+ |