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

98
trend/swing.go Normal file
View File

@@ -0,0 +1,98 @@
package trend
import (
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/core"
"github.com/banbox/banbot/strat"
ta "github.com/banbox/banta"
)
/*
初版:https://jesse.trade/strategies/trendswingtrader-v1
去掉e1<c或e1>c后,更不稳定
adx对部分条件应用会更好,直接全部过滤略差
加入海龟资金管理&ER开仓系数后表现略差
*/
func swing(p *config.RunPolicyConfig) *strat.TradeStrat {
slRate := p.Def("slRate", 4.5, core.PNorm(0.5, 5))
tpRate := p.Def("tpRate", 8, core.PNorm(3, 13))
return &strat.TradeStrat{
WarmupNum: 200,
OnBar: func(s *strat.StratJob) {
e := s.Env
c := e.Close.Get(0)
adx := ta.ADX(e.High, e.Low, e.Close, 14).Get(0)
atr := ta.ATR(e.High, e.Low, e.Close, 14).Get(0)
e1 := ta.EMA(e.Close, 30).Get(0)
e2 := ta.EMA(e.Close, 50).Get(0)
e3 := ta.EMA(e.Close, 120).Get(0)
openRate := float64(1)
trend := float64(0)
tag := ""
if e2 < e1 && e1 < c {
if e3 < e2 {
tag = "long1"
} else {
tag = "long2"
if adx <= 25 {
// 表现较差
openRate *= 0.5
}
}
trend = 1
} else if e2 > e1 && e1 > c {
if e3 > e2 {
tag = "short1"
} else {
tag = "short2"
if adx <= 25 {
// 表现较差
openRate *= 0.5
}
}
trend = -1
}
if tag != "" {
if adx <= 25 {
tag += "_a"
}
}
if len(s.LongOrders) > 0 {
for _, od := range s.LongOrders {
sl := od.GetStopLoss()
curSL := c - atr*slRate
if curSL > sl.Price {
sl.Price = curSL
}
}
} else if trend == 1 && tag != "" && openRate > 0 {
s.OpenOrder(&strat.EnterReq{
Tag: tag,
CostRate: openRate,
StopLossVal: atr * slRate,
TakeProfitVal: atr * tpRate,
TakeProfitRate: 0.5,
})
}
if len(s.ShortOrders) > 0 {
for _, od := range s.ShortOrders {
sl := od.GetStopLoss()
curSL := c + atr*slRate
if curSL < sl.Price {
sl.Price = curSL
}
}
} else if trend == -1 && tag != "" && openRate > 0 {
s.OpenOrder(&strat.EnterReq{
Tag: tag,
Short: true,
CostRate: openRate,
StopLossVal: atr * slRate,
TakeProfitVal: atr * tpRate,
TakeProfitRate: 0.5,
})
}
},
}
}