feat: contract codegen baseline - add proto code generation for client and server

- Add proto files for backtest and market domains
- Generate Go code in packages/contracts/gen/go
- Generate Dart code in apps/client/lib/src/generated
- Add contracts-gen and contracts-check binaries
- Update pubspec.yaml with protoc dependencies
- Update go.work with new module
This commit is contained in:
toki 2026-05-28 05:29:03 +09:00
parent fe7604b0fd
commit 88c673d973
31 changed files with 5130 additions and 15 deletions

View file

@ -26,31 +26,24 @@ proto-socket을 transport로 유지하면서 ALT application protobuf 계약을
- contract compatibility note - contract compatibility note
- generated output 검증 명령 - generated output 검증 명령
## 필수 기능 ## 기능
### Epic: [contracts] Contract schema and codegen ### Epic: [contracts] Contract schema and codegen
ALT application protobuf 계약과 generated output 검증 흐름을 묶는다. ALT application protobuf 계약과 generated output 검증 흐름을 묶는다.
- [ ] [schema-baseline] `common.proto`, `market.proto`, `backtest.proto`가 MVP payload 기준을 담는다. - [ ] [schema-baseline] `common.proto`, `market.proto`, `backtest.proto`가 MVP payload 기준을 담는다.
- [ ] [go-codegen] Go generated contract를 반복 생성할 수 있는 명령이 있다. - [ ] [go-codegen] Go generated contract를 반복 생성할 수 있는 명령이 있다. 검증: 문서화된 Go contract generation 명령이 로컬에서 실행된다.
- [ ] [dart-codegen] Flutter client가 사용할 Dart generated contract를 반복 생성할 수 있는 명령이 있다. - [ ] [dart-codegen] Flutter client가 사용할 Dart generated contract를 반복 생성할 수 있는 명령이 있다. 검증: 문서화된 Dart contract generation 명령이 로컬에서 실행된다.
- [ ] [parser-map] API/client에서 contract message parser map을 구성할 표준 위치와 패턴이 정해져 있다. - [ ] [parser-map] API/client에서 contract message parser map을 구성할 표준 위치와 패턴이 정해져 있다.
- [ ] [compat-note] additive change, field number, versioning 기준이 contracts 문서에 정리되어 있다. - [ ] [compat-note] additive change, field number, versioning 기준과 proto-socket transport proto / ALT application proto 책임 분리가 contracts 문서에 정리되어 있다.
- [ ] [contract-check] root 검증 또는 contracts 검증 명령이 schema/codegen drift를 감지한다. - [ ] [contract-check] root 검증 또는 contracts 검증 명령이 schema/codegen drift를 감지한다. 검증: generated output을 source schema와 대조할 수 있고 `bin/test`, `bin/lint`가 contract 변경 후 통과한다.
## 완료 기준
- [ ] Go와 Dart contract generation 명령이 문서화되어 있고 로컬에서 실행된다.
- [ ] generated output은 source schema와 함께 검증할 수 있다.
- [ ] proto-socket transport proto와 ALT application proto의 책임이 문서에서 분리되어 있다.
- [ ] `bin/test``bin/lint`가 contract 변경 후 통과한다.
## 완료 리뷰 ## 완료 리뷰
- 상태: 없음 - 상태: 없음
- 요청일: 없음 - 요청일: 없음
- 완료 근거: 아직 필수 기능과 완료 기준이 충족되지 않았다. - 완료 근거: 아직 기능 Task와 Task별 검증이 충족되지 않았다.
- 리뷰 필요: - 리뷰 필요:
- [ ] 사용자가 완료 결과를 확인했다 - [ ] 사용자가 완료 결과를 확인했다
- [ ] archive 이동을 승인했다 - [ ] archive 이동을 승인했다

View file

@ -0,0 +1,111 @@
<!-- task=m-contract-codegen-baseline/03+02_api_parser_map plan=0 tag=API -->
# Code Review Reference - API
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.
## 개요
date=2026-05-28
task=m-contract-codegen-baseline/03+02_api_parser_map, plan=0, tag=API
## 이 파일을 읽는 리뷰 에이전트에게
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G06.md``code_review_cloud_G06_N.log`, `PLAN-cloud-G06.md``plan_cloud_G06_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/03+02_api_parser_map/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
---
## 구현 항목별 완료 여부
| 항목 | 완료 여부 |
|------|---------|
| [API-1] API contract parser map helper | [ ] |
| [API-2] Wire parser map into socket server | [ ] |
## 구현 체크리스트
- [ ] [API-1] API 내부 contract parser map helper와 unit test를 추가한다.
- [ ] [API-2] socket server construction이 API parser map을 사용하도록 연결하고 module dependency를 정리한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
## 코드리뷰 전용 체크리스트
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
- [ ] `코드리뷰 결과``PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [ ] active `CODE_REVIEW-*-G??.md``code_review_cloud_G06_N.log`로 아카이브한다.
- [ ] active `PLAN-*-G??.md``plan_cloud_G06_M.log`로 아카이브한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/m-contract-codegen-baseline/03+02_api_parser_map/``agent-task/archive/YYYY/MM/m-contract-codegen-baseline/03+02_api_parser_map/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-contract-codegen-baseline/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G06.md``CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
## 계획 대비 변경 사항
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
## 주요 설계 결정
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
## 리뷰어를 위한 체크포인트
- API parser map이 모든 generated request/response payload를 등록하는지 확인한다.
- parser helper가 package-level mutable map을 공유하지 않는지 확인한다.
- `server.go`가 empty parser map 대신 API parser map을 쓰는지 확인한다.
## 검증 결과
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
### API-1 중간 검증
```bash
$ cd services/api && go test ./internal/contracts
(output)
```
### API-2 중간 검증
```bash
$ cd services/api && go test ./...
(output)
```
### 최종 검증
```bash
$ cd services/api && go test ./...
(output)
$ bin/test
(output)
$ bin/lint
(output)
```
---
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

View file

@ -0,0 +1,188 @@
<!-- task=m-contract-codegen-baseline/03+02_api_parser_map plan=0 tag=API -->
# Plan - API Parser Map
## 이 파일을 읽는 구현 에이전트에게
`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 반드시 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종화는 code-review 스킬 전용이다.
## 배경
Go API는 proto-socket session boundary를 맡지만 현재 ALT application payload parser map을 등록하지 않는다. `02+01_codegen_check`가 generated Go contracts를 만든 뒤, API 내부에 표준 parser map 위치를 두면 다음 `Socket Session Loop` Milestone에서 handshake/request-response를 바로 얹을 수 있다.
## 분석 결과
### 읽은 파일
- `agent-roadmap/current.md`
- `agent-roadmap/phase/foundation-alignment/PHASE.md`
- `agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md`
- `agent-ops/rules/project/domain/api/rules.md`
- `agent-ops/rules/project/domain/contracts/rules.md`
- `services/api/go.mod`
- `services/api/internal/socket/server.go`
- `services/api/internal/config/config.go`
- `services/api/cmd/alt-api/main.go`
- `packages/contracts/proto/alt/v1/common.proto`
- `packages/contracts/proto/alt/v1/market.proto`
- `packages/contracts/proto/alt/v1/backtest.proto`
- `../proto-socket/go/communicator.go`
- `bin/test`
- `bin/lint`
### 테스트 커버리지 공백
- API parser map helper: 기존 테스트 없음. 새 unit test가 모든 ALT request/response/result message key와 parse success를 검증해야 한다.
- `socket.NewServer` parser map 주입: 기존 테스트 없음. 최소한 helper가 non-empty이고 server construction이 컴파일되는 것을 `go test ./...`로 검증한다.
### 심볼 참조
- renamed/removed symbols: none.
### 분할 판단
분할 정책을 먼저 평가했다. 이 plan은 `03+02_api_parser_map`이며 `02+01_codegen_check``complete.log`를 만든 뒤 시작한다. Client Dart parser map은 별도 `04+02_client_parser_map`에서 병렬 처리한다.
### 범위 결정 근거
이 subtask는 `services/api/**`와 API module dependency만 다룬다. Flutter client parser map, UI, actual request handlers, worker execution은 범위 밖이다.
### 빌드 등급
build=`cloud-G06`, review=`cloud-G06`. Protocol parser registration이 API runtime boundary에 들어가고 generated module dependency를 추가하므로 cloud review가 필요하다.
## 의존 관계 및 구현 순서
`03+02_api_parser_map`은 같은 task group의 `02+01_codegen_check``complete.log`를 만든 뒤 시작한다. 이 의존성은 directory name의 `+02`가 source of truth다.
## 구현 체크리스트
- [ ] [API-1] API 내부 contract parser map helper와 unit test를 추가한다.
- [ ] [API-2] socket server construction이 API parser map을 사용하도록 연결하고 module dependency를 정리한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
### [API-1] API contract parser map helper
#### 문제
`../proto-socket/go/communicator.go:20``ParserMap``map[string]func([]byte) (proto.Message, error)`이고, parser가 없으면 `../proto-socket/go/communicator.go:304`에서 error를 반환한다. ALT API에는 generated `alt.v1` messages를 parser map으로 묶는 표준 위치가 없다.
Before:
```go
// ../proto-socket/go/communicator.go:304
func (c *Communicator) parse(typeName string, data []byte) (proto.Message, error) {
c.mu.RLock()
parser := c.parserMap[typeName]
c.mu.RUnlock()
if parser == nil {
return nil, fmt.Errorf("protobuf parser is not registered for type %s", typeName)
}
return parser(data)
}
```
해결 후 형태:
```go
package contracts
func ParserMap() protoSocket.ParserMap {
return protoSocket.ParserMap{
protoSocket.TypeNameOf(&altv1.HelloRequest{}): parserFor(func() proto.Message { return &altv1.HelloRequest{} }),
}
}
```
#### 해결 방법
`services/api/internal/contracts/parser_map.go`를 만들고 generated `altv1` message 전체를 등록한다. request/response/result payload를 모두 포함하고 helper는 map을 새로 반환해 호출자가 mutate해도 package 전역 상태가 생기지 않게 한다.
#### 수정 파일 및 체크리스트
- [ ] `services/api/internal/contracts/parser_map.go`: `ParserMap()`과 shared `parserFor` helper 추가.
- [ ] `services/api/internal/contracts/parser_map_test.go`: map keys와 parse success 검증.
- [ ] `services/api/go.mod`: generated Go module require 추가.
#### 테스트 작성
작성한다. `TestParserMapIncludesAltMessages``HelloRequest`, `HelloResponse`, `ListInstrumentsRequest`, `ListInstrumentsResponse`, `ListBarsRequest`, `ListBarsResponse`, `StartBacktestRequest`, `StartBacktestResponse`, `GetBacktestRunRequest`, `GetBacktestRunResponse`, `GetBacktestResultRequest`, `GetBacktestResultResponse`, `BacktestResult`를 등록/parse한다.
#### 중간 검증
```bash
cd services/api && go test ./internal/contracts
```
기대 결과: exit 0.
### [API-2] Wire parser map into socket server
#### 문제
`services/api/internal/socket/server.go:12``protoSocket.ParserMap{}`를 전달해 ALT payload가 들어와도 parse할 수 없다.
Before:
```go
// services/api/internal/socket/server.go:10
func NewServer(cfg config.Config) *protoSocket.WsServer {
return protoSocket.NewWsServer(cfg.Host, cfg.Port, cfg.SocketPath, func(conn *websocket.Conn) *protoSocket.WsClient {
return protoSocket.NewWsClient(conn, cfg.HeartbeatIntervalSec, cfg.HeartbeatWaitSec, protoSocket.ParserMap{})
})
}
```
해결 후 형태:
```go
import (
apiContracts "git.toki-labs.com/toki/alt/services/api/internal/contracts"
)
return protoSocket.NewWsClient(conn, cfg.HeartbeatIntervalSec, cfg.HeartbeatWaitSec, apiContracts.ParserMap())
```
#### 해결 방법
`server.go`에서 API contracts helper를 import하고 `NewWsClient``apiContracts.ParserMap()`을 전달한다. `go mod tidy`로 generated contract module dependency를 정리한다.
#### 수정 파일 및 체크리스트
- [ ] `services/api/internal/socket/server.go`: empty parser map을 API parser map으로 교체.
- [ ] `services/api/go.mod`: generated contract module dependency 유지.
- [ ] `services/api/go.sum`: 필요한 checksum 변경 반영.
#### 테스트 작성
별도 socket server unit test는 작성하지 않는다. 이 subtask는 parser map helper unit test와 `go test ./...` 컴파일 검증으로 충분하다. 실제 handshake/request-response behavior는 후속 `Socket Session Loop` Milestone 범위다.
#### 중간 검증
```bash
cd services/api && go test ./...
```
기대 결과: exit 0.
## 수정 파일 요약
| 파일 | 항목 |
|------|------|
| `services/api/internal/contracts/parser_map.go` | API-1 |
| `services/api/internal/contracts/parser_map_test.go` | API-1 |
| `services/api/internal/socket/server.go` | API-2 |
| `services/api/go.mod` | API-1, API-2 |
| `services/api/go.sum` | API-2 |
## 최종 검증
```bash
cd services/api && go test ./...
bin/test
bin/lint
```
기대 결과: 모든 명령 exit 0. Go test cache output은 허용한다.
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.

View file

