ZigZag Indicator Extension: Real-Time Pip Calculation & On-Chart Display

Development Log · 2025-02

1. Title

ZigZag Indicator Extension: Real-Time Pip Calculation & On-Chart Display

2. Date / Phase

  • Date: 2025-02
  • Phase: Phase of Instrumentation & Real-Time Feedback — การขยายขีดความสามารถของ Indicator จากระดับ "การมองเห็นโครงสร้างราคา" ไปสู่ "การวัดปริมาณเชิงตัวเลขแบบทันที" บนหน้าจอการซื้อขาย

3. Background

จุดเริ่มต้นของบทสนทนาคือความต้องการพัฒนาตัวชี้วัด ZigZag มาตรฐานของ MetaQuotes (MQL4) ซึ่งเดิมทีทำหน้าที่เพียงวาดเส้นเชื่อมต่อจุดสูงสุด–ต่ำสุดที่มีนัยสำคัญต่อราคา (Extremum) แต่ไม่มีกลไกในการ วัดขนาดของเส้น (Pip) หรือ วัดความผันผวนของแท่งเทียนก่อนหน้า (Previous Candlestick Pip Range) ในแบบเรียลไทม์

ผู้ใช้ต้องการให้ Indicator นี้ไม่เพียงแต่ "ชี้ตำแหน่ง" ของการกลับตัว (Reversal) แต่ยังต้อง รายงานค่าปริมาณ ของเส้นที่เพิ่งจบลง และ แทนที่ค่าด้วยค่าของเส้นใหม่ ทันทีเมื่อเกิดการกลับตัวครั้งถัดไป โดยแสดงผลที่มุมขวาล่างของหน้าจอด้วยรูปแบบที่กำหนดตายตัว (Century Gothic, White/Gray, ขนาด 20)

4. Key Insights

การพัฒนาในครั้งนี้เปิดเผยหลักการสำคัญหลายประการเกี่ยวกับการออกแบบ Indicator แบบ Real-Time:

  • การแยกสถานะ (State Separation): ค่า Pip ของ ZigZag และค่า Pip Range ของแท่งเทียนก่อนหน้าเป็นข้อมูลคนละมิติ จึงต้องแยกตัวแปร จัดเก็บ แยกฟังก์ชันแสดงผล และแยกบรรทัดบนหน้าจอ เพื่อไม่ให้เกิดการทับซ้อนหรือสับสน
  • การตรวจจับการกลับตัว (Reversal Detection): การกลับตัวของ ZigZag สามารถตรวจจับได้จาก ทิศทางของเส้น (Direction) ที่เปลี่ยนไป โดยใช้ตัวแปร LastZigzagDirection เป็นตัวจำสถานะ (1 = ขาขึ้น, -1 = ขาลง) แล้วจึงคำนวณ Pip ของเส้นที่เพิ่งปิดตัวลง
  • การลบและเขียนทับ (Overwrite Semantics): การใช้ ObjectDelete ก่อน ObjectCreate ทุกครั้งทำให้ Label บนกราฟไม่สะสมซ้ำ และสะท้อนค่าล่าสุดเสมอ ซึ่งเป็นรูปแบบที่เหมาะกับข้อมูลที่เปลี่ยนแปลงทุกแท่งเทียน
  • การจัดวางตำแหน่ง (Corner Anchoring): การใช้ CORNER_RIGHT_LOWER ร่วมกับ XDISTANCE และ YDISTANCE ทำให้ Label ยังคงอยู่มุมขวาล่างแม้ผู้ใช้จะเลื่อนกราฟ (Pan) หรือซูม (Zoom) — เป็นการยึดติดกับ "หน้าจอ" ไม่ใช่ "ราคา"
  • การคำนวณ Pip ใน MQL4: ค่า Pip มาตรฐานคำนวณจาก (ราคาแตกต่าง) / Point ซึ่งใช้ได้กับคู่เงินส่วนใหญ่ แต่ต้องระวังในกรณีของ Broker ที่มี Digits ผิดปกติ (เช่น 5 หลักสำหรับคู่ที่ไม่ใช่ JPY)

5. Decisions

  • ตัดสินใจเพิ่มฟังก์ชัน DisplayZigzagPip() และ DisplayCandlePipRange() แยกออกจากกัน เพื่อความชัดเจนในการดูแลรักษา (Maintainability)
  • ตัดสินใจใช้ตัวแปร Global LastZigzagPip, LastCandlePipRange, และ LastZigzagDirection เพื่อเก็บสถานะล่าสุดไว้ใช้อ้างอิงในรอบการคำนวณถัดไป
  • ตัดสินใจคำนวณ Pip ของ ZigZag ณ จุดที่เกิดการกลับตัวเท่านั้น ไม่คำนวณทุกแท่งเทียน เพื่อลดภาระการประมวลผลและสะท้อน "เส้นที่จบสมบูรณ์แล้ว" อย่างถูกต้อง
  • ตัดสินใจลบ Label เก่าทุกครั้งก่อนสร้างใหม่ ด้วย ObjectDelete เพื่อให้แน่ใจว่ามี Label เพียงชุดเดียวบนหน้าจอ
  • ตัดสินใจกำหนดสีขาว (White) สำหรับค่า ZigZag Pip และ สีเทา (Gray) สำหรับค่า Candle Pip Range ตามที่ผู้ใช้ระบุ เพื่อแยกแยะประเภทข้อมูลด้วยสายตา
  • ตัดสินใจใช้ฟอนต์ Century Gothic ขนาด 20 ตามข้อกำหนด เพื่อความสม่ำเสมอของรูปแบบการแสดงผล

