로컬 스토리지 작업 방법
이 글과 해당 동영상에서는 로컬 스토리지가 무엇인지와 cTrader 알고리즘에서 어떻게 사용할 수 있는지 설명합니다. 또한 유용한 예제를 제공하고 로컬 스토리지 범위가 어떻게 작동하는지 설명합니다.
로컬 스토리지를 사용하는 이유
알고리즘이 로컬 파일 시스템에 무언가를 저장하거나 접근하길 원하는 경우가 많습니다. 예를 들어, 모든 cBot 작업의 로그를 저장하고 싶을 수 있습니다. 그러나 이는 일반적으로 알고리즘이 높은 접근 권한(AccessRights.FullAccess)을 요구하며, 이는 사용자에게 이상적이지 않습니다. 알고리즘이 사용자에게 높은 권한을 요구하면, 특히 소스 코드 없이 배포된 경우 사용자는 알고리즘을 신뢰하기 어려워집니다. 로컬 스토리지는 보안 문제를 일으키지 않으면서 로컬 파일 시스템에 안전하게 접근할 수 있는 편리한 방법입니다. 로컬 스토리지를 사용하면 개발자가 알고리즘의 접근 권한을 AccessRights.None으로 유지할 수 있습니다.
로컬 스토리지에 문자열 저장하기
모든 유형의 cTrader 알고리즘은 읽기 및 쓰기 작업을 실행할 수 있는 LocalStorage 속성을 가지고 있습니다. 로컬 스토리지가 어떻게 작동하는지 보여주기 위해 새로운 cBot을 생성하겠습니다. OnStart 핸들러에서 LocalStorage.SetString(string key, string value) 메서드를 사용할 것입니다. 보시다시피, 이 메서드는 정보가 저장될 키와 저장될 값 두 가지 인수를 받습니다.
1 | |
값을 검색하기 위해 cBot의 OnTick 핸들러에서 GetString(string key) 메서드를 사용할 것입니다.
1 | |
Message가 null이 아니면 cBot을 빌드하고 로그에 검색된 값이 올바르게 출력되는 것을 확인할 수 있습니다.
로컬 스토리지에 객체 저장하기
문자열 외에도 로컬 스토리지를 사용하여 모든 종류의 객체를 저장할 수 있습니다. cTrader는 로컬 스토리지에서 객체를 직렬화 및 역직렬화하여 모든 종류의 데이터를 공유할 수 있도록 합니다. 이를 보여주기 위해 정보를 저장할 새로운 클래스를 생성하고 저장한 후 나중에 검색할 수 있습니다. 이 클래스를 Signal이라고 명명하겠습니다.
1 2 3 4 5 6 | |
OnStart() 메서드에서 이 클래스의 새 인스턴스를 생성하고 속성을 초기화할 것입니다.
1 2 3 4 5 | |
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 | |
cBot을 빌드하고 실행하면 로그에 올바른 값이 출력되는 것을 확인할 수 있습니다.
로컬 스토리지의 범위
로컬 스토리지를 사용할 때 저장된 값이 향후 검색을 위해 노출되는 범위를 정의할 수도 있습니다. 세 가지 다른 범위가 있습니다:
- 인스턴스 범위 - 저장된 값은 특정 인스턴스에서만 사용 가능합니다.
- 유형 범위 - 저장된 값은 특정 알고리즘의 모든 인스턴스에서 사용 가능합니다.
- 장치 범위 - 저장된 값은 유형에 관계없이 모든 알고리즘에서 사용 가능합니다.
다음은 인스턴스 범위를 사용하는 예입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
SetString() 메서드에서 범위를 명시적으로 지정했습니다.
이 cBot의 여러 인스턴스를 추가하고 하나는 로컬 스토리지에 쓰고 다른 하나는 정보를 검색하도록 구성할 수 있습니다. 이 경우 정보 읽기는 불가능해야 합니다. 그러나 쓰기 및 읽기 작업을 모두 실행하도록 하나의 인스턴스만 설정된 경우 cBot은 의도한 대로 작동해야 합니다.
다음은 유형 범위를 사용하는 예입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
이 봇의 두 인스턴스를 생성하고 하나는 로컬 스토리지에 쓰고 다른 하나는 저장된 값을 읽도록 설정하면 모든 것이 오류 없이 작동해야 합니다.
마지막으로, 장치 범위를 사용하면 다른 알고리즘 간에 정보를 교환할 수 있습니다. 다음은 이 범위 유형을 사용하는 예입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
동일한 코드를 사용하는 여러 cBot을 빌드할 수 있습니다. 올바르게 설정하면 하나의 cBot이 로컬 스토리지에 정보를 저장하고 다른 하나가 이를 검색할 수 있습니다. 범위가 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 | |
이 코드로 여러 cBot을 빌드하고 다른 cTrader 인스턴스 간에 정보를 공유하는 실험을 수행하면 저장된 값이 의도한 대로 유지되는 것을 확인할 수 있습니다.