@ -0,0 +1,113 @@
<!-- task=m-contract-codegen-baseline/04+02_client_parser_map plan=0 tag=API -->
# Code Review Reference - API
> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> The task is NOT complete until every implementation-owned section below is filled in.
> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving.
> Fill implementation-owned sections, then stop with active files in place and report ready for review.
> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume.
> Follow the ownership table at the bottom of this file for which sections you own.
## 개요
date=2026-05-28
task=m-contract-codegen-baseline/04+02_client_parser_map, plan=0, tag=API
## 이 파일을 읽는 리뷰 에이전트에게
> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다.
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다.
1. 판정을 append한다.
2. `CODE_REVIEW-cloud-G06.md``code_review_cloud_G06_N.log`, `PLAN-cloud-G06.md``plan_cloud_G06_M.log`로 아카이브한다.
3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/04+02_client_parser_map/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다.
4. PASS이고 task group이 `m-<milestone-slug>`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다.
5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다.
---
## 구현 항목별 완료 여부
| 항목 | 완료 여부 |
|------|---------|
| [API-1] Flutter parser map helper | [ ] |
| [API-2] Client contract location documentation | [ ] |
## 구현 체크리스트
- [ ] [API-1] Flutter client contract parser map helper와 unit test를 추가한다.
- [ ] [API-2] client README에 generated contract와 parser map 표준 위치를 문서화한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
## 코드리뷰 전용 체크리스트
> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.
> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다.
- [ ] `코드리뷰 결과``PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [ ] active `CODE_REVIEW-*-G??.md``code_review_cloud_G06_N.log`로 아카이브한다.
- [ ] active `PLAN-*-G??.md``plan_cloud_G06_M.log`로 아카이브한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/m-contract-codegen-baseline/04+02_client_parser_map/``agent-task/archive/YYYY/MM/m-contract-codegen-baseline/04+02_client_parser_map/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-contract-codegen-baseline/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G06.md``CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
## 계획 대비 변경 사항
_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._
## 주요 설계 결정
_구현 에이전트가 주요 설계 결정 사항을 기록한다._
## 리뷰어를 위한 체크포인트
- Client parser map이 generated message qualified names를 key로 쓰는지 확인한다.
- Helper가 presentation/UI layer에 의존하지 않는지 확인한다.
- Test가 generated Dart files를 실제 import/parse하는지 확인한다.
## 검증 결과
_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._
필수 규칙:
- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다.
- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다.
- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다.
### API-1 중간 검증
```bash
$ cd apps/client && flutter test test/contracts/alt_contracts_test.dart
(output)
```
### API-2 중간 검증
```bash
$ rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md
(output)
```
### 최종 검증
```bash
$ cd apps/client && flutter test test/contracts/alt_contracts_test.dart
(output)
$ rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md
(output)
$ bin/test
(output)
$ bin/lint
(output)
```
---
> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?**
> If anything is blank, go back and fill it in before saving this file.
> Leave review-agent-only sections unchanged.

View file

@ -0,0 +1,184 @@
<!-- task=m-contract-codegen-baseline/04+02_client_parser_map plan=0 tag=API -->
# Plan - Client Parser Map
## 이 파일을 읽는 구현 에이전트에게
`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 반드시 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종화는 code-review 스킬 전용이다.
## 배경
Flutter client는 generated ALT contracts를 소비해야 하지만 현재 parser map 표준 위치가 없다. `02+01_codegen_check`가 Dart generated output을 만든 뒤, `lib/src/contracts`에 작은 helper를 두면 후속 socket client adoption이 UI와 generated code를 직접 엮지 않아도 된다.
## 분석 결과
### 읽은 파일
- `agent-roadmap/current.md`
- `agent-roadmap/phase/foundation-alignment/PHASE.md`
- `agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md`
- `agent-ops/rules/project/domain/client/rules.md`
- `agent-ops/rules/project/domain/contracts/rules.md`
- `apps/client/pubspec.yaml`
- `apps/client/README.md`
- `apps/client/lib/main.dart`
- `apps/client/lib/src/app/app.dart`
- `apps/client/lib/src/app/router.dart`
- `apps/client/lib/src/features/dashboard/presentation/dashboard_screen.dart`
- `apps/client/test/widget_test.dart`
- `packages/contracts/proto/alt/v1/common.proto`
- `packages/contracts/proto/alt/v1/market.proto`
- `packages/contracts/proto/alt/v1/backtest.proto`
- `../proto-socket/dart/lib/src/communicator.dart`
- `bin/test`
- `bin/lint`
### 테스트 커버리지 공백
- Client parser map helper: 기존 테스트 없음. 새 Dart unit test가 qualified message name keys와 fromBuffer parse success를 검증해야 한다.
- Generated Dart import stability: 기존 widget test는 generated contracts를 import하지 않는다. 새 parser map test가 generated files를 컴파일 경로에 포함한다.
### 심볼 참조
- renamed/removed symbols: none.
### 분할 판단
분할 정책을 먼저 평가했다. 이 plan은 `04+02_client_parser_map`이며 `02+01_codegen_check``complete.log`를 만든 뒤 시작한다. API parser map은 별도 `03+02_api_parser_map`으로 분리되어 있고, 두 subtask는 codegen 이후 병렬 가능하다.
### 범위 결정 근거
이 subtask는 `apps/client/lib/src/contracts`, generated Dart imports, client tests, client README만 다룬다. Socket connection lifecycle, WebSocket configuration, UI state, Go API 변경은 범위 밖이다.
### 빌드 등급
build=`cloud-G06`, review=`cloud-G06`. Generated Dart contracts와 proto-socket wire type conventions를 client boundary에 묶는 protocol/client 작업이다.
## 의존 관계 및 구현 순서
`04+02_client_parser_map`은 같은 task group의 `02+01_codegen_check``complete.log`를 만든 뒤 시작한다. 이 의존성은 directory name의 `+02`가 source of truth다.
## 구현 체크리스트
- [ ] [API-1] Flutter client contract parser map helper와 unit test를 추가한다.
- [ ] [API-2] client README에 generated contract와 parser map 표준 위치를 문서화한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
### [API-1] Flutter parser map helper
#### 문제
`apps/client/README.md:5`는 ALT protobuf bindings를 `lib/src` 아래에 추가하라고만 안내한다. `../proto-socket/dart/lib/src/communicator.dart:45``Map<String, GeneratedMessage Function(List<int>)>` parser map을 요구하고, `../proto-socket/dart/lib/src/communicator.dart:98`은 outgoing `typeName``data.info_.qualifiedMessageName`을 쓴다. Client에는 generated ALT messages의 qualified names를 모으는 helper가 없다.
Before:
```markdown
<!-- apps/client/README.md:5 -->
This app uses Riverpod for state and dependency boundaries, and `go_router` for navigation. ALT protobuf bindings and the proto-socket client layer should be added under `lib/src` after `packages/contracts` generation is introduced.
```
```dart
// ../proto-socket/dart/lib/src/communicator.dart:45
void initialize(
Map<String, GeneratedMessage Function(List<int>)> instanceGenerator,
{required Transport transport}) {
_instanceGenerator = instanceGenerator;
_transport = transport;
}
```
해결 후 형태:
```dart
import 'package:protobuf/protobuf.dart';
Map<String, GeneratedMessage Function(List<int>)> altParserMap() {
return {
HelloRequest.getDefault().info_.qualifiedMessageName: HelloRequest.fromBuffer,
HelloResponse.getDefault().info_.qualifiedMessageName: HelloResponse.fromBuffer,
};
}
```
#### 해결 방법
`apps/client/lib/src/contracts/alt_contracts.dart`를 만들고 generated `common.pb.dart`, `market.pb.dart`, `backtest.pb.dart`의 request/response/result message를 등록한다. helper는 새 map을 반환하고, UI/presentation layer에는 import하지 않는다.
#### 수정 파일 및 체크리스트
- [ ] `apps/client/lib/src/contracts/alt_contracts.dart`: `altParserMap()` 추가.
- [ ] `apps/client/test/contracts/alt_contracts_test.dart`: qualified key와 parse success 검증.
#### 테스트 작성
작성한다. `altParserMap contains generated ALT message parsers``HelloRequest`, `HelloResponse`, `ListInstrumentsRequest`, `ListInstrumentsResponse`, `ListBarsRequest`, `ListBarsResponse`, `StartBacktestRequest`, `StartBacktestResponse`, `GetBacktestRunRequest`, `GetBacktestRunResponse`, `GetBacktestResultRequest`, `GetBacktestResultResponse`, `BacktestResult`를 map에서 찾아 `fromBuffer` round-trip으로 검증한다.
#### 중간 검증
```bash
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
```
기대 결과: exit 0.
### [API-2] Client contract location documentation
#### 문제
`apps/client/README.md:5`의 문장은 codegen 도입 전 placeholder라서 generated output path와 parser map helper 위치를 알려주지 않는다.
Before:
```markdown
<!-- apps/client/README.md:5 -->
ALT protobuf bindings and the proto-socket client layer should be added under `lib/src` after `packages/contracts` generation is introduced.
```
해결 후 형태:
```markdown
Generated ALT protobuf files live under `lib/src/generated/alt/v1`.
Client parser map helpers live under `lib/src/contracts`.
Do not edit generated files by hand; run `../../bin/contracts-gen`.
```
#### 해결 방법
README에 generated output path, parser map helper path, regeneration command만 짧게 남긴다.
#### 수정 파일 및 체크리스트
- [ ] `apps/client/README.md`: generated contract and parser map section 추가.
#### 테스트 작성
문서 변경이므로 테스트 파일은 작성하지 않는다. deterministic search로 앵커 존재를 확인한다.
#### 중간 검증
```bash
rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md
```
기대 결과: 모든 앵커가 검색된다.
## 수정 파일 요약
| 파일 | 항목 |
|------|------|
| `apps/client/lib/src/contracts/alt_contracts.dart` | API-1 |
| `apps/client/test/contracts/alt_contracts_test.dart` | API-1 |
| `apps/client/README.md` | API-2 |
## 최종 검증
```bash
cd apps/client && flutter test test/contracts/alt_contracts_test.dart
rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md
bin/test
bin/lint
```
기대 결과: 모든 명령 exit 0. Flutter test cache output은 해당 없음.
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.

View file

