変数の値をcTraderに保存する
インジケーターやcBotで使った変数などをプログラム停止後も保持しておくことができる機能です。cTrader4.6でやっとできるようになりました。
これによりインジケーター間の連携や、時間足切り替え時のデータ引き継ぎなどがより自然に行えるようになりました。
インジケーターやcBot同士でデータを共有するには「ローカルストレージ」という機能を利用します。
ブラウザで使うローカルストレージとは全くの別物です。cTrader専用のローカルストレージで、MyDocument\cAlgo\LocalStorageというフォルダにファイルとして保存されるようになっています。
LocalStorageインターフェイス
public interface LocalStorage
cTrader用ローカルストレージに対する操作はすべてこのLocalStorageインターフェイスを介して行います。
メソッド
(void) SetString(string key, string value, [LocalStorageScope localStorageScope]);
文字列をローカルストレージに保存します。LocalStorageScopeはデフォルトでInstanceのため、特に指定しない場合、保存したデータは同じインジケーターからしか利用できません。
(void) SetObject(string key, object obj, [LocalStorageScope localStorageScope]);
オブジェクトをローカルストレージに保存します。LocalStorageScopeはデフォルトでInstance
(string) GetString(string key, [LocalStorageScope localStorageScope]);
指定したキーの文字列データをローカルストレージから取得します。LocalStorageScopeを指定しなかった場合は、Instance、Type、Deviceの順に探して最初に見つかったものが取得されます。見つからなければ空文字列が返ります。
(T) GetObject<T>(string key, [LocalStorageScope localStorageScope]);
指定したキーのオブジェクトデータをローカルストレージから取得します。Tは「保存されてる型」です。LocalStorageScopeを指定しなかった場合は、Instance、Type、Deviceの順に探して最初に見つかったものが取得されます。見つからなければnullが返ります。
(void) Remove(string key, [LocalStorageScope localStorageScope]);
指定したキーのデータをローカルストレージから削除します。LocalStorageScopeを指定しなかった場合は、Instance、Type、Deviceの順に探して最初に見つかったものが削除されます。
(void) Flush(LocalStorageScope localStorageScope);
指定したスコープのローカルストレージデータを保存します。(基本的にローカルストレージのデータは自動的に1分ごとに保存されます。このメソッドはすぐにLocalStorageに反映させたいときに使用します)
(void) Reload(LocalStorageScope localStorageScope);
指定したスコープのローカルストレージデータを再読込します。このときに未保存のデータがあると消えてしまうため、事前にSetStringなどしてる場合は先にFlushを呼んでからReloadを呼び出しましょう。
補足
ローカルストレージ機能ではSetStringやGetStringするごとにファイル入出力を行っているわけではなく、一定間隔でためたデータを保存、読み込みをするようになっています。
そのため、遅延なくインジケーター間でデータ共有したい場合は必要に応じてFlushとReloadというメソッドを呼んでやる必要があります。
オブジェクトを保存したい場合は構造体(struct)が無難です。SetObjectはなんでも保存できちゃうんですが、GetObjectは自作クラスだと結構失敗します。TimeFrameなども取得できません。(cTrader4.6.3~cTrader4.7.9で確認)
keyは最大50文字で基本は半角英数字で一部記号も利用できます。/や%などファイル名に使用できない記号は使えません。あとなぜか_(アンダスコア)もエラーが出ます。スペースは最初と最後でなければ利用できるようです。
データはすべて平文でjsonで保存されるため、パスワードなど見られたらまずいデータを保存してはいけません。
SetObjectでもバイナリで保存されるわけではなくすべてjsonで保存されるため、「とりあえずオブジェクトごと保存しといたら実は中に機密データ持ってて丸見えに」なんてことないように気をつけましょう。
LocalStorageScope列挙型
ローカルストレージに保存されるデータのスコープ(アクセスできる範囲)を表します。
Instance | 同じインスタンスでのみデータを読み出せます。 |
Type | 同じインジケーター/cBotでのみデータを読み出せます。 |
Device | 同じPC内すべてのcBot/Instanceからデータを読み出せます。 |
狭い順にInstance->Type->Deviceです。スコープは必要最小限のものを使用する方が良いでしょう。
再起動時や時間足切り替え時にデータを持ち越したいだけであればInstance, 別のチャートで動く同じインジケーター間で連携させたいならType, 別のインジケーター/cBot間で連携したいならDeviceといった具合に選択します。