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" "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"` 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) impl.NewImpl() data_ok := []*ResultData{} data_not := []*ResultData{} for _, code := range strategy.GetStocks() { basic := strategy.GetBasic(code) if ok, data := RuleFilter(basic); ok { data_ok = append(data_ok, data) } else { data_not = append(data_not, data) } } WriteResults(data_ok, "ok") WriteResults(data_not, "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, *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 }