【MQL5パラダイス 第4回】ให้ EA ตัดสินใจ! นำทางเส้นทางที่ตลาดแตกหักด้วยคำสั่ง if
สวัสดีทุกคน ผมคือ Pineapple
ในการ回 第3 ครั้งก่อน เราได้พูดถึงกล่องวิเศษที่ใช้เก็บข้อมูล ชื่อ “ตัวแปร”int(จำนวนเต็ม)หรือdouble(ทศนิยม)เป็นกล่องที่เราใส่ราคาหรือจำนวนล็อตแล้วเก็บไว้ใช่ไหมนะ แล้วคุณลองแก้ตัวเลขด้วยตนเองและแสดงด้วยฟังก์ชัน Print ไหม ทำได้ไหม?
ตอนนี้ เรายังมีการใส่ข้อมูลไว้ในกล่องได้ แต่โปรแกรมของเราก็ยังเป็นแค่ “ผู้บันทึก” หาก EA (โปรแกรมซื้อขายอัตโนมัติ) จะต่อสู้กับตลาดให้คุณ มันจำเป็นต้องมีสมองที่สามารถตัดสินใจจากข้อมูลเหล่านั้น「สถานการณ์ถูกวิเคราะห์และตัดสินใจอย่างมีเหตุผล」จำเป็นอย่างยิ่ง
ครั้งนี้ เราจะเข้าสู่ความงดงามสูงสุดของการเขียนโปรแกรม「เงื่อนไขแบบ if (if statement)」หากจำได้เมื่อ覚えれば โปรแกรมของคุณจะเริ่มก้าวแรกในการรับมือกับคลื่นราคาตามกฎที่คุณกำหนดไว้ จิบกาแฟขณะอ่านเพื่อผ่อนคลายไปด้วยนะ
สอนโปรแกรมให้รู้จัก “ถ้า-แล้ว”
ชีวิตประจำวันของเราเป็นการเรียงลำดับเงื่อนไขเสมอ “ถ้าฝนตกก็เอาร่มไปด้วย” “ถ้ากาแฟเย็นก็อุ่นด้วยไมโครเวฟ” “ถ้ากระเป๋าสตางค์เหลือแค่พันเยน ก็ให้กินข้าวหน้าเนื้อ”
การเทรด FX ก็เช่นเดียวกัน “ถ้าราคาปัจจุบันสูงกว่าเส้นค่าเฉลี่ยเคลื่อนที่ ให้ซื้อ” “ถ้าขาดทุนรวมเกิน 5,000 เยน ก็หยุดการขาดทุน”
この「もし〇〇なら、△△をする」ไวยากรณ์เพื่อสอน MT5 เรื่องนี้คือ「if(イフ)文」เป็นภาษาอังกฤษว่า if (ถ้าหาก…) ซึ่งตรงไปตรงมาจึงเข้าใจง่าย
วิธีเขียนพื้นฐานใน MQL5 จะเป็นดังนี้
if (条件式)
{
// 条件を満たしたときに、実行したい処理をここに書く
}
ง่ายมากใช่ไหม()ในวงเล็บนี้คือ “เงื่อนไข” และเมื่อเงื่อนไขผ่าน จะดำเนินการภายในวงเล็บคู่ {} เท่านั้น หากไม่ผ่าน เฉพาะไปที่ภายในวงเล็บจะถูกละไว้{}หากเงื่อนไขไม่ผ่าน เนื้อหาภายในวงเล็บจะถูกละเว้น
จำแนกสัญลักษณ์เปรียบเทียบ (Operator) กัน
เพื่อสร้าง “เงื่อนไข” เราต้องมีสัญลักษณ์เปรียบเทียบระหว่างตัวเลขสองค่า ซึ่งเป็นสัญลักษณ์ที่เราใช้บ่อยใน MQL5 (เรียกว่าเปรียบเทียบโอเปอเรเตอร์) มีหกข้อหลักดังนี้
A > B: A มากกว่า Bใหญ่กว่าA < B: A น้อยกว่า Bเล็กกว่าA >= B: A มากกว่าเท่า Bมากกว่า or เท่ากับ(มากกว่าหรือเท่ากับ)A <= B: A น้อยกว่าเท่า Bน้อยกว่าหรือเท่ากับ(เท่ากับหรือน้อยกว่า)A == B: A และ B เหมือนกันอย่างสิ้นเชิงทั้งหมดเหมือนกัน(注意! เรียง two equals)A != B: A กับ Bไม่เหมือนกัน(ไม่เท่ากัน)
มีจุดที่ผู้เริ่มต้นเขียนโปรแกรมมักสับสนมากที่สุด อยู่ตรงที่“การแสดงค่าเท่ากัน”=ถูกซ้อนด้วย==แล้วเขียนว่าคือ
ครั้งก่อน ตอนใส่ข้อมูลให้ตัวแปร เราเขียนdouble my_lot = 0.1;ใช่ไหม ในโลกการเขียนโปรแกรม สัญลักษณ์เดียวกัน=หมายถึง“ใส่สิ่งด้านขวามาใส่ในกล่องด้านซ้าย (การกำหนดค่า)”จึงเป็นความหมาย
ดังนั้น เพื่อเปรียบเทียบว่าซ้ายและขวาเท่ากันหรือไม่ จึงต้องเขียนซ้ำด้วย==สองตัวติดกัน ตามกฎนี้ จดไว้ในใจนะ
ลองเขียนสคริปต์ที่ใช้ if จริงๆ
ดังนั้น เราจะรวมกันระหว่าง “ตัวแปร” ที่เรียนมาก่อนหน้า กับ “if statement” ที่เรียนมาเพื่อเขียนสคริปต์ที่ใช้งานจริง
ครั้งนี้ เราจะเปรียบเทียบ “ราคาปัจจุบัน” กับ “ราคาของเส้นค่าเฉลี่ยเคลื่อนที่” เพื่อให้ MT5 ตัดสินใจมองแนวซื้อหรือแนวขาย (※ยังไม่ได้เรียนวิธีรับราคแบบเรียลไทม์จริงๆ ดังนั้นจะใส่ตัวเลขสมมติในตัวแปรเพื่อทดสอบดู)
เปิด MetaEditor สร้างสคริปต์ใหม่ แล้วเขียนโค้ดด้านล่างลงไป
void OnStart()
{
// 1. ใส่ราคาสมมติลงในตัวแปร
double current_price = 150.50; // ราคาปัจจุบัน (สมมติ)
double ma_price = 150.00; // ราคาของเส้นค่าเฉลี่ยเคลื่อนที่ (สมมติ)
Print("【กำลังเริ่มการตัดสินใจสภาพตลาด】");
// 2. ถ้าปัจจุบราคาสูงกว่าเส้นค่าเฉลี่ย
if (current_price > ma_price)
{
Print("ราคาปัจจุบัน(", current_price, ")อยู่เหนือเส้นค่าเฉลี่ย。");
Print("แนวโน้มขึ้นมา! พิจารณาซื้อได้เลย。");
}
// 3. หรือถ้าราคาต่ำกว่าเส้นค่าเฉลี่ย
else if (current_price < ma_price)
{
Print("ราคาปัจจุบัน(", current_price, ")อยู่ต่ำกว่าเส้นค่าเฉลี่ย。");
Print("แนวโน้มลงมา! พิจารณากาารขายได้เลย。");
}
// 4. ถ้าไม่ใช่ทั้งสองกรณี
else
{
Print("ราคากับเส้นค่าเฉลี่ยเคลื่อนที่เท่ากันทั้งหมด มาเฝ้าดูสถานการณ์ต่อไป。");
}
}
คำอธิบายตัวอย่างโค้ด
เป็นยังไงบ้าง โค้ดยาวขึ้นนิดหน่อยแต่สิ่งที่ทำก็เรียบง่ายมาก
ในส่วนแรกcurrent_price(ราคาปัจจุบัน)ให้150.50ใส่ไว้ในma_price(ราคาของเส้นค่าเฉลี่ย)ให้150.00แล้ว
ส่วนกลางเป็นจุดที่ if เริ่มทำงาน「else(エルス)」มาพร้อมความหมายว่า “ไม่ใช่กรณีนั้น”
if (current_price > ma_price)จุดผ่านแรก 150.50 > 150.00 ดังนั้นเงื่อนไขนี้ผ่าน (true) แล้วelse if (current_price < ma_price)กรณีที่เงื่อนไขแรกไม่ผ่าน แล้วเงื่อนไขนี้ล่ะเป็นอย่างไร? จะไม่ถูกเรียกใช้งานในกรณีนี้เพราะเงื่อนไขแรกผ่านไปแล้วelseกรณีอื่นๆ ที่ไม่ตรงกับเงื่อนไขด้านบน จะถูกดำเนินการ
เมื่อคอมไพล์และรันใน MT5 ในแท็บ Expert จะเห็นข้อความว่า “พิจารณาซื้อ”
ลองเปลี่ยนค่าของตัวแปร current_price เป็น 149.00 แล้วคอมไพล์และรันใหม่ คราวนี้จะเห็นข้อความเปลี่ยนเป็น “พิจารณาขาย” อย่างแน่นอน
โปรแกรมเปรียบเทียบตัวเลขด้วยตนเองและแสดงข้อความตามสถานการณ์ ถือเป็นการตัดสินใจจริงๆ
การใช้งาน if มากเกินไปอาจนำไปสู่กับดัก “curve fitting”
เมื่อจำคำสั่ง if ได้ โปรแกรมจะทำให้โปรแกรมมีการตัดสินใจที่ซับซ้อนมากขึ้น ซึ่งอันตรายมักเกิดขึ้นจากกับดักที่เรียกว่า「การปรับให้เข้ากับข้อมูลด้วย if มากเกินไป (overfitting)」
เมื่อทำ backtest ด้วยข้อมูลในอดีต จะมีช่วงที่ขาดทุนมาก โดยการใช้ if ซ้ำๆ จะทำให้ลบผลขาดทุนนั้นได้ง่าย
“ถ้าถึงวันอังคารบ่ายสาม เศษการค้าไม่ทำ” “ถ้าหางแท่งเทียนก่อนหน้าเกิน 15 pips ก็เลี่ยงการเข้า” “ถ้า RSI อยู่ระหว่าง 55-60 ก็พักไว้”
ด้วยการเพิ่มเงื่อนไข-หาผลลัพธ์ที่ไม่ดีจากกราฟในอดีต จะทำให้กราฟ backtest พุ่งขึ้นไปในทางที่ดีขึ้น
แต่โค้ดดังกล่าวอาจกลายเป็น spaghetti ที่ซับซ้อน เนื่องจาก if ซ้อนกันหลายชั้น
และเมื่อขับเคลื่อนไขที่ถูกปรับให้เข้ากับอดีต ตัว EA จะใช้งานไม่ได้ในตลาดจริง ทำให้เงินทุนลดลง เพราะตลาดไม่เหมือนกับอดีตเสมอไป
「การเทรดที่เรียบง่ายและมั่นคง」นี่คือหลักการของผม
ระบบที่แข็งแรงจริงๆ จะมี if น้อยมาก “ถ้า MA ชี้ขึ้น ให้ซื้อ” “ถ้าแนวขวางไปกว่านี้ ให้ทำกำไร” เพียงเงื่อนไขง่ายๆ เหล่านี้ (if) ก็พอ แล้ว EA จะสามารถปรับตัวกับการเปลี่ยนแปลงของตลาดได้ระยะยาว
if เป็นฟังก์ชันที่มีประโยชน์มาก แต่ควรใช้อย่างระมัดระวัง “เงื่อนไขนี้แท้จริงคือแก่นแท้ของตลาด หรือเป็นการตีความจากอดีตอย่างเดียว?” ทุกครั้งที่คุณเพิ่ม if ในโค้ดให้หยุดคิดสักครู่ถามตัวเองด้วย
สรุป
ครั้งนี้เราได้เรียนรู้ about if เพื่อให้โปรแกรมมีการตัดสินใจ เปรียบเทียบค่าตัวแปรและทำงานแตกต่างกันตามผลลัพธ์ หากทำได้ ก็เหมือนว่า “สมองของระบบอัตโนมัติ” ได้ครึ่งหนึ่งของงานสำเร็จแล้ว
อย่างไรก็ตาม ในตัวอย่าง code นี้ เราใส่ราคาลงในตัวแปรด้วยการ hard-code ด้วยมือเอง ในการซื้อขายจริง ควรได้รับราคาจริงแบบเรียลไทม์จาก MT5
ดังนั้น ครั้งต่อไป「วิธีรับราคาปัจจุบันจาก MT5 (Bid・Ask)」เราจะเรียนรู้กัน ถึงตอนนี้ โปรแกรมของคุณจะเชื่อมต่อกับตลาดจริงๆ ได้ เมื่อได้ราคาจริงมาแล้วจะใช้ if เพื่อการตัดสินใจ การพัฒนา EA จะยิ่งมีความสมจริงมากขึ้น
ไม่ต้องกดดัน ค่อยๆ ทำทีละขั้นตอน แล้วพบกันในครั้งต่อไปของ “MQL5 Paradise” ขอให้การเทรดของคุณเต็มไปด้วยการตัดสินใจที่ยอดเยี่ยม Pineapple ครับ