[EA・โปรแกรมเมชั่น] ความผิดพลาดที่เลวร้ายที่สุดที่ทำให้ EA ที่กำลังทำงานออกจากชาร์ต
สวัสดีครับ ผม 2pay ครับ
นี่เป็นเรื่องสั้นเกี่ยวกับ EA อีกครั้งหนึ่ง
ทุกคนเคยมีประสบการณ์ที่ EA ที่กำลังทำงานอยู่โดนถอดออกอย่างกะทันหันบ้างไหมครับ?
หลังจากที่ตำแหน่งของ EA ถูกเปิดขึ้นแล้ว EA เกิดถอดออกจากกราฟด้วยตนเองและไม่สามารถควบคุมตำแหน่งได้บ้างในบางกรณีที่เกิดขึ้นได้ยาก
เมื่อ EA ตกอยู่ในสถานการณ์ผิดปกติ จะมีข้อความแสดงข้อผิดพลาดในประวัติการใช้งานหรือบันทึกผู้เชี่ยวชาญ
หัวข้อที่ผมยกขึ้นเป็นข้อผิดพลาดที่น่ากลัวที่สุดคือ “array out of range”
ข้อผิดพลาดที่เกิดเมื่อเข้าถึงนอกขอบเขตของอาร์เรย์ และเมื่อเกิดขึ้นโปรแกรมจะหยุดทำงานทันที
ในกรณีของอินดิเคเตอร์จะยังคงอยู่บนกราฟ แต่จะไม่คำนวณและไม่แสดงอะไรเลย
และในกรณีของ EA จะถูกถอดออกจากกราฟทั้งโปรแกรม
เพราะในเวลาที่เกิดข้อผิดพลาดไม่มีการแจ้งเตือนใดๆ ทำให้ตอนที่นอนอยู่หรือตอนอยู่นอกสถานที่ ไม่รู้ตัวเอาไว้ ตำแหน่งที่ไม่ถูกควบคุมอาจสร้างผลขาดทุนมหาศาล
ผู้ใช้งาน EA ที่สังเกตเห็นความผิดพลาดจะไม่เข้าใจสถานการณ์และลำบากใจว่าจะควรปิดตำแหน่งหรือไม่
เมื่อพยายามติดตั้ง EA ใหม่ก็จะถูกปฏิเสธด้วยข้อผิดพลาดเดิมซ้ำอีก
เกิดขึ้นได้ในช่วงเวลาใดบ้าง?
เพื่อเข้าใจเรื่องนี้ เราต้องเข้าใจเกี่ยวกับอาร์เรย์ (ด้านล่างนี้จะใช้นิพจน์ที่อธิบายแบบง่ายขึ้นนิดหน่อย)
อาร์เรย์คือเหมือนกับกล่องที่เรียงลำดับตัวแปรต่อเนื่องกัน
ตัวแปรในโปรแกรมคือกล่องที่สามารถตั้งชื่อได้ตามชอบและบรรจุข้อมูล (ตัวเลขหรือข้อความ) เข้าไปได้
เมื่อเรานำหมายเลขกล่องชื่อ “a” มาใส่ตัวเลข “1”
a=1 แสดงว่าเราบรรจุตัวเลข 1 เข้าไปในกล่องของ a
ในทางกลับกันเมื่ออยากรู้เนื้อหาภายในกล่อง “a”
จะเขียนว่า Print(a) เป็นต้น (“Print()” คือคำสั่งที่ออกผลลัพธ์ไปยังบันทึก/log)
จากนั้นบันทึกจะแสดง “1”
เมื่อมีการเตรียมกล่องจำนวนมากเหมือนกล่อง “a” สามารถสร้างได้หลายชื่อ เช่น “b” “c” ฯลฯ แต่ถ้าต้องการ 100 กล่อง การตั้งชื่อก็ลำบาก
ดังนั้นจึงทำให้กลายเป็นอาร์เรย์เพื่อใช้งานเป็นชุด
โดยการเขียน a[100] เพื่อ
จะสร้างตัวแปร a ทั้ง 100 ตัวตั้งแต่หมายเลข 0 ถึง 99 (ในภาษา mql อาร์เรย์เริ่มต้นที่ 0)
แต่ละตัวแปรในอาร์เรย์สามารถบรรจุเลขต่างๆ กันได้
a[0]=1
a[1]=25
a[99]=-10
ดังเช่นนี้
ที่นี่
a[250]=45
จะเป็นอย่างไร
อาร์เรย์ของ a สร้างแค่ 100 ตัวก่อน (ถึงหมายเลข 99)
จะเป็นไปได้หรือไม่ที่จะบรรจุเลขเข้าไปที่หมายเลข 250 ที่ไม่มีอยู่?
คำตอบคือ ไม่ได้
เพราะกำหนดช่วงของอาร์เรย์ไว้ (0~99) เท่านั้น
นี่คือ “array out of range”
ในโค้ดที่ใช้อาร์เรย์มีหลายส่วนที่ใช้งานเป็นตัวอย่าง เช่น 4 ค่าเปิดปิด
ค่าปิดถูกนิยามเป็น "close[]" และช่วงของอาร์เรย์จะตรงกับจำนวนแท่งบนกราฟที่แสดง
อาร์เรย์ที่เรียงตามลำดับเวลาดังกล่าวเรียกว่า “อาร์เรย์ตามลำดับเวลา”
โดยปกติ [0] (= หมายเลข 0) จะเป็นแท่งปัจจุบัน และแท่งที่เก่าที่สุดจะมีค่าใหญ่สุด [バー数-1]
ตัวอย่างเมื่อจำนวนแท่งกราฟเป็น 3000 บท แล้วเข้าถึง close[4500] ที่อยู่ก่อนหน้า 3000 แท่ง จะเกิดข้อผิดพลาดเพราะอยู่นอกขอบเขต
เมื่อ EA หรืออินดิเคเตอร์ต้องย้อนกลับไปคำนวณอย่างน้อย 3000 บรรทัด ผู้พัฒนาจะกำหนดจุดเริ่มต้นการคำนวณที่แท่ง [2999] แล้วนับลงไปถึง [0]
สิ่งสำคัญคือผู้ใช้ควรให้กราฟแสดงมากกว่า 3000 แท่ง
ถ้าผู้พัฒนากำหนดมา ก็ให้ทำตามคำแนะนำ
แน่นอนว่า developers ก็ควรหามาตรการเพื่อป้องกัน
เพื่อให้ผู้ใช้สามารถปรับจำนวนแท่งได้ อาจมีการแจ้งเตือนเมื่อขอบเขตของอาร์เรย์ถูกใช้งานจนเกินไปหรือมีการกำหนดค่าผิด เพื่อให้ผู้ใช้เพิ่มจำนวนแท่ง
ในการเขียนจริงจะไม่ใส่ตัวเลขลงในองค์ประกอบของอาร์เรย์โดยตรงบ่อยนัก มักระบุด้วยตัวแปร
close[a]
วิธีนี้ช่วยให้การเขียนดูสะดวกขึ้น แต่หากไม่ตรวจสอบว่าค่าภายใน a คืออะไร จะไม่รู้ว่าไปติดที่ไหน
เงื่อนไขด้านล่างนี้ทำให้การแสดงออกอยู่ในขอบเขตของอาร์เรย์ close เท่านั้น หากขนาดอาร์เรย์มีค่าน้อยกว่า a จะไม่แสดง close[a]
if( ArraySize(close)-1 > a ){
Print( close[a] ); }
เมื่อใช้ในลูปขนาดใหญ่ ควรคำนวณ ArraySize(close) ไว้ในตัวแปรนอกลูปเพื่อไม่เรียกฟังก์ชันซ้ำๆ ภายในลูป
ตอนที่เริ่มศึกษาก็ไม่เข้าใจว่าเหตุใดข้อผิดพลาดนี้ถึงเกิดขึ้น และต้องพยายามทำความเข้าใจระบบอยู่ค่อนข้างมาก
ถึงอย่างนั้นในงานพัฒนาเป็นสิ่งจำเป็น และโดยพื้นฐาน เราต้องออกแบบให้ไม่เกิด array out of range หรือมีการจัดการข้อผิดพลาดป้องกันไว้
เรื่องราวของวันนี้จบลงที่นี่
ขอบคุณที่ท่านได้อ่านครับ/ค่ะ