Langkau tajuk talian

Cara bekerja dengan storan tempatan

Dalam artikel ini dan video yang berkaitan, kami akan menerangkan apa itu storan tempatan dan bagaimana ia boleh digunakan dalam algo cTrader anda. Kami juga akan memberikan contoh yang berguna dan menerangkan cara skop storan tempatan berfungsi.

Mengapa menggunakan storan tempatan

Terdapat banyak kes di mana anda mahu algo anda menyimpan sesuatu ke atau mengakses sesuatu dari sistem fail tempatan. Contohnya, anda mungkin ingin menyimpan log semua operasi cBot. Walau bagaimanapun, ini biasanya memerlukan algo mempunyai hak akses yang lebih tinggi (AccessRights.FullAccess), yang kurang ideal untuk pengguna. Jika algo meminta pengguna untuk memberikan kebenaran yang lebih tinggi, pengguna berkemungkinan kurang mempercayai algo tersebut, terutamanya jika ia diedarkan tanpa kod sumbernya. Storan tempatan ialah cara mudah untuk mengakses sistem fail tempatan dengan selamat tanpa menimbulkan sebarang kebimbangan keselamatan. Penggunaan storan tempatan membolehkan pembangun mengekalkan hak akses algo mereka ditetapkan kepada AccessRights.None.

Menyimpan rentetan dalam storan tempatan

Setiap jenis algo cTrader mempunyai sifat LocalStorage yang membolehkan pelaksanaan operasi baca dan tulis. Untuk menunjukkan cara storan tempatan berfungsi, kami akan mencipta cBot baharu. Dalam pengendali OnStart, kami akan menggunakan kaedah LocalStorage.SetString(string key, string value). Seperti yang anda lihat, ia mengambil dua hujah, iaitu kunci di mana maklumat harus disimpan dan nilai yang akan disimpan.

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

Untuk mendapatkan semula nilai, kami akan menggunakan kaedah GetString(string key) dalam pengendali OnTick cBot.

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

Selagi Message tidak null, kita boleh membina cBot dan melihat nilai yang diambil dicetak dengan betul dalam log.

Menyimpan objek dalam storan tempatan

Selain rentetan, anda boleh menggunakan storan tempatan untuk menyimpan sebarang jenis objek. Di sebalik tabir, cTrader menyerial dan menyahserial objek dalam storan tempatan yang membolehkan perkongsian sebarang jenis data. Untuk menunjukkan ini, kita boleh mencipta kelas baharu untuk menyimpan maklumat, menyimpannya dan kemudian mengambilnya semula. Kita akan menamakan kelas ini Signal.

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

Dalam kaedah OnStart(), kita akan mencipta contoh baharu kelas ini dan mengawalkan sifatnya.

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

Kita akan menggunakan kaedah SetObject(string key, Object object) untuk menyimpan dan mengambil semula baki akaun.

 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);
}

Jika kita membina cBot kita dan melancarkannya, kita sepatutnya melihat nilai yang betul dicetak dalam log.

Skop storan tempatan

Apabila menggunakan storan tempatan, anda juga boleh menentukan skop di mana nilai yang disimpan didedahkan untuk pengambilan semula pada masa hadapan. Terdapat tiga skop berbeza yang tersedia:

  • Skop tika - nilai yang disimpan hanya tersedia untuk tika tertentu.
  • Skop jenis - nilai yang disimpan tersedia untuk semua tika algoritma tertentu.
  • Skop peranti - nilai yang disimpan tersedia untuk semua algoritma tanpa mengira jenisnya.

Berikut adalah contoh bagaimana penggunaan skop tika boleh kelihatan.

 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"));
    }
}

Perhatikan bahawa kita telah menyatakan skop secara jelas dalam kaedah SetString().

Kita boleh menambah beberapa tika cBot ini dan mengkonfigurasinya supaya satu menulis ke storan tempatan manakala yang lain mengambil maklumat. Dalam kes ini, membaca maklumat sepatutnya mustahil. Walau bagaimanapun, jika hanya satu tika ditetapkan untuk melaksanakan kedua-dua operasi tulis dan baca, cBot tersebut sepatutnya berfungsi seperti yang dimaksudkan.

Berikut adalah contoh penggunaan skop jenis.

 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"));
    }
}

Jika kita mencipta dua tika bot ini dan menetapkannya supaya satu tika menulis ke storan tempatan dan yang lain membaca nilai yang disimpan, semuanya sepatutnya berfungsi tanpa menimbulkan sebarang ralat.

Akhir sekali, skop peranti membolehkan pertukaran maklumat antara algo yang berbeza. Berikut adalah contoh penggunaan jenis skop ini.

 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"));
    }
}

Kita boleh membina beberapa cBot yang semuanya menggunakan kod yang sama. Jika kita menetapkannya dengan betul, satu cBot boleh menyimpan maklumat ke storan tempatan manakala yang lain mengambilnya. Selagi skop sama dengan LocalStorageScope.Device, sistem kita sepatutnya berfungsi seperti yang dimaksudkan.

Menggunakan kaedah Flush() dan Reload()

Jika anda ingin berkongsi maklumat antara beberapa tika cTrader, panggil kaedah Flush() dan 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"));
    }
}

Jika kita membina beberapa cBot dengan kod ini dan menjalankan eksperimen untuk berkongsi maklumat antara tika cTrader yang berbeza, kita akan melihat bahawa nilai yang disimpan kekal seperti yang dimaksudkan.