หน้าแรก การเทรดด้วยระบบ โพสต์

สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: การใช้ EMA และกรองเวลาภายใน

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

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 สัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลาภายใน

รูปที่ 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 ที่กำหนด หากเปลี่ยนสัญญาณจะมีกรณีแตกต่างกัน:

  1. Limit>0. จะเข้าซื้อในช่วงการเคลื่อนไหวเมื่อเกิดการหลุดพ้นที่ผิดพลาดจากค่าเฉลี่ยเคลื่อนที่ในราคาที่ดีกว่าราคาตลาด (Buy Limit และ Sell Limit จะถูกวางตามสัญญาณการซื้อขาย)
  2. Limit<0. จะเข้าซื้อในทิศทางการเคลื่อนไหวของราคา (Buy Stop และ Sell Stop จะถูกวางตามสัญญาณการซื้อขาย).
  3. 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 เลือก

รูปที่ 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

รูปที่ 3 ผลการทดสอบของ Expert Advisor ที่มีสัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวโดยไม่ใช้กรอง ITF

เนื่องจากไม่ใช้กรองเวลาภายใน ทำให้เกิดสัญญาณที่ผิดพลาดมากมาย สัญญาณการซื้อขายสามารถปรับปรุงได้หากเราทำการวิเคราะห์ผลของการซื้อขายตามชั่วโมงการซื้อขาย.

ในกรณีของเรา พบว่าการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวให้สัญญาณที่ผิดพลาดมากมายตั้งแต่เวลา 6:00 จนถึง 23:59. เราสามารถกำหนดกรองเวลาภายในโดยตั้งค่าพารามิเตอร์กรอง.

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

หากเราตั้งค่าค่าของ BadHoursOfDay=16777152 เราจะกรองสัญญาณที่ผิดพลาดได้มากมาย:

รูปที่ 4 ผลการทดสอบของ Expert Advisor ที่มีสัญญาณการซื้อขายตามการตัดกันของค่าเฉลี่ยเคลื่อนที่สองตัวพร้อมกรองเวลา (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.


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

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