package ptn import ( ta "github.com/banbox/banta" "math" ) func getOHLC(e *ta.BarEnv, i int) (float64, float64, float64, float64) { return e.Open.Get(i), e.High.Get(i), e.Low.Get(i), e.Close.Get(i) } type EngulfingRes struct { Bottom float64 Top float64 } func makeEngulfingRes(dirt int, minVal, maxVal float64) *PtnRes { return &PtnRes{ Type: PtnEngulfing, Dirt: dirt, Confidence: 1, Data: &EngulfingRes{ Bottom: minVal, Top: maxVal, }, } } /* 检查是否是吞没形态 1 看涨吞没 -1看跌吞没 */ func isEngulfing(e *ta.BarEnv) *PtnRes { o, h, l, c := getOHLC(e, 0) o1, h1, l1, c1 := getOHLC(e, 1) solid := math.Abs(o - c) if solid/(h-l) < 0.6 { // 第二个蜡烛实体至少60% return nil } solid1 := math.Abs(o1 - c1) if solid1/(h1-l1) <= 0.13 && solid > solid1*3 { // 第一个是十字星,直接符合 if o > c { return makeEngulfingRes(-1, min(l, l1), max(h, h1)) } else { return makeEngulfingRes(1, min(l, l1), max(h, h1)) } } if o < c { // 后一个是阳线,要求前一个是阴线 if o1 > c1 && o1 <= c && c1 >= o { // 前开<收盘 & 前收 > 开盘 return makeEngulfingRes(1, min(l, l1), max(h, h1)) } } else if o1 < c1 && c1 <= o && o1 >= c { // 后一个阴线,要求前一个阳线 // 前收<开盘 & 前开 > 收盘 return makeEngulfingRes(-1, min(l, l1), max(h, h1)) } return nil }