28 lines
659 B
Go
28 lines
659 B
Go
package strategy
|
||
|
||
import "github.com/shopspring/decimal"
|
||
|
||
/************** EMA 指數移動平均 **************/
|
||
type EMA struct {
|
||
n int
|
||
alp decimal.Decimal // 平滑係數 α = 2 / (n + 1)
|
||
val decimal.Decimal // 當前EMA值
|
||
ok bool
|
||
}
|
||
|
||
func NewEMA(n int) *EMA {
|
||
return &EMA{n: n, alp: decimal.NewFromFloat(2.0).Div(decimal.NewFromInt(int64(n + 1)))}
|
||
}
|
||
|
||
func (e *EMA) Push(close decimal.Decimal) (decimal.Decimal, bool) {
|
||
if !e.ok {
|
||
// 第一筆資料直接當作EMA初始值
|
||
e.val = close
|
||
e.ok = true
|
||
return e.val, false
|
||
}
|
||
// EMA計算公式
|
||
e.val = e.alp.Mul(close).Add(decimal.NewFromInt(1).Sub(e.alp).Mul(e.val))
|
||
return e.val, true
|
||
}
|