MetaTrader5
Panduan Lengkap Fibonacci ZigZag untuk MetaTrader 5
Persiapan untuk Fibonacci ZigZag Sebelum kita mulai, kita butuh beberapa hal: 1 grafik ZigZag 2 buffer data untuk harga tertinggi dan terendah Parameter input Serangkaian variabel sistem yang akan direset setiap kali indikator dihitung ulang Array upWaves akan menyimpan harga tertinggi, sedangkan array dwWaves akan menyimpan harga terendah. Variabel sistem yang perlu kita ketahui meliputi tipe gelombang terakhir, di mana gelombang tersebut dimulai, di mana gelombang tersebut berakhir, serta jarak dalam bar dari awal hingga akhir. //--- melacak zigzag
int wave_type=0;
//--- harga dari gelombang (harga awal)
double wave_start_price=0.0;
//--- harga ke dari gelombang (harga akhir)
double wave_end_price=0.0;
//--- jarak dalam bar dari harga awal
int wave_start_distance=0;
//--- jarak dalam bar dari harga akhir
int wave_end_distance=0;
//--- pelacakan harga tertinggi
double high_mem=0.0;
int distance_from_high=0;
//--- pelacakan harga terendah
double low_mem=0.0;
int distance_from_low=0;
//--- rolling atr
double rollingAtr=0.0;
int rollingAtrs=0; Kita juga perlu membuat fungsi reset sistem: void resetSystem() {
ArrayFill(upWaves, 0, ArraySize(upWaves), 0.0);
ArrayFill(dwWaves, 0, ArraySize(dwWaves), 0.0);
wave_type=0;
wave_start_price=0.0;
wave_end_price=0.0;
wave_start_distance=0;
wave_end_distance=0;
high_mem=0.0;
low_mem=0.0;
distance_from_high=0;
distance_from_low=0;
rollingAtr=0.0;
rollingAtrs=0;
} Standar saja, kita mengisi array dengan nol dan mereset variabel sistem. Di bagian oninit, kita akan menyiapkan buffer, plot, dan memanggil reset untuk pertama kali: SetIndexBuffer(0, upWaves, INDICATOR_DATA);
SetIndexBuffer(1, dwWaves, INDICATOR_DATA);
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_ZIGZAG);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, Color);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, Width);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, Style);
resetSystem(); Kita mulai dengan menghitung rolling atr. Sampai kita mengumpulkan lebih banyak bar daripada periode atr, kita tidak akan melakukan hal lain. Bagian yang mengelola rolling atr adalah sebagai berikut: jika kita belum mengumpulkan lebih dari periode, terus tambahkan range dari bar yang ditemukan ke dalam penjumlahan setelah mencapai periode, kita melakukan pembagian pertama (rata-rata) setelah itu, kita mengurangi satu bagian dari rolling atr, yaitu atr/periode, dan kemudian menambahkan bagian baru yang merupakan range bar/periode Kita tempatkan bagian terakhir terlebih dahulu karena ini akan terjadi lebih sering dan kita tidak perlu mengakses dua pernyataan if. //--- mengelola atr
rollingAtrs++;
if(rollingAtrs>rollingAtrPeriod){
double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod);
//--- kita menghapus bagian lama dan menambahkan bagian baru
rollingAtr=(rollingAtr)-(rollingAtr/((double)rollingAtrPeriod))+new_portion;
} else if(rollingAtrshigh_mem && low[i]>=low_mem){
double new_wave_size_in_atr_units=((high[i]-low_mem)/_Point)/rollingAtr;
//--- jika ukuran gelombang baru valid
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
//--- mulai gelombang naik baru
wave_type=1;
//--- harga awal adalah low mem
wave_start_price=low_mem;
wave_start_distance=distance_from_low;
//--- harga akhir adalah harga tinggi baru
wave_end_price=high[i];
wave_end_distance=0;
//--- gambar gelombang
dwWaves[i-wave_start_distance]=low_mem;
upWaves[i]=high[i];
//--- ubah harga tinggi
high_mem=high[i];
distance_from_high=0;
//--- ubah harga rendah
low_mem=low[i];
distance_from_low=0;
}
}
//--- jika kita melanggar harga rendah dan bukan harga tinggi
else if(low[i]wave_end_price){
//--- hapus harga akhir sebelumnya dari posisi array-nya (0.0=kosong)
upWaves[i-wave_end_distance]=0.0;
//--- tempatkan di posisi baru
upWaves[i]=high[i];
wave_end_price=high[i];
wave_end_distance=0;
//--- ubah harga tinggi
high_mem=high[i];
distance_from_high=0;
//--- ubah harga rendah
low_mem=low[i];
distance_from_low=0;
}
//--- periksa retracement
if(low[i]0.0){
double retraced=(size_of_retracement/size_of_wave)*100.0;
double new_wave_size_in_atr_units=((wave_end_price-low_mem)/_Point)/rollingAtr;
//--- jika ukuran gelombang baru valid
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
//--- jika retracement signifikan, mulai gelombang turun
if(retraced>=retracement){
//--- mulai gelombang turun baru
wave_type=-1;
//--- harga awal adalah high mem
wave_start_price=high[i-distance_from_high];
wave_start_distance=distance_from_high;
//--- harga akhir adalah harga rendah baru
wave_end_price=low[i];
wave_end_distance=0;
//--- gambar gelombang
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
//--- ubah harga tinggi
high_mem=high[i];
distance_from_high=0;
//--- ubah harga rendah
low_mem=low[i];
distance_from_low=0;
}
}
}
}
} Kita melakukan sebaliknya ketika kita memiliki gelombang turun. Dan kita selesai, zigzag retracement kita sudah siap. Berikut adalah zigzag dengan 23.6% retracement dan 0.0 ukuran minimum gelombang dalam satuan atr Dan berikut adalah zigzag yang sama dengan 3 ukuran minimum gelombang dalam satuan atr
2025.03.03