ข้ามไปที่เนื้อหา

วงจรชีวิตของอินดิเคเตอร์ที่กำหนดเอง

โครงสร้างโค้ดตัวอย่าง

บทความนี้จะแนะนำคุณผ่านโครงสร้างโค้ดและอธิบายตรรกะเบื้องหลังเหตุการณ์และวงจรชีวิตสำหรับอินดิเคเตอร์ cTrader เพื่อเข้าถึงอินดิเคเตอร์ที่กำหนดเอง ให้เปิดแท็บ Local ในแอป Algo

Image title

ตัวอย่างเช่น คุณสามารถสร้างอินดิเคเตอร์ใหม่ชื่อ "LifeCycle Test" ด้วยโค้ดตัวอย่างต่อไปนี้ที่มีอยู่ในหน้าต่างแก้ไขโค้ด

Image title

เพื่อรีเซ็ตเป็นเวอร์ชันต้นแบบ ให้คัดลอกโค้ดด้านล่าง

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    [Indicator(AccessRights = AccessRights.None)]
    public class LifeCycleTest : Indicator
    {
        [Parameter(DefaultValue = "Hello world!")]
        public string Message { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }

        protected override void Initialize()
        {
            // To learn more about cTrader Algo visit our Help Center:
            // https://help.ctrader.com/ctrader-algo/


            Print(Message);
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = 
        }
    }
}

โดยสังเขป โครงสร้างโค้ดประกอบด้วยเพียงสองเมธอด คือเมธอด Initialize() และเมธอด Calculate() คลิก Build เพื่อดำเนินการทดสอบอินดิเคเตอร์นี้ เราจะเพิ่มเมธอดเพิ่มเติมที่เรียกว่า OnDestroy() และอธิบายวัตถุประสงค์ในภายหลัง

เหตุการณ์การเริ่มต้น

เมื่ออินดิเคเตอร์ cTrader ถูกแนบกับกราฟเป็นครั้งแรกหรือเมื่อผู้ใช้เปลี่ยนการตั้งค่าพารามิเตอร์ใดๆ อินสแตนซ์ของอินดิเคเตอร์จะถูกสร้างใหม่และเมธอด Initialize() จะถูกเรียกใช้ เมธอดนี้ใช้เพื่อเริ่มต้นตัวแปรใดๆ ที่คุณวางแผนจะใช้ในอินดิเคเตอร์ของคุณ คุณยังสามารถกำหนดและอ้างอิงอินดิเคเตอร์เพิ่มเติมเพื่อสร้างอินดิเคเตอร์เดียวโดยใช้สูตรจากอินดิเคเตอร์อื่นๆ

โดยค่าเริ่มต้น เทมเพลตโค้ดใหม่จะรวมการตั้งค่าพารามิเตอร์ที่เรียกว่า Message ด้วยค่า "Hello world!"

1
2
[Parameter(DefaultValue = "Hello world!")]
public string Message { get; set; }

ในเมธอด Initialize() มีบรรทัดโค้ดที่พิมพ์ข้อความนี้ไปยังล็อก

1
Print(Message);

เพื่อสาธิตเมธอด Initialize() ให้เพิ่มอินสแตนซ์อินดิเคเตอร์โดยคลิกไอคอน Plus ถัดจากไอคอน Build และเลือกสัญลักษณ์ หากคุณคลิก More ในแถวอินดิเคเตอร์และเลือก Add an instance สัญลักษณ์ EURUSD พร้อมช่วงเวลา h1 จะถูกเพิ่มโดยอัตโนมัติ

Image title

หมายเหตุ

การเพิ่มอินสแตนซ์ใน cTrader Algo เหมือนกับการแนบอินดิเคเตอร์กับกราฟในแอป Trade

ตอนนี้ ให้เปิดแท็บ Log ในแผง Trade Watch ใต้กราฟ คุณจะเห็นว่าข้อความ "Hello world" ถูกพิมพ์แล้ว

Image title

