package surge import ( "bufio" "fmt" "github.com/banbox/banbot/btime" "github.com/banbox/banbot/core" ta "github.com/banbox/banta" "math" "os" "strconv" "strings" "testing" "time" ) /* 测试顺势暴跌做空。应对2025-10-10 */ func TestDownQwen(t *testing.T) { stamps, data, err := ParseFile("E:\\trade\\go\\bandata\\backtest\\bdb35c1d91\\surge_alldown.log") if err != nil { panic(err) } env, _ := ta.NewBarEnv("", "", "", "1m") lenS := env.NewSeries(nil) volS := env.NewSeries(nil) var prevLen float64 var volThres = 2.8 var holdBars int var holdAmt, openDirt float64 for i, row := range data { timeMS := stamps[i] vol, solid, lenMid, _, len66 := row[0], row[1], row[2], row[3], row[4] if math.IsNaN(lenMid) { continue } env.TimeStop = timeMS lenS.Append(lenMid) volS.Append(vol) volMa1 := ta.SMA(volS, 3).Get(1) low5len := ta.Lowest(lenS, 30).Get(1) if openDirt != 0 { // 正在做空/多 holdAmt += lenMid holdBars += 1 if lenMid*openDirt < 0 { dateStr := btime.ToDateStr(timeMS, core.DefaultDateFmt) fmt.Printf("%s close, hold %d total: %.2f\n", dateStr, holdBars, holdAmt*openDirt) openDirt, holdBars = 0, 0 holdAmt = 0 } } else if vol > volThres && lenMid < low5len && len66 < 0 && solid < -0.5 && prevLen < 0 { // 成交量突破阈值,中位数阴线,3个len全部阴线,中位数创新低 // 与前一个k线比率不超过3 prevRate := lenMid / prevLen if prevRate < 3 && prevRate > 1.5 && vol/volMa1 < 2 { openDirt = -1 fmt.Printf("%s short, thres: %.2f vol: %.2f len: %.2f solid: %.2f\n", btime.ToDateStr(timeMS, core.DefaultDateFmt), volThres, vol, lenMid, solid) } } prevLen = lenMid } } func ParseFile(path string) ([]int64, [][5]float64, error) { f, err := os.Open(path) if err != nil { return nil, nil, err } defer f.Close() var ts []int64 var vals [][5]float64 scanner := bufio.NewScanner(f) for scanner.Scan() { t, v := ParseLine(scanner.Text()) if t != 0 { ts = append(ts, t) vals = append(vals, v) } } return ts, vals, scanner.Err() } func ParseLine(s string) (int64, [5]float64) { var arr [5]float64 f := strings.Fields(s) if len(f) < 7 { return 0, arr } t, err := time.ParseInLocation("2006-01-02 15:04:05", f[0]+" "+f[1], time.UTC) if err != nil { return 0, arr } for i := 0; i < 5; i++ { v, err := strconv.ParseFloat(f[2+i], 64) if err != nil { return t.UnixMilli(), arr } arr[i] = v } return t.UnixMilli(), arr }