ローカルストレージ

このガイドでは、cTraderアルゴリズム開発時にローカルストレージを利用する方法について説明します。以下に、ローカルストレージアクセスの概要を1分でまとめています。

ローカルストレージの1分でわかる説明!

  • ローカルストレージを使うと、情報をローカルファイルシステムに保存できます。これにより、複数のcBotやインジケーターのデプロイ間でデータを永続化できます!
  • データを保存するには、SetString(string key, string value) および SetObject(string key, object obj) メソッドを使用します。データを取得するには、GetString(string key) および T GetObject<T>(string key) メソッドを呼び出します。
  • 好みのローカルストレージスコープを指定するには、LocalStorageScope 列挙体を使用します!例えば、SetString(string key, string value, LocalStorageScope.Device) オーバーロードを使用すると、Documents/cAlgo/LocalStorage/ ディレクトリにデータが保存されます。
  • 情報は自動的に毎分保存されますが、Flush(LocalStorageScope localStorageScope) メソッドを使用して遅延なくデータを保存できます。
  • バックテストや最適化中は、ローカルストレージはメモリ内にのみデータを保存します。

ローカルストレージの使用方法

ローカルストレージは、cBotやインジケーターの1回または複数回の起動/停止間で情報を保存する方法として考えてください。この機能により、cBotやインジケーターのデータを保存し、ニーズに応じてさまざまな方法でこの情報にアクセスできます。ローカルストレージは、アルゴリズムに与えられたアクセス権に関係なく機能します。

LocalStorage インターフェイスには、ローカルストレージにデータを保存またはアクセスするためのすべてのメソッドが含まれています。以下はこれらのメソッドのいくつかの例です。

  • SetString(string key, string value)。指定されたキーに一致させて文字列値を保存します。
  • SetObject(string key, object obj)。指定されたキーに一致させてオブジェクトを保存します。
  • GetString(string key)。指定されたキーで保存された文字列値を取得します。
  • T GetObject<T>(string key)。指定されたキーでローカルストレージからタイプ T の保存されたオブジェクトを取得します。

警告

SetObject(string key, object obj) および GetObject<T>(string key) メソッドは、シリアライズ(バイトに変換)できるデータタイプのみで機能します。

以下の例では、cBotインスタンスが起動時に例のメッセージを保存し、その後の起動時には同じインスタンスがメッセージボックスを表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class SampleLocalStorageTest : Robot

    {

        protected override void OnStart()
        {

            string messageLocalStorage = LocalStorage.GetString("Example Message");

            if (messageLocalStorage is not null)

            {

                MessageBox.Show(messageLocalStorage);

            }

            LocalStorage.SetString("Example Message", "This is just an example message");
        }
    }
}

上記のcBotインスタンスが初めて起動された後、例のメッセージがローカルストレージに保存されます。そのインスタンスを停止し、再度起動すると、以下のメッセージボックスが表示されます。

なお、AccessRights.None が指定されている場合でも、ローカルストレージは機能します。

ローカルストレージのスコープを定義する

ローカルストレージのスコープ(LocalStorageScope タイプで定義)は、情報が正確にどこに保存され、どのようにアクセスされるかを決定します。この enum には、以下の定数が含まれています。

  • LocalStorageScope.Instance。保存されたデータは、特定のcBot/インジケーターの実行インスタンスのみがアクセス可能です。情報は Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/ ディレクトリに保存されます。このパス内で、"AlgoType" はローカルストレージを使用するcTrader拡張機能の種類(cBots または Indicators)を表し、AlgoName は特定のcBot/インジケーターの名前を表します。InstanceUniqueIdentifier は、特定のcBot/インジケーターのインスタンスの一意のIDです。
  • LocalStorageScope.Type。保存されたデータは、特定のcBot/インジケーターのすべての実行インスタンスがアクセスできます。情報は Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/ ディレクトリに保存されます。
  • LocalStorageScope.Device。保存されたデータは、現在のデバイス上で実行されているすべてのcBot/インジケーターのインスタンスがアクセスできます。情報は "Documents/cAlgo/LocalStorage/" ディレクトリに保存されます。

次に、SetString() および SetObject() のようなメソッドには、カスタムのローカルストレージスコープを指定できる追加のオーバーロードがあります。例えば、次のコードは文字列を LocalStorageScope.Type に保存します。この文字列は、同じタイプのすべての拡張機能からアクセス可能になります。

1
SetString(Example String, Just an example string, LocalStorageScope.Type);

もし LocalStorageScope がパラメータとして指定されていない場合、LocalStorageScope.Instance がデフォルトで使用されます。

ただし、GetString(string key) および T GetObject<T>(string key) メソッドについてはこの動作が異なります。これらのメソッドがローカルストレージスコープを指定せずに呼び出された場合、指定されたキーは以下の階層に従ってすべてのスコープで検索されます。

  • インスタンス。
  • タイプ。
  • デバイス。

さらに、異なるローカルストレージスコープごとに独自のディスクスペースの制限があります。

  • LocalStorageScope.Instance は10MBに制限されています。
  • LocalStorageScope.Type は100MBに制限されています。
  • LocalStorageScope.Device は500MBに制限されています。

上記の制限は累積的ではありません。例えば、すでにデバイスレベルのストレージの500MBすべてを使用している場合でも、インスタンスレベルのストレージを使用して情報を保存し、その制限である10MBに達するまでデータを保存することができます。

情報の保存と読み込みの仕組み

ローカルストレージに情報を保存する場合(例:SetString() メソッドを呼び出す)、cTraderはデータを毎分自動的に保存します。データはインスタンスの停止時にも保存されます。

ただし、以下のメソッドを使用して、この動作をカスタマイズすることができます。

  • Flush(LocalStorageScope localStorageScope)。指定されたスコープにすべてのデータを保存します。
  • Reload(LocalStorageScope localStorageScope)。指定されたスコープからすべての値を再読み込みします。

ただし、Reload(LocalStorageScope localStorageScope メソッドを呼び出すと、保留中の変更が失われる可能性があることを忘れないでください。これを避けるために、事前に Flush(LocalStorageScope localStorageScope) を呼び出してください。

以下の例では、cBotにマーケットオーダーを実行するよう依頼しています。このアクションが完了した後、すぐに開いたポジションの総利益を LocalStorageScope.Type に保存します。

1
2
3
4
5
ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, Custom label);
var positionOne = Positions.Find("Custom label");        
string positionOneGrossProfit = positionOne.GrossProfit.ToString();
LocalStorage.SetString("Position 1", positionOneGrossProfit, LocalStorageScope.Device); 
LocalStorage.Flush(LocalStorageScope.Device);

バックテストと最適化におけるローカルストレージ

ローカルストレージは、リアルタイム取引とバックテストでは動作が異なります。

前述のように、リアルタイム取引でこの機能が使用される場合、ローカルストレージはローカルマシンのファイルシステムを使用します。しかし、バックテストでファイルシステムを使用すると、現在の市場の動きや取引操作に関連しない大量のデータが保存されるという問題が発生します。

これらの問題を回避するために、バックテストやcBotの最適化を行う際、すべてのローカルストレージ操作はメモリ内でのみ実行されます。結果として、ファイルシステムに保存されるデータはリアルタイム取引に関するものだけとなります。

まとめると、ローカルストレージは複数のcBotやインジケーターの停止/起動間でデータを持続させることができるAlgo APIの非常に有用な機能です。ローカルストレージを効果的に活用することで、ファイルシステムに保存されたカスタムデータに基づいて複雑な自動取引戦略を作成することができます。

目次

このページについて