63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
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
|
|
}
|