MQL5 Wizard เป็นเครื่องมือที่ช่วยให้เราสามารถสร้างโค้ดของ EA (Expert Advisor) อัตโนมัติได้อย่างง่ายดาย หากใครสนใจรายละเอียดเพิ่มเติมสามารถดูได้ที่ การสร้าง EA ที่พร้อมใช้งานใน MQL5 Wizard.
ในบทความนี้เราจะพูดถึงกลยุทธ์ที่อิงจากการตัดกันของราคากับตัวบ่งชี้ค่าเฉลี่ยเคลื่อนที่ (Moving Average) ที่ได้รับการยืนยันจากตัวบ่งชี้ ADX (Average Directional Index) กลยุทธ์นี้เรียกว่า "สัญญาณจากการตัดกันของราคาและ MA ที่ได้รับการยืนยันโดย ADX" (เมื่อสร้าง EA อัตโนมัติใน MQL5 Wizard).
สัญญาณการซื้อขาย:
- ซื้อ: ราคาปิดของแท่งเทียนล่าสุดสูงกว่าค่าเฉลี่ยเคลื่อนที่ และค่าเฉลี่ยเคลื่อนที่เพิ่มขึ้นทั้งในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้.
- ขาย: ราคาปิดของแท่งเทียนล่าสุดต่ำกว่าค่าเฉลี่ยเคลื่อนที่ และค่าเฉลี่ยเคลื่อนที่ลดลงทั้งในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้.
- เพื่อกรองสัญญาณเท็จ จะมีการตรวจสอบพลังของแนวโน้ม (ADX>ADXmin) และทิศทางของแนวโน้มด้วยการใช้ Directional Movement Indexes (DI+ และ DI-).
กลยุทธ์นี้ถูกนำไปใช้งานในคลาส CSignalADX_MA (ต้องนำไปไว้ที่ terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

รูปที่ 1. สัญญาณการซื้อขายจากการตัดกันของราคาและค่าเฉลี่ยเคลื่อนที่
รายละเอียดสัญญาณการซื้อขาย
กลยุทธ์การเทรดนี้ถูกนำไปใช้งานในคลาส CSignalADX_MA ซึ่งมีเมธอดที่ป้องกันการเข้าถึงข้อมูลตัวบ่งชี้และราคาง่ายขึ้น:
double PlusADX(int ind) // คืนค่าของเส้น DI+ ของแท่งเทียน double MainADX(int ind) // คืนค่าของเส้นหลักของแท่งเทียน double MinusADX(int ind) // คืนค่าของเส้น DI- ของแท่งเทียน double EMA(int ind) // คืนค่าของค่าเฉลี่ยเคลื่อนที่ของแท่งเทียน double Close(int ind) // คืนค่าของราคาปิดของแท่งเทียน double StateADX(int ind) // คืนค่าความแตกต่างระหว่างเส้น DI+ และ DI- double StateEMA(int ind) // คืนค่าเป็นบวกถ้า EMA เพิ่มขึ้นและเป็นลบถ้า EMA ลดลง double StateClose(int ind) // คืนค่าความแตกต่างระหว่างราคาปิดและค่าเฉลี่ยเคลื่อนที่
1. เปิดตำแหน่งซื้อ (Long Position)
เงื่อนไขในการเปิดตำแหน่งซื้อ:
- StateEMA(0)<0 และ StateEMA(1)>0: ค่าเฉลี่ยเคลื่อนที่เพิ่มขึ้นในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้;
- StateClose(1)>0: ราคาปิดของแท่งเทียนล่าสุดสูงกว่าค่าเฉลี่ยเคลื่อนที่;
- MainADX(0)>minimum_ADX: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด (สำหรับตรวจสอบการมีแนวโน้ม);
- StateADX(0)>0: DI+ สูงกว่า DI- ของแท่งเทียนปัจจุบัน.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการเปิดตำแหน่งซื้อ (buy) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- condition 1: ค่าเฉลี่ยเคลื่อนที่เพิ่มขึ้นในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้ bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condition 2: ราคาปิดของแท่งเทียนล่าสุดสูงกว่าค่าเฉลี่ยเคลื่อนที่ bool Buy_Condition_2=(StateClose(1)>0); //--- condition 3: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4: ค่าของ DI+ สูงกว่า DI- ของแท่งเทียนปัจจุบัน bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- ตรวจสอบเงื่อนไขทั้งหมด return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. ปิดตำแหน่งซื้อ (Close Long Position)
เงื่อนไขในการปิดตำแหน่งซื้อ:
- StateEMA(0)<0 และ StateEMA(1)<0: ค่าเฉลี่ยเคลื่อนที่ลดลงในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้;
- StateClose(1)<0: ราคาปิดของแท่งเทียนล่าสุดต่ำกว่าค่าเฉลี่ยเคลื่อนที่;
- MainADX(0)>minimum_ADX: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด;
- StateADX(0)<0: DI- สูงกว่า DI+ ของแท่งเทียนปัจจุบัน.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปิดตำแหน่งซื้อ | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- condition 1: ค่าเฉลี่ยเคลื่อนที่ลดลงในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้ bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condition 2: ราคาปิดของแท่งเทียนล่าสุดต่ำกว่าค่าเฉลี่ยเคลื่อนที่ bool Sell_Condition_2=(StateClose(1)<0); //--- condition 3: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4: ค่าของ DI- ต่ำกว่า DI+ ของแท่งเทียนปัจจุบัน bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- ตรวจสอบเงื่อนไขทั้งหมด return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. เปิดตำแหน่งขาย (Short Position)
เงื่อนไขในการเปิดตำแหน่งขายจะเหมือนกับเงื่อนไขในการปิดตำแหน่งซื้อ.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการเปิดตำแหน่งขาย (sell) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- condition 1: ค่าเฉลี่ยเคลื่อนที่ลดลงในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้ bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condition 2: ราคาปิดของแท่งเทียนล่าสุดต่ำกว่าค่าเฉลี่ยเคลื่อนที่ bool Sell_Condition_2=(StateClose(1)<0); //--- condition 3: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4: ค่าของ DI- ต่ำกว่า DI- ของแท่งเทียนปัจจุบัน bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- ตรวจสอบเงื่อนไขทั้งหมด return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. ปิดตำแหน่งขาย (Close Short Position)
เงื่อนไขในการปิดตำแหน่งขายจะเหมือนกับเงื่อนไขในการเปิดตำแหน่งซื้อ.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปิดตำแหน่งขาย | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- condition 1: ค่าเฉลี่ยเคลื่อนที่เพิ่มขึ้นในแท่งเทียนปัจจุบันและแท่งเทียนก่อนหน้านี้ bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condition 2: ราคาปิดของแท่งเทียนล่าสุดสูงกว่าค่าเฉลี่ยเคลื่อนที่ bool Buy_Condition_2=(StateClose(1)>0); //--- condition 3: ค่าของ ADX ในแท่งเทียนปัจจุบันสูงกว่าค่าที่กำหนด bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4: ค่าของ DI+ สูงกว่า DI- ของแท่งเทียนปัจจุบัน bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- ตรวจสอบเงื่อนไขทั้งหมด return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
การสร้าง Expert Advisor โดยใช้ MQL5 Wizard
ในการสร้างหุ่นยนต์เทรดตามกลยุทธ์นี้ คุณต้องเลือกคุณสมบัติของสัญญาณเป็น "สัญญาณจากการตัดกันของราคาและ MA ที่ได้รับการยืนยันโดย ADX" ในตัวเลือก MQL5 Wizard:

รูปที่ 2. เลือก "สัญญาณจากการตัดกันของราคาและ MA ที่ได้รับการยืนยันโดย ADX" ใน MQL5 Wizard
จากนั้นคุณต้องระบุอัลกอริธึม trailing stop ที่ต้องการ และระบบ การจัดการเงินและความเสี่ยง โค้ดของ Expert Advisor จะถูกสร้างขึ้นโดยอัตโนมัติ คุณสามารถคอมไพล์และทดสอบใน Strategy Tester ของ MetaTrader 5.
ผลการทดสอบ
มาดูการทดสอบย้อนกลับของ Expert Advisor บนข้อมูลย้อนหลัง (EURUSD H1, ช่วงเวลาทดสอบ: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).
ในการสร้าง Expert Advisor เราใช้ปริมาณคงที่ (Trading Fixed Lot, 0.1) และไม่ได้ใช้ Algorithm Trailing Stop (Trailing not used).

รูปที่ 3. ผลการทดสอบย้อนหลังของ Expert Advisor ตามแนวทางการตัดกันของราคาและ MA ที่ได้รับการยืนยันโดย ADX
ไฟล์แนบ: ไฟล์ SignalADX-MA.mqh ที่มีคลาส CSignalADX_MA ต้องถูกวางไว้ที่ terminal_data_folder\MQL5\Include\Expert\Signal\.
ไฟล์ ma_crossover_adx.mq5 มีโค้ดของ Expert Advisor ที่สร้างขึ้นโดยใช้ MQL5 Wizard.
โพสต์ที่เกี่ยวข้อง
- สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: การใช้ EMA และกรองเวลาภายใน
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- ใช้ MQL5 Wizard สร้าง Expert Advisor ด้วยสัญญาณเทรด Morning/Evening Stars + Stochastic
- การสร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณการเทรดจาก Morning/Evening Stars + RSI
- MQL5 Wizard: สร้างสัญญาณเทรดจาก Bullish Harami/Bearish Harami + Stochastic สำหรับ MetaTrader 5