【MQL5パラダイス 第7回】มาคุยกับอินดicator! อ่านค่าเส้นค่าเฉลี่ยเคลื่อนที่เพื่อกำหนดแนวโน้ม~บทนำสู่ MQL5
สวัสดีทุกคน ผมชื่อ Pineapple
ในรอบที่แล้วรอบที่ 6 เราได้เรียนรู้เกี่ยวกับ「OnTick(オンティック)」เกี่ยวกับวิธีที่โปรแกรมจะทำงานทุกครั้งที่ราคาสั่นไหว เพื่อสร้างรากฐานของหุ่นยนต์เทรดอัตโนมัติที่ทำงานตลอด 24 ชั่วโมงใช่ไหมล่ะ
อย่างไรก็ตาม EA ในปัจจุบันของเราเห็นได้แค่「ราคาปัจจุบัน」เท่านั้น ในการเทรดจริงๆ จะมีการวิเคราะห์สภาวะตลาดด้วย “เส้นค่าเฉลี่ยเคลื่อนที่ (MA)” ที่อ่านจากค่าเฉลี่ยราคาที่ผ่านมา หรือ “RSI” ที่ใช้ตัดสินว่าซื้อมากเกินไปหรือขายมากเกินไป ซึ่งเป็นอินดิเคเตอร์ใช้งานเพื่อวิเคราะห์สถานการณ์ของตลาดใช่ไหมล่ะ
ดังนั้นในครั้งนี้ เราจะมาพูดถึง「วิธีการอ่านค่าของอินดิเคเตอร์ภายในโปรแกรม」เกี่ยวกับการทำให้ EA มี „ดวงตาใหม่” อย่างอินดิเคเตอร์ เพื่อกลายร่างจากผู้เฝ้าดูราคาธรรมดา ไปเป็นเทรดเดอร์ที่วิเคราะห์สภาวะตลาดได้อย่างมีประสิทธิภาพ
มีแนวคิดใหม่เล็กน้อยเกิดขึ้น แต่เราจะอธิบายอย่างช้าๆ เข้าใจง่ายๆ ค่อยๆ อ่านพร้อมกับกาแฟแก้วโปรดนะครับ
อินดิเคเตอร์ของ MQL5 เป็น「การจองร้านอาหาร」
สำหรับผู้ที่เคยเขียนโปรแกรมบน MT4 (MQL4) มาก่อน อาจมีความสับสนเล็กน้อยตรงนี้ บน MT4 หากต้องการค่าอินดิเคเตอร์ ก็แค่เขียนฟังก์ชันบอกไปว่า「บอกฉันค่า Moving Average ตอนนี้เลย」แล้วค่าก็จะ返กลับมาได้ทันที
แต่บน MQL5 สถานการณ์เปลี่ยนไปเล็กน้อย การรับอินดิเคเตอร์ใน MQL5 ต้องทำตามกฎที่จะต้องผ่านขั้นตอนสองขั้นตอนอย่าง「การจองร้านอาหาร」แบบสองขั้นตอน
ทำไมถึงทำให้ยุ่งยากนะ? เพราะต้องการให้「ความเร็วและความเบา」ในการทำงานเกิดขึ้นถ้าทุกครั้งที่ Tick (การเปลี่ยนแปลงราคา) กำลังโหลดอินดิเคเตอร์ตั้งแต่ศูนย์ จะทำให้สมองของคอมพิวเตอร์ทำงานหนักจนพังได้
จดจำสองขั้นตอน
- จอง (การรับ handles)เริ่มด้วยการบอก MT5 ว่า「ฉันจะใช้ค่า MA ระยะ 14」 และReservation Ticket (Handle)รับมา
- รับค่า (คัดลอกบัฟเฟอร์)ทุกครั้งที่ราคาขยับ ก็จะเรียกดู Reservation Ticket นี้แล้วขอ「ค่าล่าสุด」และใส่ไว้ในกล่องที่เตรียมไว้
มาสร้างกรอบใหม่「OnInit」เพื่อจองไว้ก่อน
การจองร้านอาหารต้องทำไว้ก่อนมื้ออาหารจริงใช่ไหม ในโปรแกรมก็เช่นกัน ก่อนจะเกิดการเปลี่ยนแปลงราคาตลอด OnTick (OnTick) จะช้าเกินไป ควรจองตั้งแต่ต้นเมื่อวาง EA บนกราฟ เพื่อจองเพียงครั้งเดียว
จึงมีกรอบOnInit(オンイニット)ที่เข้ามาในบทบาทนี้ (Init ย่อมาจาก Initialization=การเริ่มต้น)
เมื่อสร้างไฟล์ EA ใหม่ใน MetaEditor จริงๆ แล้วOnTickจะอยู่ด้านบน และมีบล็อกOnInitที่ถูกเตรียมไว้ตั้งแต่เริ่มต้น ที่นี่จะมี「เมื่อ EA ถูกติดตั้งบนกราฟ ให้รันการเตรียมการเพียงครั้งเดียว」ให้เขียนลงไป นี่คือจุดที่เหมาะแก่การจองอินดิเคเตอร์จริงๆ
เตรียม “กล่องลักษณะแถวของข้อมูล” ที่จะใส่ข้อมูลหลายชุด
ยังมีสิ่งที่เตรียมอีกชื่อหนึ่ง อินดิเคเตอร์มีค่าเป็น「ค่าแท่งเทียนปัจจุบัน」「ค่าแท่งเทียนก่อนหน้า」「สองแท่งก่อนหน้า…」และมีข้อมูลหลายชุดเก็บไว้ใช่ไหม
เพื่อรับข้อมูลเหล่านี้ ไม่พอที่จะใช้ “กล่องข้อมูลที่มีข้อมูลเพียงช่องเดียว” อย่างที่ได้เรียนในรอบที่ 3 ต้องมีหลายกล่องเรียงกันเป็น「คอลัมน์กล่อง (อาเรย์: ไฟลื้อเล็ก)」จำเป็นต้องเตรียมไว้
ใน MQL5 ชื่อของตัวแปรตามด้วย[] (วงเล็บสี่เหลี่ยม) เพื่อสร้าง「คอลัมน์กล่อง」นี้
double ma_values[];
ด้วยการเขียนแบบนี้ เราก็ได้「คอลัมน์กล่องสำหรับรับค่า MA จำนวนมาก」พร้อมใช้งานแล้ว
ลองเขียนโปรแกรมอ่านอินดิเคเตอร์จริงๆ กันเลย
อธิบายยืดยาวไปหน่อย แต่ดูตัวอย่างจริงกันเลย ในครั้งนี้จะสร้าง EA ที่ตรวจสอบว่าปัจจุบันราคาสูงกว่า SMA ระยะ 14 หรือไม่ และถ้าต่ำกว่าจะพิมพ์ผล
กรุณาใส่โค้ดด้านล่างลงไป
//+------------------------------------------------------------------+
//| My_MA_Cross.mq5 |
//+------------------------------------------------------------------+
// 1. เตรียม「กล่อง」และ「คอลัมน์กล่อง」ใช้งานทั่วทั้งโปรแกรม
int ma_handle; // กล่องสำหรับ Reservation Ticket (handle)
double ma_values[]; // คอลัมน์กล่องสำหรับรับค่า MA
//+------------------------------------------------------------------+
//| งานเตรียมเมื่อ EA เข้ากราฟ (รันเพียงครั้งเดียว) |
//+------------------------------------------------------------------+
int OnInit()
{
// 2. ได้รับ Reservation Ticket สำหรับค่า SMA ระยะ 14
ma_handle = iMA(_Symbol, PERIOD_CURRENT, 14, 0, MODE_SMA, PRICE_CLOSE);
// 3. จัดเรียงคอลัมน์ให้ใหม่เป็น「ล่าสุดจากขวาไปซ้าย」
ArraySetAsSeries(ma_values, true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ใครอ่านค่าเมื่อ Tick ทุกครั้ง: ส่วนหัวใจ |
//+------------------------------------------------------------------+
void OnTick()
{
// 4. ใช้ Reservation Ticket เพื่อรับค่า MA ล่าสุด 3 ค่า (ปัจจุบัน, ก่อนหน้า, ก่อนหน้าอีก)
if(CopyBuffer(ma_handle, 0, 0, 3, ma_values) <= 0) return;
// 5. ดึงราคาปัจจุบัน (Bid)
double current_price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 6. เปรียบเทียบราคาปัจจุบับกับ MA (ma_values[0] คือค่าล่าสุด)
if(current_price > ma_values[0])
{
Print("ราคาปัจจุบัน (", current_price, ") สูงกว่า MA (", ma_values[0], ") แข็งแรงขึ้น!");
}
else if(current_price < ma_values[0])
{
Print("ราคาปัจจุบัน (", current_price, ") ต่ำกว่า MA (", ma_values[0], ") ใจอ่อน!");
}
}
วิธีอ่านโค้ดตัวอย่าง
เป็นยังไงบ้างครับ? ถ้าอ่านเป็นขั้นตอนจะไม่ยากอย่างที่คิด
- ขั้นตอนที่ 2: ได้รับ Reservation Ticket (iMA)
iMAเป็นฟังก์ชันที่ใช้จองค่า MA ในเครื่อง คำในวงเล็บจะประกอบด้วย คู่สกุลเงิน, กรอบเวลา, ช่วงระยะเวลา (14), ชนิดการแสดง (SMA), ค่าใช้ราคาที่ใช้ (PRICE_CLOSE) และค่ากำหนดอื่นๆ ตามที่เราใช้บนกราฟ - ขั้นตอนที่ 3: ไม้ยมล่องข้อมูล (ArraySetAsSeries)เป็น「มหัศจรรย์」ของ MQL5 ที่สำคัญมาก ปกติแล้วอาร์เรย์ในโปรแกรมจะบรรจุข้อมูลจากเก่าที่สุดไปใหม่ แต่เราต้องการข้อมูลล่าสุดใช่ไหม นี่คือการตั้งค่าทำให้ ma_values[0] คือค่าใหม่ล่าสุด
ArraySetAsSeriesกับค่าtrueจะสลับลำดับกล่อง ทำให้「ma_values[0]คือแท่งล่าสุด」「ma_values[1]คือแท่งก่อนหน้า」ลำดับที่เข้าใจได้ง่ายมาก - ขั้นตอนที่ 4: รับค่า (CopyBuffer)
OnTickในส่วนนี้CopyBufferเป็นฟังก์ชันที่ใช้รับข้อมูลma_handle)」ใช้เพื่อดูตำแหน่งที่ใหม่ที่สุด (03
หลังจากนั้นจะเป็นบทเรียนที่เคยเรียนมาก่อนหน้าอย่างif 文 ออกมาทั้งหมด เปรียบเทียบราคาปัจจุบัน (current_price) กับค่า MA ล่าสุด (ma_values[0]) เพื่อพิมพ์ว่าเป็นแนวโน้มแข็งแกร่งหรืออ่อนแอ
คอมไพล์แล้วตั้ง EA บนกราฟ แล้วดู log ใน Expert tab ซักหน่อย ราคาจะอธิบายสถานการณ์ตลาดด้วย MA และราคาปัจจุบันอย่างต่อเนื่องครับ
เรียบง่ายแต่แม่นยำในการตัดสินใจ
เมื่อสามารถดึงอินดิเคเตอร์ด้วยโปรแกรมได้ หลายคนอาจอยากใช้ง indicators มากมายร่วมกัน เช่น Moving Average, RSI, MACD, Bollinger Bands ฯลฯ
เข้าใจความรู้สึกนะครับ ฉันเองก็เคยทำ EA ที่อินดิเคเตอร์เยอะจนกราฟแท่งเทียนไม่เห็นเลย (หัวเราะ)
แต่ยิ่งมีอินดิเคเตอร์มาก ความเงื่อนไขในการเข้าตลาดจะยากขึ้น และจำนวนการเข้าเทรดจะลดลงอย่างมาก และจะได้ EA ที่ผ่านการปรับแต่งจนเกินไป (curve fitting) ซึ่งมีปัญหาในการใช้งานจริง
อนาคตของตลาดไม่ใช่รูปแบบเดิมเสมอไปการเทรดที่เรียบง่ายและแข็งแกร่งถ้าเป้าหมายคือระบบที่มั่นคง ลองเริ่มจากแนวโน้มง่ายๆ ด้วย “เส้นค่าเฉลี่ยเคลื่อนที่ 1 เส้น” ก่อนเป็นสิ่งที่แนะนำอย่างยิ่ง
แนวคิดที่ใส่ลงในโปรแกรมนี้คือ「ราคาต่างจาก MA ขึ้นหรือลง」เป็นข้อเท็จจริงที่ทรงพลังที่สุดในการดูแนวโน้มตลาด ไม่ใช่สมการคำนวณที่ซับซ้อน ลองถือพื้นฐานนี้ไว้ เพราะเป็นรากฐานของระบบที่อยู่รอดในระยะยาว
ก่อนอื่นให้ฟังเสียงจากอินดิเคเตอร์เพียงตัวเดียวอย่างใจเย็นนะครับ
สรุป
ครั้งนี้เราใช้OnInitและCopyBufferเพื่ออ่านค่า MA และตัดสินแนวโน้มตลาด
การรับค่าปัจจุบัน, การตัดสินด้วย if และการวิเคราะห์ด้วยอินดิเคเตอร์ ทั้งหมดนี้รวมกันแล้ว ทำให้ „หัวคิด” ของ EA ของคุณมีฟังก์ชันเหมือนเทรดเดอร์มืออาชีพแล้ว
สิ่งที่ยังขาดอีกอย่างเดียวคือ การกระทำจริงในการสั่งซื้อ (Enter) ครับ!ครั้งหน้าจะทำให้ EA ของเราได้กดปุ่มสั่งซื้อ MT5 ด้วยกันนะครับ แม้บางคนอาจบอกว่าการสั่งซื้อด้วย MQL5 ยาก ขอให้มั่นใจ เพราะเราจะอธิบายวิธีใช้งานอย่างเข้าใจง่ายกับผู้เริ่มต้น โดยมีผู้ช่วยที่แข็งแกร่งอย่าง “CTrade” ที่ช่วยให้สั่งซื้อได้อย่างปลอดภัยและง่าย
โปรแกรมที่คุณสร้างจะถือ pos ตามเจตนาของคุณ ความรู้สึกนั้นกำลังใกล้เข้ามาอยู่แล้ว!
แล้วพบกันในครั้งต่อไปของ「MQL5パラダイス」 ผมขอให้การวิเคราะห์ EA ของคุณสามารถจับทิศทางแนวโน้มที่ยอดเยี่ยมไว้ได้ ด้วยความหวังสูง Pineapple บอกลา!”