ทุกครั้งที่อินดิเคเตอร์ถูกเพิ่มลงในกราฟเป็นครั้งแรกหรือเมื่อมีการเปลี่ยนพารามิเตอร์ กราฟจะถูกรีเฟรชและเมธอด Initialize() จะถูกเรียกใช้อีกครั้ง พิมพ์ข้อความที่แตกต่างในส่วน Parameters เพื่อดูรายการล็อกอัปเดตตามนั้น

Image title

คำนวณผลลัพธ์ของอินดิเคเตอร์

เมธอด Calculate() จะถูกเรียกสำหรับแต่ละดัชนีของข้อมูลประวัติศาสตร์และในแต่ละติ๊กที่เข้ามา ตัวอย่างเช่น หากกราฟปัจจุบันมี 1000 แท่ง เมธอด Calculate() จะถูกเรียกสำหรับดัชนี 0, 1, 2 และต่อๆ ไป จนถึงสูงสุด 999

1
public override void Calculate(int index)

เมธอด Calculate() อาจถูกเรียกหลายครั้งต่อวินาทีในช่วงที่มีความผันผวนสูงหรือเรียกน้อยลงเมื่อตลาดอยู่ในภาวะราบ เพื่อทดสอบการทำงาน คุณสามารถเพิ่มบรรทัดโค้ดในเนื้อความของเมธอด Calculate() เพื่อพิมพ์ค่าดัชนีที่ถูกส่งเข้ามาในเมธอดสำหรับแต่ละติ๊กข้อมูลใหม่ อย่าลืมคลิก Build ทุกครั้งหลังจากเพิ่มการเปลี่ยนแปลงในหน้าต่างแก้ไขโค้ด

1
Print("Index: " + index);

เพื่อสลับจากหน้าต่างแก้ไขโค้ดไปยังกราฟ ให้คลิกที่อินสแตนซ์อินดิเคเตอร์ที่เพิ่มเข้ามา หากคุณเปิดแท็บ Log ในแผง Trade Watch คุณจะเห็นค่าที่พิมพ์สำหรับแต่ละดัชนีที่ถูกส่งเข้ามาในเมธอด

Image title

เมธอด OnDestroy()

เมธอด OnDestroy() จะถูกเรียกเมื่ออินดิเคเตอร์ถูกเอาออกจากกราฟและไม่จำเป็นอีกต่อไป คุณจะต้องนำเมธอดนี้ไปใช้งาน เนื่องจากไม่ได้ถูกเพิ่มโดยค่าเริ่มต้นเมื่อคุณสร้างอินดิเคเตอร์ใหม่

1
2
3
4
protected override void OnDestroy()
        {
            base.OnDestroy();            
        }

เมธอดนี้มีประโยชน์สำหรับโปรแกรมเมอร์ เนื่องจากช่วยให้สามารถปล่อยทรัพยากรที่ไม่ได้จัดการและทำงานขั้นสุดท้ายได้ ช่วยป้องกันการรั่วไหลของหน่วยความจำและทำให้มั่นใจว่าอินดิเคเตอร์ไม่คงทรัพยากรไว้หลังจากถูกเอาออก ตัวอย่างเช่น การปิดการเชื่อมต่อกับแหล่งข้อมูลภายนอก การปล่อยวัตถุข้อมูลขนาดใหญ่ และการดำเนินการอื่นๆ ที่ปลดปล่อยหน่วยความจำ

สรุป

สรุปแล้ว เมธอด Initialize(), Calculate() และ OnDestroy() แสดงขั้นตอนต่างๆ ของวงจรชีวิตของอินดิเคเตอร์ที่กำหนดเอง โดยการปรับเปลี่ยนโค้ดตัวอย่างในแอป Algo คุณสามารถตัดสินใจได้ว่าจะเริ่มต้นตัวแปรอินดิเคเตอร์อย่างไร คำนวณผลลัพธ์ของอินดิเคเตอร์ และทำงานขั้นสุดท้ายอย่างไร

Image title