This commit is contained in:
2026-02-27 13:26:22 +08:00
parent 4dde784047
commit fc5a1be7e1
8 changed files with 47 additions and 40 deletions

View File

@@ -12,7 +12,7 @@ import (
func Run(key string, ymd int) {
log.Println("Run Mock Order.")
var stocks []*models.StratModel
impl.DBService.Where("strat_key=? and ymd=? and rsi_score>0 and macd_score>0 and ai_score>=?", key, ymd, 5).Find(&stocks)
impl.DBService.Where("strat_key=? and ymd=? and status=2 and ai_score>=?", key, ymd, 5).Find(&stocks)
if len(stocks) == 0 {
log.Println("No data to process.")
return

View File

@@ -1,23 +1,25 @@
package restful
import (
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/quant/gostock/internal/impl"
"git.apinb.com/quant/gostock/internal/logic/strategy"
"git.apinb.com/quant/gostock/internal/models"
"github.com/gin-gonic/gin"
)
func Recommend(ctx *gin.Context) {
ymd := lastYmd()
strategy.TotalScore(ymd)
ymdQuery := ctx.DefaultQuery("ymd", "")
var ymd int
if ymdQuery != "" {
ymd = utils.String2Int(ymdQuery)
}
if ymd == 0 {
ymd = models.GetYmd()
}
var stocks []string
impl.DBService.Model(&models.StratModel{}).Where("total_score>?", 0).Pluck("code", &stocks)
impl.DBService.Model(&models.StratModel{}).Where("status=2 and ai_score>=5 and ymd=?", ymd).Pluck("code", &stocks)
ctx.JSON(200, stocks)
return
}
func lastYmd() int {
var ymd int
sql := "select ymd from strat_model sm group by ymd order by ymd desc limit 1"
impl.DBService.Raw(sql).Scan(&ymd)
return ymd
}

View File

@@ -67,19 +67,34 @@ func Starter(ctx *gin.Context) {
var allowStocks []*models.StratModel
impl.DBService.Model(&models.StratModel{}).Where("status=1 and ymd=?", ymd).Find(&allowStocks)
for _, m := range allowStocks {
upd := map[string]any{
"recommend_desc": "策略规则",
}
// CTARSI指标贴近下轨并成上涨趋势
rsiResult := indicator.RunRsi(m.Code)
impl.DBService.Model(m).Where("id=?", m.ID).Updates(map[string]any{"rsi_score": rsiResult.Score, "rsi_val_oversold": rsiResult.Oversold, "rsi_val_prve": rsiResult.Prve, "rsi_val_last": rsiResult.Last, "recommend_desc": m.RecommendDesc + "||Rsi:" + rsiResult.Desc})
upd["rsi_score"] = rsiResult.Score
upd["rsi_val_oversold"] = rsiResult.Oversold
upd["rsi_val_prve"] = rsiResult.Prve
upd["rsi_val_last"] = rsiResult.Last
upd["total_desc"] = m.TotalDesc + "||Rsi:" + rsiResult.Desc
// CTAMACD指标红绿柱及价量关系
macdResult := indicator.RunMacd(m.Code)
impl.DBService.Model(m).Where("id=?", m.ID).Updates(map[string]any{"macd_score": macdResult.Score, "macd_val": macdResult.Val, "recommend_desc": m.RecommendDesc + "||Macd:" + macdResult.Desc})
upd["macd_score"] = macdResult.Score
upd["macd_val"] = macdResult.Val
upd["total_desc"] = upd["total_desc"].(string) + "||Macd:" + macdResult.Desc
// 更新数据
impl.DBService.Model(&models.StratModel{}).Where("id=?", m.ID).Updates(upd)
}
// 将满足条件的状态标记为2,待AI分析
impl.DBService.Model(&models.StratModel{}).Where("ymd=? and rsi_score>0 and macd_score>0 and status=1", ymd).Updates(map[string]any{"status": 2})
// 加入资金流向特大的标的
var codes []string
impl.DBService.Model(&models.MoneyTotal{}).Where("is_greater_pervious = ? and last3_day_mf_amount>?", true, 100000).Pluck("code", &codes)
impl.DBService.Model(&models.StratModel{}).Where("ai_score=-2 and code in ?", codes).Updates(map[string]any{"ai_score": 0, "recommend_desc": "资金流向"})
impl.DBService.Model(&models.StratModel{}).Where("ymd=? and code in ?", ymd, codes).Updates(map[string]any{"status": 2, "recommend_desc": "资金流向"})
// Todo: 舆论分析得出的标的

View File

@@ -16,7 +16,7 @@ func Boot() {
// 启动 AI 分析任务
func BootAiStart(key string, ymd int) error {
var datas []models.StratModel
err := impl.DBService.Where("strat_key=? and ymd=? and ai_score=0 and rsi_score>0 and macd_score>0", key, ymd).Find(&datas).Error
err := impl.DBService.Where("strat_key=? and ymd=? and status=2", key, ymd).Find(&datas).Error
if err != nil {
log.Printf("Failed to query data: %v", err)
return fmt.Errorf("query failed: %w", err)
@@ -25,8 +25,9 @@ func BootAiStart(key string, ymd int) error {
// 构造任务列表
var tasks []func()
for _, row := range datas {
r := row
tasks = append(tasks, func() {
BootAiTask(row.ID, row.Code)
BootAiTask(r.ID, r.Code)
})
}

View File

@@ -21,7 +21,7 @@ func (r *RuleFactory) RunAmount(code string) {
check := true
for _, row := range data {
if row.Amount < MinPrice {
if row.Amount < MinAmount {
check = false
break
}

View File

@@ -1,21 +1,14 @@
package strategy
import (
"log"
// func TotalScore(ymd int) {
// log.Println("Total Score", ymd)
// where := " where up_date_day>360 and ymd=" + utils.Int2String(ymd)
// sql := "update strat_model set total_score=industry_score+st_score+gt_amount+gt_price+roe_score+rsi_score" + where
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/quant/gostock/internal/impl"
)
func TotalScore(ymd int) {
log.Println("Total Score", ymd)
where := " where up_date_day>360 and ymd=" + utils.Int2String(ymd)
sql := "update strat_model set total_score=industry_score+st_score+gt_amount+gt_price+roe_score+rsi_score" + where
log.Println("SQL:", sql)
err := impl.DBService.Exec(sql).Error
if err != nil {
log.Println("Failed to update total score:", err)
return
}
}
// log.Println("SQL:", sql)
// err := impl.DBService.Exec(sql).Error
// if err != nil {
// log.Println("Failed to update total score:", err)
// return
// }
// }

View File

@@ -24,7 +24,7 @@ type StratModel struct {
RoeScore int // ROE 是否大于设定值
ValRoe float64 // ROE 值
RecommendDesc string // 推荐描述
Status int // 状态 -1:不推荐0:正常 1:推荐
Status int // 状态 -1:不推荐0:未处理, 1:推荐待指标分析, 2:待AI分析
// macd
MacdScore int `gorm:"default:0"`