106 lines
3.8 KiB
Go
106 lines
3.8 KiB
Go
// 修复后的banbot完整策略代码
|
||
package llmjob
|
||
|
||
import (
|
||
"github.com/banbox/banbot/config"
|
||
"github.com/banbox/banbot/core"
|
||
"github.com/banbox/banbot/strat"
|
||
ta "github.com/banbox/banta"
|
||
)
|
||
|
||
func J1569(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
||
// 定义可调超参数
|
||
fastPeriod := pol.DefInt("fastPeriod", 10, core.PNorm(5, 20))
|
||
smaRatio := pol.Def("smaRatio", 2.0, core.PNorm(1.5, 4.0))
|
||
supportResistancePeriod := pol.DefInt("supportResistancePeriod", 12, core.PNorm(5, 20))
|
||
confirmPeriod := pol.DefInt("confirmPeriod", 3, core.PNorm(2, 5))
|
||
riskRewardRatio := pol.Def("riskRewardRatio", 2.2, core.PNorm(1.5, 3.0))
|
||
|
||
// 计算慢速SMA周期
|
||
slowPeriod := int(float64(fastPeriod) * smaRatio)
|
||
|
||
// 确保预热K线数量足够计算所有指标
|
||
warmupNum := slowPeriod
|
||
if supportResistancePeriod > warmupNum {
|
||
warmupNum = supportResistancePeriod
|
||
}
|
||
|
||
return &strat.TradeStrat{
|
||
WarmupNum: warmupNum,
|
||
HedgeOff: true, // 单向持仓模式
|
||
EachMaxLong: 1, // 最多1个多头订单
|
||
EachMaxShort: 1, // 最多1个空头订单
|
||
RunTimeFrames: []string{"1h"},
|
||
OnBar: func(s *strat.StratJob) {
|
||
e := s.Env
|
||
|
||
// 计算移动平均线
|
||
smaFast := ta.SMA(e.Close, fastPeriod)
|
||
smaSlow := ta.SMA(e.Close, slowPeriod)
|
||
|
||
// 计算支撑阻力位(过去10根K线的最高价和最低价)
|
||
recentLow := ta.Lowest(e.Low, supportResistancePeriod)
|
||
recentHigh := ta.Highest(e.High, supportResistancePeriod)
|
||
|
||
// 计算确认条件所需的指标
|
||
highestSmaSlow := ta.Highest(smaSlow, confirmPeriod)
|
||
lowestSmaSlow := ta.Lowest(smaSlow, confirmPeriod)
|
||
lowestLow3 := ta.Lowest(e.Low, confirmPeriod)
|
||
highestHigh3 := ta.Highest(e.High, confirmPeriod)
|
||
|
||
// 获取当前值
|
||
closePrice := e.Close.Get(0)
|
||
smaSlowVal := smaSlow.Get(0)
|
||
recentLowVal := recentLow.Get(0)
|
||
recentHighVal := recentHigh.Get(0)
|
||
highestSmaSlowVal := highestSmaSlow.Get(0)
|
||
lowestSmaSlowVal := lowestSmaSlow.Get(0)
|
||
lowestLow3Val := lowestLow3.Get(0)
|
||
highestHigh3Val := highestHigh3.Get(0)
|
||
|
||
// 生成交易信号 - 只计算一次交叉信号
|
||
crossSignal := smaFast.Cross(smaSlow)
|
||
bullishCross := crossSignal == 1 // 10周期SMA上穿20周期SMA
|
||
bearishCross := crossSignal == -1 // 10周期SMA下穿20周期SMA
|
||
breakoutUp := closePrice > highestSmaSlowVal // 收盘价突破过去3根K线的20周期SMA最高点
|
||
breakoutDown := closePrice < lowestSmaSlowVal // 收盘价跌破过去3根K线的20周期SMA最低点
|
||
retestUp := lowestLow3Val > smaSlowVal // 过去3根K线的最低价保持在20周期SMA之上
|
||
retestDown := highestHigh3Val < smaSlowVal // 过去3根K线的最高价保持在20周期SMA之下
|
||
|
||
// 三重确认条件
|
||
buyCondition := bullishCross && breakoutUp && retestUp
|
||
sellCondition := bearishCross && breakoutDown && retestDown
|
||
|
||
// 计算止损止盈
|
||
longSL := recentLowVal // 买入止损设为过去10根K线的最低价
|
||
shortSL := recentHighVal // 卖出止损设为过去10根K线的最高价
|
||
|
||
riskSizeLong := closePrice - longSL // 买入交易的风险大小
|
||
riskSizeShort := shortSL - closePrice // 卖出交易的风险大小
|
||
|
||
longTP := closePrice + (riskSizeLong * riskRewardRatio) // 买入交易的止盈价格
|
||
shortTP := closePrice - (riskSizeShort * riskRewardRatio) // 卖出交易的止盈价格
|
||
|
||
// 执行交易
|
||
if buyCondition && len(s.LongOrders) == 0 {
|
||
s.OpenOrder(&strat.EnterReq{
|
||
Tag: "Long",
|
||
OrderType: core.OrderTypeMarket,
|
||
StopLoss: longSL,
|
||
TakeProfit: longTP,
|
||
})
|
||
}
|
||
|
||
if sellCondition && len(s.ShortOrders) == 0 {
|
||
s.OpenOrder(&strat.EnterReq{
|
||
Tag: "Short",
|
||
Short: true,
|
||
OrderType: core.OrderTypeMarket,
|
||
StopLoss: shortSL,
|
||
TakeProfit: shortTP,
|
||
})
|
||
}
|
||
},
|
||
}
|
||
}
|