72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package demo
|
|
|
|
import (
|
|
"github.com/banbox/banbot/config"
|
|
"github.com/banbox/banbot/core"
|
|
"github.com/banbox/banbot/strat"
|
|
ta "github.com/banbox/banta"
|
|
)
|
|
|
|
func Demo(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
|
// 定义可调超参数
|
|
fastPeriod := pol.DefInt("fastPeriod", 5, core.PNorm(3, 20))
|
|
maRate := pol.Def("maRate", 4.0, core.PNorm(1.5, 9.0))
|
|
|
|
// 计算慢速均线周期
|
|
slowPeriod := int(float64(fastPeriod) * maRate)
|
|
|
|
return &strat.TradeStrat{
|
|
WarmupNum: slowPeriod + 10,
|
|
OnBar: func(s *strat.StratJob) {
|
|
e := s.Env
|
|
|
|
// 计算技术指标
|
|
maFast := ta.SMA(e.Close, fastPeriod) // 快速移动平均线
|
|
maSlow := ta.SMA(e.Close, slowPeriod) // 慢速移动平均线
|
|
maCrossState := maFast.Cross(maSlow) // 判断均线交叉状态
|
|
|
|
// 金叉:快线上穿慢线
|
|
if maCrossState == 1 {
|
|
// 先平掉空头持仓
|
|
if len(s.ShortOrders) > 0 {
|
|
s.CloseOrders(&strat.ExitReq{
|
|
Tag: "golden_cross_close_short",
|
|
Dirt: core.OdDirtShort,
|
|
})
|
|
}
|
|
|
|
// 再开多头仓位
|
|
if len(s.LongOrders) == 0 {
|
|
s.OpenOrder(&strat.EnterReq{
|
|
Tag: "golden_cross_long",
|
|
Short: false,
|
|
})
|
|
}
|
|
}
|
|
|
|
// 死叉:快线下穿慢线
|
|
if maCrossState == -1 {
|
|
// 先平掉多头持仓
|
|
if len(s.LongOrders) > 0 {
|
|
s.CloseOrders(&strat.ExitReq{
|
|
Tag: "death_cross_close_long",
|
|
Dirt: core.OdDirtLong,
|
|
})
|
|
}
|
|
|
|
// 再开空头仓位
|
|
if len(s.ShortOrders) == 0 {
|
|
s.OpenOrder(&strat.EnterReq{
|
|
Tag: "death_cross_short",
|
|
Short: true,
|
|
})
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
strat.StratMake["demo"] = Demo
|
|
}
|