92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"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"
|
|
"github.com/gocarina/gocsv"
|
|
)
|
|
|
|
var (
|
|
ServiceKey = "gostock"
|
|
)
|
|
|
|
type ResultData struct { // Our example struct, you can use "-" to ignore a field
|
|
Code string `csv:"code"`
|
|
Name string `csv:"name"`
|
|
Desc string `csv:"desc"`
|
|
Pass string `csv:"pass"`
|
|
}
|
|
|
|
func main() {
|
|
log.Println("Hello Cli!")
|
|
config.New(ServiceKey)
|
|
impl.NewImpl()
|
|
|
|
data_ok := []*ResultData{}
|
|
data_not := []*ResultData{}
|
|
for _, code := range strategy.GetStocks() {
|
|
basic := strategy.GetBasic(code)
|
|
if ok, desc := RuleFilter(basic); ok {
|
|
data_ok = append(data_ok, &ResultData{Code: code, Name: basic.Name, Desc: desc, Pass: "OK"})
|
|
} else {
|
|
data_not = append(data_not, &ResultData{Code: code, Name: basic.Name, Desc: desc, Pass: "NOT"})
|
|
}
|
|
}
|
|
|
|
WriteResults(data_ok, "ok")
|
|
WriteResults(data_ok, "not")
|
|
|
|
log.Println("Done!")
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
}
|
|
|
|
func RuleFilter(basic *models.StockBasic) (bool, string) {
|
|
if re := rule.NewUpDate().Run(basic.ListDate); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewST().Run(basic.Name); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewIdustry().Run(basic.Industry); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewPrice().Run(basic.TsCode); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewAmount().Run(basic.TsCode); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewRoe().Run(basic.TsCode); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
|
|
if re := rule.NewRsi(strategy.GetArgs(basic.TsCode)).Run(basic.TsCode); re.Score <= 0 {
|
|
return false, re.Desc
|
|
}
|
|
return true, ""
|
|
}
|