This commit is contained in:
2026-08-24 20:53:21 +08:00
commit 6e78bba16a
287 changed files with 32443 additions and 0 deletions

91
trend/20250225/MACDX.go Normal file
View File

@@ -0,0 +1,91 @@
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
}
},
}
}