package trend import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/orm/ormo" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) /* 测试仅catr时开多,持有一日平仓 */ func smp1(p *config.RunPolicyConfig) *strat.TradeStrat { allowOpen := false return &strat.TradeStrat{ WarmupNum: 10, RunTimeFrames: []string{"4h"}, OnPairInfos: func(s *strat.StratJob) []*strat.PairSub { return []*strat.PairSub{ {"_cur_", "1d", 30}, } }, OnSymbols: func(items []string) []string { hasBTC := false for _, it := range items { if it == "BTC/USDT:USDT" { hasBTC = true } } if !hasBTC { return append([]string{"BTC/USDT:USDT"}, items...) } return items }, OnStartUp: func(s *strat.StratJob) { s.More = 0 }, OnBar: func(s *strat.StratJob) { e := s.Env atr := ta.ATR(e.High, e.Low, e.Close, 14).Get(0) doOpen := s.More.(int) c := e.Close.Get(0) o := e.Open.Get(0) if len(s.LongOrders) > 0 { slPrice := c - atr*3 for _, od := range s.LongOrders { holdNum := e.BarCount(od.EnterAt) if holdNum < 8 { continue } sl := od.GetStopLoss() if sl == nil && (c-od.InitPrice < atr*3 || o >= c-atr*0.6) { s.CloseOrders(&strat.ExitReq{ Tag: "exit", OrderID: od.ID, }) } else if sl == nil || slPrice > sl.Price { od.SetStopLoss(&ormo.ExitTrigger{ Price: slPrice, }) } } } else if doOpen == 1 { s.More = 0 s.OpenOrder(&strat.EnterReq{ Tag: "long1", }) } }, OnInfoBar: func(s *strat.StratJob, e *ta.BarEnv, pair, tf string) { if pair == "BTC/USDT:USDT" { ma30 := ta.SMA(e.Close, 45).Get(0) c := e.Close.Get(0) allowOpen = c > ma30 } c := e.Close.Get(0) h1 := e.High.Get(1) atr := ta.ATR(e.High, e.Low, e.Close, 14).Get(0) tr := ta.TR(e.High, e.Low, e.Close).Get(0) ma := ta.SMA(e.Close, 14).Get(0) if allowOpen && len(s.LongOrders) == 0 && c < h1-atr*0.4 && c > ma { if tr > atr { s.More = 1 } } }, } } func smp0(p *config.RunPolicyConfig) *strat.TradeStrat { return &strat.TradeStrat{ WarmupNum: 30, RunTimeFrames: []string{"1d"}, OnBar: func(s *strat.StratJob) { e := s.Env c := e.Close.Get(0) h1 := e.High.Get(1) atr := ta.ATR(e.High, e.Low, e.Close, 14).Get(0) tr := ta.TR(e.High, e.Low, e.Close).Get(0) ma := ta.SMA(e.Close, 14).Get(0) if len(s.LongOrders) > 0 { s.CloseOrders(&strat.ExitReq{ Tag: "exit", Dirt: core.OdDirtLong, }) } else if c < h1-atr*0.4 && c > ma { if tr > atr { s.OpenOrder(&strat.EnterReq{ Tag: "long1", TakeProfitVal: atr * 2, }) } } }, } }