พื้นที่จัดเก็บข้อมูลในเครื่อง
ในคู่มือนี้ เราอธิบายวิธีการทำงานกับพื้นที่จัดเก็บข้อมูลในเครื่องเมื่อพัฒนา algo ของ cTrader ด้านล่างนี้ เราให้สรุปหนึ่งนาทีเกี่ยวกับวิธีการทำงานของการเข้าถึงพื้นที่จัดเก็บข้อมูลในเครื่อง
พื้นที่จัดเก็บข้อมูลในเครื่องในหนึ่งนาที!
- พื้นที่จัดเก็บข้อมูลในเครื่องช่วยให้คุณบันทึกข้อมูลในระบบไฟล์ในเครื่องของคุณ ใช้มันเพื่อเก็บรักษาข้อมูลระหว่างการใช้งานสองครั้งหรือมากกว่าของ cBot และอินดิเคเตอร์ของคุณ
- เพื่อบันทึกข้อมูล ใช้เมธอด
SetString(string key, string value)และSetObject(string key, object obj)เพื่อเรียกข้อมูลกลับมา เรียกใช้เมธอดGetString(string key)และT GetObject<T>(string key) - ระบุขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่องที่คุณต้องการโดยใช้ enum
LocalStorageScopeตัวอย่างเช่น โอเวอร์โหลดSetString(string key, string value, LocalStorageScope.Device)จะบันทึกข้อมูลในไดเรกทอรีDocuments/cAlgo/LocalStorage/ของคุณ - แม้ว่าข้อมูลจะถูกบันทึกโดยอัตโนมัติทุกนาที คุณสามารถใช้เมธอด
Flush(LocalStorageScope localStorageScope)เพื่อจัดเก็บข้อมูลโดยไม่มีความล่าช้า - ในระหว่างการทดสอบย้อนหลังและการปรับค่าที่เหมาะสม พื้นที่จัดเก็บข้อมูลในเครื่องจะเก็บข้อมูลไว้ในหน่วยความจำเท่านั้น
การใช้พื้นที่จัดเก็บข้อมูลในเครื่อง
คิดว่าพื้นที่จัดเก็บข้อมูลในเครื่องเป็นวิธีเก็บข้อมูลระหว่างการหยุดและเริ่มหนึ่งครั้งหรือหลายครั้งของ cBot และอินดิเคเตอร์ของคุณ คุณลักษณะนี้ช่วยให้สามารถบันทึกข้อมูล cBot และอินดิเคเตอร์ และจากนั้นเข้าถึงข้อมูลนี้ได้หลายวิธีขึ้นอยู่กับความต้องการของคุณ พื้นที่จัดเก็บข้อมูลในเครื่องทำงานโดยไม่คำนึงถึงสิทธิ์การเข้าถึงที่ให้กับ algo
อินเทอร์เฟซ LocalStorage ประกอบด้วยเมธอดทั้งหมดที่คุณสามารถใช้เพื่อจัดเก็บและเข้าถึงข้อมูลไปยังและจากพื้นที่จัดเก็บข้อมูลในเครื่อง ตัวอย่างของเมธอดเหล่านี้ได้แก่:
SetString(string key, string value)- บันทึกค่าสตริงโดยจับคู่กับคีย์ที่ระบุSetObject(string key, object obj)- บันทึกออบเจ็กต์โดยจับคู่กับคีย์ที่ระบุGetString(string key)- ดึงค่าสตริงที่บันทึกไว้โดยค้นหาจากคีย์ที่ระบุT GetObject<T>(string key)- ดึงออบเจ็กต์ประเภทTที่บันทึกไว้จากพื้นที่จัดเก็บข้อมูลในเครื่องโดยค้นหาจากคีย์ที่ระบุ
คำเตือน
เมธอด SetObject(string key, object obj) และ GetObject<T>(string key) ใช้ได้เฉพาะกับประเภทข้อมูลที่สามารถแปลงเป็นไบต์ได้เท่านั้น
พิจารณาตัวอย่างต่อไปนี้ซึ่งเราขอให้อินสแตนซ์ของ cBot บันทึกข้อความตัวอย่างเมื่อเริ่มต้น ในการเริ่มต้นครั้งต่อๆ ไป อินสแตนซ์เดียวกันจะแสดงกล่องข้อความที่มีข้อความของเรา
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 27 28 29 30 31 32 33 | |
หลังจากอินสแตนซ์ของ cBot ข้างต้นถูกเปิดใช้งานเป็นครั้งแรก มันจะบันทึกข้อความตัวอย่างของเราในพื้นที่จัดเก็บข้อมูลในเครื่อง หลังจากหยุดอินสแตนซ์และเริ่มต้นอีกครั้ง กล่องข้อความต่อไปนี้จะปรากฏขึ้น

