หน้าแรก ตัวชี้วัดทางเทคนิค โพสต์

Fibonacci ZigZag: เครื่องมือวิเคราะห์ตลาดสำหรับ MetaTrader 5

ไฟล์แนบ
56619.zip (2.54 KB, ดาวน์โหลด 0 ครั้ง)

การตั้งค่า

เราต้องการ:

  • 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;
}
}

เมื่อเรามีคลื่นขึ้น:

  1. หากมีจุดสูงใหม่ ให้ย้าย zigzag จากตำแหน่งสูงก่อนหน้าไปยังตำแหน่งสูงใหม่
  2. หากมีจุดต่ำใหม่ หรือจุดต่ำใหม่ถูกตั้งค่า ให้คำนวณระยะห่างจากจุดสูงไปยังจุดต่ำแล้วแบ่งตามขนาดของคลื่น

นี่คือโค้ดที่เกี่ยวข้อง:

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


โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)