コンテンツにスキップ

ローカルストレージの操作方法

この記事と対応する動画では、ローカルストレージとは何か、そしてcTraderアルゴリズムでどのように使用できるかを説明します。 また、有用な例を提供し、ローカルストレージのスコープがどのように機能するかを説明します。

ローカルストレージを使用する理由

アルゴリズムがローカルファイルシステムに何かを保存したり、そこからアクセスしたりしたい場合が多くあります。 例えば、すべてのcBot操作のログを保存したい場合があります。 しかし、これには通常、アルゴリズムが昇格されたアクセス権(AccessRights.FullAccess)を持つ必要があり、ユーザーにとって理想的ではありません。 アルゴリズムがユーザーに昇格された権限を要求する場合、特にソースコードなしで配布されている場合、ユーザーはアルゴリズムを信頼する可能性が低くなります。 ローカルストレージは、セキュリティ上の懸念を導入することなく、ローカルファイルシステムに安全にアクセスする便利な方法です。 ローカルストレージを使用することで、開発者はアルゴリズムのアクセス権をAccessRights.Noneに設定したままにすることができます。

ローカルストレージに文字列を保存する

すべてのタイプのcTraderアルゴリズムには、読み取りおよび書き込み操作を実行できるLocalStorageプロパティがあります。 ローカルストレージの動作をデモンストレーションするために、新しいcBotを作成します。 そのOnStartハンドラーで、LocalStorage.SetString(string key, string value)メソッドを使用します。 ご覧の通り、このメソッドは2つの引数を取ります。1つは情報を保存するためのキー、もう1つは保存する値です。

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

値を取得するために、cBotのOnTickハンドラーでGetString(string key)メソッドを使用します。

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をビルドして起動すると、ログに正しい値が表示されるはずです。

ローカルストレージのスコープ

ローカルストレージを使用する際、保存された値が将来取得されるスコープを定義することもできます。 利用可能な3つの異なるスコープがあります:

  • インスタンススコープ - 保存された値は特定のインスタンスでのみ利用可能です。
  • タイプスコープ - 保存された値は特定のアルゴリズムのすべてのインスタンスで利用可能です。
  • デバイススコープ - 保存された値は、タイプに関係なくすべてのアルゴリズムで利用可能です。

以下は、インスタンススコープを使用する例です。

 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の複数のインスタンスを追加し、1つがローカルストレージに書き込み、もう1つが情報を取得するように設定できます。 この場合、情報の読み取りは不可能です。 ただし、書き込みと読み取りの両方の操作を実行するように1つのインスタンスを設定すると、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"));
    }
}

このボットの2つのインスタンスを作成し、1つのインスタンスがローカルストレージに書き込み、もう1つが保存された値を読み取るように設定すると、エラーを発生させることなくすべてが動作するはずです。

最後に、デバイススコープを使用すると、異なるアルゴリズム間で情報を交換できます。 以下は、このスコープタイプを使用する例です。

 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をビルドできます。 それらを正しく設定すると、1つのcBotがローカルストレージに情報を保存し、もう1つがそれを取得できます。 スコープが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インスタンス間で情報を共有する実験を行うと、保存された値が意図した通りに永続化されることがわかります。