Files
banstagy/surge/down_test.go
2026-08-24 20:53:21 +08:00

109 lines
2.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}