106 lines
3.6 KiB
Go
106 lines
3.6 KiB
Go
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).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)
|
||
}
|