@ -0,0 +1,664 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/backtest.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb;
import 'backtest.pbenum.dart';
import 'common.pbenum.dart' as $1;
import 'market.pb.dart' as $0;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'backtest.pbenum.dart';
class BacktestRunSpec extends $pb.GeneratedMessage {
factory BacktestRunSpec({
$core.String? strategyId,
$1.Market? market,
$1.Timeframe? timeframe,
$fixnum.Int64? fromUnixMs,
$fixnum.Int64? toUnixMs,
}) {
final result = create();
if (strategyId != null) result.strategyId = strategyId;
if (market != null) result.market = market;
if (timeframe != null) result.timeframe = timeframe;
if (fromUnixMs != null) result.fromUnixMs = fromUnixMs;
if (toUnixMs != null) result.toUnixMs = toUnixMs;
return result;
}
BacktestRunSpec._();
factory BacktestRunSpec.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory BacktestRunSpec.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'BacktestRunSpec',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'strategyId')
..aE<$1.Market>(2, _omitFieldNames ? '' : 'market',
enumValues: $1.Market.values)
..aE<$1.Timeframe>(3, _omitFieldNames ? '' : 'timeframe',
enumValues: $1.Timeframe.values)
..aInt64(4, _omitFieldNames ? '' : 'fromUnixMs')
..aInt64(5, _omitFieldNames ? '' : 'toUnixMs')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestRunSpec clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestRunSpec copyWith(void Function(BacktestRunSpec) updates) =>
super.copyWith((message) => updates(message as BacktestRunSpec))
as BacktestRunSpec;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static BacktestRunSpec create() => BacktestRunSpec._();
@$core.override
BacktestRunSpec createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static BacktestRunSpec getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<BacktestRunSpec>(create);
static BacktestRunSpec? _defaultInstance;
@$pb.TagNumber(1)
$core.String get strategyId => $_getSZ(0);
@$pb.TagNumber(1)
set strategyId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasStrategyId() => $_has(0);
@$pb.TagNumber(1)
void clearStrategyId() => $_clearField(1);
@$pb.TagNumber(2)
$1.Market get market => $_getN(1);
@$pb.TagNumber(2)
set market($1.Market value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasMarket() => $_has(1);
@$pb.TagNumber(2)
void clearMarket() => $_clearField(2);
@$pb.TagNumber(3)
$1.Timeframe get timeframe => $_getN(2);
@$pb.TagNumber(3)
set timeframe($1.Timeframe value) => $_setField(3, value);
@$pb.TagNumber(3)
$core.bool hasTimeframe() => $_has(2);
@$pb.TagNumber(3)
void clearTimeframe() => $_clearField(3);
@$pb.TagNumber(4)
$fixnum.Int64 get fromUnixMs => $_getI64(3);
@$pb.TagNumber(4)
set fromUnixMs($fixnum.Int64 value) => $_setInt64(3, value);
@$pb.TagNumber(4)
$core.bool hasFromUnixMs() => $_has(3);
@$pb.TagNumber(4)
void clearFromUnixMs() => $_clearField(4);
@$pb.TagNumber(5)
$fixnum.Int64 get toUnixMs => $_getI64(4);
@$pb.TagNumber(5)
set toUnixMs($fixnum.Int64 value) => $_setInt64(4, value);
@$pb.TagNumber(5)
$core.bool hasToUnixMs() => $_has(4);
@$pb.TagNumber(5)
void clearToUnixMs() => $_clearField(5);
}
class BacktestRun extends $pb.GeneratedMessage {
factory BacktestRun({
$core.String? id,
BacktestRunSpec? spec,
BacktestRunStatus? status,
$fixnum.Int64? createdAtUnixMs,
$fixnum.Int64? updatedAtUnixMs,
}) {
final result = create();
if (id != null) result.id = id;
if (spec != null) result.spec = spec;
if (status != null) result.status = status;
if (createdAtUnixMs != null) result.createdAtUnixMs = createdAtUnixMs;
if (updatedAtUnixMs != null) result.updatedAtUnixMs = updatedAtUnixMs;
return result;
}
BacktestRun._();
factory BacktestRun.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory BacktestRun.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'BacktestRun',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'id')
..aOM<BacktestRunSpec>(2, _omitFieldNames ? '' : 'spec',
subBuilder: BacktestRunSpec.create)
..aE<BacktestRunStatus>(3, _omitFieldNames ? '' : 'status',
enumValues: BacktestRunStatus.values)
..aInt64(4, _omitFieldNames ? '' : 'createdAtUnixMs')
..aInt64(5, _omitFieldNames ? '' : 'updatedAtUnixMs')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestRun clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestRun copyWith(void Function(BacktestRun) updates) =>
super.copyWith((message) => updates(message as BacktestRun))
as BacktestRun;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static BacktestRun create() => BacktestRun._();
@$core.override
BacktestRun createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static BacktestRun getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<BacktestRun>(create);
static BacktestRun? _defaultInstance;
@$pb.TagNumber(1)
$core.String get id => $_getSZ(0);
@$pb.TagNumber(1)
set id($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => $_clearField(1);
@$pb.TagNumber(2)
BacktestRunSpec get spec => $_getN(1);
@$pb.TagNumber(2)
set spec(BacktestRunSpec value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasSpec() => $_has(1);
@$pb.TagNumber(2)
void clearSpec() => $_clearField(2);
@$pb.TagNumber(2)
BacktestRunSpec ensureSpec() => $_ensure(1);
@$pb.TagNumber(3)
BacktestRunStatus get status => $_getN(2);
@$pb.TagNumber(3)
set status(BacktestRunStatus value) => $_setField(3, value);
@$pb.TagNumber(3)
$core.bool hasStatus() => $_has(2);
@$pb.TagNumber(3)
void clearStatus() => $_clearField(3);
@$pb.TagNumber(4)
$fixnum.Int64 get createdAtUnixMs => $_getI64(3);
@$pb.TagNumber(4)
set createdAtUnixMs($fixnum.Int64 value) => $_setInt64(3, value);
@$pb.TagNumber(4)
$core.bool hasCreatedAtUnixMs() => $_has(3);
@$pb.TagNumber(4)
void clearCreatedAtUnixMs() => $_clearField(4);
@$pb.TagNumber(5)
$fixnum.Int64 get updatedAtUnixMs => $_getI64(4);
@$pb.TagNumber(5)
set updatedAtUnixMs($fixnum.Int64 value) => $_setInt64(4, value);
@$pb.TagNumber(5)
$core.bool hasUpdatedAtUnixMs() => $_has(4);
@$pb.TagNumber(5)
void clearUpdatedAtUnixMs() => $_clearField(5);
}
class StartBacktestRequest extends $pb.GeneratedMessage {
factory StartBacktestRequest({
BacktestRunSpec? spec,
}) {
final result = create();
if (spec != null) result.spec = spec;
return result;
}
StartBacktestRequest._();
factory StartBacktestRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory StartBacktestRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'StartBacktestRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOM<BacktestRunSpec>(1, _omitFieldNames ? '' : 'spec',
subBuilder: BacktestRunSpec.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StartBacktestRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StartBacktestRequest copyWith(void Function(StartBacktestRequest) updates) =>
super.copyWith((message) => updates(message as StartBacktestRequest))
as StartBacktestRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static StartBacktestRequest create() => StartBacktestRequest._();
@$core.override
StartBacktestRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static StartBacktestRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<StartBacktestRequest>(create);
static StartBacktestRequest? _defaultInstance;
@$pb.TagNumber(1)
BacktestRunSpec get spec => $_getN(0);
@$pb.TagNumber(1)
set spec(BacktestRunSpec value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasSpec() => $_has(0);
@$pb.TagNumber(1)
void clearSpec() => $_clearField(1);
@$pb.TagNumber(1)
BacktestRunSpec ensureSpec() => $_ensure(0);
}
class StartBacktestResponse extends $pb.GeneratedMessage {
factory StartBacktestResponse({
BacktestRun? run,
}) {
final result = create();
if (run != null) result.run = run;
return result;
}
StartBacktestResponse._();
factory StartBacktestResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory StartBacktestResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'StartBacktestResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOM<BacktestRun>(1, _omitFieldNames ? '' : 'run',
subBuilder: BacktestRun.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StartBacktestResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StartBacktestResponse copyWith(
void Function(StartBacktestResponse) updates) =>
super.copyWith((message) => updates(message as StartBacktestResponse))
as StartBacktestResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static StartBacktestResponse create() => StartBacktestResponse._();
@$core.override
StartBacktestResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static StartBacktestResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<StartBacktestResponse>(create);
static StartBacktestResponse? _defaultInstance;
@$pb.TagNumber(1)
BacktestRun get run => $_getN(0);
@$pb.TagNumber(1)
set run(BacktestRun value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasRun() => $_has(0);
@$pb.TagNumber(1)
void clearRun() => $_clearField(1);
@$pb.TagNumber(1)
BacktestRun ensureRun() => $_ensure(0);
}
class GetBacktestRunRequest extends $pb.GeneratedMessage {
factory GetBacktestRunRequest({
$core.String? runId,
}) {
final result = create();
if (runId != null) result.runId = runId;
return result;
}
GetBacktestRunRequest._();
factory GetBacktestRunRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory GetBacktestRunRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'GetBacktestRunRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'runId')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestRunRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestRunRequest copyWith(
void Function(GetBacktestRunRequest) updates) =>
super.copyWith((message) => updates(message as GetBacktestRunRequest))
as GetBacktestRunRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static GetBacktestRunRequest create() => GetBacktestRunRequest._();
@$core.override
GetBacktestRunRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static GetBacktestRunRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<GetBacktestRunRequest>(create);
static GetBacktestRunRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get runId => $_getSZ(0);
@$pb.TagNumber(1)
set runId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasRunId() => $_has(0);
@$pb.TagNumber(1)
void clearRunId() => $_clearField(1);
}
class GetBacktestRunResponse extends $pb.GeneratedMessage {
factory GetBacktestRunResponse({
BacktestRun? run,
}) {
final result = create();
if (run != null) result.run = run;
return result;
}
GetBacktestRunResponse._();
factory GetBacktestRunResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory GetBacktestRunResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'GetBacktestRunResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOM<BacktestRun>(1, _omitFieldNames ? '' : 'run',
subBuilder: BacktestRun.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestRunResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestRunResponse copyWith(
void Function(GetBacktestRunResponse) updates) =>
super.copyWith((message) => updates(message as GetBacktestRunResponse))
as GetBacktestRunResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static GetBacktestRunResponse create() => GetBacktestRunResponse._();
@$core.override
GetBacktestRunResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static GetBacktestRunResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<GetBacktestRunResponse>(create);
static GetBacktestRunResponse? _defaultInstance;
@$pb.TagNumber(1)
BacktestRun get run => $_getN(0);
@$pb.TagNumber(1)
set run(BacktestRun value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasRun() => $_has(0);
@$pb.TagNumber(1)
void clearRun() => $_clearField(1);
@$pb.TagNumber(1)
BacktestRun ensureRun() => $_ensure(0);
}
class BacktestResult extends $pb.GeneratedMessage {
factory BacktestResult({
$core.String? runId,
$0.Price? startingCash,
$0.Price? endingEquity,
}) {
final result = create();
if (runId != null) result.runId = runId;
if (startingCash != null) result.startingCash = startingCash;
if (endingEquity != null) result.endingEquity = endingEquity;
return result;
}
BacktestResult._();
factory BacktestResult.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory BacktestResult.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'BacktestResult',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'runId')
..aOM<$0.Price>(2, _omitFieldNames ? '' : 'startingCash',
subBuilder: $0.Price.create)
..aOM<$0.Price>(3, _omitFieldNames ? '' : 'endingEquity',
subBuilder: $0.Price.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestResult clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
BacktestResult copyWith(void Function(BacktestResult) updates) =>
super.copyWith((message) => updates(message as BacktestResult))
as BacktestResult;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static BacktestResult create() => BacktestResult._();
@$core.override
BacktestResult createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static BacktestResult getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<BacktestResult>(create);
static BacktestResult? _defaultInstance;
@$pb.TagNumber(1)
$core.String get runId => $_getSZ(0);
@$pb.TagNumber(1)
set runId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasRunId() => $_has(0);
@$pb.TagNumber(1)
void clearRunId() => $_clearField(1);
@$pb.TagNumber(2)
$0.Price get startingCash => $_getN(1);
@$pb.TagNumber(2)
set startingCash($0.Price value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasStartingCash() => $_has(1);
@$pb.TagNumber(2)
void clearStartingCash() => $_clearField(2);
@$pb.TagNumber(2)
$0.Price ensureStartingCash() => $_ensure(1);
@$pb.TagNumber(3)
$0.Price get endingEquity => $_getN(2);
@$pb.TagNumber(3)
set endingEquity($0.Price value) => $_setField(3, value);
@$pb.TagNumber(3)
$core.bool hasEndingEquity() => $_has(2);
@$pb.TagNumber(3)
void clearEndingEquity() => $_clearField(3);
@$pb.TagNumber(3)
$0.Price ensureEndingEquity() => $_ensure(2);
}
class GetBacktestResultRequest extends $pb.GeneratedMessage {
factory GetBacktestResultRequest({
$core.String? runId,
}) {
final result = create();
if (runId != null) result.runId = runId;
return result;
}
GetBacktestResultRequest._();
factory GetBacktestResultRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory GetBacktestResultRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'GetBacktestResultRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'runId')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestResultRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestResultRequest copyWith(
void Function(GetBacktestResultRequest) updates) =>
super.copyWith((message) => updates(message as GetBacktestResultRequest))
as GetBacktestResultRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static GetBacktestResultRequest create() => GetBacktestResultRequest._();
@$core.override
GetBacktestResultRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static GetBacktestResultRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<GetBacktestResultRequest>(create);
static GetBacktestResultRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get runId => $_getSZ(0);
@$pb.TagNumber(1)
set runId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasRunId() => $_has(0);
@$pb.TagNumber(1)
void clearRunId() => $_clearField(1);
}
class GetBacktestResultResponse extends $pb.GeneratedMessage {
factory GetBacktestResultResponse({
BacktestResult? result,
}) {
final result$ = create();
if (result != null) result$.result = result;
return result$;
}
GetBacktestResultResponse._();
factory GetBacktestResultResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory GetBacktestResultResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'GetBacktestResultResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOM<BacktestResult>(1, _omitFieldNames ? '' : 'result',
subBuilder: BacktestResult.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestResultResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
GetBacktestResultResponse copyWith(
void Function(GetBacktestResultResponse) updates) =>
super.copyWith((message) => updates(message as GetBacktestResultResponse))
as GetBacktestResultResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static GetBacktestResultResponse create() => GetBacktestResultResponse._();
@$core.override
GetBacktestResultResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static GetBacktestResultResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<GetBacktestResultResponse>(create);
static GetBacktestResultResponse? _defaultInstance;
@$pb.TagNumber(1)
BacktestResult get result => $_getN(0);
@$pb.TagNumber(1)
set result(BacktestResult value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasResult() => $_has(0);
@$pb.TagNumber(1)
void clearResult() => $_clearField(1);
@$pb.TagNumber(1)
BacktestResult ensureResult() => $_ensure(0);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,55 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/backtest.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class BacktestRunStatus extends $pb.ProtobufEnum {
static const BacktestRunStatus BACKTEST_RUN_STATUS_UNSPECIFIED =
BacktestRunStatus._(
0, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_UNSPECIFIED');
static const BacktestRunStatus BACKTEST_RUN_STATUS_PENDING =
BacktestRunStatus._(
1, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_PENDING');
static const BacktestRunStatus BACKTEST_RUN_STATUS_RUNNING =
BacktestRunStatus._(
2, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_RUNNING');
static const BacktestRunStatus BACKTEST_RUN_STATUS_SUCCEEDED =
BacktestRunStatus._(
3, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_SUCCEEDED');
static const BacktestRunStatus BACKTEST_RUN_STATUS_FAILED =
BacktestRunStatus._(
4, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_FAILED');
static const BacktestRunStatus BACKTEST_RUN_STATUS_CANCELED =
BacktestRunStatus._(
5, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_CANCELED');
static const $core.List<BacktestRunStatus> values = <BacktestRunStatus>[
BACKTEST_RUN_STATUS_UNSPECIFIED,
BACKTEST_RUN_STATUS_PENDING,
BACKTEST_RUN_STATUS_RUNNING,
BACKTEST_RUN_STATUS_SUCCEEDED,
BACKTEST_RUN_STATUS_FAILED,
BACKTEST_RUN_STATUS_CANCELED,
];
static final $core.List<BacktestRunStatus?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 5);
static BacktestRunStatus? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const BacktestRunStatus._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -0,0 +1,253 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/backtest.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use backtestRunStatusDescriptor instead')
const BacktestRunStatus$json = {
'1': 'BacktestRunStatus',
'2': [
{'1': 'BACKTEST_RUN_STATUS_UNSPECIFIED', '2': 0},
{'1': 'BACKTEST_RUN_STATUS_PENDING', '2': 1},
{'1': 'BACKTEST_RUN_STATUS_RUNNING', '2': 2},
{'1': 'BACKTEST_RUN_STATUS_SUCCEEDED', '2': 3},
{'1': 'BACKTEST_RUN_STATUS_FAILED', '2': 4},
{'1': 'BACKTEST_RUN_STATUS_CANCELED', '2': 5},
],
};
/// Descriptor for `BacktestRunStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List backtestRunStatusDescriptor = $convert.base64Decode(
'ChFCYWNrdGVzdFJ1blN0YXR1cxIjCh9CQUNLVEVTVF9SVU5fU1RBVFVTX1VOU1BFQ0lGSUVEEA'
'ASHwobQkFDS1RFU1RfUlVOX1NUQVRVU19QRU5ESU5HEAESHwobQkFDS1RFU1RfUlVOX1NUQVRV'
'U19SVU5OSU5HEAISIQodQkFDS1RFU1RfUlVOX1NUQVRVU19TVUNDRUVERUQQAxIeChpCQUNLVE'
'VTVF9SVU5fU1RBVFVTX0ZBSUxFRBAEEiAKHEJBQ0tURVNUX1JVTl9TVEFUVVNfQ0FOQ0VMRUQQ'
'BQ==');
@$core.Deprecated('Use backtestRunSpecDescriptor instead')
const BacktestRunSpec$json = {
'1': 'BacktestRunSpec',
'2': [
{'1': 'strategy_id', '3': 1, '4': 1, '5': 9, '10': 'strategyId'},
{
'1': 'market',
'3': 2,
'4': 1,
'5': 14,
'6': '.alt.v1.Market',
'10': 'market'
},
{
'1': 'timeframe',
'3': 3,
'4': 1,
'5': 14,
'6': '.alt.v1.Timeframe',
'10': 'timeframe'
},
{'1': 'from_unix_ms', '3': 4, '4': 1, '5': 3, '10': 'fromUnixMs'},
{'1': 'to_unix_ms', '3': 5, '4': 1, '5': 3, '10': 'toUnixMs'},
],
};
/// Descriptor for `BacktestRunSpec`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List backtestRunSpecDescriptor = $convert.base64Decode(
'Cg9CYWNrdGVzdFJ1blNwZWMSHwoLc3RyYXRlZ3lfaWQYASABKAlSCnN0cmF0ZWd5SWQSJgoGbW'
'Fya2V0GAIgASgOMg4uYWx0LnYxLk1hcmtldFIGbWFya2V0Ei8KCXRpbWVmcmFtZRgDIAEoDjIR'
'LmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIgCgxmcm9tX3VuaXhfbXMYBCABKANSCmZyb2'
'1Vbml4TXMSHAoKdG9fdW5peF9tcxgFIAEoA1IIdG9Vbml4TXM=');
@$core.Deprecated('Use backtestRunDescriptor instead')
const BacktestRun$json = {
'1': 'BacktestRun',
'2': [
{'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
{
'1': 'spec',
'3': 2,
'4': 1,
'5': 11,
'6': '.alt.v1.BacktestRunSpec',
'10': 'spec'
},
{
'1': 'status',
'3': 3,
'4': 1,
'5': 14,
'6': '.alt.v1.BacktestRunStatus',
'10': 'status'
},
{
'1': 'created_at_unix_ms',
'3': 4,
'4': 1,
'5': 3,
'10': 'createdAtUnixMs'
},
{
'1': 'updated_at_unix_ms',
'3': 5,
'4': 1,
'5': 3,
'10': 'updatedAtUnixMs'
},
],
};
/// Descriptor for `BacktestRun`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List backtestRunDescriptor = $convert.base64Decode(
'CgtCYWNrdGVzdFJ1bhIOCgJpZBgBIAEoCVICaWQSKwoEc3BlYxgCIAEoCzIXLmFsdC52MS5CYW'
'NrdGVzdFJ1blNwZWNSBHNwZWMSMQoGc3RhdHVzGAMgASgOMhkuYWx0LnYxLkJhY2t0ZXN0UnVu'
'U3RhdHVzUgZzdGF0dXMSKwoSY3JlYXRlZF9hdF91bml4X21zGAQgASgDUg9jcmVhdGVkQXRVbm'
'l4TXMSKwoSdXBkYXRlZF9hdF91bml4X21zGAUgASgDUg91cGRhdGVkQXRVbml4TXM=');
@$core.Deprecated('Use startBacktestRequestDescriptor instead')
const StartBacktestRequest$json = {
'1': 'StartBacktestRequest',
'2': [
{
'1': 'spec',
'3': 1,
'4': 1,
'5': 11,
'6': '.alt.v1.BacktestRunSpec',
'10': 'spec'
},
],
};
/// Descriptor for `StartBacktestRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List startBacktestRequestDescriptor = $convert.base64Decode(
'ChRTdGFydEJhY2t0ZXN0UmVxdWVzdBIrCgRzcGVjGAEgASgLMhcuYWx0LnYxLkJhY2t0ZXN0Un'
'VuU3BlY1IEc3BlYw==');
@$core.Deprecated('Use startBacktestResponseDescriptor instead')
const StartBacktestResponse$json = {
'1': 'StartBacktestResponse',
'2': [
{
'1': 'run',
'3': 1,
'4': 1,
'5': 11,
'6': '.alt.v1.BacktestRun',
'10': 'run'
},
],
};
/// Descriptor for `StartBacktestResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List startBacktestResponseDescriptor = $convert.base64Decode(
'ChVTdGFydEJhY2t0ZXN0UmVzcG9uc2USJQoDcnVuGAEgASgLMhMuYWx0LnYxLkJhY2t0ZXN0Un'
'VuUgNydW4=');
@$core.Deprecated('Use getBacktestRunRequestDescriptor instead')
const GetBacktestRunRequest$json = {
'1': 'GetBacktestRunRequest',
'2': [
{'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'},
],
};
/// Descriptor for `GetBacktestRunRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List getBacktestRunRequestDescriptor =
$convert.base64Decode(
'ChVHZXRCYWNrdGVzdFJ1blJlcXVlc3QSFQoGcnVuX2lkGAEgASgJUgVydW5JZA==');
@$core.Deprecated('Use getBacktestRunResponseDescriptor instead')
const GetBacktestRunResponse$json = {
'1': 'GetBacktestRunResponse',
'2': [
{
'1': 'run',
'3': 1,
'4': 1,
'5': 11,
'6': '.alt.v1.BacktestRun',
'10': 'run'
},
],
};
/// Descriptor for `GetBacktestRunResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List getBacktestRunResponseDescriptor =
$convert.base64Decode(
'ChZHZXRCYWNrdGVzdFJ1blJlc3BvbnNlEiUKA3J1bhgBIAEoCzITLmFsdC52MS5CYWNrdGVzdF'
'J1blIDcnVu');
@$core.Deprecated('Use backtestResultDescriptor instead')
const BacktestResult$json = {
'1': 'BacktestResult',
'2': [
{'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'},
{
'1': 'starting_cash',
'3': 2,
'4': 1,
'5': 11,
'6': '.alt.v1.Price',
'10': 'startingCash'
},
{
'1': 'ending_equity',
'3': 3,
'4': 1,
'5': 11,
'6': '.alt.v1.Price',
'10': 'endingEquity'
},
],
};
/// Descriptor for `BacktestResult`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List backtestResultDescriptor = $convert.base64Decode(
'Cg5CYWNrdGVzdFJlc3VsdBIVCgZydW5faWQYASABKAlSBXJ1bklkEjIKDXN0YXJ0aW5nX2Nhc2'
'gYAiABKAsyDS5hbHQudjEuUHJpY2VSDHN0YXJ0aW5nQ2FzaBIyCg1lbmRpbmdfZXF1aXR5GAMg'
'ASgLMg0uYWx0LnYxLlByaWNlUgxlbmRpbmdFcXVpdHk=');
@$core.Deprecated('Use getBacktestResultRequestDescriptor instead')
const GetBacktestResultRequest$json = {
'1': 'GetBacktestResultRequest',
'2': [
{'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'},
],
};
/// Descriptor for `GetBacktestResultRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List getBacktestResultRequestDescriptor =
$convert.base64Decode(
'ChhHZXRCYWNrdGVzdFJlc3VsdFJlcXVlc3QSFQoGcnVuX2lkGAEgASgJUgVydW5JZA==');
@$core.Deprecated('Use getBacktestResultResponseDescriptor instead')
const GetBacktestResultResponse$json = {
'1': 'GetBacktestResultResponse',
'2': [
{
'1': 'result',
'3': 1,
'4': 1,
'5': 11,
'6': '.alt.v1.BacktestResult',
'10': 'result'
},
],
};
/// Descriptor for `GetBacktestResultResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List getBacktestResultResponseDescriptor =
$convert.base64Decode(
'ChlHZXRCYWNrdGVzdFJlc3VsdFJlc3BvbnNlEi4KBnJlc3VsdBgBIAEoCzIWLmFsdC52MS5CYW'
'NrdGVzdFJlc3VsdFIGcmVzdWx0');

View file

@ -0,0 +1,306 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/common.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'common.pbenum.dart';
class Decimal extends $pb.GeneratedMessage {
factory Decimal({
$core.String? value,
}) {
final result = create();
if (value != null) result.value = value;
return result;
}
Decimal._();
factory Decimal.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Decimal.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Decimal',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'value')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Decimal clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Decimal copyWith(void Function(Decimal) updates) =>
super.copyWith((message) => updates(message as Decimal)) as Decimal;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Decimal create() => Decimal._();
@$core.override
Decimal createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Decimal getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Decimal>(create);
static Decimal? _defaultInstance;
@$pb.TagNumber(1)
$core.String get value => $_getSZ(0);
@$pb.TagNumber(1)
set value($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasValue() => $_has(0);
@$pb.TagNumber(1)
void clearValue() => $_clearField(1);
}
class ErrorInfo extends $pb.GeneratedMessage {
factory ErrorInfo({
$core.String? code,
$core.String? message,
}) {
final result = create();
if (code != null) result.code = code;
if (message != null) result.message = message;
return result;
}
ErrorInfo._();
factory ErrorInfo.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ErrorInfo.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ErrorInfo',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'code')
..aOS(2, _omitFieldNames ? '' : 'message')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ErrorInfo clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ErrorInfo copyWith(void Function(ErrorInfo) updates) =>
super.copyWith((message) => updates(message as ErrorInfo)) as ErrorInfo;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ErrorInfo create() => ErrorInfo._();
@$core.override
ErrorInfo createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ErrorInfo getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ErrorInfo>(create);
static ErrorInfo? _defaultInstance;
@$pb.TagNumber(1)
$core.String get code => $_getSZ(0);
@$pb.TagNumber(1)
set code($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasCode() => $_has(0);
@$pb.TagNumber(1)
void clearCode() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get message => $_getSZ(1);
@$pb.TagNumber(2)
set message($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasMessage() => $_has(1);
@$pb.TagNumber(2)
void clearMessage() => $_clearField(2);
}
class HelloRequest extends $pb.GeneratedMessage {
factory HelloRequest({
$core.String? clientName,
$core.String? clientVersion,
$core.String? altProtocolVersion,
}) {
final result = create();
if (clientName != null) result.clientName = clientName;
if (clientVersion != null) result.clientVersion = clientVersion;
if (altProtocolVersion != null)
result.altProtocolVersion = altProtocolVersion;
return result;
}
HelloRequest._();
factory HelloRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory HelloRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'HelloRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'clientName')
..aOS(2, _omitFieldNames ? '' : 'clientVersion')
..aOS(3, _omitFieldNames ? '' : 'altProtocolVersion')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
HelloRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
HelloRequest copyWith(void Function(HelloRequest) updates) =>
super.copyWith((message) => updates(message as HelloRequest))
as HelloRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static HelloRequest create() => HelloRequest._();
@$core.override
HelloRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static HelloRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<HelloRequest>(create);
static HelloRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get clientName => $_getSZ(0);
@$pb.TagNumber(1)
set clientName($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasClientName() => $_has(0);
@$pb.TagNumber(1)
void clearClientName() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get clientVersion => $_getSZ(1);
@$pb.TagNumber(2)
set clientVersion($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasClientVersion() => $_has(1);
@$pb.TagNumber(2)
void clearClientVersion() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get altProtocolVersion => $_getSZ(2);
@$pb.TagNumber(3)
set altProtocolVersion($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasAltProtocolVersion() => $_has(2);
@$pb.TagNumber(3)
void clearAltProtocolVersion() => $_clearField(3);
}
class HelloResponse extends $pb.GeneratedMessage {
factory HelloResponse({
$core.String? serverName,
$core.String? serverVersion,
$core.String? altProtocolVersion,
$core.Iterable<$core.String>? capabilities,
}) {
final result = create();
if (serverName != null) result.serverName = serverName;
if (serverVersion != null) result.serverVersion = serverVersion;
if (altProtocolVersion != null)
result.altProtocolVersion = altProtocolVersion;
if (capabilities != null) result.capabilities.addAll(capabilities);
return result;
}
HelloResponse._();
factory HelloResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory HelloResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'HelloResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'serverName')
..aOS(2, _omitFieldNames ? '' : 'serverVersion')
..aOS(3, _omitFieldNames ? '' : 'altProtocolVersion')
..pPS(4, _omitFieldNames ? '' : 'capabilities')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
HelloResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
HelloResponse copyWith(void Function(HelloResponse) updates) =>
super.copyWith((message) => updates(message as HelloResponse))
as HelloResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static HelloResponse create() => HelloResponse._();
@$core.override
HelloResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static HelloResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<HelloResponse>(create);
static HelloResponse? _defaultInstance;
@$pb.TagNumber(1)
$core.String get serverName => $_getSZ(0);
@$pb.TagNumber(1)
set serverName($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasServerName() => $_has(0);
@$pb.TagNumber(1)
void clearServerName() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get serverVersion => $_getSZ(1);
@$pb.TagNumber(2)
set serverVersion($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasServerVersion() => $_has(1);
@$pb.TagNumber(2)
void clearServerVersion() => $_clearField(2);
@$pb.TagNumber(3)
$core.String get altProtocolVersion => $_getSZ(2);
@$pb.TagNumber(3)
set altProtocolVersion($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasAltProtocolVersion() => $_has(2);
@$pb.TagNumber(3)
void clearAltProtocolVersion() => $_clearField(3);
@$pb.TagNumber(4)
$pb.PbList<$core.String> get capabilities => $_getList(3);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,111 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/common.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class Market extends $pb.ProtobufEnum {
static const Market MARKET_UNSPECIFIED =
Market._(0, _omitEnumNames ? '' : 'MARKET_UNSPECIFIED');
static const Market MARKET_KR =
Market._(1, _omitEnumNames ? '' : 'MARKET_KR');
static const Market MARKET_US =
Market._(2, _omitEnumNames ? '' : 'MARKET_US');
static const $core.List<Market> values = <Market>[
MARKET_UNSPECIFIED,
MARKET_KR,
MARKET_US,
];
static final $core.List<Market?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 2);
static Market? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const Market._(super.value, super.name);
}
class Venue extends $pb.ProtobufEnum {
static const Venue VENUE_UNSPECIFIED =
Venue._(0, _omitEnumNames ? '' : 'VENUE_UNSPECIFIED');
static const Venue VENUE_KRX = Venue._(1, _omitEnumNames ? '' : 'VENUE_KRX');
static const Venue VENUE_NASDAQ =
Venue._(2, _omitEnumNames ? '' : 'VENUE_NASDAQ');
static const Venue VENUE_NYSE =
Venue._(3, _omitEnumNames ? '' : 'VENUE_NYSE');
static const $core.List<Venue> values = <Venue>[
VENUE_UNSPECIFIED,
VENUE_KRX,
VENUE_NASDAQ,
VENUE_NYSE,
];
static final $core.List<Venue?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 3);
static Venue? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const Venue._(super.value, super.name);
}
class Currency extends $pb.ProtobufEnum {
static const Currency CURRENCY_UNSPECIFIED =
Currency._(0, _omitEnumNames ? '' : 'CURRENCY_UNSPECIFIED');
static const Currency CURRENCY_KRW =
Currency._(1, _omitEnumNames ? '' : 'CURRENCY_KRW');
static const Currency CURRENCY_USD =
Currency._(2, _omitEnumNames ? '' : 'CURRENCY_USD');
static const $core.List<Currency> values = <Currency>[
CURRENCY_UNSPECIFIED,
CURRENCY_KRW,
CURRENCY_USD,
];
static final $core.List<Currency?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 2);
static Currency? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const Currency._(super.value, super.name);
}
class Timeframe extends $pb.ProtobufEnum {
static const Timeframe TIMEFRAME_UNSPECIFIED =
Timeframe._(0, _omitEnumNames ? '' : 'TIMEFRAME_UNSPECIFIED');
static const Timeframe TIMEFRAME_DAILY =
Timeframe._(1, _omitEnumNames ? '' : 'TIMEFRAME_DAILY');
static const Timeframe TIMEFRAME_MINUTE_1 =
Timeframe._(2, _omitEnumNames ? '' : 'TIMEFRAME_MINUTE_1');
static const Timeframe TIMEFRAME_MINUTE_5 =
Timeframe._(3, _omitEnumNames ? '' : 'TIMEFRAME_MINUTE_5');
static const $core.List<Timeframe> values = <Timeframe>[
TIMEFRAME_UNSPECIFIED,
TIMEFRAME_DAILY,
TIMEFRAME_MINUTE_1,
TIMEFRAME_MINUTE_5,
];
static final $core.List<Timeframe?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 3);
static Timeframe? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const Timeframe._(super.value, super.name);
}
const $core.bool _omitEnumNames =
$core.bool.fromEnvironment('protobuf.omit_enum_names');

View file

@ -0,0 +1,150 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/common.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use marketDescriptor instead')
const Market$json = {
'1': 'Market',
'2': [
{'1': 'MARKET_UNSPECIFIED', '2': 0},
{'1': 'MARKET_KR', '2': 1},
{'1': 'MARKET_US', '2': 2},
],
};
/// Descriptor for `Market`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List marketDescriptor = $convert.base64Decode(
'CgZNYXJrZXQSFgoSTUFSS0VUX1VOU1BFQ0lGSUVEEAASDQoJTUFSS0VUX0tSEAESDQoJTUFSS0'
'VUX1VTEAI=');
@$core.Deprecated('Use venueDescriptor instead')
const Venue$json = {
'1': 'Venue',
'2': [
{'1': 'VENUE_UNSPECIFIED', '2': 0},
{'1': 'VENUE_KRX', '2': 1},
{'1': 'VENUE_NASDAQ', '2': 2},
{'1': 'VENUE_NYSE', '2': 3},
],
};
/// Descriptor for `Venue`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List venueDescriptor = $convert.base64Decode(
'CgVWZW51ZRIVChFWRU5VRV9VTlNQRUNJRklFRBAAEg0KCVZFTlVFX0tSWBABEhAKDFZFTlVFX0'
'5BU0RBURACEg4KClZFTlVFX05ZU0UQAw==');
@$core.Deprecated('Use currencyDescriptor instead')
const Currency$json = {
'1': 'Currency',
'2': [
{'1': 'CURRENCY_UNSPECIFIED', '2': 0},
{'1': 'CURRENCY_KRW', '2': 1},
{'1': 'CURRENCY_USD', '2': 2},
],
};
/// Descriptor for `Currency`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List currencyDescriptor = $convert.base64Decode(
'CghDdXJyZW5jeRIYChRDVVJSRU5DWV9VTlNQRUNJRklFRBAAEhAKDENVUlJFTkNZX0tSVxABEh'
'AKDENVUlJFTkNZX1VTRBAC');
@$core.Deprecated('Use timeframeDescriptor instead')
const Timeframe$json = {
'1': 'Timeframe',
'2': [
{'1': 'TIMEFRAME_UNSPECIFIED', '2': 0},
{'1': 'TIMEFRAME_DAILY', '2': 1},
{'1': 'TIMEFRAME_MINUTE_1', '2': 2},
{'1': 'TIMEFRAME_MINUTE_5', '2': 3},
],
};
/// Descriptor for `Timeframe`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List timeframeDescriptor = $convert.base64Decode(
'CglUaW1lZnJhbWUSGQoVVElNRUZSQU1FX1VOU1BFQ0lGSUVEEAASEwoPVElNRUZSQU1FX0RBSU'
'xZEAESFgoSVElNRUZSQU1FX01JTlVURV8xEAISFgoSVElNRUZSQU1FX01JTlVURV81EAM=');
@$core.Deprecated('Use decimalDescriptor instead')
const Decimal$json = {
'1': 'Decimal',
'2': [
{'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
],
};
/// Descriptor for `Decimal`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List decimalDescriptor =
$convert.base64Decode('CgdEZWNpbWFsEhQKBXZhbHVlGAEgASgJUgV2YWx1ZQ==');
@$core.Deprecated('Use errorInfoDescriptor instead')
const ErrorInfo$json = {
'1': 'ErrorInfo',
'2': [
{'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'},
{'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},
],
};
/// Descriptor for `ErrorInfo`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List errorInfoDescriptor = $convert.base64Decode(
'CglFcnJvckluZm8SEgoEY29kZRgBIAEoCVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYW'
'dl');
@$core.Deprecated('Use helloRequestDescriptor instead')
const HelloRequest$json = {
'1': 'HelloRequest',
'2': [
{'1': 'client_name', '3': 1, '4': 1, '5': 9, '10': 'clientName'},
{'1': 'client_version', '3': 2, '4': 1, '5': 9, '10': 'clientVersion'},
{
'1': 'alt_protocol_version',
'3': 3,
'4': 1,
'5': 9,
'10': 'altProtocolVersion'
},
],
};
/// Descriptor for `HelloRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List helloRequestDescriptor = $convert.base64Decode(
'CgxIZWxsb1JlcXVlc3QSHwoLY2xpZW50X25hbWUYASABKAlSCmNsaWVudE5hbWUSJQoOY2xpZW'
'50X3ZlcnNpb24YAiABKAlSDWNsaWVudFZlcnNpb24SMAoUYWx0X3Byb3RvY29sX3ZlcnNpb24Y'
'AyABKAlSEmFsdFByb3RvY29sVmVyc2lvbg==');
@$core.Deprecated('Use helloResponseDescriptor instead')
const HelloResponse$json = {
'1': 'HelloResponse',
'2': [
{'1': 'server_name', '3': 1, '4': 1, '5': 9, '10': 'serverName'},
{'1': 'server_version', '3': 2, '4': 1, '5': 9, '10': 'serverVersion'},
{
'1': 'alt_protocol_version',
'3': 3,
'4': 1,
'5': 9,
'10': 'altProtocolVersion'
},
{'1': 'capabilities', '3': 4, '4': 3, '5': 9, '10': 'capabilities'},
],
};
/// Descriptor for `HelloResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List helloResponseDescriptor = $convert.base64Decode(
'Cg1IZWxsb1Jlc3BvbnNlEh8KC3NlcnZlcl9uYW1lGAEgASgJUgpzZXJ2ZXJOYW1lEiUKDnNlcn'
'Zlcl92ZXJzaW9uGAIgASgJUg1zZXJ2ZXJWZXJzaW9uEjAKFGFsdF9wcm90b2NvbF92ZXJzaW9u'
'GAMgASgJUhJhbHRQcm90b2NvbFZlcnNpb24SIgoMY2FwYWJpbGl0aWVzGAQgAygJUgxjYXBhYm'
'lsaXRpZXM=');

View file

@ -0,0 +1,683 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/market.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:core' as $core;
import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb;
import 'common.pb.dart' as $0;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
class Instrument extends $pb.GeneratedMessage {
factory Instrument({
$core.String? id,
$0.Market? market,
$0.Venue? venue,
$core.String? symbol,
$core.String? name,
$0.Currency? currency,
$core.Iterable<$core.MapEntry<$core.String, $core.String>>? providerSymbols,
}) {
final result = create();
if (id != null) result.id = id;
if (market != null) result.market = market;
if (venue != null) result.venue = venue;
if (symbol != null) result.symbol = symbol;
if (name != null) result.name = name;
if (currency != null) result.currency = currency;
if (providerSymbols != null)
result.providerSymbols.addEntries(providerSymbols);
return result;
}
Instrument._();
factory Instrument.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Instrument.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Instrument',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'id')
..aE<$0.Market>(2, _omitFieldNames ? '' : 'market',
enumValues: $0.Market.values)
..aE<$0.Venue>(3, _omitFieldNames ? '' : 'venue',
enumValues: $0.Venue.values)
..aOS(4, _omitFieldNames ? '' : 'symbol')
..aOS(5, _omitFieldNames ? '' : 'name')
..aE<$0.Currency>(6, _omitFieldNames ? '' : 'currency',
enumValues: $0.Currency.values)
..m<$core.String, $core.String>(7, _omitFieldNames ? '' : 'providerSymbols',
entryClassName: 'Instrument.ProviderSymbolsEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OS,
packageName: const $pb.PackageName('alt.v1'))
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Instrument clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Instrument copyWith(void Function(Instrument) updates) =>
super.copyWith((message) => updates(message as Instrument)) as Instrument;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Instrument create() => Instrument._();
@$core.override
Instrument createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Instrument getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<Instrument>(create);
static Instrument? _defaultInstance;
@$pb.TagNumber(1)
$core.String get id => $_getSZ(0);
@$pb.TagNumber(1)
set id($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => $_clearField(1);
@$pb.TagNumber(2)
$0.Market get market => $_getN(1);
@$pb.TagNumber(2)
set market($0.Market value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasMarket() => $_has(1);
@$pb.TagNumber(2)
void clearMarket() => $_clearField(2);
@$pb.TagNumber(3)
$0.Venue get venue => $_getN(2);
@$pb.TagNumber(3)
set venue($0.Venue value) => $_setField(3, value);
@$pb.TagNumber(3)
$core.bool hasVenue() => $_has(2);
@$pb.TagNumber(3)
void clearVenue() => $_clearField(3);
@$pb.TagNumber(4)
$core.String get symbol => $_getSZ(3);
@$pb.TagNumber(4)
set symbol($core.String value) => $_setString(3, value);
@$pb.TagNumber(4)
$core.bool hasSymbol() => $_has(3);
@$pb.TagNumber(4)
void clearSymbol() => $_clearField(4);
@$pb.TagNumber(5)
$core.String get name => $_getSZ(4);
@$pb.TagNumber(5)
set name($core.String value) => $_setString(4, value);
@$pb.TagNumber(5)
$core.bool hasName() => $_has(4);
@$pb.TagNumber(5)
void clearName() => $_clearField(5);
@$pb.TagNumber(6)
$0.Currency get currency => $_getN(5);
@$pb.TagNumber(6)
set currency($0.Currency value) => $_setField(6, value);
@$pb.TagNumber(6)
$core.bool hasCurrency() => $_has(5);
@$pb.TagNumber(6)
void clearCurrency() => $_clearField(6);
@$pb.TagNumber(7)
$pb.PbMap<$core.String, $core.String> get providerSymbols => $_getMap(6);
}
class Price extends $pb.GeneratedMessage {
factory Price({
$0.Currency? currency,
$0.Decimal? amount,
}) {
final result = create();
if (currency != null) result.currency = currency;
if (amount != null) result.amount = amount;
return result;
}
Price._();
factory Price.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Price.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Price',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aE<$0.Currency>(1, _omitFieldNames ? '' : 'currency',
enumValues: $0.Currency.values)
..aOM<$0.Decimal>(2, _omitFieldNames ? '' : 'amount',
subBuilder: $0.Decimal.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Price clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Price copyWith(void Function(Price) updates) =>
super.copyWith((message) => updates(message as Price)) as Price;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Price create() => Price._();
@$core.override
Price createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Price getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Price>(create);
static Price? _defaultInstance;
@$pb.TagNumber(1)
$0.Currency get currency => $_getN(0);
@$pb.TagNumber(1)
set currency($0.Currency value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasCurrency() => $_has(0);
@$pb.TagNumber(1)
void clearCurrency() => $_clearField(1);
@$pb.TagNumber(2)
$0.Decimal get amount => $_getN(1);
@$pb.TagNumber(2)
set amount($0.Decimal value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasAmount() => $_has(1);
@$pb.TagNumber(2)
void clearAmount() => $_clearField(2);
@$pb.TagNumber(2)
$0.Decimal ensureAmount() => $_ensure(1);
}
class Quantity extends $pb.GeneratedMessage {
factory Quantity({
$0.Decimal? amount,
}) {
final result = create();
if (amount != null) result.amount = amount;
return result;
}
Quantity._();
factory Quantity.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Quantity.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Quantity',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOM<$0.Decimal>(1, _omitFieldNames ? '' : 'amount',
subBuilder: $0.Decimal.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Quantity clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Quantity copyWith(void Function(Quantity) updates) =>
super.copyWith((message) => updates(message as Quantity)) as Quantity;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Quantity create() => Quantity._();
@$core.override
Quantity createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Quantity getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Quantity>(create);
static Quantity? _defaultInstance;
@$pb.TagNumber(1)
$0.Decimal get amount => $_getN(0);
@$pb.TagNumber(1)
set amount($0.Decimal value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasAmount() => $_has(0);
@$pb.TagNumber(1)
void clearAmount() => $_clearField(1);
@$pb.TagNumber(1)
$0.Decimal ensureAmount() => $_ensure(0);
}
class Bar extends $pb.GeneratedMessage {
factory Bar({
$core.String? instrumentId,
$0.Timeframe? timeframe,
$fixnum.Int64? timestampUnixMs,
Price? open,
Price? high,
Price? low,
Price? close,
Quantity? volume,
}) {
final result = create();
if (instrumentId != null) result.instrumentId = instrumentId;
if (timeframe != null) result.timeframe = timeframe;
if (timestampUnixMs != null) result.timestampUnixMs = timestampUnixMs;
if (open != null) result.open = open;
if (high != null) result.high = high;
if (low != null) result.low = low;
if (close != null) result.close = close;
if (volume != null) result.volume = volume;
return result;
}
Bar._();
factory Bar.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory Bar.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'Bar',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'instrumentId')
..aE<$0.Timeframe>(2, _omitFieldNames ? '' : 'timeframe',
enumValues: $0.Timeframe.values)
..aInt64(3, _omitFieldNames ? '' : 'timestampUnixMs')
..aOM<Price>(4, _omitFieldNames ? '' : 'open', subBuilder: Price.create)
..aOM<Price>(5, _omitFieldNames ? '' : 'high', subBuilder: Price.create)
..aOM<Price>(6, _omitFieldNames ? '' : 'low', subBuilder: Price.create)
..aOM<Price>(7, _omitFieldNames ? '' : 'close', subBuilder: Price.create)
..aOM<Quantity>(8, _omitFieldNames ? '' : 'volume',
subBuilder: Quantity.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Bar clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
Bar copyWith(void Function(Bar) updates) =>
super.copyWith((message) => updates(message as Bar)) as Bar;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Bar create() => Bar._();
@$core.override
Bar createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static Bar getDefault() =>
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bar>(create);
static Bar? _defaultInstance;
@$pb.TagNumber(1)
$core.String get instrumentId => $_getSZ(0);
@$pb.TagNumber(1)
set instrumentId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasInstrumentId() => $_has(0);
@$pb.TagNumber(1)
void clearInstrumentId() => $_clearField(1);
@$pb.TagNumber(2)
$0.Timeframe get timeframe => $_getN(1);
@$pb.TagNumber(2)
set timeframe($0.Timeframe value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasTimeframe() => $_has(1);
@$pb.TagNumber(2)
void clearTimeframe() => $_clearField(2);
@$pb.TagNumber(3)
$fixnum.Int64 get timestampUnixMs => $_getI64(2);
@$pb.TagNumber(3)
set timestampUnixMs($fixnum.Int64 value) => $_setInt64(2, value);
@$pb.TagNumber(3)
$core.bool hasTimestampUnixMs() => $_has(2);
@$pb.TagNumber(3)
void clearTimestampUnixMs() => $_clearField(3);
@$pb.TagNumber(4)
Price get open => $_getN(3);
@$pb.TagNumber(4)
set open(Price value) => $_setField(4, value);
@$pb.TagNumber(4)
$core.bool hasOpen() => $_has(3);
@$pb.TagNumber(4)
void clearOpen() => $_clearField(4);
@$pb.TagNumber(4)
Price ensureOpen() => $_ensure(3);
@$pb.TagNumber(5)
Price get high => $_getN(4);
@$pb.TagNumber(5)
set high(Price value) => $_setField(5, value);
@$pb.TagNumber(5)
$core.bool hasHigh() => $_has(4);
@$pb.TagNumber(5)
void clearHigh() => $_clearField(5);
@$pb.TagNumber(5)
Price ensureHigh() => $_ensure(4);
@$pb.TagNumber(6)
Price get low => $_getN(5);
@$pb.TagNumber(6)
set low(Price value) => $_setField(6, value);
@$pb.TagNumber(6)
$core.bool hasLow() => $_has(5);
@$pb.TagNumber(6)
void clearLow() => $_clearField(6);
@$pb.TagNumber(6)
Price ensureLow() => $_ensure(5);
@$pb.TagNumber(7)
Price get close => $_getN(6);
@$pb.TagNumber(7)
set close(Price value) => $_setField(7, value);
@$pb.TagNumber(7)
$core.bool hasClose() => $_has(6);
@$pb.TagNumber(7)
void clearClose() => $_clearField(7);
@$pb.TagNumber(7)
Price ensureClose() => $_ensure(6);
@$pb.TagNumber(8)
Quantity get volume => $_getN(7);
@$pb.TagNumber(8)
set volume(Quantity value) => $_setField(8, value);
@$pb.TagNumber(8)
$core.bool hasVolume() => $_has(7);
@$pb.TagNumber(8)
void clearVolume() => $_clearField(8);
@$pb.TagNumber(8)
Quantity ensureVolume() => $_ensure(7);
}
class ListInstrumentsRequest extends $pb.GeneratedMessage {
factory ListInstrumentsRequest({
$0.Market? market,
$core.String? provider,
}) {
final result = create();
if (market != null) result.market = market;
if (provider != null) result.provider = provider;
return result;
}
ListInstrumentsRequest._();
factory ListInstrumentsRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListInstrumentsRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListInstrumentsRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aE<$0.Market>(1, _omitFieldNames ? '' : 'market',
enumValues: $0.Market.values)
..aOS(2, _omitFieldNames ? '' : 'provider')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListInstrumentsRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListInstrumentsRequest copyWith(
void Function(ListInstrumentsRequest) updates) =>
super.copyWith((message) => updates(message as ListInstrumentsRequest))
as ListInstrumentsRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListInstrumentsRequest create() => ListInstrumentsRequest._();
@$core.override
ListInstrumentsRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListInstrumentsRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListInstrumentsRequest>(create);
static ListInstrumentsRequest? _defaultInstance;
@$pb.TagNumber(1)
$0.Market get market => $_getN(0);
@$pb.TagNumber(1)
set market($0.Market value) => $_setField(1, value);
@$pb.TagNumber(1)
$core.bool hasMarket() => $_has(0);
@$pb.TagNumber(1)
void clearMarket() => $_clearField(1);
@$pb.TagNumber(2)
$core.String get provider => $_getSZ(1);
@$pb.TagNumber(2)
set provider($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasProvider() => $_has(1);
@$pb.TagNumber(2)
void clearProvider() => $_clearField(2);
}
class ListInstrumentsResponse extends $pb.GeneratedMessage {
factory ListInstrumentsResponse({
$core.Iterable<Instrument>? instruments,
}) {
final result = create();
if (instruments != null) result.instruments.addAll(instruments);
return result;
}
ListInstrumentsResponse._();
factory ListInstrumentsResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListInstrumentsResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListInstrumentsResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..pPM<Instrument>(1, _omitFieldNames ? '' : 'instruments',
subBuilder: Instrument.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListInstrumentsResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListInstrumentsResponse copyWith(
void Function(ListInstrumentsResponse) updates) =>
super.copyWith((message) => updates(message as ListInstrumentsResponse))
as ListInstrumentsResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListInstrumentsResponse create() => ListInstrumentsResponse._();
@$core.override
ListInstrumentsResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListInstrumentsResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListInstrumentsResponse>(create);
static ListInstrumentsResponse? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<Instrument> get instruments => $_getList(0);
}
class ListBarsRequest extends $pb.GeneratedMessage {
factory ListBarsRequest({
$core.String? instrumentId,
$0.Timeframe? timeframe,
$fixnum.Int64? fromUnixMs,
$fixnum.Int64? toUnixMs,
}) {
final result = create();
if (instrumentId != null) result.instrumentId = instrumentId;
if (timeframe != null) result.timeframe = timeframe;
if (fromUnixMs != null) result.fromUnixMs = fromUnixMs;
if (toUnixMs != null) result.toUnixMs = toUnixMs;
return result;
}
ListBarsRequest._();
factory ListBarsRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListBarsRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListBarsRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'instrumentId')
..aE<$0.Timeframe>(2, _omitFieldNames ? '' : 'timeframe',
enumValues: $0.Timeframe.values)
..aInt64(3, _omitFieldNames ? '' : 'fromUnixMs')
..aInt64(4, _omitFieldNames ? '' : 'toUnixMs')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListBarsRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListBarsRequest copyWith(void Function(ListBarsRequest) updates) =>
super.copyWith((message) => updates(message as ListBarsRequest))
as ListBarsRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListBarsRequest create() => ListBarsRequest._();
@$core.override
ListBarsRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListBarsRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListBarsRequest>(create);
static ListBarsRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get instrumentId => $_getSZ(0);
@$pb.TagNumber(1)
set instrumentId($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasInstrumentId() => $_has(0);
@$pb.TagNumber(1)
void clearInstrumentId() => $_clearField(1);
@$pb.TagNumber(2)
$0.Timeframe get timeframe => $_getN(1);
@$pb.TagNumber(2)
set timeframe($0.Timeframe value) => $_setField(2, value);
@$pb.TagNumber(2)
$core.bool hasTimeframe() => $_has(1);
@$pb.TagNumber(2)
void clearTimeframe() => $_clearField(2);
@$pb.TagNumber(3)
$fixnum.Int64 get fromUnixMs => $_getI64(2);
@$pb.TagNumber(3)
set fromUnixMs($fixnum.Int64 value) => $_setInt64(2, value);
@$pb.TagNumber(3)
$core.bool hasFromUnixMs() => $_has(2);
@$pb.TagNumber(3)
void clearFromUnixMs() => $_clearField(3);
@$pb.TagNumber(4)
$fixnum.Int64 get toUnixMs => $_getI64(3);
@$pb.TagNumber(4)
set toUnixMs($fixnum.Int64 value) => $_setInt64(3, value);
@$pb.TagNumber(4)
$core.bool hasToUnixMs() => $_has(3);
@$pb.TagNumber(4)
void clearToUnixMs() => $_clearField(4);
}
class ListBarsResponse extends $pb.GeneratedMessage {
factory ListBarsResponse({
$core.Iterable<Bar>? bars,
}) {
final result = create();
if (bars != null) result.bars.addAll(bars);
return result;
}
ListBarsResponse._();
factory ListBarsResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListBarsResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListBarsResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'),
createEmptyInstance: create)
..pPM<Bar>(1, _omitFieldNames ? '' : 'bars', subBuilder: Bar.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListBarsResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListBarsResponse copyWith(void Function(ListBarsResponse) updates) =>
super.copyWith((message) => updates(message as ListBarsResponse))
as ListBarsResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListBarsResponse create() => ListBarsResponse._();
@$core.override
ListBarsResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListBarsResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListBarsResponse>(create);
static ListBarsResponse? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<Bar> get bars => $_getList(0);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');

View file

@ -0,0 +1,11 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/market.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports

View file

@ -0,0 +1,251 @@
// This is a generated file - do not edit.
//
// Generated from alt/v1/market.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
// ignore_for_file: unused_import
import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use instrumentDescriptor instead')
const Instrument$json = {
'1': 'Instrument',
'2': [
{'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
{
'1': 'market',
'3': 2,
'4': 1,
'5': 14,
'6': '.alt.v1.Market',
'10': 'market'
},
{
'1': 'venue',
'3': 3,
'4': 1,
'5': 14,
'6': '.alt.v1.Venue',
'10': 'venue'
},
{'1': 'symbol', '3': 4, '4': 1, '5': 9, '10': 'symbol'},
{'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},
{
'1': 'currency',
'3': 6,
'4': 1,
'5': 14,
'6': '.alt.v1.Currency',
'10': 'currency'
},
{
'1': 'provider_symbols',
'3': 7,
'4': 3,
'5': 11,
'6': '.alt.v1.Instrument.ProviderSymbolsEntry',
'10': 'providerSymbols'
},
],
'3': [Instrument_ProviderSymbolsEntry$json],
};
@$core.Deprecated('Use instrumentDescriptor instead')
const Instrument_ProviderSymbolsEntry$json = {
'1': 'ProviderSymbolsEntry',
'2': [
{'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
{'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
],
'7': {'7': true},
};
/// Descriptor for `Instrument`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List instrumentDescriptor = $convert.base64Decode(
'CgpJbnN0cnVtZW50Eg4KAmlkGAEgASgJUgJpZBImCgZtYXJrZXQYAiABKA4yDi5hbHQudjEuTW'
'Fya2V0UgZtYXJrZXQSIwoFdmVudWUYAyABKA4yDS5hbHQudjEuVmVudWVSBXZlbnVlEhYKBnN5'
'bWJvbBgEIAEoCVIGc3ltYm9sEhIKBG5hbWUYBSABKAlSBG5hbWUSLAoIY3VycmVuY3kYBiABKA'
'4yEC5hbHQudjEuQ3VycmVuY3lSCGN1cnJlbmN5ElIKEHByb3ZpZGVyX3N5bWJvbHMYByADKAsy'
'Jy5hbHQudjEuSW5zdHJ1bWVudC5Qcm92aWRlclN5bWJvbHNFbnRyeVIPcHJvdmlkZXJTeW1ib2'
'xzGkIKFFByb3ZpZGVyU3ltYm9sc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIg'
'ASgJUgV2YWx1ZToCOAE=');
@$core.Deprecated('Use priceDescriptor instead')
const Price$json = {
'1': 'Price',
'2': [
{
'1': 'currency',
'3': 1,
'4': 1,
'5': 14,
'6': '.alt.v1.Currency',
'10': 'currency'
},
{
'1': 'amount',
'3': 2,
'4': 1,
'5': 11,
'6': '.alt.v1.Decimal',
'10': 'amount'
},
],
};
/// Descriptor for `Price`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List priceDescriptor = $convert.base64Decode(
'CgVQcmljZRIsCghjdXJyZW5jeRgBIAEoDjIQLmFsdC52MS5DdXJyZW5jeVIIY3VycmVuY3kSJw'
'oGYW1vdW50GAIgASgLMg8uYWx0LnYxLkRlY2ltYWxSBmFtb3VudA==');
@$core.Deprecated('Use quantityDescriptor instead')
const Quantity$json = {
'1': 'Quantity',
'2': [
{
'1': 'amount',
'3': 1,
'4': 1,
'5': 11,
'6': '.alt.v1.Decimal',
'10': 'amount'
},
],
};
/// Descriptor for `Quantity`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List quantityDescriptor = $convert.base64Decode(
'CghRdWFudGl0eRInCgZhbW91bnQYASABKAsyDy5hbHQudjEuRGVjaW1hbFIGYW1vdW50');
@$core.Deprecated('Use barDescriptor instead')
const Bar$json = {
'1': 'Bar',
'2': [
{'1': 'instrument_id', '3': 1, '4': 1, '5': 9, '10': 'instrumentId'},
{
'1': 'timeframe',
'3': 2,
'4': 1,
'5': 14,
'6': '.alt.v1.Timeframe',
'10': 'timeframe'
},
{'1': 'timestamp_unix_ms', '3': 3, '4': 1, '5': 3, '10': 'timestampUnixMs'},
{'1': 'open', '3': 4, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'open'},
{'1': 'high', '3': 5, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'high'},
{'1': 'low', '3': 6, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'low'},
{
'1': 'close',
'3': 7,
'4': 1,
'5': 11,
'6': '.alt.v1.Price',
'10': 'close'
},
{
'1': 'volume',
'3': 8,
'4': 1,
'5': 11,
'6': '.alt.v1.Quantity',
'10': 'volume'
},
],
};
/// Descriptor for `Bar`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List barDescriptor = $convert.base64Decode(
'CgNCYXISIwoNaW5zdHJ1bWVudF9pZBgBIAEoCVIMaW5zdHJ1bWVudElkEi8KCXRpbWVmcmFtZR'
'gCIAEoDjIRLmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIqChF0aW1lc3RhbXBfdW5peF9t'
'cxgDIAEoA1IPdGltZXN0YW1wVW5peE1zEiEKBG9wZW4YBCABKAsyDS5hbHQudjEuUHJpY2VSBG'
'9wZW4SIQoEaGlnaBgFIAEoCzINLmFsdC52MS5QcmljZVIEaGlnaBIfCgNsb3cYBiABKAsyDS5h'
'bHQudjEuUHJpY2VSA2xvdxIjCgVjbG9zZRgHIAEoCzINLmFsdC52MS5QcmljZVIFY2xvc2USKA'
'oGdm9sdW1lGAggASgLMhAuYWx0LnYxLlF1YW50aXR5UgZ2b2x1bWU=');
@$core.Deprecated('Use listInstrumentsRequestDescriptor instead')
const ListInstrumentsRequest$json = {
'1': 'ListInstrumentsRequest',
'2': [
{
'1': 'market',
'3': 1,
'4': 1,
'5': 14,
'6': '.alt.v1.Market',
'10': 'market'
},
{'1': 'provider', '3': 2, '4': 1, '5': 9, '10': 'provider'},
],
};
/// Descriptor for `ListInstrumentsRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List listInstrumentsRequestDescriptor =
$convert.base64Decode(
'ChZMaXN0SW5zdHJ1bWVudHNSZXF1ZXN0EiYKBm1hcmtldBgBIAEoDjIOLmFsdC52MS5NYXJrZX'
'RSBm1hcmtldBIaCghwcm92aWRlchgCIAEoCVIIcHJvdmlkZXI=');
@$core.Deprecated('Use listInstrumentsResponseDescriptor instead')
const ListInstrumentsResponse$json = {
'1': 'ListInstrumentsResponse',
'2': [
{
'1': 'instruments',
'3': 1,
'4': 3,
'5': 11,
'6': '.alt.v1.Instrument',
'10': 'instruments'
},
],
};
/// Descriptor for `ListInstrumentsResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List listInstrumentsResponseDescriptor =
$convert.base64Decode(
'ChdMaXN0SW5zdHJ1bWVudHNSZXNwb25zZRI0CgtpbnN0cnVtZW50cxgBIAMoCzISLmFsdC52MS'
'5JbnN0cnVtZW50UgtpbnN0cnVtZW50cw==');
@$core.Deprecated('Use listBarsRequestDescriptor instead')
const ListBarsRequest$json = {
'1': 'ListBarsRequest',
'2': [
{'1': 'instrument_id', '3': 1, '4': 1, '5': 9, '10': 'instrumentId'},
{
'1': 'timeframe',
'3': 2,
'4': 1,
'5': 14,
'6': '.alt.v1.Timeframe',
'10': 'timeframe'
},
{'1': 'from_unix_ms', '3': 3, '4': 1, '5': 3, '10': 'fromUnixMs'},
{'1': 'to_unix_ms', '3': 4, '4': 1, '5': 3, '10': 'toUnixMs'},
],
};
/// Descriptor for `ListBarsRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List listBarsRequestDescriptor = $convert.base64Decode(
'Cg9MaXN0QmFyc1JlcXVlc3QSIwoNaW5zdHJ1bWVudF9pZBgBIAEoCVIMaW5zdHJ1bWVudElkEi'
'8KCXRpbWVmcmFtZRgCIAEoDjIRLmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIgCgxmcm9t'
'X3VuaXhfbXMYAyABKANSCmZyb21Vbml4TXMSHAoKdG9fdW5peF9tcxgEIAEoA1IIdG9Vbml4TX'
'M=');
@$core.Deprecated('Use listBarsResponseDescriptor instead')
const ListBarsResponse$json = {
'1': 'ListBarsResponse',
'2': [
{'1': 'bars', '3': 1, '4': 3, '5': 11, '6': '.alt.v1.Bar', '10': 'bars'},
],
};
/// Descriptor for `ListBarsResponse`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List listBarsResponseDescriptor = $convert.base64Decode(
'ChBMaXN0QmFyc1Jlc3BvbnNlEh8KBGJhcnMYASADKAsyCy5hbHQudjEuQmFyUgRiYXJz');

View file

@ -105,6 +105,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.9" version: "1.0.9"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2"
url: "https://pub.dev"
source: hosted
version: "3.1.7"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -122,7 +130,7 @@ packages:
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
fixnum: fixnum:
dependency: transitive dependency: "direct main"
description: description:
name: fixnum name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
@ -320,6 +328,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.0" version: "6.0.0"
protoc_plugin:
dependency: "direct dev"
description:
name: protoc_plugin
sha256: d1ea363e9118f954d9d482c2f7281c5ff5149b059e68672d1faa564d49091f05
url: "https://pub.dev"
source: hosted
version: "25.0.0"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:

View file

@ -37,6 +37,7 @@ dependencies:
flutter_riverpod: ^3.3.1 flutter_riverpod: ^3.3.1
go_router: ^17.2.3 go_router: ^17.2.3
protobuf: ^6.0.0 protobuf: ^6.0.0
fixnum: ^1.1.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
@ -48,6 +49,7 @@ dev_dependencies:
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # rules and activating additional ones.
flutter_lints: ^6.0.0 flutter_lints: ^6.0.0
protoc_plugin: ^25.0.0
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View file

@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
client_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$client_root"
exec dart run protoc_plugin "$@"

41
bin/contracts-check Executable file
View file

@ -0,0 +1,41 @@
#!/usr/bin/env bash
set -euo pipefail
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
go_out="$root/packages/contracts/gen/go"
dart_out="$root/apps/client/lib/src/generated"
snapshot_dir="$(mktemp -d)"
trap 'rm -rf "$snapshot_dir"' EXIT
snapshot_go="$snapshot_dir/go"
snapshot_dart="$snapshot_dir/dart"
mkdir -p "$snapshot_go" "$snapshot_dart"
if [ -d "$go_out" ]; then
cp -R "$go_out/." "$snapshot_go/"
fi
if [ -d "$dart_out" ]; then
cp -R "$dart_out/." "$snapshot_dart/"
fi
"$root/bin/contracts-gen"
drift=0
if ! diff -ru "$snapshot_go" "$go_out" >/dev/null; then
echo "contracts-check: Go generated output drift detected under $go_out" >&2
diff -ru "$snapshot_go" "$go_out" >&2 || true
drift=1
fi
if ! diff -ru "$snapshot_dart" "$dart_out" >/dev/null; then
echo "contracts-check: Dart generated output drift detected under $dart_out" >&2
diff -ru "$snapshot_dart" "$dart_out" >&2 || true
drift=1
fi
if [ "$drift" -ne 0 ]; then
echo "contracts-check: run bin/contracts-gen and commit the regenerated output" >&2
exit 1
fi

50
bin/contracts-gen Executable file
View file

@ -0,0 +1,50 @@
#!/usr/bin/env bash
set -euo pipefail
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
proto_root="$root/packages/contracts/proto"
go_out="$root/packages/contracts/gen/go"
dart_out="$root/apps/client/lib/src/generated"
dart_plugin="$root/apps/client/tool/protoc-gen-dart"
require_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "contracts-gen: required command not found: $1" >&2
exit 1
fi
}
require_cmd protoc
require_cmd protoc-gen-go
if [ ! -x "$dart_plugin" ]; then
echo "contracts-gen: dart protoc plugin wrapper missing or not executable: $dart_plugin" >&2
exit 1
fi
protos=(
"alt/v1/common.proto"
"alt/v1/market.proto"
"alt/v1/backtest.proto"
)
mkdir -p "$go_out"
mkdir -p "$dart_out"
(
cd "$proto_root"
protoc \
-I . \
--go_out="$go_out" \
--go_opt=paths=source_relative \
"${protos[@]}"
)
(
cd "$proto_root"
protoc \
-I . \
--plugin=protoc-gen-dart="$dart_plugin" \
--dart_out="$dart_out" \
"${protos[@]}"
)

View file

@ -4,6 +4,7 @@ set -euo pipefail
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
for module in \ for module in \
"$root/packages/contracts/gen/go" \
"$root/packages/domain" \ "$root/packages/domain" \
"$root/services/api" \ "$root/services/api" \
"$root/services/worker" \ "$root/services/worker" \

View file

@ -3,7 +3,10 @@ set -euo pipefail
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
"$root/bin/contracts-check"
for module in \ for module in \
"$root/packages/contracts/gen/go" \
"$root/packages/domain" \ "$root/packages/domain" \
"$root/services/api" \ "$root/services/api" \
"$root/services/worker" \ "$root/services/worker" \

View file

@ -3,6 +3,7 @@ go 1.22
use ( use (
../proto-socket/go ../proto-socket/go
./apps/cli ./apps/cli
./packages/contracts/gen/go
./packages/domain ./packages/domain
./services/api ./services/api
./services/worker ./services/worker

1
go.work.sum Normal file
View file

@ -0,0 +1 @@
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=

View file

@ -8,5 +8,31 @@ Initial contract direction:
- additive protobuf changes first - additive protobuf changes first
- explicit handshake/version messages because proto-socket protocol `0.1` does not carry an application version field - explicit handshake/version messages because proto-socket protocol `0.1` does not carry an application version field
- market-neutral models with Korea market daily bars as the MVP path - market-neutral models with Korea market daily bars as the MVP path (including `ListBarsRequest`/`ListBarsResponse` and `GetBacktestResultRequest`/`GetBacktestResultResponse` for the MVP schema)
- generated clients should be derived from `proto/` sources, not edited by hand - generated clients should be derived from `proto/` sources, not edited by hand
## Compatibility
- Prefer additive fields and messages.
- Never renumber existing fields.
- Reserve removals or semantic rewrites for an explicit version bump.
## Transport Boundary
- `proto-socket` owns `PacketBase`, heartbeat, nonce, and transport framing.
- ALT `alt.v1` messages are application payloads carried in `PacketBase.data`.
## Codegen
Generated outputs are committed source-of-derivation artifacts:
- Go: `packages/contracts/gen/go/alt/v1/*.pb.go` (Go module `git.toki-labs.com/toki/alt/packages/contracts/gen/go`).
- Dart: `apps/client/lib/src/generated/alt/v1/*.pb*.dart`.
Commands (run from repository root):
- `bin/contracts-gen` regenerates Go and Dart outputs from `proto/`. Requires `protoc`, `protoc-gen-go`, and a working `apps/client` Flutter package (the Dart plugin is invoked via `apps/client/tool/protoc-gen-dart`).
- `bin/contracts-check` snapshots current generated outputs, regenerates, and fails when the regeneration produces a diff. Used by `bin/test` to keep schema and generated code aligned.
Do not hand-edit files under `packages/contracts/gen/` or `apps/client/lib/src/generated/`.

View file

@ -0,0 +1,674 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.11
// protoc v5.29.3
// source: alt/v1/backtest.proto
package altv1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type BacktestRunStatus int32
const (
BacktestRunStatus_BACKTEST_RUN_STATUS_UNSPECIFIED BacktestRunStatus = 0
BacktestRunStatus_BACKTEST_RUN_STATUS_PENDING BacktestRunStatus = 1
BacktestRunStatus_BACKTEST_RUN_STATUS_RUNNING BacktestRunStatus = 2
BacktestRunStatus_BACKTEST_RUN_STATUS_SUCCEEDED BacktestRunStatus = 3
BacktestRunStatus_BACKTEST_RUN_STATUS_FAILED BacktestRunStatus = 4
BacktestRunStatus_BACKTEST_RUN_STATUS_CANCELED BacktestRunStatus = 5
)
// Enum value maps for BacktestRunStatus.
var (
BacktestRunStatus_name = map[int32]string{
0: "BACKTEST_RUN_STATUS_UNSPECIFIED",
1: "BACKTEST_RUN_STATUS_PENDING",
2: "BACKTEST_RUN_STATUS_RUNNING",
3: "BACKTEST_RUN_STATUS_SUCCEEDED",
4: "BACKTEST_RUN_STATUS_FAILED",
5: "BACKTEST_RUN_STATUS_CANCELED",
}
BacktestRunStatus_value = map[string]int32{
"BACKTEST_RUN_STATUS_UNSPECIFIED": 0,
"BACKTEST_RUN_STATUS_PENDING": 1,
"BACKTEST_RUN_STATUS_RUNNING": 2,
"BACKTEST_RUN_STATUS_SUCCEEDED": 3,
"BACKTEST_RUN_STATUS_FAILED": 4,
"BACKTEST_RUN_STATUS_CANCELED": 5,
}
)
func (x BacktestRunStatus) Enum() *BacktestRunStatus {
p := new(BacktestRunStatus)
*p = x
return p
}
func (x BacktestRunStatus) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (BacktestRunStatus) Descriptor() protoreflect.EnumDescriptor {
return file_alt_v1_backtest_proto_enumTypes[0].Descriptor()
}
func (BacktestRunStatus) Type() protoreflect.EnumType {
return &file_alt_v1_backtest_proto_enumTypes[0]
}
func (x BacktestRunStatus) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use BacktestRunStatus.Descriptor instead.
func (BacktestRunStatus) EnumDescriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{0}
}
type BacktestRunSpec struct {
state protoimpl.MessageState `protogen:"open.v1"`
StrategyId string `protobuf:"bytes,1,opt,name=strategy_id,json=strategyId,proto3" json:"strategy_id,omitempty"`
Market Market `protobuf:"varint,2,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"`
Timeframe Timeframe `protobuf:"varint,3,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"`
FromUnixMs int64 `protobuf:"varint,4,opt,name=from_unix_ms,json=fromUnixMs,proto3" json:"from_unix_ms,omitempty"`
ToUnixMs int64 `protobuf:"varint,5,opt,name=to_unix_ms,json=toUnixMs,proto3" json:"to_unix_ms,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BacktestRunSpec) Reset() {
*x = BacktestRunSpec{}
mi := &file_alt_v1_backtest_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BacktestRunSpec) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BacktestRunSpec) ProtoMessage() {}
func (x *BacktestRunSpec) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BacktestRunSpec.ProtoReflect.Descriptor instead.
func (*BacktestRunSpec) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{0}
}
func (x *BacktestRunSpec) GetStrategyId() string {
if x != nil {
return x.StrategyId
}
return ""
}
func (x *BacktestRunSpec) GetMarket() Market {
if x != nil {
return x.Market
}
return Market_MARKET_UNSPECIFIED
}
func (x *BacktestRunSpec) GetTimeframe() Timeframe {
if x != nil {
return x.Timeframe
}
return Timeframe_TIMEFRAME_UNSPECIFIED
}
func (x *BacktestRunSpec) GetFromUnixMs() int64 {
if x != nil {
return x.FromUnixMs
}
return 0
}
func (x *BacktestRunSpec) GetToUnixMs() int64 {
if x != nil {
return x.ToUnixMs
}
return 0
}
type BacktestRun struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Spec *BacktestRunSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"`
Status BacktestRunStatus `protobuf:"varint,3,opt,name=status,proto3,enum=alt.v1.BacktestRunStatus" json:"status,omitempty"`
CreatedAtUnixMs int64 `protobuf:"varint,4,opt,name=created_at_unix_ms,json=createdAtUnixMs,proto3" json:"created_at_unix_ms,omitempty"`
UpdatedAtUnixMs int64 `protobuf:"varint,5,opt,name=updated_at_unix_ms,json=updatedAtUnixMs,proto3" json:"updated_at_unix_ms,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BacktestRun) Reset() {
*x = BacktestRun{}
mi := &file_alt_v1_backtest_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BacktestRun) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BacktestRun) ProtoMessage() {}
func (x *BacktestRun) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BacktestRun.ProtoReflect.Descriptor instead.
func (*BacktestRun) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{1}
}
func (x *BacktestRun) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *BacktestRun) GetSpec() *BacktestRunSpec {
if x != nil {
return x.Spec
}
return nil
}
func (x *BacktestRun) GetStatus() BacktestRunStatus {
if x != nil {
return x.Status
}
return BacktestRunStatus_BACKTEST_RUN_STATUS_UNSPECIFIED
}
func (x *BacktestRun) GetCreatedAtUnixMs() int64 {
if x != nil {
return x.CreatedAtUnixMs
}
return 0
}
func (x *BacktestRun) GetUpdatedAtUnixMs() int64 {
if x != nil {
return x.UpdatedAtUnixMs
}
return 0
}
type StartBacktestRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Spec *BacktestRunSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *StartBacktestRequest) Reset() {
*x = StartBacktestRequest{}
mi := &file_alt_v1_backtest_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *StartBacktestRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*StartBacktestRequest) ProtoMessage() {}
func (x *StartBacktestRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use StartBacktestRequest.ProtoReflect.Descriptor instead.
func (*StartBacktestRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{2}
}
func (x *StartBacktestRequest) GetSpec() *BacktestRunSpec {
if x != nil {
return x.Spec
}
return nil
}
type StartBacktestResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Run *BacktestRun `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *StartBacktestResponse) Reset() {
*x = StartBacktestResponse{}
mi := &file_alt_v1_backtest_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *StartBacktestResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*StartBacktestResponse) ProtoMessage() {}
func (x *StartBacktestResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use StartBacktestResponse.ProtoReflect.Descriptor instead.
func (*StartBacktestResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{3}
}
func (x *StartBacktestResponse) GetRun() *BacktestRun {
if x != nil {
return x.Run
}
return nil
}
type GetBacktestRunRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetBacktestRunRequest) Reset() {
*x = GetBacktestRunRequest{}
mi := &file_alt_v1_backtest_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetBacktestRunRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetBacktestRunRequest) ProtoMessage() {}
func (x *GetBacktestRunRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[4]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetBacktestRunRequest.ProtoReflect.Descriptor instead.
func (*GetBacktestRunRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{4}
}
func (x *GetBacktestRunRequest) GetRunId() string {
if x != nil {
return x.RunId
}
return ""
}
type GetBacktestRunResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Run *BacktestRun `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetBacktestRunResponse) Reset() {
*x = GetBacktestRunResponse{}
mi := &file_alt_v1_backtest_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetBacktestRunResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetBacktestRunResponse) ProtoMessage() {}
func (x *GetBacktestRunResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[5]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetBacktestRunResponse.ProtoReflect.Descriptor instead.
func (*GetBacktestRunResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{5}
}
func (x *GetBacktestRunResponse) GetRun() *BacktestRun {
if x != nil {
return x.Run
}
return nil
}
type BacktestResult struct {
state protoimpl.MessageState `protogen:"open.v1"`
RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
StartingCash *Price `protobuf:"bytes,2,opt,name=starting_cash,json=startingCash,proto3" json:"starting_cash,omitempty"`
EndingEquity *Price `protobuf:"bytes,3,opt,name=ending_equity,json=endingEquity,proto3" json:"ending_equity,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *BacktestResult) Reset() {
*x = BacktestResult{}
mi := &file_alt_v1_backtest_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *BacktestResult) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BacktestResult) ProtoMessage() {}
func (x *BacktestResult) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BacktestResult.ProtoReflect.Descriptor instead.
func (*BacktestResult) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{6}
}
func (x *BacktestResult) GetRunId() string {
if x != nil {
return x.RunId
}
return ""
}
func (x *BacktestResult) GetStartingCash() *Price {
if x != nil {
return x.StartingCash
}
return nil
}
func (x *BacktestResult) GetEndingEquity() *Price {
if x != nil {
return x.EndingEquity
}
return nil
}
type GetBacktestResultRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetBacktestResultRequest) Reset() {
*x = GetBacktestResultRequest{}
mi := &file_alt_v1_backtest_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetBacktestResultRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetBacktestResultRequest) ProtoMessage() {}
func (x *GetBacktestResultRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[7]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetBacktestResultRequest.ProtoReflect.Descriptor instead.
func (*GetBacktestResultRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{7}
}
func (x *GetBacktestResultRequest) GetRunId() string {
if x != nil {
return x.RunId
}
return ""
}
type GetBacktestResultResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Result *BacktestResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetBacktestResultResponse) Reset() {
*x = GetBacktestResultResponse{}
mi := &file_alt_v1_backtest_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetBacktestResultResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetBacktestResultResponse) ProtoMessage() {}
func (x *GetBacktestResultResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_backtest_proto_msgTypes[8]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetBacktestResultResponse.ProtoReflect.Descriptor instead.
func (*GetBacktestResultResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_backtest_proto_rawDescGZIP(), []int{8}
}
func (x *GetBacktestResultResponse) GetResult() *BacktestResult {
if x != nil {
return x.Result
}
return nil
}
var File_alt_v1_backtest_proto protoreflect.FileDescriptor
const file_alt_v1_backtest_proto_rawDesc = "" +
"\n" +
"\x15alt/v1/backtest.proto\x12\x06alt.v1\x1a\x13alt/v1/common.proto\x1a\x13alt/v1/market.proto\"\xcb\x01\n" +
"\x0fBacktestRunSpec\x12\x1f\n" +
"\vstrategy_id\x18\x01 \x01(\tR\n" +
"strategyId\x12&\n" +
"\x06market\x18\x02 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12/\n" +
"\ttimeframe\x18\x03 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12 \n" +
"\ffrom_unix_ms\x18\x04 \x01(\x03R\n" +
"fromUnixMs\x12\x1c\n" +
"\n" +
"to_unix_ms\x18\x05 \x01(\x03R\btoUnixMs\"\xd7\x01\n" +
"\vBacktestRun\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12+\n" +
"\x04spec\x18\x02 \x01(\v2\x17.alt.v1.BacktestRunSpecR\x04spec\x121\n" +
"\x06status\x18\x03 \x01(\x0e2\x19.alt.v1.BacktestRunStatusR\x06status\x12+\n" +
"\x12created_at_unix_ms\x18\x04 \x01(\x03R\x0fcreatedAtUnixMs\x12+\n" +
"\x12updated_at_unix_ms\x18\x05 \x01(\x03R\x0fupdatedAtUnixMs\"C\n" +
"\x14StartBacktestRequest\x12+\n" +
"\x04spec\x18\x01 \x01(\v2\x17.alt.v1.BacktestRunSpecR\x04spec\">\n" +
"\x15StartBacktestResponse\x12%\n" +
"\x03run\x18\x01 \x01(\v2\x13.alt.v1.BacktestRunR\x03run\".\n" +
"\x15GetBacktestRunRequest\x12\x15\n" +
"\x06run_id\x18\x01 \x01(\tR\x05runId\"?\n" +
"\x16GetBacktestRunResponse\x12%\n" +
"\x03run\x18\x01 \x01(\v2\x13.alt.v1.BacktestRunR\x03run\"\x8f\x01\n" +
"\x0eBacktestResult\x12\x15\n" +
"\x06run_id\x18\x01 \x01(\tR\x05runId\x122\n" +
"\rstarting_cash\x18\x02 \x01(\v2\r.alt.v1.PriceR\fstartingCash\x122\n" +
"\rending_equity\x18\x03 \x01(\v2\r.alt.v1.PriceR\fendingEquity\"1\n" +
"\x18GetBacktestResultRequest\x12\x15\n" +
"\x06run_id\x18\x01 \x01(\tR\x05runId\"K\n" +
"\x19GetBacktestResultResponse\x12.\n" +
"\x06result\x18\x01 \x01(\v2\x16.alt.v1.BacktestResultR\x06result*\xdf\x01\n" +
"\x11BacktestRunStatus\x12#\n" +
"\x1fBACKTEST_RUN_STATUS_UNSPECIFIED\x10\x00\x12\x1f\n" +
"\x1bBACKTEST_RUN_STATUS_PENDING\x10\x01\x12\x1f\n" +
"\x1bBACKTEST_RUN_STATUS_RUNNING\x10\x02\x12!\n" +
"\x1dBACKTEST_RUN_STATUS_SUCCEEDED\x10\x03\x12\x1e\n" +
"\x1aBACKTEST_RUN_STATUS_FAILED\x10\x04\x12 \n" +
"\x1cBACKTEST_RUN_STATUS_CANCELED\x10\x05BCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3"
var (
file_alt_v1_backtest_proto_rawDescOnce sync.Once
file_alt_v1_backtest_proto_rawDescData []byte
)
func file_alt_v1_backtest_proto_rawDescGZIP() []byte {
file_alt_v1_backtest_proto_rawDescOnce.Do(func() {
file_alt_v1_backtest_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_backtest_proto_rawDesc), len(file_alt_v1_backtest_proto_rawDesc)))
})
return file_alt_v1_backtest_proto_rawDescData
}
var file_alt_v1_backtest_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_alt_v1_backtest_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
var file_alt_v1_backtest_proto_goTypes = []any{
(BacktestRunStatus)(0), // 0: alt.v1.BacktestRunStatus
(*BacktestRunSpec)(nil), // 1: alt.v1.BacktestRunSpec
(*BacktestRun)(nil), // 2: alt.v1.BacktestRun
(*StartBacktestRequest)(nil), // 3: alt.v1.StartBacktestRequest
(*StartBacktestResponse)(nil), // 4: alt.v1.StartBacktestResponse
(*GetBacktestRunRequest)(nil), // 5: alt.v1.GetBacktestRunRequest
(*GetBacktestRunResponse)(nil), // 6: alt.v1.GetBacktestRunResponse
(*BacktestResult)(nil), // 7: alt.v1.BacktestResult
(*GetBacktestResultRequest)(nil), // 8: alt.v1.GetBacktestResultRequest
(*GetBacktestResultResponse)(nil), // 9: alt.v1.GetBacktestResultResponse
(Market)(0), // 10: alt.v1.Market
(Timeframe)(0), // 11: alt.v1.Timeframe
(*Price)(nil), // 12: alt.v1.Price
}
var file_alt_v1_backtest_proto_depIdxs = []int32{
10, // 0: alt.v1.BacktestRunSpec.market:type_name -> alt.v1.Market
11, // 1: alt.v1.BacktestRunSpec.timeframe:type_name -> alt.v1.Timeframe
1, // 2: alt.v1.BacktestRun.spec:type_name -> alt.v1.BacktestRunSpec
0, // 3: alt.v1.BacktestRun.status:type_name -> alt.v1.BacktestRunStatus
1, // 4: alt.v1.StartBacktestRequest.spec:type_name -> alt.v1.BacktestRunSpec
2, // 5: alt.v1.StartBacktestResponse.run:type_name -> alt.v1.BacktestRun
2, // 6: alt.v1.GetBacktestRunResponse.run:type_name -> alt.v1.BacktestRun
12, // 7: alt.v1.BacktestResult.starting_cash:type_name -> alt.v1.Price
12, // 8: alt.v1.BacktestResult.ending_equity:type_name -> alt.v1.Price
7, // 9: alt.v1.GetBacktestResultResponse.result:type_name -> alt.v1.BacktestResult
10, // [10:10] is the sub-list for method output_type
10, // [10:10] is the sub-list for method input_type
10, // [10:10] is the sub-list for extension type_name
10, // [10:10] is the sub-list for extension extendee
0, // [0:10] is the sub-list for field type_name
}
func init() { file_alt_v1_backtest_proto_init() }
func file_alt_v1_backtest_proto_init() {
if File_alt_v1_backtest_proto != nil {
return
}
file_alt_v1_common_proto_init()
file_alt_v1_market_proto_init()
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_backtest_proto_rawDesc), len(file_alt_v1_backtest_proto_rawDesc)),
NumEnums: 1,
NumMessages: 9,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_alt_v1_backtest_proto_goTypes,
DependencyIndexes: file_alt_v1_backtest_proto_depIdxs,
EnumInfos: file_alt_v1_backtest_proto_enumTypes,
MessageInfos: file_alt_v1_backtest_proto_msgTypes,
}.Build()
File_alt_v1_backtest_proto = out.File
file_alt_v1_backtest_proto_goTypes = nil
file_alt_v1_backtest_proto_depIdxs = nil
}

View file

@ -0,0 +1,546 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.11
// protoc v5.29.3
// source: alt/v1/common.proto
package altv1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Market int32
const (
Market_MARKET_UNSPECIFIED Market = 0
Market_MARKET_KR Market = 1
Market_MARKET_US Market = 2
)
// Enum value maps for Market.
var (
Market_name = map[int32]string{
0: "MARKET_UNSPECIFIED",
1: "MARKET_KR",
2: "MARKET_US",
}
Market_value = map[string]int32{
"MARKET_UNSPECIFIED": 0,
"MARKET_KR": 1,
"MARKET_US": 2,
}
)
func (x Market) Enum() *Market {
p := new(Market)
*p = x
return p
}
func (x Market) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Market) Descriptor() protoreflect.EnumDescriptor {
return file_alt_v1_common_proto_enumTypes[0].Descriptor()
}
func (Market) Type() protoreflect.EnumType {
return &file_alt_v1_common_proto_enumTypes[0]
}
func (x Market) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Market.Descriptor instead.
func (Market) EnumDescriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{0}
}
type Venue int32
const (
Venue_VENUE_UNSPECIFIED Venue = 0
Venue_VENUE_KRX Venue = 1
Venue_VENUE_NASDAQ Venue = 2
Venue_VENUE_NYSE Venue = 3
)
// Enum value maps for Venue.
var (
Venue_name = map[int32]string{
0: "VENUE_UNSPECIFIED",
1: "VENUE_KRX",
2: "VENUE_NASDAQ",
3: "VENUE_NYSE",
}
Venue_value = map[string]int32{
"VENUE_UNSPECIFIED": 0,
"VENUE_KRX": 1,
"VENUE_NASDAQ": 2,
"VENUE_NYSE": 3,
}
)
func (x Venue) Enum() *Venue {
p := new(Venue)
*p = x
return p
}
func (x Venue) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Venue) Descriptor() protoreflect.EnumDescriptor {
return file_alt_v1_common_proto_enumTypes[1].Descriptor()
}
func (Venue) Type() protoreflect.EnumType {
return &file_alt_v1_common_proto_enumTypes[1]
}
func (x Venue) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Venue.Descriptor instead.
func (Venue) EnumDescriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{1}
}
type Currency int32
const (
Currency_CURRENCY_UNSPECIFIED Currency = 0
Currency_CURRENCY_KRW Currency = 1
Currency_CURRENCY_USD Currency = 2
)
// Enum value maps for Currency.
var (
Currency_name = map[int32]string{
0: "CURRENCY_UNSPECIFIED",
1: "CURRENCY_KRW",
2: "CURRENCY_USD",
}
Currency_value = map[string]int32{
"CURRENCY_UNSPECIFIED": 0,
"CURRENCY_KRW": 1,
"CURRENCY_USD": 2,
}
)
func (x Currency) Enum() *Currency {
p := new(Currency)
*p = x
return p
}
func (x Currency) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Currency) Descriptor() protoreflect.EnumDescriptor {
return file_alt_v1_common_proto_enumTypes[2].Descriptor()
}
func (Currency) Type() protoreflect.EnumType {
return &file_alt_v1_common_proto_enumTypes[2]
}
func (x Currency) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Currency.Descriptor instead.
func (Currency) EnumDescriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{2}
}
type Timeframe int32
const (
Timeframe_TIMEFRAME_UNSPECIFIED Timeframe = 0
Timeframe_TIMEFRAME_DAILY Timeframe = 1
Timeframe_TIMEFRAME_MINUTE_1 Timeframe = 2
Timeframe_TIMEFRAME_MINUTE_5 Timeframe = 3
)
// Enum value maps for Timeframe.
var (
Timeframe_name = map[int32]string{
0: "TIMEFRAME_UNSPECIFIED",
1: "TIMEFRAME_DAILY",
2: "TIMEFRAME_MINUTE_1",
3: "TIMEFRAME_MINUTE_5",
}
Timeframe_value = map[string]int32{
"TIMEFRAME_UNSPECIFIED": 0,
"TIMEFRAME_DAILY": 1,
"TIMEFRAME_MINUTE_1": 2,
"TIMEFRAME_MINUTE_5": 3,
}
)
func (x Timeframe) Enum() *Timeframe {
p := new(Timeframe)
*p = x
return p
}
func (x Timeframe) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Timeframe) Descriptor() protoreflect.EnumDescriptor {
return file_alt_v1_common_proto_enumTypes[3].Descriptor()
}
func (Timeframe) Type() protoreflect.EnumType {
return &file_alt_v1_common_proto_enumTypes[3]
}
func (x Timeframe) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Timeframe.Descriptor instead.
func (Timeframe) EnumDescriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{3}
}
type Decimal struct {
state protoimpl.MessageState `protogen:"open.v1"`
Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Decimal) Reset() {
*x = Decimal{}
mi := &file_alt_v1_common_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Decimal) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Decimal) ProtoMessage() {}
func (x *Decimal) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_common_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Decimal.ProtoReflect.Descriptor instead.
func (*Decimal) Descriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{0}
}
func (x *Decimal) GetValue() string {
if x != nil {
return x.Value
}
return ""
}
type ErrorInfo struct {
state protoimpl.MessageState `protogen:"open.v1"`
Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ErrorInfo) Reset() {
*x = ErrorInfo{}
mi := &file_alt_v1_common_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ErrorInfo) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ErrorInfo) ProtoMessage() {}
func (x *ErrorInfo) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_common_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead.
func (*ErrorInfo) Descriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{1}
}
func (x *ErrorInfo) GetCode() string {
if x != nil {
return x.Code
}
return ""
}
func (x *ErrorInfo) GetMessage() string {
if x != nil {
return x.Message
}
return ""
}
type HelloRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ClientName string `protobuf:"bytes,1,opt,name=client_name,json=clientName,proto3" json:"client_name,omitempty"`
ClientVersion string `protobuf:"bytes,2,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"`
AltProtocolVersion string `protobuf:"bytes,3,opt,name=alt_protocol_version,json=altProtocolVersion,proto3" json:"alt_protocol_version,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *HelloRequest) Reset() {
*x = HelloRequest{}
mi := &file_alt_v1_common_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *HelloRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HelloRequest) ProtoMessage() {}
func (x *HelloRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_common_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead.
func (*HelloRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{2}
}
func (x *HelloRequest) GetClientName() string {
if x != nil {
return x.ClientName
}
return ""
}
func (x *HelloRequest) GetClientVersion() string {
if x != nil {
return x.ClientVersion
}
return ""
}
func (x *HelloRequest) GetAltProtocolVersion() string {
if x != nil {
return x.AltProtocolVersion
}
return ""
}
type HelloResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
ServerName string `protobuf:"bytes,1,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"`
ServerVersion string `protobuf:"bytes,2,opt,name=server_version,json=serverVersion,proto3" json:"server_version,omitempty"`
AltProtocolVersion string `protobuf:"bytes,3,opt,name=alt_protocol_version,json=altProtocolVersion,proto3" json:"alt_protocol_version,omitempty"`
Capabilities []string `protobuf:"bytes,4,rep,name=capabilities,proto3" json:"capabilities,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *HelloResponse) Reset() {
*x = HelloResponse{}
mi := &file_alt_v1_common_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *HelloResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*HelloResponse) ProtoMessage() {}
func (x *HelloResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_common_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use HelloResponse.ProtoReflect.Descriptor instead.
func (*HelloResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_common_proto_rawDescGZIP(), []int{3}
}
func (x *HelloResponse) GetServerName() string {
if x != nil {
return x.ServerName
}
return ""
}
func (x *HelloResponse) GetServerVersion() string {
if x != nil {
return x.ServerVersion
}
return ""
}
func (x *HelloResponse) GetAltProtocolVersion() string {
if x != nil {
return x.AltProtocolVersion
}
return ""
}
func (x *HelloResponse) GetCapabilities() []string {
if x != nil {
return x.Capabilities
}
return nil
}
var File_alt_v1_common_proto protoreflect.FileDescriptor
const file_alt_v1_common_proto_rawDesc = "" +
"\n" +
"\x13alt/v1/common.proto\x12\x06alt.v1\"\x1f\n" +
"\aDecimal\x12\x14\n" +
"\x05value\x18\x01 \x01(\tR\x05value\"9\n" +
"\tErrorInfo\x12\x12\n" +
"\x04code\x18\x01 \x01(\tR\x04code\x12\x18\n" +
"\amessage\x18\x02 \x01(\tR\amessage\"\x88\x01\n" +
"\fHelloRequest\x12\x1f\n" +
"\vclient_name\x18\x01 \x01(\tR\n" +
"clientName\x12%\n" +
"\x0eclient_version\x18\x02 \x01(\tR\rclientVersion\x120\n" +
"\x14alt_protocol_version\x18\x03 \x01(\tR\x12altProtocolVersion\"\xad\x01\n" +
"\rHelloResponse\x12\x1f\n" +
"\vserver_name\x18\x01 \x01(\tR\n" +
"serverName\x12%\n" +
"\x0eserver_version\x18\x02 \x01(\tR\rserverVersion\x120\n" +
"\x14alt_protocol_version\x18\x03 \x01(\tR\x12altProtocolVersion\x12\"\n" +
"\fcapabilities\x18\x04 \x03(\tR\fcapabilities*>\n" +
"\x06Market\x12\x16\n" +
"\x12MARKET_UNSPECIFIED\x10\x00\x12\r\n" +
"\tMARKET_KR\x10\x01\x12\r\n" +
"\tMARKET_US\x10\x02*O\n" +
"\x05Venue\x12\x15\n" +
"\x11VENUE_UNSPECIFIED\x10\x00\x12\r\n" +
"\tVENUE_KRX\x10\x01\x12\x10\n" +
"\fVENUE_NASDAQ\x10\x02\x12\x0e\n" +
"\n" +
"VENUE_NYSE\x10\x03*H\n" +
"\bCurrency\x12\x18\n" +
"\x14CURRENCY_UNSPECIFIED\x10\x00\x12\x10\n" +
"\fCURRENCY_KRW\x10\x01\x12\x10\n" +
"\fCURRENCY_USD\x10\x02*k\n" +
"\tTimeframe\x12\x19\n" +
"\x15TIMEFRAME_UNSPECIFIED\x10\x00\x12\x13\n" +
"\x0fTIMEFRAME_DAILY\x10\x01\x12\x16\n" +
"\x12TIMEFRAME_MINUTE_1\x10\x02\x12\x16\n" +
"\x12TIMEFRAME_MINUTE_5\x10\x03BCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3"
var (
file_alt_v1_common_proto_rawDescOnce sync.Once
file_alt_v1_common_proto_rawDescData []byte
)
func file_alt_v1_common_proto_rawDescGZIP() []byte {
file_alt_v1_common_proto_rawDescOnce.Do(func() {
file_alt_v1_common_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_common_proto_rawDesc), len(file_alt_v1_common_proto_rawDesc)))
})
return file_alt_v1_common_proto_rawDescData
}
var file_alt_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
var file_alt_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_alt_v1_common_proto_goTypes = []any{
(Market)(0), // 0: alt.v1.Market
(Venue)(0), // 1: alt.v1.Venue
(Currency)(0), // 2: alt.v1.Currency
(Timeframe)(0), // 3: alt.v1.Timeframe
(*Decimal)(nil), // 4: alt.v1.Decimal
(*ErrorInfo)(nil), // 5: alt.v1.ErrorInfo
(*HelloRequest)(nil), // 6: alt.v1.HelloRequest
(*HelloResponse)(nil), // 7: alt.v1.HelloResponse
}
var file_alt_v1_common_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_alt_v1_common_proto_init() }
func file_alt_v1_common_proto_init() {
if File_alt_v1_common_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_common_proto_rawDesc), len(file_alt_v1_common_proto_rawDesc)),
NumEnums: 4,
NumMessages: 4,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_alt_v1_common_proto_goTypes,
DependencyIndexes: file_alt_v1_common_proto_depIdxs,
EnumInfos: file_alt_v1_common_proto_enumTypes,
MessageInfos: file_alt_v1_common_proto_msgTypes,
}.Build()
File_alt_v1_common_proto = out.File
file_alt_v1_common_proto_goTypes = nil
file_alt_v1_common_proto_depIdxs = nil
}

