ローカルストレージを操作する方法

cBots (自動売買)

このビデオと対応する記事では、ローカルストレージについて説明します。ローカルストレージとは何か、そしてそれを cTrader アルゴでどのように使用できるかを説明します。さらに、便利な例を提供し、ローカルストレージのスコープがどのように機能するかを説明します。

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

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

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

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

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 をビルドし、cTrader の異なるインスタンス間で情報を共有する実験を行うと、保存された値が意図した通りに永続化されることがわかります。

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 の異なるインスタンス間で情報を共有する実験を行うと、保存された値が意図した通りに永続化されることがわかります。

いつものように、この記事とビデオが役に立ったことを願っています。cTrader でのアルゴ取引についてもっと学びたい場合は、YouTube チャンネルを購読してください。

目次

このページについて