ในกรอบของมาสเตอร์คลาส “การเขียนโปรแกรมสำหรับตลาดฟอเร็กซ์”
ในการเทรดประจำวัน นักเทรดส่วนใหญ่ต้องเผชิญกับโปรแกรมต่างๆ ที่พัฒนาขึ้นสำหรับเทอร์มินัล MetaTrader 4 เป็นประจำ สคริปต์, อินดิเคเตอร์, และ เอ็กซ์เปิร์ต แอดไวเซอร์ (Expert Advisor) – เป้าหมายหลักคือช่วยตัดสินใจเปิดหรือปิดออเดอร์ (หรือทำให้กระบวนการเป็นอัตโนมัติโดยสมบูรณ์) 90% ของเวลา โปรแกรมเหล่านี้ทำงานได้ตามปกติและเป็นที่พอใจของผู้ใช้ ทว่าในอีก 10% ที่เหลือ มักเกิดสถานการณ์ที่โปรแกรมไม่สามารถสะท้อนสภาพตลาดได้ครบถ้วน ณ จุดนี้ ความต้องการที่จะปรับปรุง (หรือกล่าวให้ชัดคือ “เพิ่มประสิทธิภาพ”) จะผุดขึ้นมาอย่างหลีกเลี่ยงไม่ได้ เช่น เพิ่มเงื่อนไขเข้า-ออกตำแหน่ง ปรับพฤติกรรมเล็กน้อย หรือเพียงแสดงข้อความเตือน นี่คือตัวอย่างส่วนหนึ่งของการแก้ไขเล็กๆ น้อยๆ จำนวนมากที่บางครั้งเราอยากทำ (หรือจำเป็นต้องทำ)
เรื่องไม่ยากอย่างที่คิด
อย่างไรก็ตาม นักเทรดส่วนใหญ่ไม่มีความรู้ด้านการเขียนโปรแกรมเลย บ่อยครั้งพวกเขามองว่าเป็นทักษะที่ยากเกินเอื้อม ต้องใช้แรงและทุนมหาศาลในการเรียนรู้ แต่ผลตอบแทนอาจไม่คุ้มค่า สุดท้ายจึงจำต้อง จ้างโปรแกรมเมอร์ภายนอก (ซึ่งแน่นอนว่าต้องเสียเงิน) หรือพึ่งพาฟอรัม (ซึ่งนักพัฒนามือใหม่มักไม่ใช่การแก้ไขที่ถูกต้อง แต่กลับใส่โค้ด “แก้ขัด” เข้าไป ซึ่งท้ายที่สุดอาจนำไปสู่การล้างพอร์ต) หรือเลิกล้มความคิดที่จะปรับเปลี่ยนใดๆ ไปเลย
เอาล่ะ ผมจะไม่พยายามเปลี่ยนความคิดคุณ ขอพูดตรงๆ ว่า โดยรวมแล้ว การเขียนโปรแกรมเป็นศาสตร์ที่ซับซ้อน และการสร้างซอฟต์แวร์ระดับ MS Word หรือยิ่งกว่านั้นคือ MS Windows เป็นงานหนักสำหรับทีมพัฒนาขนาดใหญ่ที่ต้องใช้เวลาและบุคลากรผู้เชี่ยวชาญจำนวนมาก ทว่า โปรแกรมส่วนใหญ่สำหรับ MT4 ไม่ได้ซับซ้อนขนาดนั้น และบุคคลเดียว แม้จะเป็นมือใหม่ ก็สามารถทำความเข้าใจได้
สำหรับการพัฒนาโปรแกรมบนเทอร์มินัล MetaTrader 4 เราใช้เครื่องมือที่เรียกว่า โปรแกรมแก้ไขโค้ด MetaEditor คุณสามารถเรียกใช้งานได้ทั้งจากโฟลเดอร์ติดตั้งเทอร์มินัล หรือคลิกไอคอนรูปสี่เหลี่ยมข้าวหลามตัดสีเหลืองที่มีเครื่องหมายตกใจ (!) บนแถบเครื่องมือของ MetaTrader 4 เพื่อสื่อสารกับคอมพิวเตอร์ (นั่นคือ เขียนโปรแกรม) เราใช้ภาษาเฉพาะทางที่เรียกว่า ภาษาโปรแกรม ซึ่งในกรณีของ MetaTrader 4 คือ MQL4 นี่เป็นภาษาเชิงฟังก์ชันที่คล้ายภาษาซี (C-like functional language) แบบคอมไพล์
ลองเจาะลึกความหมายของคำเหล่านี้กันสักนิด “คล้ายภาษาซี” หมายถึงมีโครงสร้างใกล้เคียงกับภาษา C (อย่าสับสนกับ C++) ซึ่งพัฒนาโดย Dennis Ritchie และ Ken Thompson ระหว่างปี 1969–1973 อย่างไรก็ตาม สำหรับผู้เริ่มต้น นี่เป็นเพียงเกร็ดความรู้มากกว่าคำแนะนำปฏิบัติ “เชิงฟังก์ชัน” หมายถึง หลักการพื้นฐานคือการใช้ฟังก์ชันในการแบ่งงานออกเป็นส่วนย่อยๆ ผ่านโครงสร้างภาษาที่เรียกว่า “ฟังก์ชัน” แต่เราจะไม่ลงลึกเรื่องนี้ในบทความนี้
คำว่า “แบบคอมไพล์” น่าจะสำคัญที่สุดสำหรับเรา หมายถึงหลังจากเขียนโปรแกรมเสร็จ ก่อนรันต้องทำการ “คอมไพล์” นั่นคือ แปลงซอร์สโค้ดให้เป็นไฟล์โปรแกรม (.ex4) ที่เครื่องสามารถทำงานได้ โดยใช้คำสั่ง “Compile” ในเมนู “File” ของ MetaEditor (หรือกดปุ่มลัด F5)
แม้ว่า ภาษา MQL4 จะค่อนข้างเรียบง่าย แต่ก็ไม่สามารถอธิบายความสามารถทั้งหมดได้ในบทความเดียว เราจะมุ่งเน้นที่แนวคิดและพื้นฐานที่สำคัญที่สุด ส่วนรายละเอียดอื่นๆ ขอฝากให้ผู้อ่านศึกษาเพิ่มเติมเอง
ก้าวสำคัญสู่ความเข้าใจโปรแกรม MQL4
สมมติว่าเรามีโปรแกรมที่ต้องการปรับแต่ง มือไม้เริ่มคันอยากลงมือทำ แล้วควรเริ่มจากไหน?
ขั้นแรก ต้องมั่นใจว่าโปรแกรมนั้นมี ซอร์สโค้ด (source code) โปรแกรมหลายตัวที่ดาวน์โหลดจากอินเทอร์เน็ตมักมาเป็นไฟล์สำเร็จรูป (หลังคอมไพล์แล้ว) ซึ่งมีนามสกุล .ex4 การปรับแต่งไฟล์ประเภทนี้เป็นไปไม่ได้ ไฟล์ซอร์สโค้ดจะมีนามสกุล .mq4 และส่วนใหญ่สามารถหาได้จากอินเทอร์เน็ต คำค้นหาแนะนำ คือ “ชื่อโปรแกรม + source code”, “ชื่อโปรแกรม + sources”, หรือ “ชื่อโปรแกรม + mq4”
สำหรับโปรแกรมที่มาพร้อมกับชุดติดตั้ง MT4 ตั้งแต่ต้น ซอร์สโค้ดจะมีให้พร้อมใช้งานในโฟลเดอร์ย่อยภายในไดเรกทอรีติดตั้ง
หลังจากดาวน์โหลดไฟล์ซอร์สโค้ดแล้ว ต้องวางไว้ใน โฟลเดอร์ที่ถูกต้อง มิฉะนั้นเทอร์มินัลจะไม่โหลดไฟล์นั้น เอ็กซ์เปิร์ต แอดไวเซอร์ ต้องอยู่ในโฟลเดอร์ experts, สคริปต์อยู่ในโฟลเดอร์ experts\scripts, และ อินดิเคเตอร์ อยู่ในโฟลเดอร์ experts\indicators โฟลเดอร์ experts ตั้งอยู่ในไดเรกทอรีติดตั้งของเทอร์มินัลลูกค้า
เมื่อวางไฟล์ถูกที่แล้ว ลองเปิดใน MetaEditor และคอมไพล์ หากทุกอย่างเรียบร้อย โปรแกรมที่คอมไพล์แล้วจะ ถูกเพิ่มเข้าสู่เทอร์มินัลลูกค้าของคุณโดยอัตโนมัติ และปรากฏให้เห็น เช่น ในหน้าต่าง “Navigator” (นำวิเกเตอร์)
ข้อควรระวัง! เพื่อหลีกเลี่ยงความซ้ำซ้อนหรือปัญหาชื่อไฟล์ชนกัน แนะนำให้เปลี่ยนชื่อไฟล์ซอร์สโค้ดโดยเติมคำว่า “My” ไว้ด้านหน้า เช่น เปลี่ยน “MovingAverage.mq4” เป็น “MyMovingAverage.mq4”
หากการคอมไพล์ล้มเหลว จะมีข้อความแจ้งเตือนปรากฏในแท็บ “Errors” ในหน้าต่าง “Toolbox” ของ MetaEditor ข้อความผิดพลาด (หรือหลายข้อ) จะเป็นภาษาอังกฤษ พร้อมระบุบรรทัดที่เกิดปัญหา
เมื่อรันและยืนยันว่าทำงานถูกต้อง ก็ถึงขั้นตอนที่ยากที่สุด… ไม่ใช่การแก้โค้ด แต่คือ การเข้าใจลอจิกการทำงานของโปรแกรมอย่างถ่องแท้ คุณต้องเข้าใจอย่างชัดเจนว่าโปรแกรมทำงานบนหลักการใด ทำอะไร และมีขั้นตอนหลักอะไรบ้าง
เช่น หากพูดถึง MACD ขั้นตอนหลักคือการคำนวณค่าเฉลี่ยเคลื่อนที่ระยะยาว ค่าเฉลี่ยเคลื่อนที่ระยะสั้น และการสร้างเส้นสัญญาณ คุณต้องเข้าใจอย่างแจ่มแจ้งว่าแต่ละขั้นตอนเกิดขึ้นอย่างไร
การค้นหาข้อมูลเพิ่มเติมด้วยคำค้น “ชื่อโปรแกรม + algorithm” จะช่วยได้มาก
การเข้าใจอัลกอริทึมคือหนึ่งในก้าวที่สำคัญที่สุดสู่ความเข้าใจโปรแกรม!
โครงสร้างของสคริปต์ อินดิเคเตอร์ และเอ็กซ์เปิร์ต แอดไวเซอร์ ในภาษา MQL4
หลังจากเข้าใจอัลกอริทึมแล้ว ภารกิจถัดไปคือ จับคู่คำอธิบายเชิงตรรกะกับโค้ดจริง ซึ่งจำเป็นต้องมีความรู้เบื้องต้นเกี่ยวกับโครงสร้างโปรแกรม นี่คือสิ่งที่เราจะพูดถึงในส่วนนี้
MT4 มีโปรแกรม 3 ประเภท ได้แก่ เอ็กซ์เปิร์ต แอดไวเซอร์, อินดิเคเตอร์ และสคริปต์ โครงสร้างที่ง่ายที่สุดคือ สคริปต์ ซึ่งมีส่วนประกาศคุณสมบัติ (Properties/Header) ตามด้วยฟังก์ชัน start รูปแบบในโค้ดเป็นดังนี้:
int start()
{
คำสั่งต่างๆ อยู่ที่นี่
}
เมื่อรันสคริปต์ ส่วนหัวจะถูกเริ่มต้น จากนั้นเรียกฟังก์ชัน start เริ่มประมวลผลคำสั่งทีละบรรทัดตั้งแต่หลังวงเล็บปีกกาเปิด จนถึงวงเล็บปีกกาปิด (หรือจนเจอคำสั่ง return(…))
เอ็กซ์เปิร์ต แอดไวเซอร์และอินดิเคเตอร์มีโครงสร้างซับซ้อนกว่าเล็กน้อย โดยมี 3 ฟังก์ชันหลัก คือ init, deinit และ start รูปแบบเหมือนฟังก์ชัน start ของสคริปต์ แต่การทำงานต่างกัน ฟังก์ชัน init ถูกเรียกเมื่อแนบโปรแกรมกับกราฟ ใช้สำหรับกำหนดค่าเริ่มต้น (Initialization) จากนั้นเรียกฟังก์ชัน start ซึ่งจะถูกเรียกทุกครั้งที่มีการรับทิกใหม่ ทำให้สามารถ อัปเดตอินดิเคเตอร์และเอ็กซ์เปิร์ต แอดไวเซอร์แบบไดนามิก ได้ เมื่อถอดโปรแกรมออกจากกราฟ จะเรียกฟังก์ชัน deinit เพื่อเคลียร์ค่าหรือปิดการทำงาน (Deinitialization) ข้อควรระวัง! ฟังก์ชัน init และ/หรือ deinit อาจไม่มีในโปรแกรมก็ได้ ในกรณีนั้นถือว่าไม่มีการดำเนินการใดๆ
ดังนั้น โครงสร้างโปรแกรมจึงเริ่มมีรูปร่างชัดเจนขึ้น
คอมเมนต์ – สัญญาณของโปรแกรมเมอร์มืออาชีพ
ในบทความนี้ ขอกล่าวถึงอีกประเด็นหนึ่ง ในซอร์สโค้ดที่ดีที่เขียนโดยโปรแกรมเมอร์ฝีมือดี จะมี องค์ประกอบพิเศษที่ช่วยให้เข้าใจหน้าที่ของแต่ละส่วนของโค้ด เรียกว่า “คอมเมนต์ (Comments)” ซึ่งมี 2 รูปแบบ:
1). “//” – เครื่องหมายทับคู่ (//) ทุกสิ่งหลังเครื่องหมายนี้จนถึงจบบรรทัดถือเป็นคอมเมนต์
2) “/*” และ “*/” – ทุกสิ่งระหว่างสัญลักษณ์นี้ถือเป็นคอมเมนต์ ซึ่งสามารถเขียนได้หลายบรรทัด
ตัวอย่าง:
// คอมเมนต์บรรทัดเดียว
/* คอมเมนต์หลายบรรทัด
ซึ่งสามารถเขียนได้หลายบรรทัด */
ในโค้ด คอมเมนต์มักแสดงเป็นสีเทา
คอมเมนต์สามารถเป็นข้อความใดๆ ก็ได้ เพราะไม่ถูกคอมไพล์และไม่รวมอยู่ในไฟล์โปรแกรมผลลัพธ์ ทว่า การมีคอมเมนต์ที่เหมาะสมช่วยให้อ่านและเข้าใจโปรแกรมได้ง่ายขึ้นเสมอ คุณจะพบว่าคอมเมนต์เพียงไม่กี่บรรทัดอาจประหยัดเวลาได้หลายชั่วโมงจากการพยายามตีความว่า “โค้ดนี้ทำอะไร?”
ดังนั้น กฎข้อที่ 1: เมื่อจะเริ่มปรับแต่งโปรแกรม อย่าขี้เกียจ ใส่คอมเมนต์อธิบายสิ่งที่คุณต้องการทำจริงๆ ซึ่งจะช่วยให้การทำงานกับโปรแกรมนั้นง่ายขึ้นอย่างมาก!
ใน นิตยสารฉบับถัดไป เราจะเริ่มเจาะลึกพื้นฐานของภาษาโปรแกรม MQL4 ห้ามพลาด!