การตั้งค่า
เราต้องการ:
- 1 แผนภาพ zigzag
- 2 บัฟเฟอร์ข้อมูลสำหรับจุดสูงและจุดต่ำ
- พารามิเตอร์การนำเข้า
- ชุดตัวแปรของระบบที่รีเซ็ตทุกครั้งที่ตัวบ่งชี้คำนวณใหม่
ตัวแปรระบบ:
เราต้องรู้ประเภทคลื่นล่าสุด จุดเริ่มต้น จุดสิ้นสุด และระยะห่างในบาร์ระหว่างจุดเริ่มต้นและจุดสิ้นสุด
#property indicator_buffers 2 #property indicator_plots 1 input double retracement=23.6; //จำนวนการย้อนกลับ input double minSizeInAtrUnits=0.0; //ขนาดขั้นต่ำของคลื่นในหน่วย ATR input int rollingAtrPeriod=14; //ระยะเวลาการคำนวณ ATR input color Color=clrDodgerBlue; //สีของคลื่น input int Width=3; //ความกว้างของคลื่น input ENUM_LINE_STYLE Style=STYLE_SOLID; //สไตล์ของคลื่น //--- เก็บข้อมูลคลื่นขึ้นและลง double upWaves[],dwWaves[];
อาร์เรย์ upWaves จะเก็บจุดสูงและอาร์เรย์ dwWaves จะเก็บจุดต่ำ
เราต้องสร้างฟังก์ชั่นรีเซ็ตระบบ:
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;
} มาต่อกันที่การคำนวณกันเถอะ
สิ่งแรกที่เราต้องจัดการคือ ATR ที่ไหลไป:
- หากเรายังไม่ได้เก็บข้อมูลมากกว่าระยะเวลาให้เพิ่มช่วงของบาร์ที่พบลงในผลรวม
- เมื่อเราถึงระยะเวลาแล้วทำการแบ่งครั้งแรก (เฉลี่ย)
//--- จัดการ ATR
rollingAtrs++;
if(rollingAtrs>rollingAtrPeriod){
double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod);
rollingAtr=(rollingAtr)-(rollingAtr/((double)rollingAtrPeriod))+new_portion;
}
else if(rollingAtrs<=rollingAtrPeriod){
rollingAtr+=(high[i]-low[i])/_Point;
if(rollingAtrs==rollingAtrPeriod){
rollingAtr/=((double)rollingAtrs);
high_mem=high[i];
low_mem=low[i];
distance_from_high=0;
distance_from_low=0;
}
} เยี่ยมไปเลย ตอนนี้เรามีอีกปัญหาหนึ่ง.
พื้นฐานของ zig zag นี้คือการย้อนกลับ
แต่สำหรับการย้อนกลับจะต้องมีคลื่นอย่างน้อยหนึ่งคลื่นก่อน
ดังนั้นเราจะทำการ:
- เมื่อ ATR ถูกเติมเต็ม (ATR ที่เก็บ = ระยะเวลา) เราจะจับจุดสูงและจุดต่ำในตัวแปรระบบของเรา
- ข้างใดที่สามารถสร้างคลื่นที่มีขนาดที่ถูกต้องในหน่วย ATR และสร้างจุดสูงใหม่ (คลื่นขึ้น) หรือจุดต่ำใหม่ (คลื่นลง) จะเป็นฝ่ายชนะ
if(!wave_type){
if(high[i]>high_mem&&low[i]>=low_mem){
double new_wave_size_in_atr_units=((high[i]-low_mem)/_Point)/rollingAtr;
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
wave_type=1;
wave_start_price=low_mem;
wave_start_distance=distance_from_low;
wave_end_price=high[i];
wave_end_distance=0;
dwWaves[i-wave_start_distance]=low_mem;
upWaves[i]=high[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
}
else if(low[i]=minSizeInAtrUnits){
wave_type=-1;
wave_start_price=high_mem;
wave_start_distance=distance_from_high;
wave_end_price=low[i];
wave_end_distance=0;
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
}
else if(low[i]high_mem){
high_mem=high[i];
low_mem=low[i];
distance_from_high=0;
distance_from_low=0;
}
} เมื่อเรามีคลื่นขึ้น:
- หากมีจุดสูงใหม่ ให้ย้าย zigzag จากตำแหน่งสูงก่อนหน้าไปยังตำแหน่งสูงใหม่
- หากมีจุดต่ำใหม่ หรือจุดต่ำใหม่ถูกตั้งค่า ให้คำนวณระยะห่างจากจุดสูงไปยังจุดต่ำแล้วแบ่งตามขนาดของคลื่น
นี่คือโค้ดที่เกี่ยวข้อง:
if(wave_type==1){
if(high[i]>wave_end_price){
upWaves[i-wave_end_distance]=0.0;
upWaves[i]=high[i];
wave_end_price=high[i];
wave_end_distance=0;
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
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;
if(new_wave_size_in_atr_units>=minSizeInAtrUnits){
if(retraced>=retracement){
wave_type=-1;
wave_start_price=high[i-distance_from_high];
wave_start_distance=distance_from_high;
wave_end_price=low[i];
wave_end_distance=0;
upWaves[i-wave_start_distance]=high_mem;
dwWaves[i]=low[i];
high_mem=high[i];
distance_from_high=0;
low_mem=low[i];
distance_from_low=0;
}
}
}
}
} และเราก็เสร็จสิ้นแล้ว zigzag กับ 23.6% การย้อนกลับและ 0.0 ขนาดขั้นต่ำของคลื่นในหน่วย ATR

และนี่คือ zigzag เดียวกันกับ 3 ขนาดขั้นต่ำของคลื่นในหน่วย ATR

โพสต์ที่เกี่ยวข้อง
- เครื่องมือ Open Range Breakout สำหรับ MetaTrader 5
- Volume Profile + Range v6.0: เครื่องมือวิเคราะห์การซื้อขายใน MetaTrader 5
- เครื่องมือแสดงความยาวของไส้เทียนใน MT5 สำหรับเทรดเดอร์
- ID Lite Info MA – ตัวช่วยวิเคราะห์ Moving Average สำหรับ MetaTrader 5
- การวิเคราะห์สเปกตรัมเดี่ยว: ตัวชี้วัดแนวโน้มสำหรับ MetaTrader 5