โปรดทราบว่าพื้นที่จัดเก็บข้อมูลในเครื่องทำงานแม้ว่าจะระบุ AccessRights.None
กำหนดขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่อง
ขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่อง (กำหนดผ่านประเภท LocalStorageScope) กำหนดว่าข้อมูลจะถูกจัดเก็บที่ไหนและสามารถเข้าถึงได้อย่างไร enum นี้ประกอบด้วยค่าคงที่ต่อไปนี้:
LocalStorageScope.Instance- ข้อมูลที่บันทึกไว้จะถูกจัดเก็บและสามารถเข้าถึงได้เฉพาะโดยอินสแตนซ์ที่กำลังทำงานของ cBot หรืออินดิเคเตอร์เท่านั้น ข้อมูลจะถูกบันทึกไปยังไดเรกทอรีDocuments/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/ในเส้นทางนี้ "AlgoType" หมายถึงประเภทของส่วนขยาย cTrader ที่ทำงานกับพื้นที่จัดเก็บข้อมูลในเครื่อง (cBotsหรือIndicators) ในขณะที่AlgoNameคือชื่อของ cBot/อินดิเคเตอร์เฉพาะInstanceUniqueIdentifierคือ ID ที่ไม่ซ้ำกันของอินสแตนซ์เฉพาะของ cBot หรืออินดิเคเตอร์นั้นๆLocalStorageScope.Type- ข้อมูลที่บันทึกไว้จะถูกจัดเก็บและสามารถเข้าถึงได้โดยอินสแตนซ์ที่กำลังทำงานทั้งหมดของ cBot หรืออินดิเคเตอร์เฉพาะ ข้อมูลจะถูกบันทึกไปยังไดเรกทอรีDocuments/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/LocalStorageScope.Device- ข้อมูลที่บันทึกไว้จะถูกจัดเก็บและสามารถเข้าถึงได้โดยอินสแตนซ์ที่กำลังทำงานทั้งหมดของ cBot และอินดิเคเตอร์บนอุปกรณ์ปัจจุบัน ข้อมูลจะถูกบันทึกไปยังไดเรกทอรี "Documents/cAlgo/LocalStorage/"
ในทางกลับกัน เมธอดเช่น SetString() และ SetObject() มีโอเวอร์โหลดเพิ่มเติมที่อนุญาตให้ระบุขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่องแบบกำหนดเอง ตัวอย่างเช่น โค้ดต่อไปนี้จะบันทึกสตริงไปยัง LocalStorageScope.Type ซึ่งสตริงนี้จะสามารถเข้าถึงได้โดยส่วนขยายทั้งหมดของประเภทนั้นๆ ในภายหลัง
1 | |
หากไม่ได้ระบุ LocalStorageScope เป็นพารามิเตอร์ LocalStorageScope.Instance จะถูกใช้โดยค่าเริ่มต้น
โปรดทราบว่าพฤติกรรมนี้แตกต่างจากเมธอด GetString(string key) และ T GetObject<T>(string key) เมื่อเรียกใช้เมธอดเหล่านี้โดยไม่ระบุขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่อง พวกมันจะค้นหาคีย์ที่ระบุในทุกขอบเขตตามลำดับดังต่อไปนี้:
- อินสแตนซ์
- ประเภท
- อุปกรณ์
นอกจากนี้ ขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่องแต่ละแบบมีโควต้าพื้นที่ดิสก์ของตัวเอง:
LocalStorageScope.Instanceจำกัดที่ 10 MBLocalStorageScope.Typeจำกัดที่ 100 MBLocalStorageScope.Deviceจำกัดที่ 500 MB
ขีดจำกัดที่กำหนดไว้ข้างต้นไม่สะสม ตัวอย่างเช่น หากคุณใช้พื้นที่จัดเก็บระดับอุปกรณ์ 500 MB ไปหมดแล้ว คุณยังคงสามารถจัดเก็บข้อมูลโดยใช้พื้นที่จัดเก็บระดับอินสแตนซ์ได้จนกว่าจะถึงขีดจำกัด 10 MB
การบันทึกและโหลดข้อมูลทำงานอย่างไร
เมื่อจัดเก็บข้อมูลในพื้นที่จัดเก็บข้อมูลในเครื่อง (เช่น โดยการเรียกใช้เมธอด SetString()) cTrader จะบันทึกข้อมูลโดยอัตโนมัติทุกนาที ข้อมูลยังถูกบันทึกเมื่อหยุดอินสแตนซ์
อย่างไรก็ตาม คุณสามารถปรับแต่งพฤติกรรมนี้ได้โดยใช้เมธอดต่อไปนี้:
Flush(LocalStorageScope localStorageScope)- บันทึกข้อมูลทั้งหมดไปยังขอบเขตที่ระบุReload(LocalStorageScope localStorageScope)- โหลดค่าทั้งหมดจากขอบเขตที่ระบุใหม่
โปรดทราบว่าเมื่อเรียกใช้เมธอด Reload(LocalStorageScope localStorageScope การเปลี่ยนแปลงที่รอดำเนินการอาจสูญหายได้ เพื่อหลีกเลี่ยงสิ่งนี้ ตรวจสอบให้แน่ใจว่าได้เรียกใช้ Flush(LocalStorageScope localStorageScope) ก่อน
ในตัวอย่างด้านล่าง เราขอให้ cBot ดำเนินการคำสั่ง Market หลังจากดำเนินการนี้เสร็จสิ้น เราจะบันทึก P&L ขั้นต้นของโพสิชันที่เราเพิ่งเปิดใน LocalStorageScope.Type ทันที
1 2 3 4 5 | |
พื้นที่จัดเก็บข้อมูลในเครื่องใน Backtesting และการปรับให้เหมาะสม
พื้นที่จัดเก็บข้อมูลในเครื่องทำงานแตกต่างกันใน Backtesting เมื่อเทียบกับการเทรดแบบเรียลไทม์
ดังที่แสดงก่อนหน้านี้ พื้นที่จัดเก็บข้อมูลในเครื่องใช้ระบบไฟล์ของเครื่องของคุณเมื่อใช้ฟีเจอร์นี้ในการเทรดแบบเรียลไทม์ อย่างไรก็ตาม การใช้ระบบไฟล์ใน Backtesting จะนำไปสู่ปัญหาหลายประการ โดยเฉพาะอย่างยิ่งการบันทึกข้อมูลจำนวนมากที่ไม่เกี่ยวข้องกับการเคลื่อนไหวของตลาดและการดำเนินการเทรดในปัจจุบัน
เพื่อหลีกเลี่ยงปัญหาเหล่านี้ การดำเนินการทั้งหมดกับพื้นที่จัดเก็บข้อมูลในเครื่องจะดำเนินการในหน่วยความจำเท่านั้นเมื่อทำ Backtesting หรือปรับให้เหมาะสมกับ cBot ของคุณ ผลลัพธ์คือ คุณสามารถมั่นใจได้ว่าข้อมูลทั้งหมดที่บันทึกลงในระบบไฟล์ของคุณเกี่ยวข้องกับการเทรดแบบเรียลไทม์เท่านั้น
โดยสรุป พื้นที่จัดเก็บข้อมูลในเครื่องเป็นฟีเจอร์ที่มีประโยชน์อย่างมากของ Algo API ที่ช่วยให้สามารถเก็บรักษาข้อมูลระหว่างการหยุดและเริ่มต้นหลายครั้งของ cBot และอินดิเคเตอร์ต่างๆ การใช้พื้นที่จัดเก็บข้อมูลในเครื่องอย่างมีประสิทธิภาพ คุณสามารถสร้างกลยุทธ์การเทรดอัตโนมัติที่ซับซ้อนโดยอิงจากข้อมูลที่กำหนดเองที่บันทึกไว้ในระบบไฟล์ของคุณ