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

23
old/t01/1h.go Normal file
View File

@@ -0,0 +1,23 @@
package t01
import (
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/strat"
)
func Main1HV1(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 最适合1h的参数,测试20240101-20240324,50币,无需大周期趋势
maSml = 10
openOffRate = -1.5
badRate = 1.5
goodRate = 1
return &strat.TradeStrat{
Version: 1,
WarmupNum: 300,
MinTfScore: 0.75,
//OnPairInfos: onPairInfos,
OnStartUp: onStartUp,
//OnInfoBar: onInfoBar,
OnBar: onBar,
}
}

BIN
old/t01/20240322_24_1h.xlsx Normal file

Binary file not shown.

BIN
old/t01/20240322_24_4h.xlsx Normal file

Binary file not shown.

BIN
old/t01/20240322_24_5m.xlsx Normal file

Binary file not shown.

23
old/t01/4h.go Normal file
View File

@@ -0,0 +1,23 @@
package t01
import (
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/strat"
)
func Main4HV1(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 最适合4h的参数,测试20240101-20240324,50币,无需大周期趋势
maSml = 10
openOffRate = -1
badRate = 1.5
goodRate = 1
return &strat.TradeStrat{
Version: 1,
WarmupNum: 300,
MinTfScore: 0.75,
//OnPairInfos: onPairInfos,
OnStartUp: onStartUp,
//OnInfoBar: onInfoBar,
OnBar: onBar,
}
}

138
old/t01/common.go Normal file
View File

@@ -0,0 +1,138 @@
package t01
import (
"github.com/banbox/banbot/orm/ormo"
"github.com/banbox/banbot/strat"
"github.com/banbox/banexg/log"
"github.com/banbox/banstagy/com"
ta "github.com/banbox/banta"
"go.uber.org/zap"
"math"
)
var (
// 这里是默认参数,请尽量在MainVX()中修改,不要在这里修改
maBig = 30
maSml = 30
maParent = 50
sampleNum = 500 // 斜率采样数量
sampleStep = 2 // 斜率计算间隔
atrLen = 14
openOffRate = float64(0) // 开单时,从均线偏移基准ATR的倍数
goodRate = float64(10) // 收益超过此倍数的ATR时,将止损更新为均线
badRate = float64(5) // 损失超过此倍数的ATR时,止损退出
)
type MoreType struct {
bigSlop *com.Slop
hitGoods map[int64]bool // 触发goodRate的订单ID,允许每个bar更新止损
}
func openOrder(s *strat.StratJob, closePrice, dirt, price, stopLoss float64) {
if (stopLoss-closePrice)*dirt >= 0 {
// 当前止损立刻满足,跳过
return
}
tag := "long"
if dirt < 0 {
tag = "short"
}
err := s.OpenOrder(&strat.EnterReq{
Tag: tag,
Limit: price,
StopLoss: stopLoss,
Short: dirt < 0,
})
if err != nil {
log.Error("open order fail", zap.Error(err))
}
}
func onStartUp(s *strat.StratJob) {
s.More = &MoreType{
bigSlop: com.NewSlop(sampleNum, 0.25),
hitGoods: make(map[int64]bool),
}
}
func onInfoBar(s *strat.StratJob, e *ta.BarEnv, pair, tf string) {
sma := ta.SMA(e.Close, maParent)
prevSma := sma.Get(sampleStep)
if e.BarNum%sampleStep > 0 || math.IsNaN(prevSma) {
return
}
more, _ := s.More.(*MoreType)
curSma := sma.Get(0)
slop := (curSma - prevSma) / curSma
more.bigSlop.Update(e.BarNum, slop)
}
func onBar(s *strat.StratJob) {
e := s.Env
atr := ta.ATR(e.High, e.Low, e.Close, atrLen)
baseAtrLen := int(math.Round(float64(atrLen) * 4.3))
atrBase := ta.Lowest(ta.Highest(atr, atrLen), baseAtrLen).Get(0)
c := e.Close.Get(0)
smaBig := ta.SMA(e.Close, maBig)
smaVal := smaBig.Get(0)
// smaSml := ta.SMA(e.Close, maSml)
// maX := smaSml.Cross(smaBig)
// rsiVal := ta.RSI(e.Close, 20).Get(0)
more, _ := s.More.(*MoreType)
prevSma := smaBig.Get(sampleStep)
if e.BarNum%sampleStep == 0 && !math.IsNaN(prevSma) {
slop := (smaVal - prevSma) / smaVal
more.bigSlop.Update(e.BarNum, slop)
}
var longOd, shortOd *ormo.InOutOrder
if len(s.LongOrders) > 0 {
longOd = s.LongOrders[0]
}
if len(s.ShortOrders) > 0 {
shortOd = s.ShortOrders[0]
}
atrVal := atr.Get(0)
slRange := max(atrBase*badRate, atrVal*1.5)
// 检查是否触发盈利阈值,若触发更新止损
var orders = []*ormo.InOutOrder{longOd, shortOd}
for _, od := range orders {
if od != nil {
odDirt := 1.0
if od.Short {
odDirt = -1
}
isGood, ok := more.hitGoods[od.ID]
if !ok && (c-od.Enter.Average)*odDirt >= atrBase*goodRate {
more.hitGoods[od.ID] = true
isGood = true
}
if isGood {
// 已触发盈利阈值,每个bar更新止损
sl := od.GetStopLoss()
if sl == nil || (smaVal-sl.Price)*odDirt > 0 {
od.SetStopLoss(&ormo.ExitTrigger{Price: smaVal})
}
} else if od.Status == ormo.InOutStatusInit {
// 尚未入场,更新入场价格,更新止损
_ = od.SetEnterLimit(smaVal)
od.SetStopLoss(&ormo.ExitTrigger{Price: smaVal - odDirt*slRange})
}
}
}
if atrVal < atrBase {
// && more.bigSlop.Dirt > 0
if longOd == nil && more.bigSlop.Dirt >= 0 {
// 开多单 && c-smaVal+slRange > atrBase*0.5
openOrder(s, c, 1, 0, c-slRange)
}
// && more.bigSlop.Dirt < 0
if shortOd == nil && more.bigSlop.Dirt <= 0 {
// 开空单 && smaVal+slRange-c > atrBase*0.5
openOrder(s, c, -1, 0, c+slRange)
}
}
}

27
old/t01/v1.go Normal file
View File

@@ -0,0 +1,27 @@
package t01
import (
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/strat"
"github.com/banbox/banstagy/com"
)
func MainV1(pol *config.RunPolicyConfig) *strat.TradeStrat {
// 最适合5m的参数,测试20240322-20240324,50币,无需大周期趋势
maSml = 10
maBig = 50
maParent = 30
openOffRate = 0.5
badRate = 3
goodRate = 3
return &strat.TradeStrat{
Version: 1,
WarmupNum: 300,
MinTfScore: 0.75,
//DrawDownExit: true,
OnStartUp: onStartUp,
OnBar: onBar,
OnPairInfos: com.MakePairInfos(sampleNum*sampleStep + maParent),
OnInfoBar: onInfoBar,
}
}