package restful import ( "log" "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/quant/gostock/internal/impl" "git.apinb.com/quant/gostock/internal/logic/mock" "git.apinb.com/quant/gostock/internal/logic/strategy" "git.apinb.com/quant/gostock/internal/logic/strategy/indicator" "git.apinb.com/quant/gostock/internal/logic/strategy/rule" "git.apinb.com/quant/gostock/internal/models" "github.com/gin-gonic/gin" ) func Starter(ctx *gin.Context) { log.Println("Strategy START.") ymdQuery := ctx.DefaultQuery("ymd", "") var ymd int if ymdQuery != "" { ymd = utils.String2Int(ymdQuery) } if ymd == 0 { ymd = models.GetYmd() } for _, code := range strategy.GetStocks() { // 验收是否已经持仓 if mock.IsPosition(code) { log.Printf("Position exists for %s, skip.", code) continue } basic := strategy.GetBasic(code) model := models.NewStratModel("selector", code, ymd) stratRule := rule.NewRule(model) { // 规则:上市时间 stratRule.RunUpDate(basic.ListDate) // 规则:是否是ST stratRule.RunST(basic.Name) // 规则:行业,剔除夕阳和中性行业 stratRule.RunIndustry(basic.Industry) // 规则:最近20天每天最低价高于5元 stratRule.RunPrice(code) // 规则:每天交易额超过10亿 stratRule.RunAmount(code) // 规则:ROE 市盈率必须为正 stratRule.RunRoe(code) // 满足以上规则在让Deepseek分析 if model.UpDateDay > 360 && model.StScore > 0 && model.IndustryScore > 1 && model.GtPrice > 0 && model.GtAmount > 0 && model.RoeScore > 0 { model.Status = 1 // 待Indicator分析 model.TotalScore = float64(model.IndustryScore + model.StScore + model.GtPrice + model.GtAmount + model.RoeScore) model.AddDesc("Rule规则满足,加入标的") } else { model.Status = -1 model.AddDesc("Rule规则不满足,不加入标的") } } model.Save() } 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": "策略规则", } // CTA:RSI指标贴近下轨并成上涨趋势 rsiResult := indicator.RunRsi(m.Code) 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 // CTA:MACD指标红绿柱及价量关系 macdResult := indicator.RunMacd(m.Code) 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("ymd=? and code in ?", ymd, codes).Updates(map[string]any{"status": 2, "recommend_desc": "资金流向"}) // Todo: 舆论分析得出的标的 // AI分析:根据基本资料,过去200交易日的数据,200日的财务指标,3年财报给出得分 strategy.BootAiStart("selector", ymd) log.Println("Strategy END.") mock.Run("selector", ymd) }