init
This commit is contained in:
94
llmjob/2874.go
Normal file
94
llmjob/2874.go
Normal file
@@ -0,0 +1,94 @@
|
||||
// 修复后的banbot完整策略代码
|
||||
package llmjob
|
||||
|
||||
import (
|
||||
"github.com/banbox/banbot/config"
|
||||
"github.com/banbox/banbot/core"
|
||||
"github.com/banbox/banbot/strat"
|
||||
ta "github.com/banbox/banta"
|
||||
"math"
|
||||
)
|
||||
|
||||
func J2874(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
||||
// 定义可调参数
|
||||
rsiPeriod := pol.DefInt("rsiPeriod", 70, core.PNorm(20, 100))
|
||||
longExitThreshold := pol.Def("longExitThreshold", 0.65, core.PNorm(0.55, 0.8))
|
||||
shortExitThreshold := pol.Def("shortExitThreshold", 0.35, core.PNorm(0.2, 0.45))
|
||||
allowLong := pol.Def("allowLong", 1.0, core.PUniform(0, 1)) > 0.5
|
||||
allowShort := pol.Def("allowShort", 1.0, core.PUniform(0, 1)) > 0.5
|
||||
|
||||
return &strat.TradeStrat{
|
||||
WarmupNum: rsiPeriod, // 预热期至少为RSI周期
|
||||
HedgeOff: true, // 单向持仓模式,与原PineScript策略一致
|
||||
RunTimeFrames: []string{"4h"},
|
||||
OnBar: func(s *strat.StratJob) {
|
||||
e := s.Env
|
||||
|
||||
// 计算各种价格组合
|
||||
ohlc4 := ta.HLC3(e.High, e.Low, e.Close).Add(e.Open).Div(4)
|
||||
hlc3 := ta.HLC3(e.High, e.Low, e.Close)
|
||||
hl2 := ta.HL2(e.High, e.Low)
|
||||
|
||||
// 计算各种RSI值并归一化(除以100)
|
||||
rsiOhlc4 := ta.RSI(ohlc4, rsiPeriod).Div(100)
|
||||
rsiClose := ta.RSI(e.Close, rsiPeriod).Div(100)
|
||||
rsiOpen := ta.RSI(e.Open, rsiPeriod).Div(100)
|
||||
rsiHigh := ta.RSI(e.High, rsiPeriod).Div(100)
|
||||
rsiHlc3 := ta.RSI(hlc3, rsiPeriod).Div(100)
|
||||
rsiHl2 := ta.RSI(hl2, rsiPeriod).Div(100)
|
||||
|
||||
// 计算RSI均值
|
||||
rsiAvg := rsiOhlc4.Add(rsiClose).Add(rsiOpen).Add(rsiHigh).Add(rsiHlc3).Add(rsiHl2).Div(6)
|
||||
rsiAvgVal := rsiAvg.Get(0)
|
||||
|
||||
// 检查数据有效性
|
||||
if math.IsNaN(rsiAvgVal) {
|
||||
return
|
||||
}
|
||||
|
||||
// 检测RSI均值与0.5的交叉
|
||||
entryThreshold := 0.5
|
||||
crossSignal := rsiAvg.Cross(entryThreshold)
|
||||
|
||||
// 生成交易信号
|
||||
longSignal := crossSignal == 1 // RSI均值上穿0.5
|
||||
shortSignal := crossSignal == -1 // RSI均值下穿0.5
|
||||
|
||||
// 生成平仓信号
|
||||
longExit := rsiAvgVal >= longExitThreshold || shortSignal
|
||||
shortExit := rsiAvgVal <= shortExitThreshold || longSignal
|
||||
|
||||
// 执行交易逻辑
|
||||
if allowLong && longSignal && len(s.LongOrders) == 0 {
|
||||
// 开多头仓位
|
||||
s.OpenOrder(&strat.EnterReq{
|
||||
Tag: "long",
|
||||
})
|
||||
}
|
||||
|
||||
if allowShort && shortSignal && len(s.ShortOrders) == 0 {
|
||||
// 开空头仓位
|
||||
s.OpenOrder(&strat.EnterReq{
|
||||
Tag: "short",
|
||||
Short: true,
|
||||
})
|
||||
}
|
||||
|
||||
if allowLong && len(s.LongOrders) > 0 && longExit {
|
||||
// 平多头仓位
|
||||
s.CloseOrders(&strat.ExitReq{
|
||||
Tag: "long_exit",
|
||||
Dirt: core.OdDirtLong,
|
||||
})
|
||||
}
|
||||
|
||||
if allowShort && len(s.ShortOrders) > 0 && shortExit {
|
||||
// 平空头仓位
|
||||
s.CloseOrders(&strat.ExitReq{
|
||||
Tag: "short_exit",
|
||||
Dirt: core.OdDirtShort,
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user