59 lines
2.2 KiB
Go
59 lines
2.2 KiB
Go
|
|
package schema
|
|||
|
|
|
|||
|
|
import "strconv"
|
|||
|
|
|
|||
|
|
// StockDaily 股票日线数据(两仓库结构一致)。
|
|||
|
|
type StockDaily struct {
|
|||
|
|
ID uint `gorm:"primarykey;autoIncrement" json:"id"`
|
|||
|
|
TsCode string `gorm:"type:varchar(20);not null;index:idx_ts_code;uniqueIndex:un_code_date;comment:股票代码" json:"ts_code"`
|
|||
|
|
TradeDate int `gorm:"index:idx_trade_date;uniqueIndex:un_code_date;comment:交易日期" json:"trade_date"`
|
|||
|
|
Open float64 `gorm:"type:decimal(10,4);comment:开盘价" json:"open"`
|
|||
|
|
High float64 `gorm:"type:decimal(10,4);comment:最高价" json:"high"`
|
|||
|
|
Low float64 `gorm:"type:decimal(10,4);comment:最低价" json:"low"`
|
|||
|
|
Close float64 `gorm:"type:decimal(10,4);comment:收盘价" json:"close"`
|
|||
|
|
PreClose float64 `gorm:"type:decimal(10,4);comment:昨收价(除权价)" json:"pre_close"`
|
|||
|
|
Change float64 `gorm:"type:decimal(10,4);comment:涨跌额" json:"change"`
|
|||
|
|
PctChg float64 `gorm:"type:decimal(10,6);comment:涨跌幅(%)" json:"pct_chg"`
|
|||
|
|
DayChg float64 `gorm:"type:decimal(6,2);comment:日均振幅(%)" json:"day_chg"`
|
|||
|
|
Vol float64 `gorm:"type:decimal(15,2);comment:成交量(手)" json:"vol"`
|
|||
|
|
Amount float64 `gorm:"type:decimal(20,2);comment:成交额(千元)" json:"amount"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (StockDaily) TableName() string {
|
|||
|
|
return "stock_daily"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Key 业务主键:ts_code + 交易日。
|
|||
|
|
func (d *StockDaily) Key() string {
|
|||
|
|
if d.TsCode == "" && d.TradeDate == 0 {
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
return d.TsCode + "#" + strconv.Itoa(d.TradeDate)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IsRising 是否收涨(昨收有效且收盘高于昨收)。
|
|||
|
|
func (d *StockDaily) IsRising() bool {
|
|||
|
|
return d.PreClose > 0 && d.Close > d.PreClose
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IsFalling 是否收跌。
|
|||
|
|
func (d *StockDaily) IsFalling() bool {
|
|||
|
|
return d.PreClose > 0 && d.Close < d.PreClose
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PctChangeFromPre 由昨收计算的涨跌幅(%);昨收无效时返回 0。
|
|||
|
|
func (d *StockDaily) PctChangeFromPre() float64 {
|
|||
|
|
if d.PreClose <= 0 {
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
return (d.Close - d.PreClose) / d.PreClose * 100
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AmplitudePct 振幅(相对昨收,%):(最高-最低)/昨收*100。
|
|||
|
|
func (d *StockDaily) AmplitudePct() float64 {
|
|||
|
|
if d.PreClose <= 0 {
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
return (d.High - d.Low) / d.PreClose * 100
|
|||
|
|
}
|