init
This commit is contained in:
103
llmjob/2523.go
Normal file
103
llmjob/2523.go
Normal file
@@ -0,0 +1,103 @@
|
||||
// 修复后的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"
|
||||
)
|
||||
|
||||
/*
|
||||
以大止损实现的高胜率,订单太少
|
||||
尝试使用atrBase针对CostRate、TakeProfit、StopLoss进行自适应,效果都更差。
|
||||
*/
|
||||
|
||||
func J2523(pol *config.RunPolicyConfig) *strat.TradeStrat {
|
||||
// 定义可调参数
|
||||
maLen := pol.DefInt("maLen", 240, core.PNorm(50, 300))
|
||||
adxThres := pol.Def("adxThres", 20, core.PNorm(15, 35))
|
||||
slRate := pol.Def("slRate", 2.5, core.PNorm(0.8, 5.0))
|
||||
|
||||
// 计算预热K线数,确保所有指标都能正确计算
|
||||
warmupNum := maLen + 20
|
||||
|
||||
//rates := make([]float64, 0, 10)
|
||||
return &strat.TradeStrat{
|
||||
WarmupNum: warmupNum,
|
||||
RunTimeFrames: []string{"3d"},
|
||||
StakeRate: 20,
|
||||
EachMaxLong: 1,
|
||||
EachMaxShort: 1,
|
||||
OnBar: func(s *strat.StratJob) {
|
||||
e := s.Env
|
||||
|
||||
// 计算技术指标
|
||||
maBig := ta.SMA(e.Close, maLen)
|
||||
rsi := ta.RSI(e.Close, 14)
|
||||
// 使用DMI计算ADX,与原始策略保持一致
|
||||
adx := ta.ADX(e.High, e.Low, e.Close, 14)
|
||||
atr := ta.ATR(e.High, e.Low, e.Close, 14)
|
||||
|
||||
// 获取当前值和历史值,避免重复计算
|
||||
curClose := e.Close.Get(0)
|
||||
curMA := maBig.Get(0)
|
||||
curRSI := rsi.Get(0)
|
||||
curADX := adx.Get(0)
|
||||
curATR := atr.Get(0)
|
||||
|
||||
// 检查数据有效性
|
||||
if math.IsNaN(curClose) || math.IsNaN(curMA) || math.IsNaN(curRSI) ||
|
||||
math.IsNaN(curADX) || math.IsNaN(curATR) {
|
||||
return
|
||||
}
|
||||
|
||||
// 检查2根K线前是否发生交叉
|
||||
closeXBig := e.Close.Cross(maBig)
|
||||
rsi2 := rsi.Get(2)
|
||||
adxOk := adx.Get(2) > adxThres
|
||||
buyConfirmation := closeXBig == 3 && (rsi2 > 40) && adxOk
|
||||
sellConfirmation := closeXBig == -3 && (rsi2 < 60) && adxOk
|
||||
|
||||
// 执行交易逻辑
|
||||
if buyConfirmation {
|
||||
s.OpenOrder(&strat.EnterReq{
|
||||
Tag: "Buy",
|
||||
TakeProfitVal: curClose * 0.02, // 2%止盈
|
||||
StopLossVal: slRate * curATR,
|
||||
})
|
||||
s.CloseOrders(&strat.ExitReq{
|
||||
Tag: "XShort",
|
||||
Dirt: core.OdDirtShort,
|
||||
})
|
||||
}
|
||||
|
||||
if sellConfirmation {
|
||||
s.OpenOrder(&strat.EnterReq{
|
||||
Tag: "short",
|
||||
Short: true,
|
||||
TakeProfitVal: curClose * 0.02, // 2%止盈
|
||||
StopLossVal: slRate * curATR,
|
||||
})
|
||||
s.CloseOrders(&strat.ExitReq{
|
||||
Tag: "XLong",
|
||||
Dirt: core.OdDirtLong,
|
||||
})
|
||||
}
|
||||
},
|
||||
//OnShutDown: func(s *strat.StratJob) {
|
||||
// if len(rates) == 0 {
|
||||
// return
|
||||
// }
|
||||
// sort.Float64s(rates)
|
||||
// size := len(rates) / 10
|
||||
// for i := 0; i < len(rates); i += size {
|
||||
// block := rates[i:min(len(rates), i+size)]
|
||||
// avg := floats.Sum(block) / float64(len(block))
|
||||
// fmt.Printf("rate %v: %.3f\n", i, avg)
|
||||
// }
|
||||
// rates = nil
|
||||
//},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user