This commit is contained in:
yanweidong
2026-01-30 20:03:50 +08:00
parent efa83b0c96
commit 03bcce8007
3 changed files with 101 additions and 82 deletions

View File

@@ -3,13 +3,11 @@ package main
import (
"log"
"os"
"strings"
"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"
"git.apinb.com/quant/gostock/internal/models"
"git.apinb.com/quant/gostock/internal/logic/types"
"github.com/gocarina/gocsv"
)
@@ -17,15 +15,6 @@ var (
ServiceKey = "gostock"
)
type ResultData struct { // Our example struct, you can use "-" to ignore a field
Code string `csv:"code"`
Name string `csv:"name"`
ROE float64 `csv:"roe"`
RSI float64 `csv:"rsi"`
Desc string `csv:"desc"`
Pass string `csv:"pass"`
}
func main() {
log.Println("Hello Cli!")
config.New(ServiceKey)
@@ -39,11 +28,11 @@ func main2() {
config.New(ServiceKey)
impl.NewImpl()
data_ok := []*ResultData{}
data_not := []*ResultData{}
data_ok := []*types.ResultData{}
data_not := []*types.ResultData{}
for _, code := range strategy.GetStocks() {
basic := strategy.GetBasic(code)
if ok, data := RuleFilter(basic); ok {
if ok, data := strategy.MustFilter(basic); ok {
data_ok = append(data_ok, data)
} else {
data_not = append(data_not, data)
@@ -56,7 +45,7 @@ func main2() {
log.Println("Done!")
}
func WriteResults(data []*ResultData, tag string) {
func WriteResults(data []*types.ResultData, tag string) {
rf, err := os.OpenFile("./result/stocks_"+tag+".csv", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm)
if err != nil {
panic(err)
@@ -69,69 +58,3 @@ func WriteResults(data []*ResultData, tag string) {
}
}
func RuleFilter(basic *models.StockBasic) (bool, *ResultData) {
var descripts []string
data := &ResultData{
Code: basic.TsCode,
Name: basic.Name,
ROE: 0,
RSI: 0,
Desc: "",
Pass: "NOT",
}
if re := rule.NewUpDate().Run(basic.ListDate); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewST().Run(basic.Name); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewIdustry().Run(basic.Industry); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewPrice().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewAmount().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewRoe().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
data.ROE = re.Roe
descripts = append(descripts, re.Desc)
}
if re := rule.NewRsi(strategy.GetArgs(basic.TsCode)).Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
data.RSI = re.Rsi
descripts = append(descripts, re.Desc)
}
data.Desc = strings.Join(descripts, "#")
data.Pass = "OK"
return true, data
}

View File

@@ -0,0 +1,87 @@
package strategy
import (
"strings"
"git.apinb.com/quant/gostock/internal/logic/strategy/rule"
"git.apinb.com/quant/gostock/internal/logic/types"
"git.apinb.com/quant/gostock/internal/models"
)
func MustFilter(basic *models.StockBasic) (bool, *types.ResultData) {
var descripts []string
data := &types.ResultData{
Code: basic.TsCode,
Name: basic.Name,
ROE: 0,
RSI: 0,
Desc: "",
Pass: "NOT",
}
if re := rule.NewUpDate().Run(basic.ListDate); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewST().Run(basic.Name); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewIdustry().Run(basic.Industry); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewPrice().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewAmount().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
descripts = append(descripts, re.Desc)
}
if re := rule.NewRoe().Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
data.ROE = re.Roe
descripts = append(descripts, re.Desc)
}
if re := rule.NewRsi(GetArgs(basic.TsCode)).Run(basic.TsCode); re.Score <= 0 {
data.Desc = re.Desc
return false, data
} else {
data.RSI = re.Rsi
descripts = append(descripts, re.Desc)
}
data.Desc = strings.Join(descripts, "#")
data.Pass = "OK"
return true, data
}
func ClacFilter(basic *models.StockBasic) (bool, *types.ResultData) {
var descripts []string
data := &types.ResultData{
Code: basic.TsCode,
Name: basic.Name,
ROE: 0,
RSI: 0,
Desc: "",
Pass: "NOT",
}
}

View File

@@ -8,3 +8,12 @@ type RuleResult struct {
Rsi float64
Desc string
}
type ResultData struct { // Our example struct, you can use "-" to ignore a field
Code string `csv:"code"`
Name string `csv:"name"`
ROE float64 `csv:"roe"`
RSI float64 `csv:"rsi"`
Desc string `csv:"desc"`
Pass string `csv:"pass"`
}