MetaTrader5
Fibonacci ZigZag - Indikator Berguna untuk MetaTrader 5
PersediaanKita perlukan:1 plot zigzag2 buffer data untuk tahap tinggi dan rendahparameter inputset pembolehubah sistem yang akan diset semula setiap kali indikator dikira semula#property indicator_buffers 2
#property indicator_plots 1
input double retracement=23.6; //jumlah retracement
input double minSizeInAtrUnits=0.0; //saiz minimum gelombang dalam unit atr
input int rollingAtrPeriod=14; //tempoh atr bergulir
input color Color=clrDodgerBlue; //warna gelombang
input int Width=3; //lebar gelombang
input ENUM_LINE_STYLE Style=STYLE_SOLID; //gaya gelombang
//+------------------------------------------------------------------+
Array upWaves akan menyimpan tahap tinggi dan array dwWaves akan menyimpan tahap rendah.Pembolehubah sistem:Kita perlu tahu jenis gelombang terakhir, di mana ia bermula, di mana ia berakhir, serta jarak dalam bar dari permulaan hingga akhir.Kemudian kita perlukan pembolehubah tinggi dan rendah tempatan serta jarak dalam bar dari setiap titik.//--- menjejaki zigzag
int wave_type=0; //--- jenis gelombang [0] tiada [1] atas [2] bawah
//--- harga dari gelombang (harga permulaan)
double wave_start_price=0.0;
//--- harga ke gelombang (harga akhir)
double wave_end_price=0.0;
//--- jarak dalam bar dari harga permulaan
int wave_start_distance=0;
//--- jarak dalam bar dari harga akhir
int wave_end_distance=0;
//--- menjejaki harga tinggi
double high_mem=0.0;
int distance_from_high=0;
//--- menjejaki harga rendah
double low_mem=0.0;
int distance_from_low=0;
//--- rolling atr
double rollingAtr=0.0;
int rollingAtrs=0;Akhir sekali, unit atr bergulir dan berapa banyak yang telah dikira.Kita kemudian buat fungsi untuk menetapkan semula 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;
}Ini adalah rutin biasa, isi array dengan nol dan set semula pembolehubah sistem.Ketika inisialisasi, kita sediakan buffer, plot, dan panggil reset untuk kali pertama: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();Jadi, mari kita teruskan kepada pengiraan.Perkara pertama yang perlu kita urus ialah rolling atr.Sehingga kita telah mengumpul lebih banyak bar daripada tempoh atr, kita tidak akan lakukan apa-apa lagi.Bahagian yang mengurus rolling atr adalah seperti berikut:jika kita belum mengumpulkan lebih daripada tempoh, teruskan menambah julat bar yang dijumpai ke dalam jumlahsebaik sahaja kita mencapai tempoh, kita lakukan pembahagian pertama (purata)selepas itu, kita potong satu bahagian dari rolling atr, iaitu atr/tempoh, dan kemudian tambah satu bahagian baharu yang merupakan julat bar/tempohKita letakkan bahagian terakhir dahulu kerana ia akan berlaku lebih kerap dan kita tidak perlu mengakses 2 pernyataan jika.//--- urus atr
rollingAtrs++;
if(rollingAtrs>rollingAtrPeriod){
double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod);
//--- kita mengeluarkan bahagian lama dan menambah bahagian baharu
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 saiz gelombang baharu adalah sah
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
//--- mula gelombang atas baharu
wave_type=1;
//--- harga permulaan adalah low mem
wave_start_price=low_mem;
wave_start_distance=distance_from_low;
//--- harga akhir adalah tahap tinggi baharu
wave_end_price=high[i];
wave_end_distance=0;
//--- lukis gelombang
dwWaves[i-wave_start_distance]=low_mem;
upWaves[i]=high[i];
//--- tukar tahap tinggi
high_mem=high[i];
distance_from_high=0;
//--- tukar tahap rendah
low_mem=low[i];
distance_from_low=0;
}
}
//--- jika kita memecahkan tahap rendah dan bukan tahap tinggi
else if(low[i]wave_end_price){
//--- keluarkan harga akhir sebelumnya dari kedudukan arraynya (0.0=kosong)
upWaves[i-wave_end_distance]=0.0;
//--- letakkan pada posisi baharu
upWaves[i]=high[i];
wave_end_price=high[i];
wave_end_distance=0;
//--- tukar tahap tinggi
high_mem=high[i];
distance_from_high=0;
//--- tukar tahap rendah
low_mem=low[i];
distance_from_low=0;
}
//--- semak untuk 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 saiz gelombang baharu adalah sah
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
//--- jika retracement signifikan, mula gelombang bawah
if(retraced>=retracement){
//--- mula gelombang bawah baharu
wave_type=-1;
//--- harga permulaan adalah high mem
wave_start_price=high[i-distance_from_high];
wave_start_distance=distance_from_high;
//--- harga akhir adalah tahap rendah baharu
wave_end_price=low[i];
wave_end_distance=0;
//--- lukis gelombang
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
//--- tukar tahap tinggi
high_mem=high[i];
distance_from_high=0;
//--- tukar tahap rendah
low_mem=low[i];
distance_from_low=0;
}
}
}
}
}
Kita lakukan sebaliknya apabila kita mempunyai gelombang bawah.Dan kita sudah selesai, zigzag retracement kita sudah siap.Inilah zigzag dengan 23.6% retracement dan 0.0 saiz minimum gelombang dalam unit atrDan inilah zigzag yang sama dengan 3 saiz minimum gelombang dalam unit atr
2025.03.03