104 lines
2.7 KiB
Go
104 lines
2.7 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"
|
||
"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
|
||
//},
|
||
}
|
||
}
|