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

พื้นที่จัดเก็บข้อมูลในเครื่อง

ในคู่มือนี้ เราอธิบายวิธีการทำงานกับพื้นที่จัดเก็บข้อมูลในเครื่องเมื่อพัฒนา 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class SampleLocalStorageTest : Robot

    {

        protected override void OnStart()
        {

            string messageLocalStorage = LocalStorage.GetString("Example Message");

            if (messageLocalStorage is not null)

            {

                MessageBox.Show(messageLocalStorage);

            }

            LocalStorage.SetString("Example Message", "This is just an example message");
        }
    }
}

หลังจากอินสแตนซ์ของ 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
SetString(Example String, Just an example string, LocalStorageScope.Type);

หากไม่ได้ระบุ LocalStorageScope เป็นพารามิเตอร์ LocalStorageScope.Instance จะถูกใช้โดยค่าเริ่มต้น

โปรดทราบว่าพฤติกรรมนี้แตกต่างจากเมธอด GetString(string key) และ T GetObject<T>(string key) เมื่อเรียกใช้เมธอดเหล่านี้โดยไม่ระบุขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่อง พวกมันจะค้นหาคีย์ที่ระบุในทุกขอบเขตตามลำดับดังต่อไปนี้:

  • อินสแตนซ์
  • ประเภท
  • อุปกรณ์

นอกจากนี้ ขอบเขตพื้นที่จัดเก็บข้อมูลในเครื่องแต่ละแบบมีโควต้าพื้นที่ดิสก์ของตัวเอง:

  • LocalStorageScope.Instance จำกัดที่ 10 MB
  • LocalStorageScope.Type จำกัดที่ 100 MB
  • LocalStorageScope.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
ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, Custom label);
var positionOne = Positions.Find("Custom label");        
string positionOneGrossProfit = positionOne.GrossProfit.ToString();
LocalStorage.SetString("Position 1", positionOneGrossProfit, LocalStorageScope.Device); 
LocalStorage.Flush(LocalStorageScope.Device);

พื้นที่จัดเก็บข้อมูลในเครื่องใน Backtesting และการปรับให้เหมาะสม

พื้นที่จัดเก็บข้อมูลในเครื่องทำงานแตกต่างกันใน Backtesting เมื่อเทียบกับการเทรดแบบเรียลไทม์

ดังที่แสดงก่อนหน้านี้ พื้นที่จัดเก็บข้อมูลในเครื่องใช้ระบบไฟล์ของเครื่องของคุณเมื่อใช้ฟีเจอร์นี้ในการเทรดแบบเรียลไทม์ อย่างไรก็ตาม การใช้ระบบไฟล์ใน Backtesting จะนำไปสู่ปัญหาหลายประการ โดยเฉพาะอย่างยิ่งการบันทึกข้อมูลจำนวนมากที่ไม่เกี่ยวข้องกับการเคลื่อนไหวของตลาดและการดำเนินการเทรดในปัจจุบัน

เพื่อหลีกเลี่ยงปัญหาเหล่านี้ การดำเนินการทั้งหมดกับพื้นที่จัดเก็บข้อมูลในเครื่องจะดำเนินการในหน่วยความจำเท่านั้นเมื่อทำ Backtesting หรือปรับให้เหมาะสมกับ cBot ของคุณ ผลลัพธ์คือ คุณสามารถมั่นใจได้ว่าข้อมูลทั้งหมดที่บันทึกลงในระบบไฟล์ของคุณเกี่ยวข้องกับการเทรดแบบเรียลไทม์เท่านั้น

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