48 lines
1.6 KiB
Go
48 lines
1.6 KiB
Go
// Package models 中的现货持仓表模型,由 logic 包读写;表名 spot_positions。
|
||
package models
|
||
|
||
import (
|
||
"time"
|
||
|
||
"git.apinb.com/bsm-sdk/core/database"
|
||
)
|
||
|
||
// SpotPosition 现货策略在库中的一行:按 BaseAsset 唯一,对应 watchList 里每个基础资产。
|
||
type SpotPosition struct {
|
||
ID uint `gorm:"primarykey"`
|
||
CreatedAt time.Time
|
||
UpdatedAt time.Time
|
||
|
||
// BaseAsset 基础资产代码,如 BTC;唯一索引,用于 upsert 与内存 map 的键
|
||
BaseAsset string `gorm:"uniqueIndex:uk_spot_base_asset;size:32;not null"`
|
||
// Symbol 交易对,如 BTCUSDT
|
||
Symbol string `gorm:"size:32;not null"`
|
||
// AvgCostUSDT 加权平均持仓成本(USDT/枚)
|
||
AvgCostUSDT float64 `gorm:"column:avg_cost_usdt;not null;default:0"`
|
||
// Quantity 策略侧同步的持仓数量(枚)
|
||
Quantity float64 `gorm:"not null;default:0"`
|
||
// DipLegLocked 超跌加仓波段锁
|
||
DipLegLocked bool `gorm:"column:dip_leg_locked;not null;default:false"`
|
||
// RallyLegLocked 冲高减仓波段锁
|
||
RallyLegLocked bool `gorm:"column:rally_leg_locked;not null;default:false"`
|
||
}
|
||
|
||
func init() {
|
||
database.AppendMigrate(&SpotPosition{})
|
||
}
|
||
|
||
// TableName 显式表名,避免与结构体名推导不一致。
|
||
func (SpotPosition) TableName() string {
|
||
return "spot_positions"
|
||
}
|
||
|
||
// SpotPortfolioSnapshot 内存中的组合视图:从数据库加载后填充 Positions。
|
||
type SpotPortfolioSnapshot struct {
|
||
Positions map[string]*SpotPosition
|
||
}
|
||
|
||
// NewSpotPortfolioSnapshot 创建空快照。
|
||
func NewSpotPortfolioSnapshot() *SpotPortfolioSnapshot {
|
||
return &SpotPortfolioSnapshot{Positions: make(map[string]*SpotPosition)}
|
||
}
|