60 lines
2.1 KiB
Go
60 lines
2.1 KiB
Go
package trend
|
|
|
|
import (
|
|
"github.com/banbox/banbot/config"
|
|
"github.com/banbox/banbot/core"
|
|
"github.com/banbox/banbot/strat"
|
|
)
|
|
|
|
func pcmp(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
|
// 定义可优化的超参数
|
|
shortPeriod := int(pol.Def("short", 7, core.PNorm(5, 10)))
|
|
longPeriod := int(pol.Def("long", 14, core.PNorm(10, 20)))
|
|
|
|
return &strat.TradeStrat{
|
|
WarmupNum: longPeriod + 5, // 预热数据数量,确保有足够的历史数据
|
|
EachMaxLong: 1, // 最多持有1个多单
|
|
EachMaxShort: 1, // 最多持有1个空单
|
|
OnBar: func(s *strat.StratJob) {
|
|
e := s.Env
|
|
curPrice := e.Close.Get(0)
|
|
|
|
// 检查当前价格是否高于短周期和长周期前的价格
|
|
shortPriceHigher := curPrice > e.Close.Get(shortPeriod)
|
|
longPriceHigher := curPrice > e.Close.Get(longPeriod)
|
|
|
|
// 检查当前价格是否低于短周期和长周期前的价格
|
|
shortPriceLower := curPrice < e.Close.Get(shortPeriod)
|
|
longPriceLower := curPrice < e.Close.Get(longPeriod)
|
|
|
|
// 多头信号:当前价格比两个周期前都高
|
|
goLong := shortPriceHigher && longPriceHigher
|
|
|
|
// 空头信号:当前价格比两个周期前都低
|
|
goShort := shortPriceLower && longPriceLower
|
|
|
|
// 检查当前订单状态
|
|
hasLongOrder := len(s.LongOrders) > 0
|
|
hasShortOrder := len(s.ShortOrders) > 0
|
|
|
|
// 开多单逻辑:当前价格比两个周期前都高,且没有持仓
|
|
if goLong && !hasLongOrder && !hasShortOrder {
|
|
s.OpenOrder(&strat.EnterReq{Tag: "long"})
|
|
} else if goShort && !hasShortOrder && !hasLongOrder {
|
|
// 开空单逻辑:当前价格比两个周期前都低,且没有持仓
|
|
s.OpenOrder(&strat.EnterReq{Tag: "short", Short: true})
|
|
}
|
|
|
|
// 平多单逻辑:不满足做多条件,且有多单持仓
|
|
if !goLong && hasLongOrder {
|
|
s.CloseOrders(&strat.ExitReq{Tag: "close_long", Dirt: core.OdDirtLong})
|
|
}
|
|
|
|
// 平空单逻辑:不满足做空条件,且有空单持仓
|
|
if !goShort && hasShortOrder {
|
|
s.CloseOrders(&strat.ExitReq{Tag: "close_short", Dirt: core.OdDirtShort})
|
|
}
|
|
},
|
|
}
|
|
}
|