6. Philosophy

การขยาย Indicator ในครั้งนี้สะท้อนปรัชญาของ "การเปลี่ยนจากแผนที่สู่มาตรวัด" (From Map to Gauge) กล่าวคือ Indicator แบบดั้งเดิมทำหน้าที่เป็น แผนที่ ที่บอกว่า "จุดกลับตัวอยู่ตรงไหน" แต่ยังไม่บอกว่า "การเคลื่อนไหวนั้นใหญ่แค่ไหน" การเพิ่มค่าตัวเลขเข้าไปทำให้ Indicator กลายเป็น มาตรวัด ที่ให้ทั้งตำแหน่งและปริมาณในคราวเดียว

นอกจากนี้ยังสะท้อนหลักคิดเรื่อง "การลบเพื่อให้เห็นชัด" (Subtractive Clarity) — การที่ระบบต้องลบค่าเดิมทิ้งก่อนใส่ค่าใหม่ ไม่ใช่เพียงเพื่อเทคนิค แต่เพื่อให้ผู้ใช้เห็นเฉพาะ ปัจจุบัน ที่มีความหมาย ไม่ต้องแบกประวัติที่ล้นเกินไว้บนหน้าจอ ซึ่งสอดคล้องกับแนวคิดที่ว่าการตัดสินใจซื้อขายที่ดีนั้นต้องการ สัญญาณที่ชัด มากกว่า ข้อมูลที่มาก

7. Future Work

  • ทดสอบกับ Broker ที่มี Digits แตกต่าง (เช่น 3 หรือ 5 หลัก) เพื่อให้แน่ใจว่าการคำนวณ Pip ถูกต้องในทุกสภาพแวดล้อม
  • เพิ่มตัวเลือกให้ผู้ใช้กำหนด Pip Factor ได้ ผ่าน Input Parameter (เช่น PipFactor) สำหรับคู่เงินหรือสินทรัพย์ที่ใช้ Pip ไม่มาตรฐาน
  • พิจารณาการใช้ OBJ_TEXT แทน OBJ_LABEL หากต้องการแสดงค่า ณ ตำแหน่งราคาจริงของจุดกลับตัว (นอกเหนือจากมุมจอ)
  • เพิ่มการแสดงผลค่า Pip Range ของแท่งเทียนปัจจุบัน (Current Bar) ควบคู่กับแท่งก่อนหน้า เพื่อให้เห็นการเปรียบเทียบความผันผวนแบบเรียลไทม์
  • พิจารณาการทำ Alert หรือ Notification เมื่อค่า Pip ของเส้น ZigZag เกินค่าที่กำหนด (Threshold) ซึ่งจะยกระดับจาก Passive Display ไปสู่ Active Signal

8. Closing Note

การพัฒนาครั้งนี้เริ่มต้นจากคำขอเล็ก ๆ ที่ดูเหมือนเพียงการ "เพิ่มข้อความบนหน้าจอ" แต่แท้จริงแล้วเป็นการเปิดประตูสู่การเปลี่ยนสถานะของ Indicator จากเครื่องมือเชิงทัศนศาสตร์ (Visual Tool) ไปสู่ระบบวัดปริมาณ (Quantitative Instrument) ที่ให้ทั้งตำแหน่งและขนาดของการเคลื่อนไหวในคราวเดียว การตัดสินใจแยกฟังก์ชันการแสดงผล การใช้ตัวแปรสถานะเพื่อตรวจจับการกลับตัว และการลบ–เขียนทับ Label อย่างมีวินัย ล้วนเป็นรากฐานที่ทำให้ Indicator นี้พร้อมต่อยอดไปสู่การเป็นระบบแจ้งเตือน (Alert System) หรือระบบวิเคราะห์ความผันผวน (Volatility Analyzer) ในอนาคต แม้ในเวอร์ชันนี้จะยังจำกัดอยู่ที่การแสดงผลบนหน้าจอ แต่ทิศทางที่ชัดเจนคือการเปลี่ยน "เส้นที่มองเห็น" ให้กลายเป็น "ตัวเลขที่วัดได้" และเปลี่ยน "การสังเกต" ให้กลายเป็น "ข้อมูลที่ตัดสินใจได้" ซึ่งเป็นก้าวสำคัญของวิวัฒนาการจาก Indicator แบบดั้งเดิมสู่ระบบช่วยตัดสินใจที่มีบริบทเชิงปริมาณครบถ้วน