콘텐츠로 이동

로컬 스토리지

이 가이드에서는 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 및 지표의 여러 시작과 중지 간에 정보를 저장하는 방법으로 생각하세요. 이 기능을 통해 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는 10 MB로 제한됩니다.
  • LocalStorageScope.Type는 100 MB로 제한됩니다.
  • LocalStorageScope.Device는 500 MB로 제한됩니다.

위에서 정의된 제한은 누적되지 않습니다. 예를 들어, 이미 장치 수준 저장 공간 500 MB를 모두 사용한 경우에도 인스턴스 수준 저장 공간을 사용하여 정보를 저장할 수 있으며, 이는 10 MB 제한에 도달할 때까지 가능합니다.

정보 저장 및 로드 작동 방식

로컬 스토리지에 정보를 저장할 때(예: 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의 매우 유용한 기능입니다. 로컬 스토리지를 효과적으로 사용하면 파일 시스템에 저장된 사용자 정의 데이터를 기반으로 복잡한 자동화된 거래 전략을 만들 수 있습니다.