MQL5 Wizard ช่วยให้คุณสร้างโค้ดของ EA (Expert Advisor) ได้อย่างอัตโนมัติ ดูรายละเอียดเพิ่มเติมได้ที่ การสร้าง EA ที่พร้อมใช้งานใน MQL5 Wizard.
สัญญาณการซื้อขายของกลยุทธ์ที่อิงจากการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัว (Moving Averages) จะถูกพิจารณาใน MQL5 Wizard - สัญญาณการซื้อขายจากการตัดกันของค่าเฉลี่ยเคลื่อนที่ที่เรียบตามเวลาสองตัว. ค่าเฉลี่ยเคลื่อนที่จะมีประสิทธิภาพในช่วงที่มีแนวโน้ม ในกรณีอื่นๆ อาจให้สัญญาณที่ผิดพลาดมากมาย หนึ่งในวิธีการปรับปรุงกลยุทธ์นี้คือการใช้กรองเวลา (Time Filters) เช่น เปิดตำแหน่งใหม่เมื่อมีการซื้อขายในช่วงยุโรปของ FOREX.
ในที่นี้เราจะพิจารณากลยุทธ์ที่อิงจากการตัดกันของค่าเฉลี่ยเคลื่อนที่ที่เรียบสองตัว (Fast EMA และ Slow EMA) พร้อมกับกรองเวลาภายใน โดยกลยุทธ์นี้เรียกว่า "สัญญาณการซื้อขายจากการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลาภายใน" (เมื่อสร้าง EA โดยอัตโนมัติใน MQL5 Wizard).
สัญญาณการซื้อขาย:
- เปิดตำแหน่ง Long: Fast EMA ตัดขึ้นเหนือ Slow EMA และเงื่อนไขกรองเวลาภายในไม่เป็นที่พอใจ.
- เปิดตำแหน่ง Short: Fast EMA ตัดลงต่ำกว่า Slow EMA และเงื่อนไขกรองเวลาภายในไม่เป็นที่พอใจ.
กลยุทธ์นี้จะถูกนำไปใช้ในคลาส CSignal2EMA_ITF.
ระบบการซื้อขายนี้จะอิงจากคำสั่งที่รอดำเนินการ (Pending Orders) โดยระดับราคาจะถูกคำนวณขึ้นอยู่กับค่าของค่าเฉลี่ยเคลื่อนที่และหน่วย ATR (Average True Range).

