ตอนที่ 4 : เขียน Expert Advisor ให้ซื้อขายตาม Indicator “Moving Average”
อ่านบทความ 3 Simple Moving Average ETF Trading Strategies แล้วลองมาเขียน EA ทดสอบกัน
จะเห็นว่าในบทความ (updated วันที่ 18 ธันวาคม 2560) จะมีกลยุทธ์ซื้อขายที่ใช้ค่าเฉลี่ยเคลื่อนที่ (Moving Average) ทั้งหมด 3 แบบ คือ
1. แบบที่ 1 : Golden Cross = 50-day crosses above the 200-day SMA
2. แบบที่ 2 : 10-30 Crossover = the 10-day crossing above the 30-day SMA
3. แบบที่ 3 : 5-10-20 Crossover = 5-day, 10-day, and 20-day SMA are all moving in the same direction
ดังนั้นเราลองนำกลยุทธ์ที่ 1 มาหัดเขียนกันนะครับ
กำหนดให้
- เปิด Long หรือเปิด Short รวมกัน ได้ครั้งละ 1 สัญญา (Maximum contract = 1)
- Logic ซื้อ เมื่อเส้นค่าเฉลี่ย 50 > 200 และ ปิดสัญญา เมื่อเส้นค่าเฉลี่ย 50 < 200
- Logic ขาย เมื่อเส้นค่าเฉลี่ย 50 < 200 และ ปิดสัญญา เมื่อเส้นค่าเฉลี่ย 50 > 200
- สามารถนำไปประยุกต์ได้กับ TimeFrame ใดๆบน MT4 Chart // นำไปวางบน Chart ไหนก็ทำงานกับสินค้าใน Chart นั้น
- ตัวแปร เมื่อเส้นค่าเฉลี่ยเส้นสั้น (50) และค่าเฉลี่ยเส้นยาว (200) สามารถเปลี่ยนแปลงได้ (ทำเผื่อไว้ สำหรับทดสอบ Optimize)
ลองวาด Flow Chart กันคร่าวๆ
แต่ะละ Block ของ Flow Chart เริ่มเขียน Header และประกาศค่าตัวแปร
ประกาศตัวแปร แต่ละตัวและให้แก้ไขได้ตอนนำ EA มาทำงาน
ก่อนอ่านค่าตัวแปร
extern คือ ตัวแปรที่มี extern นำหน้าสามารถรับค่าจาก Users เพื่อแก้ไขได้ทุกครั้งที่นำ EA มาทำงาน [อ้างอิง]
int คือตัวแปรชนิด integer เป็น ตัวเลขจำนวนเต็ม [อ้างอิง]
string คือตัวแปรชนิด string เป็น ตัวอักษรประเภท Text [อ้างอิง]
สำหรับค่าตัวแปรแบบอื่นๆ กดดูได้ที่นี่
ทีนี้ลองฝึกอ่านทีละบรรทัด
extern int MagicNumber= 100; คือการ ประกาศค่าตัวแปร MagicNumber เพื่อนำไปใช้งานในฟังก์ชั่นการส่งคำสั่ง OrderSend()
extern int Lots = 1; คือการ ประกาศค่าตัวแปร จำนวนสัญญา เพื่อนำไปใช้งานในฟังก์ชั่นการส่งคำสั่ง OrderSend()
extern string mycmt = “MyMA” ; คือการ ประกาศค่าตัวแปรสำหรับ ค่า Comment เพื่อนำไปใช้งานในฟังก์ชั่นการส่งคำสั่ง OrderSend()
extern int ShortMA = 50 ; คือการ ประกาศค่าตัวแปรให้กับ ค่า MA เส้นสั้น
extern int LongMA = 200 ; คือการ ประกาศค่าตัวแปรให้กับ ค่า MA เส้นยาว
เขียนโปรแกรมต่อจาก Flow ที่เขียนไว้ โดย Map ระหว่าง Flow และ Code ให้ดูดังนี้
มาดูความหมายกันในแต่ละบรรทัด
void OnTick() // ฟังก์ชั่น OnTick จะทำงานเมื่อมี Event การเปลี่ยนแปลงของราคา { if(Bars<100 || IsTradeAllowed()==false) // ถ้าบน Chart มีข้อมูล < 100 แท่งและ ไม่ได้มีการ Enable AutoTrade ก็จะไม่ทำงาน if(CountOrders()==0) CheckForOpen(); // ถ้าเรียกฟังก์ชั่น CountOrders แล้วไม่มีสัญญาถูกเปิดอยู่ ให้เรียกฟังก์ชั่น CheckForOpen() } |
ฟังก์ชั่น CountOrder
ฟังก์ชั้นนี้ใช้สำหรับนับ Order ทั้งหมดที่ถูกเปิดอยู่ ลองแกะดูนะครับ https://docs.mql4.com ช่วยคุณได้
คุณสามารถก๊อปปี้ไปใช้กับโค้ดอื่นๆ ที่คุณเขียนขึ้นมาเองได้
int CountOrders() { int res=0; for(int i=0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS ,MODE_TRADES); if (OrderMagicNumber()==MagicNumber) res++; } |
โค้ดในส่วนของการตรวจสอบเงื่อนไข ในการส่งคำสั่ง เปิด Order
ฟังก์ชั่น CheckForOpen มีฟังก์ชั่นย่อยที่ควรทราบดังนี้
OrderSend = เราได้เรียนรู้กันไปแล้วใน ตอนที่ 3 : เริ่มเขียน Script ตัวแรก
iMA = ฟังก์ชั่นสำหรับคำนวณค่าเฉลี่ยเคลื่อนที่ ดูรายละเอียดได้ที่ https://docs.mql4.com/indicators/ima
รายละเอียดของค่า input ของฟังก์ชั่น iMA
double iMA( string symbol, // symbol int timeframe, // timeframe int ma_period, // MA averaging period int ma_shift, // MA shift int ma_method, // averaging method int applied_price, // applied price int shift // shift ); |
Flow ในส่วนของการตรวจสอบเงื่อนไข ในการส่งคำสั่งเปิด Order
โค้ดในส่วนของการตรวจสอบเงื่อนไข ในการส่งคำสั่ง ปิด Order
ลองกดโปรแกรมไปดูเป็นตัวอย่างได้ที่นี่ครับ [Download] # โค้ดสำหรับใช้เพื่อการศึกษาเท่านั้น #
ขั้นตอนการนำโค้ดที่ดาวน์โหลดไปทดลองที่เครื่องตัวเอง
1. เปิดโปรแกรม MetaEditor จากนั้นกดปุ่ม New ด้านซ้ายมือ
2. เลือก Expert Advisor (template) จากนั้นกด Next
3.ใส่ชื่อ Name = MAstrategies จากนั้นกด Next
4. กด Next
5. กด Finish
6. ในขั้นตอนนี้เราก็จะได้ EA Template มาเรียบร้อยแล้ว
7. จากนั้น Clear ข้อความทั้งหมด โดยการกด CTRL-A และกดปุ่ม Delete (ทั้งหน้า จะว่างทั้งหมด)
8.วาง Code ที่ดาวน์โหลดจาก [Download] ไปวางได้ดังนี้ # โค้ดสำหรับใช้เพื่อการศึกษาเท่านั้น #
9. กด Compile ไม่พบ Error แสดงว่าโปรแกรมสามารถนำไปทดสอบรันได้
ต่อไปลองนำโค้ดที่เราเขียน มาลอง Backtest กัน
1. เราจะลองนำ Expert Advisor ของเราที่ใช้กลยุทธ์ Golden Cross = 50-day crosses above the 200-day SMA มาทดสอบกับข้อมูลย้อนหลังของ SET50 Index Future ดังนั้นก่อนอื่นต้องเพิ่ม Symbol “S50IF_CON” เข้าไปใน Market Watch ก่อนดังรูป
2. เปิด Tester โดยกดเมนู View -> Strategy Tester หรือกด Ctrl-R
ตั้งค่าพารามิเตอร์ดังรูป
Expert Advisor = MAstrategies.ex4
Symbol = S50IF_CON
Model = Every tick
Period = Daily
Spread = Current
3. จากนั้นกดปุ่ม Expert properties และตั้งค่าดังรูป และกดปุ่ม OK
Initial deposit = 100000 อย่าลืมเปลี่ยนจาก USD เป็น THB
Positions = Long & Short
4. กดปุ่ม Start ด้านขวาล่าง เพื่อเริ่มรันทดสอบ จากนั้นรอประมาณ 5 นาที
5. เมื่อแถบสถานะขึ้นเต็มตามรูปข้างล่างแล้ว พอร์ตทดสอบถือเป็นอันเสร็จสิ้น คราวนี้มาดูผลการทดสอบกัน
6. ที่ Tab “Results” จะแสดง transaction ที่มีการซื้อขายตั้งแต่เริ่ม จนถึงสิ้นสุด สามารถเลือก scroll bar เพื่อดู Order ย้อนหลังได้
7. Tab “Graph” จะแสดงยอด Balance ในพอร์ต ทั้งหมด
8. Tab “Report” จะแสดงค่าทางสถิติต่างๆ เพื่อใช้ในการปรับปรุงพัฒนาต่อไป
9. Tab “Journal” แสดง Log ของการรันทดสอบซื้อขาย
10. หากต้องการ Save รายงานออกมาเพื่อเก็บไว้ หรือพิมพ์ สามารถไปที่ Tab “Result” คลิ๊กขวา และเลือก “Save As Report”
11. ไฟล์ Report จะเป็นไฟล์ HTML ซึ่งเปิดได้ด้วยเว็บบราวเซอร์ทั่วไปดังรูป
ว้าวผลการทดสอบใช้ได้เลย บทความต่อๆ ไปจะมาบอกวิธีการอ่าน Strategy Tester Report กันนะครับ
ลองมาลองปรับพารามิเตอร์ด้วยการ Optimization กัน
หลังจากที่เราได้ทดสอบค่า MA 50 ตัด MA 200 ไปแล้ว คราวนี้คุณอยากรู้ไหมครับ ว่าใน Symbol ดังกล่าว และข้อมูลราคาในช่วงดังกล่าว (สภาพตลาด) ควรใช้ MA เส้นยาวเท่าไหร่ดี เพื่อให้เหมาะกับ MA 50 โดยมีโจทย์ว่าได้กำไรมากที่สุด (จริงๆ วิธีนี้ไม่ถูกต้องเสียทีเดียวครับ เพราะเราต้องดูปัจจัยอย่างอื่นประกอบกันหลายๆอย่างด้วย แต่ในที่นี้ ก็ตั้งโจทย์แบบนี้ไปก่อน)
1. ที่ Tester กด Expert Properties
2. ปรับค่า LongMA ให้ Start = 100 , Step = 10, Stop = 300 ดังรูป จากนั้นกดปุ่ม OK
3. ที่ Model เลือกเป็น Control Point จากนั้นกดปุ่ม Start
4. รอจนผลการทดสอบ สำเร็จ สังเกตุจากแถบสถานะสีน้ำเงิน
5. กดที่ Tab “Optimization Results” จากนั้นที่คอลัมพ์ Profit เพื่อเรียงลำดับ กำไรมากที่สุด ขึ้นมาก่อน เราจะเห็นว่า ค่า LongMA ที่ต่างกันจะให้ผลกำไรที่ต่างกัน
6. กดตรง Optimization Graph เราจะเห็นการแสดงผลทดสอบแบบ Graph
7. กลับมาที่ Tab “Result” คลิ๊กขวาที่ Record แรกจากนั้นเลือก “Set Input Parameter” เพื่อนำค่านี้ไปใช้ทดสอบ Back Test อีกครั้ง
8. จากรูปจะเห็นว่า Value ของ LongMA เปลี่ยนเป็น 210 จากนั้นกดปุ่ม OK
จากนั้นนำมาทำการ Backtest อีกครั้งก็จะได้ผลการทดสอบที่ดีกว่าค่า LongMA 200 ครับ
การนำ Expert Advisor มาซื้อขายแบบอัตโนมัติ
หากเราได้ทดสอบและปรับปรุงโรบอทของเราเรียบร้อยแล้ว ก็ถึงเวลาที่จะเอามาใช้งานกันจริง ก็มีขั้นตอนไม่ยากครับ ดังนี้
1. ที่ MT4 Terminal Navigator ให้ขยายกล่อง “Expert Advisors” ดังรูป จากนั้นลากไปยัง Chart ที่ต้องการเทรด
2. โปรแกรมจะมี Pop-up Windows ให้มีการยืนยันหรือเราสามารถแก้ไขค่าพารามิเตอร์ต่างๆ โดยเลือก Tab “Inputs” จากนั้นกดปุ่ม OK
3. ยืนยันว่าโรบอทของเราได้ทำงานแล้ว โดยการเห็น ไอคอนหน้ายิ้ม แสดงว่า โรบอทของเรากำลังทำงานอยู่ครับ แต่ถ้าพบไอคอนหน้าบึ้ง ก็ดูวิธีการแก้ไขในขั้นตอนที่ 4,5,6
4. ตรวจสอบว่าปุ่ม AutoTrading ได้ถูก Enable อยู่ ตามรูปข้างล่าง
5. ที่ Option -> Expert Advisors ให้เลือก “Allow automated trading”
6. คลิ๊กขวาที่ Chart ที่เพิ่งลากโรบอทไปวางจากนั้นคลิ๊กขวาและเลือก Expert Advisors -> Properties (หรือกด F7) ให้ตรวจสอบว่าในเฟรม “Live Trading” ได้เลือก Allow live trading ดังรูป
7. ถ้าโรบอทของเราทำงานก็จะมี Order เกิดขึ้นบน Terminal ครับ
ถ้า งง ว่าทำไมพอร์ตของผมเงินเยอะจัง อันนี้เป็นพอร์ต Demo ครับคุณก็สามารถมีไว้ใช้ได้งานฟรีๆ เหมือนกัน [กดสมัครที่นี่]
เย้ .. ฉันสามารถเขียนโรบอทตัวแรกได้แล้ว อย่าลืมหาความรู้เพิ่มเติม เพื่อฝึกฝนฝีมือนะครับ .. นี่เป็นแค่ก้าวแรกๆ เท่านั้น
ถ้าอยากจะลองฝึกฝีมือ ลองฝึกเขียนโรบอท Moving Average แบบที่ 2,3 ที่เหลือเลยครับ
2. แบบที่ 2 : 10-30 Crossover = the 10-day crossing above the 30-day SMA # อันนี้ปรับพารามิเตอร์แล้วทดสอบได้เลย
3. แบบที่ 3 : 5-10-20 Crossover = 5-day, 10-day, and 20-day SMA are all moving in the same direction
สรุป :
จากเนื้อหาทั้งหมดในตอนนี้ก็จะได้เร่ิมเล่าตั้งแต่
- การเข้าไปศึกษากลยุทธ์การเทรด ในที่นี้เราก็นำตัวอย่างง่ายๆ มาให้ดูกันคือการใช้ค่าเฉลี่ยเคลื่อนที่ 2 เส้นมาตัดกัน เพื่อหาจุดซื้อ และจุดขาย
- เขียน Flow Chart
- นำ Flow Chart มาเขียนเป็น MQL4 Code
- การ Compile ไฟล์ .MQ4 เป็น .EX4
- ตัวอย่าง การ Backtesting ด้วยข้อมูลย้อนหลัง
- ตัวอย่าง การ Optimization ค่าพารามิเตอร์ เพื่อเปรียบเทียบผลลัพธ์ของ LongMA ค่าต่างๆ
- การนำ EA ไปใช้งานจริง บน MT4 Terminal
นี่เป็นตัวอย่างเบื้องต้น เพื่อเป็นพื้นฐาน สำหรับการพัฒนาระบบในขั้นสูงต่อไปนะครับ
# โค้ดและผลลัพธ์ข้างต้น ใช้เพื่อการศึกษาเท่านั้นนะครับ #