MetaTrader5
สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: การใช้ EMA และกรองเวลาภายใน
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. การกรองสัญญาณที่อิงจากช่วงเวลาที่กำหนดจะถูกนำไปใช้ในคลาส CSignalITF โดยในตัวอย่างการใช้งาน เราจะพิจารณาคลาส CSignal2EMA_ITF (ซึ่งมีวัตถุของ CSignalITF อยู่). ระบบการซื้อขายนี้จะอิงจากคำสั่งที่รอดำเนินการ (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 ที่กำหนด หากเปลี่ยนสัญญาณจะมีกรณีแตกต่างกัน: 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 ขึ้นอยู่กับสัญญาณการซื้อขาย หากคำสั่งถูกวางสำเร็จ ระบบจะติดตามคำสั่ง Pending ตามค่าเฉลี่ยเคลื่อนที่ คำสั่งจะถูกดำเนินการหากราคาตลาดถึงราคาคำสั่ง. //+--------------------------------------------------------------------+
//| ตรวจสอบเงื่อนไขในการปรับคำสั่งซื้อ 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.
2011.01.13