Ana içeriğe geç

Yerel depolama ile nasıl çalışılır

Bu makalede ve ilgili videosunda, yerel depolamanın ne olduğunu ve cTrader algoritmalarınızda nasıl kullanılabileceğini açıklayacağız. Ayrıca faydalı örnekler sunacak ve yerel depolama kapsamının nasıl çalıştığını açıklayacağız.

Yerel depolama neden kullanılır

Algoritmanızın yerel dosya sistemine bir şeyler kaydetmek veya oradan bir şeyler almak istediği birçok durum vardır. Örneğin, tüm cBot işlemlerinin bir günlüğünü kaydetmek isteyebilirsiniz. Ancak bu, genellikle algoritmanın yükseltilmiş erişim haklarına (AccessRights.FullAccess) sahip olmasını gerektirir ki bu, kullanıcılar için ideal değildir. Bir algoritma, bir kullanıcıdan yükseltilmiş izinler sağlamasını isterse, kullanıcı algoritmaya güvenme olasılığı çok daha düşüktür, özellikle de kaynak kodu olmadan dağıtılıyorsa. Yerel depolama, herhangi bir güvenlik endişesi yaratmadan yerel dosya sistemine güvenli bir şekilde erişmek için uygun bir yoldur. Yerel depolama kullanmak, geliştiricilerin algoritmalarının erişim haklarını AccessRights.None olarak ayarlamasına olanak tanır.

Yerel depolamada dizeleri kaydetme

Her cTrader algoritma türünün, okuma ve yazma işlemlerini gerçekleştirmeye olanak tanıyan bir LocalStorage özelliği vardır. Yerel depolamanın nasıl çalıştığını göstermek için yeni bir cBot oluşturacağız. OnStart işleyicisinde, LocalStorage.SetString(string key, string value) yöntemini kullanacağız. Gördüğünüz gibi, iki argüman alır: bilginin kaydedileceği bir anahtar ve kaydedilecek değer.

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

Değeri almak için cBot'un OnTick işleyicisinde GetString(string key) yöntemini kullanacağız.

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

Message boş olmadığı sürece, cBot'u derleyebilir ve alınan değerin günlüğe doğru şekilde yazdırıldığını görebiliriz.

Yerel depolamada nesneleri kaydetme

Dize dışında, yerel depolamayı herhangi bir tür nesneyi kaydetmek için kullanabilirsiniz. Arka planda cTrader, yerel depolamadaki nesneleri serileştirir ve seri durumdan çıkarır, bu da her türlü verinin paylaşılmasına olanak tanır. Bunu göstermek için, bilgi depolamak, kaydetmek ve daha sonra almak üzere yeni bir sınıf oluşturabiliriz. Bu sınıfa Signal adını vereceğiz.

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

OnStart() yönteminde, bu sınıfın yeni bir örneğini oluşturacak ve özelliklerini başlatacağız.

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

Hesap bakiyesini kaydetmek ve almak için SetObject(string key, Object object) yöntemini kullanacağız.

 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'umuzu derleyip başlatırsak, doğru değerlerin günlüğe yazdırıldığını görmeliyiz.

Yerel depolama kapsamları

Yerel depolama kullanırken, kaydedilen değerlerin gelecekte alınmak üzere maruz bırakıldığı kapsamı da tanımlayabilirsiniz. Üç farklı kapsam mevcuttur:

  • Örnek kapsamı - kaydedilen değerler yalnızca belirli bir örneğe açıktır.
  • Tür kapsamı - kaydedilen değerler belirli bir algoritmanın tüm örneklerine açıktır.
  • Cihaz kapsamı - kaydedilen değerler, türlerinden bağımsız olarak tüm algoritmalara açıktır.

Örnek kapsamı kullanmak şöyle görünebilir.

 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() yönteminde kapsamı açıkça belirttiğimizi unutmayın.

Bu cBot'un birkaç örneğini ekleyebilir ve birinin yerel depolamaya yazarken diğerinin bilgi almasını sağlayacak şekilde yapılandırabiliriz. Bu durumda, bilgi okumak imkansız olmalıdır. Ancak, yalnızca bir örnek hem yazma hem de okuma işlemlerini gerçekleştirecek şekilde ayarlanmışsa, cBot amaçlandığı gibi çalışmalıdır.

Tür kapsamı kullanmaya bir örnek.

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

Bu botun iki örneğini oluşturup bir örneğin yerel depolamaya yazmasını, diğerinin ise kaydedilen değeri okumasını sağlayacak şekilde ayarlarsak, her şey herhangi bir hata vermeden çalışmalıdır.

Son olarak, cihaz kapsamı farklı algoritmalar arasında bilgi alışverişi yapılmasına olanak tanır. Bu kapsam türünün kullanımına bir örnek aşağıdadır.

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

Hepsi aynı kodu kullanan birkaç cBot oluşturabiliriz. Bunları doğru şekilde ayarlarsak, bir cBot yerel depolamaya bilgi kaydedebilirken diğeri bu bilgiyi geri alabilir. Kapsam LocalStorageScope.Device değerine eşit olduğu sürece sistemimiz amaçlandığı gibi çalışmalıdır.

Flush() ve Reload() yöntemlerini kullanma

cTrader'ın birkaç örneği arasında bilgi paylaşmak istiyorsanız Flush() ve Reload() yöntemlerini çağırın.

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

Bu kodla birkaç cBot oluşturur ve cTrader'ın farklı örnekleri arasında bilgi paylaşmak için bir deney yaparsak, kaydedilen değerlerimizin amaçlandığı gibi kalıcı olduğunu görürüz.