รูปที่ 1 สัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลาภายใน
สัญญาณการซื้อขาย
กลยุทธ์การซื้อขายนี้จะถูกนำไปใช้ใน CSignal2EMA_ITF โดยมีวิธีการที่ถูกป้องกันเพื่อทำให้การเข้าถึงค่าตัวชี้วัดง่ายขึ้น:
double FastEMA(int ind) // คืนค่าของ Fast EMA ของแท่ง double SlowEMA(int ind) // คืนค่าของ Slow EMA ของแท่ง double StateFastEMA(int ind) // คืนค่าบวก/ลบถ้า Fast EMA เพิ่มขึ้น/ลดลง double StateSlowEMA(int ind) // คืนค่าบวก/ลบถ้า Slow EMA เพิ่มขึ้น/ลดลง double StateEMA(int ind) // คืนค่าความแตกต่างระหว่าง Fast และ Slow EMA double ATR(int ind) // คืนค่าของ ATR ของแท่ง
- Limit>0. จะเข้าซื้อในช่วงการเคลื่อนไหวเมื่อเกิดการหลุดพ้นที่ผิดพลาดจากค่าเฉลี่ยเคลื่อนที่ในราคาที่ดีกว่าราคาตลาด (Buy Limit และ Sell Limit จะถูกวางตามสัญญาณการซื้อขาย)
- Limit<0. จะเข้าซื้อในทิศทางการเคลื่อนไหวของราคา (Buy Stop และ Sell Stop จะถูกวางตามสัญญาณการซื้อขาย).
- Limit=0. ในกรณีนี้จะทำการซื้อขายโดยใช้ราคาตลาด.
1. เปิดตำแหน่ง Long
ระบบจะตรวจสอบเงื่อนไขในการเปิดตำแหน่ง Long: หากความแตกต่างระหว่าง Fast และ Slow EMA บนแท่งที่เสร็จสมบูรณ์ล่าสุดได้เปลี่ยนสัญญาณจาก "-" เป็น "+" (StateEMA(1)>0 && StateEMA(2)<0).
ถัดไปจะตรวจสอบเงื่อนไขกรองเวลาภายในโดยการเรียกใช้เมธอด CheckOpenLong() ของคลาส CSignalITF หากอนุญาตให้ทำการซื้อขาย ก็จะคำนวณระดับราคาพื้นฐาน (ค่าของค่าเฉลี่ยเคลื่อนที่) และค่าช่วง ATR ของแท่งที่เสร็จสมบูรณ์ล่าสุด.
ขึ้นอยู่กับสัญญาณของพารามิเตอร์ Limit ระบบจะวางคำสั่งซื้อ Pending Order คำสั่งซื้อ, Take Profit และ Stop Loss จะถูกคำนวณสัมพันธ์กับระดับราคาพื้นฐาน (ในหน่วย ATR). เวลาหมดอายุของคำสั่งจะถูกกำหนด (ในแท่ง) โดยพารามิเตอร์ Expiration.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการเปิดตำแหน่ง Long (ซื้อ) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. ปิดตำแหน่ง Long
ในกรณีนี้ฟังก์ชันที่ตรวจสอบเงื่อนไขในการปิดตำแหน่ง Long จะคืนค่าเป็น false เสมอ ซึ่งถือว่าตำแหน่ง Long จะถูกปิดโดย Take Profit หรือ Stop Loss. หากจำเป็น คุณสามารถเขียนโค้ดของคุณเองเพื่อใช้วิธีนี้.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปิดตำแหน่ง Long | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. เปิดตำแหน่ง Short
ระบบจะตรวจสอบเงื่อนไขในการเปิดตำแหน่ง Short: หากความแตกต่างระหว่าง Fast และ Slow EMA บนแท่งที่เสร็จสมบูรณ์ล่าสุดได้เปลี่ยนสัญญาณจาก "+" เป็น "-" (StateEMA(1)<0 && StateEMA(2)>0).
ถัดไปจะตรวจสอบเงื่อนไขกรองเวลาภายในโดยการเรียกใช้เมธอด CheckOpenLong() ของคลาส CSignalITF หากอนุญาตให้ทำการซื้อขาย ก็จะคำนวณระดับราคาพื้นฐาน (ค่าของค่าเฉลี่ยเคลื่อนที่) และค่าช่วง ATR ของแท่งที่เสร็จสมบูรณ์ล่าสุด.
ขึ้นอยู่กับสัญญาณของพารามิเตอร์ Limit ระบบจะวางคำสั่งขาย Pending Order คำสั่งซื้อ, Take Profit และ Stop Loss จะถูกคำนวณสัมพันธ์กับระดับราคาพื้นฐาน (ในหน่วย ATR). เวลาหมดอายุของคำสั่งจะถูกกำหนด (ในแท่ง) โดยพารามิเตอร์ Expiration.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการเปิดตำแหน่ง Short (ขาย) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. ปิดตำแหน่ง Short
ในกรณีนี้ฟังก์ชันที่ตรวจสอบเงื่อนไขในการปิดตำแหน่ง Short จะคืนค่าเป็น false เสมอ ซึ่งถือว่าตำแหน่งจะถูกปิดโดย Take Profit หรือ Stop Loss. หากจำเป็น คุณสามารถเขียนโค้ดของคุณเองเพื่อใช้วิธีนี้.
//+------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปิดตำแหน่ง Short | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. Trailing Stop ของคำสั่งซื้อ Pending Long
Expert Advisor จะติดตามคำสั่ง Pending ขึ้นอยู่กับค่าปัจจุบันของค่าเฉลี่ยเคลื่อนที่และ ATR.
//+--------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปรับคำสั่งซื้อ Pending Long | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- ตรวจสอบ if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. Trailing Stop ของคำสั่งซื้อ Pending Short
Expert Advisor จะติดตามคำสั่ง Pending ขึ้นอยู่กับค่าปัจจุบันของค่าเฉลี่ยเคลื่อนที่และ ATR.
คำสั่งจะถูกดำเนินการหากราคาตลาดถึงราคาคำสั่ง.
//+--------------------------------------------------------------------+ //| ตรวจสอบเงื่อนไขในการปรับคำสั่งซื้อ Pending Short | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- ตรวจสอบ if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
การสร้าง Expert Advisor ด้วย MQL5 Wizard
ในการสร้างหุ่นยนต์การซื้อขายตามกลยุทธ์นี้ คุณต้องเลือกคุณสมบัติของสัญญาณเป็น "สัญญาณการซื้อขายจากการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลาภายใน" ในตัวเลือก "การสร้าง Expert Advisors ที่พร้อมใช้งาน" ของ MQL5 Wizard:

