Reusable backtest session (NewSession + RunSegment) #7

Open
opened 2026-04-29 17:33:13 +00:00 by derfenix · 0 comments
Owner

Описание

Сейчас каждый вызов backtest.Run() создаёт с нуля: Tinkoff-адаптер, CachedCandlesProvider, ContainerBuilder, Application, прогоняет сессию и всё убивает. При 1200+ вызовах из оптимизатора оверхед на setup/teardown значителен.

Предлагаемое решение

Добавить объект backtest.Session, который создаёт инфраструктуру один раз и даёт прогонять сегменты:

// Session — многоразовый бэктест с предсозданной инфраструктурой.
type Session struct { ... }

// NewSession создаёт адаптер, провайдер, контейнер.
// После вызова можно вызывать RunSegment многократно.
func NewSession(ctx context.Context, opts SessionOptions) (*Session, error)

// RunSegment выполняет один прогон на [start, end) с заданным конфигом.
// Конфиг может меняться между вызовами (разные геномы).
func (s *Session) RunSegment(ctx context.Context, start, end time.Time, cfg Config) (*Result, error)

// Close освобождает ресурсы (адаптер, кэш).
func (s *Session) Close() error

Внутреннее устройство:

  • Session хранит Tinkoff-адаптер (с CandleCache) и фабрику трейдеров
  • RunSegment пересоздаёт Application и ConfigStorage, но использует тот же адаптер/кэш
  • Run остаётся как convenience-обёртка: создаёт сессию, вызывает RunSegment, закрывает

Затрагиваемые файлы

  • pkg/backtest/session.go (новый) — Session + NewSession
  • pkg/backtest/run.goRun использует Session внутри
  • internal/environment/ — возможно, нужна доработка для переиспользования адаптера

Связи

  • Оптимизатор (strategy-optimizer/internal/eval/runner.go) — после реализации переписать Evaluate на использование Session вместо backtest.Run на каждый сегмент
  • Сложность: высокая (рефакторинг жизненного цикла)
  • Эффект: высокий (ускорение оптимизации в разы)
## Описание Сейчас каждый вызов `backtest.Run()` создаёт с нуля: Tinkoff-адаптер, CachedCandlesProvider, ContainerBuilder, Application, прогоняет сессию и всё убивает. При 1200+ вызовах из оптимизатора оверхед на setup/teardown значителен. ## Предлагаемое решение Добавить объект `backtest.Session`, который создаёт инфраструктуру один раз и даёт прогонять сегменты: ```go // Session — многоразовый бэктест с предсозданной инфраструктурой. type Session struct { ... } // NewSession создаёт адаптер, провайдер, контейнер. // После вызова можно вызывать RunSegment многократно. func NewSession(ctx context.Context, opts SessionOptions) (*Session, error) // RunSegment выполняет один прогон на [start, end) с заданным конфигом. // Конфиг может меняться между вызовами (разные геномы). func (s *Session) RunSegment(ctx context.Context, start, end time.Time, cfg Config) (*Result, error) // Close освобождает ресурсы (адаптер, кэш). func (s *Session) Close() error ``` Внутреннее устройство: - `Session` хранит Tinkoff-адаптер (с CandleCache) и фабрику трейдеров - `RunSegment` пересоздаёт `Application` и `ConfigStorage`, но использует тот же адаптер/кэш - `Run` остаётся как convenience-обёртка: создаёт сессию, вызывает `RunSegment`, закрывает ## Затрагиваемые файлы - `pkg/backtest/session.go` (новый) — Session + NewSession - `pkg/backtest/run.go` — `Run` использует Session внутри - `internal/environment/` — возможно, нужна доработка для переиспользования адаптера ## Связи - **Оптимизатор** (`strategy-optimizer/internal/eval/runner.go`) — после реализации переписать `Evaluate` на использование Session вместо `backtest.Run` на каждый сегмент - **Сложность:** высокая (рефакторинг жизненного цикла) - **Эффект:** высокий (ускорение оптимизации в разы)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Blocks
You do not have permission to read 1 dependency
Reference
trading/tradebot-ng#7
No description provided.