init
This commit is contained in:
91
trend/20250225/MACDX.go
Normal file
91
trend/20250225/MACDX.go
Normal 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
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user