Files
gostock/cmd/cli/main.go

130 lines
2.8 KiB
Go
Raw Normal View History

2026-01-27 00:25:34 +08:00
package main
2026-01-27 02:09:44 +08:00
import (
"log"
2026-01-28 23:27:21 +08:00
"os"
2026-01-29 00:02:23 +08:00
"strings"
2026-01-27 02:09:44 +08:00
"git.apinb.com/quant/gostock/internal/config"
"git.apinb.com/quant/gostock/internal/impl"
"git.apinb.com/quant/gostock/internal/logic/strategy"
"git.apinb.com/quant/gostock/internal/logic/strategy/rule"
2026-01-28 21:55:50 +08:00
"git.apinb.com/quant/gostock/internal/models"
2026-01-28 23:27:21 +08:00
"github.com/gocarina/gocsv"
2026-01-27 02:09:44 +08:00
)
2026-01-27 00:25:34 +08:00
var (
2026-01-27 02:09:44 +08:00
ServiceKey = "gostock"
2026-01-27 00:25:34 +08:00
)
2026-01-28 23:27:21 +08:00
type ResultData struct { // Our example struct, you can use "-" to ignore a field
2026-01-29 00:35:41 +08:00
Code string `csv:"code"`
Name string `csv:"name"`
ROE float64 `csv:"roe"`
RSI float64 `csv:"rsi"`
Desc string `csv:"desc"`
Pass string `csv:"pass"`
2026-01-28 23:27:21 +08:00
}
2026-01-27 00:25:34 +08:00
func main() {
log.Println("Hello Cli!")
2026-01-27 02:09:44 +08:00
config.New(ServiceKey)
impl.NewImpl()
2026-01-27 02:34:26 +08:00
2026-01-28 23:27:21 +08:00
data_ok := []*ResultData{}
data_not := []*ResultData{}
2026-01-28 02:18:48 +08:00
for _, code := range strategy.GetStocks() {
2026-01-28 21:55:50 +08:00
basic := strategy.GetBasic(code)
2026-01-29 00:35:41 +08:00
if ok, data := RuleFilter(basic); ok {
data_ok = append(data_ok, data)
2026-01-28 21:14:37 +08:00
} else {
2026-01-29 00:35:41 +08:00
data_not = append(data_not, data)
2026-01-28 02:18:48 +08:00
}
}
2026-01-28 23:27:21 +08:00
WriteResults(data_ok, "ok")
2026-01-29 00:02:23 +08:00
WriteResults(data_not, "not")
2026-01-28 02:18:48 +08:00
log.Println("Done!")
}
2026-01-27 02:34:26 +08:00
2026-01-28 23:27:21 +08:00
func WriteResults(data []*ResultData, tag string) {
rf, err := os.OpenFile("./result/stocks_"+tag+".csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer rf.Close()
err = gocsv.MarshalFile(&data, rf) // Use this to save the CSV back to the file
if err != nil {
panic(err)
}
}
2026-01-29 00:35:41 +08:00
func RuleFilter(basic *models.StockBasic) (bool, *ResultData) {
2026-01-29 00:02:23 +08:00
var descripts []string
2026-01-29 00:35:41 +08:00
data := &ResultData{
Code: basic.TsCode,
Name: basic.Name,
ROE: 0,
RSI: 0,
Desc: "",
Pass: "NOT",
}
2026-01-28 21:55:50 +08:00
if re := rule.NewUpDate().Run(basic.ListDate); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
descripts = append(descripts, re.Desc)
2026-01-27 02:34:26 +08:00
}
2026-01-28 21:14:37 +08:00
2026-01-28 21:55:50 +08:00
if re := rule.NewST().Run(basic.Name); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
descripts = append(descripts, re.Desc)
2026-01-28 21:55:50 +08:00
}
if re := rule.NewIdustry().Run(basic.Industry); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
descripts = append(descripts, re.Desc)
2026-01-28 21:14:37 +08:00
}
2026-01-28 21:55:50 +08:00
if re := rule.NewPrice().Run(basic.TsCode); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
descripts = append(descripts, re.Desc)
2026-01-28 21:55:50 +08:00
}
if re := rule.NewAmount().Run(basic.TsCode); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
descripts = append(descripts, re.Desc)
2026-01-28 21:55:50 +08:00
}
2026-01-28 23:09:16 +08:00
if re := rule.NewRoe().Run(basic.TsCode); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
2026-01-29 00:35:41 +08:00
data.ROE = re.Roe
2026-01-29 00:02:23 +08:00
descripts = append(descripts, re.Desc)
2026-01-28 23:09:16 +08:00
}
if re := rule.NewRsi(strategy.GetArgs(basic.TsCode)).Run(basic.TsCode); re.Score <= 0 {
2026-01-29 00:35:41 +08:00
data.Desc = re.Desc
return false, data
2026-01-29 00:02:23 +08:00
} else {
2026-01-29 00:35:41 +08:00
data.RSI = re.Rsi
2026-01-29 00:02:23 +08:00
descripts = append(descripts, re.Desc)
2026-01-28 23:09:16 +08:00
}
2026-01-29 00:35:41 +08:00
data.Desc = strings.Join(descripts, "#")
data.Pass = "OK"
return true, data
2026-01-27 00:25:34 +08:00
}