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 }