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 J32(pol *config.RunPolicyConfig) *strat.TradeStrat { smaLength := pol.DefInt("smaLength", 30, core.PNorm(5, 30)) macdFastLength := pol.DefInt("macdFastLength", 25, core.PNorm(5, 20)) macdSlowLength := pol.DefInt("macdSlowLength", 38, core.PNorm(15, 40)) macdSignalSmoothing := pol.DefInt("macdSignalSmoothing", 3, core.PNorm(3, 15)) warmupNum := smaLength if macdSlowLength > warmupNum { warmupNum = macdSlowLength } if macdFastLength+macdSignalSmoothing > warmupNum { warmupNum = macdFastLength + macdSignalSmoothing } return &strat.TradeStrat{ WarmupNum: warmupNum, HedgeOff: true, EachMaxLong: 1, RunTimeFrames: []string{"8h"}, OnBar: func(s *strat.StratJob) { e := s.Env sma10 := ta.SMA(e.Close, smaLength) macdLine, signalLine := ta.MACD(e.Close, macdFastLength, macdSlowLength, macdSignalSmoothing) closePrice := e.Close.Get(0) sma10Value := sma10.Get(0) macdValue := macdLine.Get(0) signalValue := signalLine.Get(0) if math.IsNaN(closePrice) || math.IsNaN(sma10Value) || math.IsNaN(macdValue) || math.IsNaN(signalValue) { return } priceCrossSMA := e.Close.Cross(sma10) macdCrossSignal := macdLine.Cross(signalLine) longCondition := priceCrossSMA == 1 && macdCrossSignal == 1 shortCondition := priceCrossSMA == -1 && macdCrossSignal == -1 if longCondition && len(s.LongOrders) == 0 { s.OpenOrder(&strat.EnterReq{ Tag: "Long", }) s.CloseOrders(&strat.ExitReq{ Tag: "CloseShort", Dirt: core.OdDirtShort, }) } if shortCondition && len(s.LongOrders) > 0 { s.OpenOrder(&strat.EnterReq{ Tag: "Short", Short: true, }) s.CloseOrders(&strat.ExitReq{ Tag: "CloseLong", Dirt: core.OdDirtLong, }) } }, } }