รูปที่ 2 เลือก "สัญญาณการซื้อขายจากการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลาภายใน" ใน MQL5 Wizard
ถัดไปคุณต้องระบุ อัลกอริธึม Trailing Stop ที่จำเป็นและ ระบบการจัดการเงินและความเสี่ยง. โค้ดของ Expert Advisor จะถูกสร้างขึ้นโดยอัตโนมัติ คุณสามารถคอมไพล์และทดสอบใน Strategy Tester ของโปรแกรม MetaTrader 5.
ผลการทดสอบ
มาพิจารณาผลการทดสอบย้อนกลับของ Expert Advisor บนข้อมูลย้อนหลัง (EUenSD H1, ระยะเวลาในการทดสอบ: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
ในการสร้าง Expert Advisor เราใช้ปริมาตรคงที่ (Trading Fixed Lot, 0.1), ไม่ได้ใช้ Trailing Stop algorithm (Trailing not used).

รูปที่ 3 ผลการทดสอบของ Expert Advisor ที่มีสัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวโดยไม่ใช้กรอง ITF
เนื่องจากไม่ใช้กรองเวลาภายใน ทำให้เกิดสัญญาณที่ผิดพลาดมากมาย สัญญาณการซื้อขายสามารถปรับปรุงได้หากเราทำการวิเคราะห์ผลของการซื้อขายตามชั่วโมงการซื้อขาย.
ในกรณีของเรา พบว่าการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวให้สัญญาณที่ผิดพลาดมากมายตั้งแต่เวลา 6:00 จนถึง 23:59. เราสามารถกำหนดกรองเวลาภายในโดยตั้งค่าพารามิเตอร์กรอง.
ตัวอย่างเช่น เราสามารถกำหนดกรองเวลาให้เปิดตำแหน่งเฉพาะตั้งแต่ 0:00 ถึง 5:59. ซึ่งสามารถทำได้โดยตั้งค่าค่าของ BadHoursOfDay=16777152=111111111111111111000000b. ชั่วโมงการซื้อขายอื่นๆ จะถือว่าเป็น "ไม่ดี" ดังนั้นจึงควรห้ามเปิดตำแหน่งใหม่ตั้งแต่ 6:00 จนถึงสิ้นวัน.
หากเราตั้งค่าค่าของ BadHoursOfDay=16777152 เราจะกรองสัญญาณที่ผิดพลาดได้มากมาย:

รูปที่ 4 ผลการทดสอบของ Expert Advisor ที่มีสัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลา (BadHoursofDay=16777152)
CSignalITF มีฟีเจอร์การกรองเวลาอื่นๆ มากมาย (เพียงระบุ "นาทีดี" และ "นาทีไม่ดี" ในชั่วโมง, ชั่วโมงในวัน, วันในสัปดาห์).
แนบไฟล์: Signal2EMA-ITF.mqh ที่มีคลาส CSignal2EMA_ITF ต้องถูกวางใน terminal_data_folder\MQL5\Include\Expert\Signal โฟลเดอร์.
expert_2ema_itf.mq5 มีโค้ดของ Expert Advisor ที่สร้างขึ้นโดยใช้ MQL5 Wizard.
โพสต์ที่เกี่ยวข้อง
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: เทคนิค Hammer/Hanging Man และ CCI
- สร้าง EA บน MQL5 Wizard ด้วยสัญญาณการซื้อขายจากแท่งเทียน 3 Black Crows/3 White Soldiers + Stochastic
- สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: Bullish Harami/Bearish Harami + CCI
- สร้าง Expert Advisor ด้วย MQL5 Wizard สำหรับสัญญาณการเทรด Bullish Harami/Bearish Harami และ RSI