This commit is contained in:
2026-08-24 20:53:21 +08:00
commit 6e78bba16a
287 changed files with 32443 additions and 0 deletions

108
surge/down_test.go Normal file
View File

@@ -0,0 +1,108 @@
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
}