package trend import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/core" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" "math" ) /* 视频号:山居听雨楼 2025/02/19 “有没有一眼就能看清楚,而且很好用的交易方法。。。。。这里分享一个只用macd的交易方法。” 【主要思想】 大周期(1d)MACD快线和慢线都处于0轴上方看多,都处于0轴下方看空; 小周期(8h)MACD: 看多时:快线上穿0轴或金叉,做多;死叉平仓。 看空时:快线下穿0轴或死叉,做空,死叉平仓。 测试小周期金叉死叉无需要求0轴上下,略好一点。 测试小周期当前参数4h盈利最佳。大周期1d最佳。 */ func MACDX2(p *config.RunPolicyConfig) *strat.TradeStrat { return &strat.TradeStrat{ WarmupNum: 200, RunTimeFrames: []string{"4h"}, OnPairInfos: func(s *strat.StratJob) []*strat.PairSub { return []*strat.PairSub{ {"_cur_", "1d", 100}, } }, OnStartUp: func(s *strat.StratJob) { s.More = 0 }, OnBar: func(s *strat.StratJob) { e := s.Env dirt := s.More.(int) macdCols := ta.MACD(e.Close, 26, 56, 20).Cols macdX := macdCols[0].Cross(macdCols[1]) macdX2 := macdCols[0].Cross(0) atr := ta.ATR(e.High, e.Low, e.Close, 30) openRate := 0.015 * e.Close.Get(0) / atr.Get(0) if openRate < 1 { openRate = math.Sqrt(openRate) } openRate *= 1.3 er := ta.ER(e.Close, 50) erDelta := min(1.3, er.Get(0)/er.Get(12)) if erDelta > 1 { openRate *= erDelta } if len(s.LongOrders) > 0 { if macdX == -1 { s.CloseOrders(&strat.ExitReq{Tag: "closeL", Dirt: core.OdDirtLong}) } } else if dirt > 0 && openRate > 0 { if macdX == 1 { s.OpenOrder(&strat.EnterReq{Tag: "long", CostRate: openRate}) } else if macdX2 == 1 { s.OpenOrder(&strat.EnterReq{Tag: "long2", CostRate: openRate}) } } if len(s.ShortOrders) > 0 { if macdX == 1 { s.CloseOrders(&strat.ExitReq{Tag: "closeS", Dirt: core.OdDirtShort}) } } else if dirt < 0 && openRate > 0 { if macdX == -1 { s.OpenOrder(&strat.EnterReq{Tag: "short", Short: true, CostRate: openRate}) } else if macdX2 == -1 { s.OpenOrder(&strat.EnterReq{Tag: "short2", Short: true, CostRate: openRate}) } } }, OnInfoBar: func(s *strat.StratJob, e *ta.BarEnv, pair, tf string) { macdCols := ta.MACD(e.Close, 12, 26, 9).Cols macd := macdCols[0].Get(0) signal := macdCols[1].Get(0) if macd > 0 && signal > 0 { s.More = 1 } else if macd < 0 && signal < 0 { s.More = -1 } else { s.More = 0 } }, } }