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

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

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

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

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

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

Algo ทุกประเภทของ cTrader มีคุณสมบัติ LocalStorage ที่อนุญาตให้ดำเนินการอ่านและเขียนได้ เพื่อแสดงวิธีการทำงานของพื้นที่จัดเก็บข้อมูลในเครื่อง เราจะสร้าง cBot ใหม่ ในตัวจัดการ OnStart เราจะใช้เมธอด LocalStorage.SetString(string key, string value) ดังที่คุณเห็น มันรับอาร์กิวเมนต์สองตัว ได้แก่ คีย์ที่ควรบันทึกข้อมูลและค่าที่จะบันทึก

1
LocalStorage.SetString("Message", Message);

เพื่อดึงค่า เราจะใช้เมธอด GetString(string key) ในตัวจัดการ OnTick ของ cBot

1
Print(LocalStorage.GetString("Message"));

ตราบใดที่ Message ไม่เป็น null เราสามารถสร้าง cBot และเห็นค่าที่ดึงมาถูกพิมพ์ในบันทึกอย่างถูกต้อง

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

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

1
2
3
4
5
6
class Signal
{
    public TradeType TradeType { get; set; }
    public double SL { get; set; }
    public double TP { get; set; }
}

ในเมธอด OnStart() เราจะสร้างอินสแตนซ์ใหม่ของคลาสนี้และกำหนดค่าเริ่มต้นให้กับคุณสมบัติต่างๆ

1
2
3
4
5
var signal = new Signal{
    TradeType = TradeType.Sell,
    SL = 50,
    TP = 50,
};

เราจะใช้เมธอด SetObject(string key, Object object) เพื่อบันทึกและเรียกคืนยอดคงเหลือในบัญชี

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    var signal = new Signal{
    TradeType = TradeType.Sell,
    SL = 50,
    TP = 50,
    };        

    LocalStorage.SetString("Message",Message);
    LocalStorage.SetObject("Signal 1", signal);
}

protected override void OnTick()
{
Print(LocalStorage.GetString("Message")); 

var signal = LocalStorage.GetObject<Signal>("Signal 1"); 
Print(signal.TradeType);
Print(signal.SL);
Print(signal.TP);
}

หากเราสร้าง cBot และเรียกใช้งาน เราควรจะเห็นค่าที่ถูกต้องถูกพิมพ์ออกมาในบันทึก

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

เมื่อใช้พื้นที่จัดเก็บข้อมูลในเครื่อง คุณยังสามารถกำหนดขอบเขตที่ค่าที่บันทึกไว้จะถูกเปิดเผยสำหรับการเรียกคืนในอนาคต มีขอบเขตที่แตกต่างกันสามประเภท:

  • ขอบเขตอินสแตนซ์ - ค่าที่บันทึกไว้จะสามารถใช้ได้เฉพาะกับอินสแตนซ์เฉพาะเท่านั้น
  • ขอบเขตประเภท - ค่าที่บันทึกไว้จะสามารถใช้ได้กับทุกอินสแตนซ์ของอัลกอริทึมเฉพาะ
  • ขอบเขตอุปกรณ์ - ค่าที่บันทึกไว้จะสามารถใช้ได้กับทุกอัลกอริทึมโดยไม่คำนึงถึงประเภทของอัลกอริทึม

นี่คือตัวอย่างการใช้ขอบเขตอินสแตนซ์

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[Parameter()]
public bool IsWriter { get; set; }


protected override void OnStart()
{   
    if(IsWriter)
    { 
        LocalStorage.SetString("Message",Message, LocalStorageScope.Instance);
    }
}

protected override void OnTick()
{        
    if(!IsWriter)
    {
        if(LocalStorage.GetString("Message") != string.Empty)
            Print(LocalStorage.GetString("Message"));
    }
}

โปรดสังเกตว่าเราได้ระบุขอบเขตอย่างชัดเจนในเมธอด SetString()

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

นี่คือตัวอย่างการใช้ขอบเขตประเภท

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
protected override void OnStart()
{   
    if(IsWriter)
    {             
        LocalStorage.SetString("Message",Message, LocalStorageScope.Type);
    }
}

protected override void OnTick()
{        
    if(!IsWriter)
    {
        if(LocalStorage.GetString("Message", LocalStorageScope.Type) != string.Empty)
            Print(LocalStorage.GetString("Message"));
    }
}

หากเราสร้างอินสแตนซ์สองตัวของบอทนี้และตั้งค่าให้อินสแตนซ์หนึ่งเขียนลงในพื้นที่จัดเก็บข้อมูลในเครื่อง และอีกอินสแตนซ์หนึ่งอ่านค่าที่บันทึกไว้ ทุกอย่างควรจะทำงานได้โดยไม่เกิดข้อผิดพลาดใดๆ

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
protected override void OnStart()
{   
    if(IsWriter)
    {             
        LocalStorage.SetString("Message",Message, LocalStorageScope.Device);
    }
}

protected override void OnTick()
{        
    if(!IsWriter)
    {
        if(LocalStorage.GetString("Message", LocalStorageScope.Device) != string.Empty)
            Print(LocalStorage.GetString("Message"));
    }
}

เราสามารถสร้าง cBot หลายตัวที่ใช้โค้ดเดียวกัน หากเราตั้งค่าอย่างถูกต้อง cBot หนึ่งตัวสามารถบันทึกข้อมูลลงในพื้นที่จัดเก็บข้อมูลในเครื่อง ในขณะที่อีกตัวหนึ่งเรียกคืนข้อมูล ตราบใดที่ขอบเขตเท่ากับ LocalStorageScope.Device ระบบของเราควรจะทำงานได้ตามที่ตั้งใจ

การใช้เมธอด Flush() และ Reload()

หากคุณต้องการแชร์ข้อมูลระหว่างอินสแตนซ์หลายตัวของ cTrader ให้เรียกใช้เมธอด Flush() และ Reload()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
protected override void OnStart()
{   
    if(IsWriter)
    {             
        LocalStorage.SetString("Message",Message, LocalStorageScope.Device);
        LocalStorage.Flush(LocalStorageScope.Device);
    }
}

protected override void OnTick()
{        
    if(!IsWriter)
    {
        LocalStorage.Reload(LocalStorageScope.Device);
        if(LocalStorage.GetString("Message", LocalStorageScope.Device) != string.Empty)
            Print(LocalStorage.GetString("Message"));
    }
}

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