diff --git a/cmd/pnl/main.go b/cmd/pnl/main.go index 227cfe9..1aab5f6 100644 --- a/cmd/pnl/main.go +++ b/cmd/pnl/main.go @@ -37,7 +37,7 @@ func run() { var daily models.StockDaily impl.DBService.Model(&models.StockDaily{}).Where("ts_code=?", item.Code).Order("id desc").Limit(1).First(&daily) - high := utils.FloatRound(daily.High*0.997, 2) + high := utils.FloatRound(daily.High*0.995, 2) pnl := utils.FloatRound(high-item.OpenPrice, 2) pnlRate := utils.FloatRound(pnl/item.OpenPrice*100, 2) diff --git a/internal/logic/mock/order.go b/internal/logic/mock/order.go index 3d63cd0..22a06ff 100644 --- a/internal/logic/mock/order.go +++ b/internal/logic/mock/order.go @@ -2,6 +2,7 @@ package mock import ( "log" + "time" "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/quant/gostock/internal/impl" @@ -46,29 +47,45 @@ func Run(key string, ymd int) { }) } - CheckClose() + Report() } -func CheckClose() { +func Report() { log.Println("Check Close Mock Order.") var positions []*models.MockPosition impl.DBService.Where("status=0").Find(&positions) for _, p := range positions { var item models.StockDaily - err := impl.DBService.Model(&models.StockDaily{}).Where("ts_code=?", p.Code).Order("id desc").Limit(1).First(&item).Error + err := impl.DBService.Model(&models.StockDaily{}).Where("ts_code=?", p.Code).Order("trade_date desc").Limit(1).First(&item).Error if err != nil { log.Printf("No data for %s, skip.", p.Code) continue } // 1.通过最高价计算平仓价格 - newClosePrice := utils.FloatRound(item.High*0.99, 2) + newClosePrice := utils.FloatRound(item.High*0.995, 2) log.Printf("Latest price for %s is %f,close %f", p.Code, item.High, newClosePrice) // 2.计算盈亏 pnl := utils.FloatRound(newClosePrice-p.OpenPrice, 2) pnlRate := utils.FloatRound(pnl/p.OpenPrice*100, 2) log.Printf("Pnl for %s is %f,rate %f", p.Code, pnl, pnlRate) + + // 3.写入报表 + t, _ := time.Parse(utils.Int2String(item.TradeDate), "20260102") + var cnt int64 + impl.DBService.Model(&models.MockReport{}).Where("today_date = ?", t).Count(&cnt) + if cnt == 0 { + impl.DBService.Model(&models.MockReport{}).Create(&models.MockReport{ + PositionId: p.ID, + Code: p.Code, + ClosePrice: newClosePrice, + Pnl: pnl, + PnlRate: pnlRate, + TodayDate: t, + }) + } + // 3.判断盈亏超过20%,才确定平仓 if pnlRate >= 20 { impl.DBService.Model(&models.MockPosition{}).Where("id=?", p.ID).Updates(map[string]any{ diff --git a/internal/models/mock_report.go b/internal/models/mock_report.go new file mode 100644 index 0000000..b4d39ea --- /dev/null +++ b/internal/models/mock_report.go @@ -0,0 +1,23 @@ +package models + +import ( + "time" + + "git.apinb.com/bsm-sdk/core/database" +) + +type MockReport struct { + ID uint `gorm:"primarykey"` + PositionId uint + TodayDate time.Time + Code string + ClosePrice float64 + Pnl float64 + PnlRate float64 +} + +func (m *MockReport) TableName() string { return "mock_report" } + +func init() { + database.AppendMigrate(&MockReport{}) +}