View file

@ -0,0 +1,643 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.11
// protoc v5.29.3
// source: alt/v1/market.proto
package altv1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Instrument struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Market Market `protobuf:"varint,2,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"`
Venue Venue `protobuf:"varint,3,opt,name=venue,proto3,enum=alt.v1.Venue" json:"venue,omitempty"`
Symbol string `protobuf:"bytes,4,opt,name=symbol,proto3" json:"symbol,omitempty"`
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
Currency Currency `protobuf:"varint,6,opt,name=currency,proto3,enum=alt.v1.Currency" json:"currency,omitempty"`
ProviderSymbols map[string]string `protobuf:"bytes,7,rep,name=provider_symbols,json=providerSymbols,proto3" json:"provider_symbols,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Instrument) Reset() {
*x = Instrument{}
mi := &file_alt_v1_market_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Instrument) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Instrument) ProtoMessage() {}
func (x *Instrument) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Instrument.ProtoReflect.Descriptor instead.
func (*Instrument) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{0}
}
func (x *Instrument) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *Instrument) GetMarket() Market {
if x != nil {
return x.Market
}
return Market_MARKET_UNSPECIFIED
}
func (x *Instrument) GetVenue() Venue {
if x != nil {
return x.Venue
}
return Venue_VENUE_UNSPECIFIED
}
func (x *Instrument) GetSymbol() string {
if x != nil {
return x.Symbol
}
return ""
}
func (x *Instrument) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *Instrument) GetCurrency() Currency {
if x != nil {
return x.Currency
}
return Currency_CURRENCY_UNSPECIFIED
}
func (x *Instrument) GetProviderSymbols() map[string]string {
if x != nil {
return x.ProviderSymbols
}
return nil
}
type Price struct {
state protoimpl.MessageState `protogen:"open.v1"`
Currency Currency `protobuf:"varint,1,opt,name=currency,proto3,enum=alt.v1.Currency" json:"currency,omitempty"`
Amount *Decimal `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Price) Reset() {
*x = Price{}
mi := &file_alt_v1_market_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Price) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Price) ProtoMessage() {}
func (x *Price) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Price.ProtoReflect.Descriptor instead.
func (*Price) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{1}
}
func (x *Price) GetCurrency() Currency {
if x != nil {
return x.Currency
}
return Currency_CURRENCY_UNSPECIFIED
}
func (x *Price) GetAmount() *Decimal {
if x != nil {
return x.Amount
}
return nil
}
type Quantity struct {
state protoimpl.MessageState `protogen:"open.v1"`
Amount *Decimal `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Quantity) Reset() {
*x = Quantity{}
mi := &file_alt_v1_market_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Quantity) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Quantity) ProtoMessage() {}
func (x *Quantity) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Quantity.ProtoReflect.Descriptor instead.
func (*Quantity) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{2}
}
func (x *Quantity) GetAmount() *Decimal {
if x != nil {
return x.Amount
}
return nil
}
type Bar struct {
state protoimpl.MessageState `protogen:"open.v1"`
InstrumentId string `protobuf:"bytes,1,opt,name=instrument_id,json=instrumentId,proto3" json:"instrument_id,omitempty"`
Timeframe Timeframe `protobuf:"varint,2,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"`
TimestampUnixMs int64 `protobuf:"varint,3,opt,name=timestamp_unix_ms,json=timestampUnixMs,proto3" json:"timestamp_unix_ms,omitempty"`
Open *Price `protobuf:"bytes,4,opt,name=open,proto3" json:"open,omitempty"`
High *Price `protobuf:"bytes,5,opt,name=high,proto3" json:"high,omitempty"`
Low *Price `protobuf:"bytes,6,opt,name=low,proto3" json:"low,omitempty"`
Close *Price `protobuf:"bytes,7,opt,name=close,proto3" json:"close,omitempty"`
Volume *Quantity `protobuf:"bytes,8,opt,name=volume,proto3" json:"volume,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Bar) Reset() {
*x = Bar{}
mi := &file_alt_v1_market_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Bar) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Bar) ProtoMessage() {}
func (x *Bar) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[3]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Bar.ProtoReflect.Descriptor instead.
func (*Bar) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{3}
}
func (x *Bar) GetInstrumentId() string {
if x != nil {
return x.InstrumentId
}
return ""
}
func (x *Bar) GetTimeframe() Timeframe {
if x != nil {
return x.Timeframe
}
return Timeframe_TIMEFRAME_UNSPECIFIED
}
func (x *Bar) GetTimestampUnixMs() int64 {
if x != nil {
return x.TimestampUnixMs
}
return 0
}
func (x *Bar) GetOpen() *Price {
if x != nil {
return x.Open
}
return nil
}
func (x *Bar) GetHigh() *Price {
if x != nil {
return x.High
}
return nil
}
func (x *Bar) GetLow() *Price {
if x != nil {
return x.Low
}
return nil
}
func (x *Bar) GetClose() *Price {
if x != nil {
return x.Close
}
return nil
}
func (x *Bar) GetVolume() *Quantity {
if x != nil {
return x.Volume
}
return nil
}
type ListInstrumentsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Market Market `protobuf:"varint,1,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"`
Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListInstrumentsRequest) Reset() {
*x = ListInstrumentsRequest{}
mi := &file_alt_v1_market_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListInstrumentsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListInstrumentsRequest) ProtoMessage() {}
func (x *ListInstrumentsRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[4]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListInstrumentsRequest.ProtoReflect.Descriptor instead.
func (*ListInstrumentsRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{4}
}
func (x *ListInstrumentsRequest) GetMarket() Market {
if x != nil {
return x.Market
}
return Market_MARKET_UNSPECIFIED
}
func (x *ListInstrumentsRequest) GetProvider() string {
if x != nil {
return x.Provider
}
return ""
}
type ListInstrumentsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Instruments []*Instrument `protobuf:"bytes,1,rep,name=instruments,proto3" json:"instruments,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListInstrumentsResponse) Reset() {
*x = ListInstrumentsResponse{}
mi := &file_alt_v1_market_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListInstrumentsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListInstrumentsResponse) ProtoMessage() {}
func (x *ListInstrumentsResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[5]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListInstrumentsResponse.ProtoReflect.Descriptor instead.
func (*ListInstrumentsResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{5}
}
func (x *ListInstrumentsResponse) GetInstruments() []*Instrument {
if x != nil {
return x.Instruments
}
return nil
}
type ListBarsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
InstrumentId string `protobuf:"bytes,1,opt,name=instrument_id,json=instrumentId,proto3" json:"instrument_id,omitempty"`
Timeframe Timeframe `protobuf:"varint,2,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"`
FromUnixMs int64 `protobuf:"varint,3,opt,name=from_unix_ms,json=fromUnixMs,proto3" json:"from_unix_ms,omitempty"`
ToUnixMs int64 `protobuf:"varint,4,opt,name=to_unix_ms,json=toUnixMs,proto3" json:"to_unix_ms,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListBarsRequest) Reset() {
*x = ListBarsRequest{}
mi := &file_alt_v1_market_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListBarsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListBarsRequest) ProtoMessage() {}
func (x *ListBarsRequest) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[6]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListBarsRequest.ProtoReflect.Descriptor instead.
func (*ListBarsRequest) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{6}
}
func (x *ListBarsRequest) GetInstrumentId() string {
if x != nil {
return x.InstrumentId
}
return ""
}
func (x *ListBarsRequest) GetTimeframe() Timeframe {
if x != nil {
return x.Timeframe
}
return Timeframe_TIMEFRAME_UNSPECIFIED
}
func (x *ListBarsRequest) GetFromUnixMs() int64 {
if x != nil {
return x.FromUnixMs
}
return 0
}
func (x *ListBarsRequest) GetToUnixMs() int64 {
if x != nil {
return x.ToUnixMs
}
return 0
}
type ListBarsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Bars []*Bar `protobuf:"bytes,1,rep,name=bars,proto3" json:"bars,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListBarsResponse) Reset() {
*x = ListBarsResponse{}
mi := &file_alt_v1_market_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListBarsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListBarsResponse) ProtoMessage() {}
func (x *ListBarsResponse) ProtoReflect() protoreflect.Message {
mi := &file_alt_v1_market_proto_msgTypes[7]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ListBarsResponse.ProtoReflect.Descriptor instead.
func (*ListBarsResponse) Descriptor() ([]byte, []int) {
return file_alt_v1_market_proto_rawDescGZIP(), []int{7}
}
func (x *ListBarsResponse) GetBars() []*Bar {
if x != nil {
return x.Bars
}
return nil
}
var File_alt_v1_market_proto protoreflect.FileDescriptor
const file_alt_v1_market_proto_rawDesc = "" +
"\n" +
"\x13alt/v1/market.proto\x12\x06alt.v1\x1a\x13alt/v1/common.proto\"\xdb\x02\n" +
"\n" +
"Instrument\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12&\n" +
"\x06market\x18\x02 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12#\n" +
"\x05venue\x18\x03 \x01(\x0e2\r.alt.v1.VenueR\x05venue\x12\x16\n" +
"\x06symbol\x18\x04 \x01(\tR\x06symbol\x12\x12\n" +
"\x04name\x18\x05 \x01(\tR\x04name\x12,\n" +
"\bcurrency\x18\x06 \x01(\x0e2\x10.alt.v1.CurrencyR\bcurrency\x12R\n" +
"\x10provider_symbols\x18\a \x03(\v2'.alt.v1.Instrument.ProviderSymbolsEntryR\x0fproviderSymbols\x1aB\n" +
"\x14ProviderSymbolsEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"^\n" +
"\x05Price\x12,\n" +
"\bcurrency\x18\x01 \x01(\x0e2\x10.alt.v1.CurrencyR\bcurrency\x12'\n" +
"\x06amount\x18\x02 \x01(\v2\x0f.alt.v1.DecimalR\x06amount\"3\n" +
"\bQuantity\x12'\n" +
"\x06amount\x18\x01 \x01(\v2\x0f.alt.v1.DecimalR\x06amount\"\xbd\x02\n" +
"\x03Bar\x12#\n" +
"\rinstrument_id\x18\x01 \x01(\tR\finstrumentId\x12/\n" +
"\ttimeframe\x18\x02 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12*\n" +
"\x11timestamp_unix_ms\x18\x03 \x01(\x03R\x0ftimestampUnixMs\x12!\n" +
"\x04open\x18\x04 \x01(\v2\r.alt.v1.PriceR\x04open\x12!\n" +
"\x04high\x18\x05 \x01(\v2\r.alt.v1.PriceR\x04high\x12\x1f\n" +
"\x03low\x18\x06 \x01(\v2\r.alt.v1.PriceR\x03low\x12#\n" +
"\x05close\x18\a \x01(\v2\r.alt.v1.PriceR\x05close\x12(\n" +
"\x06volume\x18\b \x01(\v2\x10.alt.v1.QuantityR\x06volume\"\\\n" +
"\x16ListInstrumentsRequest\x12&\n" +
"\x06market\x18\x01 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12\x1a\n" +
"\bprovider\x18\x02 \x01(\tR\bprovider\"O\n" +
"\x17ListInstrumentsResponse\x124\n" +
"\vinstruments\x18\x01 \x03(\v2\x12.alt.v1.InstrumentR\vinstruments\"\xa7\x01\n" +
"\x0fListBarsRequest\x12#\n" +
"\rinstrument_id\x18\x01 \x01(\tR\finstrumentId\x12/\n" +
"\ttimeframe\x18\x02 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12 \n" +
"\ffrom_unix_ms\x18\x03 \x01(\x03R\n" +
"fromUnixMs\x12\x1c\n" +
"\n" +
"to_unix_ms\x18\x04 \x01(\x03R\btoUnixMs\"3\n" +
"\x10ListBarsResponse\x12\x1f\n" +
"\x04bars\x18\x01 \x03(\v2\v.alt.v1.BarR\x04barsBCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3"
var (
file_alt_v1_market_proto_rawDescOnce sync.Once
file_alt_v1_market_proto_rawDescData []byte
)
func file_alt_v1_market_proto_rawDescGZIP() []byte {
file_alt_v1_market_proto_rawDescOnce.Do(func() {
file_alt_v1_market_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_market_proto_rawDesc), len(file_alt_v1_market_proto_rawDesc)))
})
return file_alt_v1_market_proto_rawDescData
}
var file_alt_v1_market_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
var file_alt_v1_market_proto_goTypes = []any{
(*Instrument)(nil), // 0: alt.v1.Instrument
(*Price)(nil), // 1: alt.v1.Price
(*Quantity)(nil), // 2: alt.v1.Quantity
(*Bar)(nil), // 3: alt.v1.Bar
(*ListInstrumentsRequest)(nil), // 4: alt.v1.ListInstrumentsRequest
(*ListInstrumentsResponse)(nil), // 5: alt.v1.ListInstrumentsResponse
(*ListBarsRequest)(nil), // 6: alt.v1.ListBarsRequest
(*ListBarsResponse)(nil), // 7: alt.v1.ListBarsResponse
nil, // 8: alt.v1.Instrument.ProviderSymbolsEntry
(Market)(0), // 9: alt.v1.Market
(Venue)(0), // 10: alt.v1.Venue
(Currency)(0), // 11: alt.v1.Currency
(*Decimal)(nil), // 12: alt.v1.Decimal
(Timeframe)(0), // 13: alt.v1.Timeframe
}
var file_alt_v1_market_proto_depIdxs = []int32{
9, // 0: alt.v1.Instrument.market:type_name -> alt.v1.Market
10, // 1: alt.v1.Instrument.venue:type_name -> alt.v1.Venue
11, // 2: alt.v1.Instrument.currency:type_name -> alt.v1.Currency
8, // 3: alt.v1.Instrument.provider_symbols:type_name -> alt.v1.Instrument.ProviderSymbolsEntry
11, // 4: alt.v1.Price.currency:type_name -> alt.v1.Currency
12, // 5: alt.v1.Price.amount:type_name -> alt.v1.Decimal
12, // 6: alt.v1.Quantity.amount:type_name -> alt.v1.Decimal
13, // 7: alt.v1.Bar.timeframe:type_name -> alt.v1.Timeframe
1, // 8: alt.v1.Bar.open:type_name -> alt.v1.Price
1, // 9: alt.v1.Bar.high:type_name -> alt.v1.Price
1, // 10: alt.v1.Bar.low:type_name -> alt.v1.Price
1, // 11: alt.v1.Bar.close:type_name -> alt.v1.Price
2, // 12: alt.v1.Bar.volume:type_name -> alt.v1.Quantity
9, // 13: alt.v1.ListInstrumentsRequest.market:type_name -> alt.v1.Market
0, // 14: alt.v1.ListInstrumentsResponse.instruments:type_name -> alt.v1.Instrument
13, // 15: alt.v1.ListBarsRequest.timeframe:type_name -> alt.v1.Timeframe
3, // 16: alt.v1.ListBarsResponse.bars:type_name -> alt.v1.Bar
17, // [17:17] is the sub-list for method output_type
17, // [17:17] is the sub-list for method input_type
17, // [17:17] is the sub-list for extension type_name
17, // [17:17] is the sub-list for extension extendee
0, // [0:17] is the sub-list for field type_name
}
func init() { file_alt_v1_market_proto_init() }
func file_alt_v1_market_proto_init() {
if File_alt_v1_market_proto != nil {
return
}
file_alt_v1_common_proto_init()
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_market_proto_rawDesc), len(file_alt_v1_market_proto_rawDesc)),
NumEnums: 0,
NumMessages: 9,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_alt_v1_market_proto_goTypes,
DependencyIndexes: file_alt_v1_market_proto_depIdxs,
MessageInfos: file_alt_v1_market_proto_msgTypes,
}.Build()
File_alt_v1_market_proto = out.File
file_alt_v1_market_proto_goTypes = nil
file_alt_v1_market_proto_depIdxs = nil
}

View file

@ -0,0 +1,5 @@
module git.toki-labs.com/toki/alt/packages/contracts/gen/go
go 1.22
require google.golang.org/protobuf v1.36.5

View file

@ -0,0 +1,6 @@
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=

View file

@ -53,3 +53,12 @@ message BacktestResult {
Price starting_cash = 2; Price starting_cash = 2;
Price ending_equity = 3; Price ending_equity = 3;
} }
message GetBacktestResultRequest {
string run_id = 1;
}
message GetBacktestResultResponse {
BacktestResult result = 1;
}

View file

@ -44,3 +44,15 @@ message ListInstrumentsRequest {
message ListInstrumentsResponse { message ListInstrumentsResponse {
repeated Instrument instruments = 1; repeated Instrument instruments = 1;
} }
message ListBarsRequest {
string instrument_id = 1;
Timeframe timeframe = 2;
int64 from_unix_ms = 3;
int64 to_unix_ms = 4;
}
message ListBarsResponse {
repeated Bar bars = 1;
}