Files
gostock/internal/logic/restful/starter.go
2026-02-27 13:43:01 +08:00

106 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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": "策略规则",
}
// CTARSI指标贴近下轨并成上涨趋势
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
// CTAMACD指标红绿柱及价量关系
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).Order("last1_day_total_amount desc").Limit(5).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)
}