69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
|
package rebalance
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"git.qtrade.icu/lychiyu/qbtrade/pkg/qbtrade"
|
||
|
"git.qtrade.icu/lychiyu/qbtrade/pkg/types"
|
||
|
)
|
||
|
|
||
|
type PositionMap map[string]*types.Position
|
||
|
type ProfitStatsMap map[string]*types.ProfitStats
|
||
|
|
||
|
type MultiMarketStrategy struct {
|
||
|
Environ *qbtrade.Environment
|
||
|
Session *qbtrade.ExchangeSession
|
||
|
|
||
|
PositionMap PositionMap `persistence:"position_map"`
|
||
|
ProfitStatsMap ProfitStatsMap `persistence:"profit_stats_map"`
|
||
|
OrderExecutorMap GeneralOrderExecutorMap
|
||
|
|
||
|
parent, ctx context.Context
|
||
|
cancel context.CancelFunc
|
||
|
}
|
||
|
|
||
|
func (s *MultiMarketStrategy) Initialize(ctx context.Context, environ *qbtrade.Environment, session *qbtrade.ExchangeSession, markets map[string]types.Market, strategyID string, instanceID string) {
|
||
|
s.parent = ctx
|
||
|
s.ctx, s.cancel = context.WithCancel(ctx)
|
||
|
|
||
|
s.Environ = environ
|
||
|
s.Session = session
|
||
|
|
||
|
// initialize position map
|
||
|
if s.PositionMap == nil {
|
||
|
log.Infof("creating position map")
|
||
|
s.PositionMap = make(PositionMap)
|
||
|
}
|
||
|
for symbol, market := range markets {
|
||
|
if _, ok := s.PositionMap[symbol]; ok {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
log.Infof("creating position for symbol %s", symbol)
|
||
|
position := types.NewPositionFromMarket(market)
|
||
|
position.Strategy = ID
|
||
|
position.StrategyInstanceID = instanceID
|
||
|
s.PositionMap[symbol] = position
|
||
|
}
|
||
|
|
||
|
// initialize profit stats map
|
||
|
if s.ProfitStatsMap == nil {
|
||
|
log.Infof("creating profit stats map")
|
||
|
s.ProfitStatsMap = make(ProfitStatsMap)
|
||
|
}
|
||
|
for symbol, market := range markets {
|
||
|
if _, ok := s.ProfitStatsMap[symbol]; ok {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
log.Infof("creating profit stats for symbol %s", symbol)
|
||
|
s.ProfitStatsMap[symbol] = types.NewProfitStats(market)
|
||
|
}
|
||
|
|
||
|
// initialize order executor map
|
||
|
s.OrderExecutorMap = NewGeneralOrderExecutorMap(session, strategyID, instanceID, s.PositionMap)
|
||
|
s.OrderExecutorMap.BindEnvironment(environ)
|
||
|
s.OrderExecutorMap.BindProfitStats(s.ProfitStatsMap)
|
||
|
s.OrderExecutorMap.Bind()
|
||
|
}
|