67 lines
2.4 KiB
Go
67 lines
2.4 KiB
Go
package strategy
|
||
|
||
import "github.com/shopspring/decimal"
|
||
|
||
/*
|
||
EMA,全名為指數移動平均線(Exponential Moving Average),用於平滑價格波動,幫助識別市場趨勢。
|
||
它與簡單移動平均線(SMA)不同,EMA 更注重近期價格,因此對價格變動的反應更迅速,能更快地反映市場趨勢。
|
||
|
||
EMA 的主要特點和作用:
|
||
更快速的反應:
|
||
EMA 比 SMA 更快地反映價格變動,因為它給予近期數據更高的權重。
|
||
識別趨勢:
|
||
通過平滑價格波動,EMA 有助於識別市場的整體趨勢,判斷是上升趨勢還是下降趨勢。
|
||
輔助交易決策:
|
||
EMA 的使用可以幫助交易者判斷買入和賣出的時機,例如,當股價高於EMA 時,可能被視為買入信號;反之,則可能被視為賣出信號。
|
||
適合短線交易:
|
||
由於EMA 對價格變動的敏感性,它更適合於短線交易者,能更快地捕捉市場的短期波動。
|
||
EMA 的計算方法:
|
||
EMA 的計算涉及一個平滑因子和一個初始值,然後每天更新。 具體公式可以參考專業的金融網站或交易平台提供的資料。
|
||
總結:
|
||
EMA 是一種有用的技術分析工具,尤其適合於快速變動的市場,它可以幫助交易者更好地理解市場趨勢,並制定相應的交易策略
|
||
*/
|
||
|
||
type EMA struct {
|
||
n uint
|
||
alp decimal.Decimal // 平滑係數 α = 2 / (n + 1)
|
||
val decimal.Decimal // 當前EMA值
|
||
ok bool // 內部旗標,用於判斷是否為第一筆資料
|
||
}
|
||
|
||
// NewEMA 建立EMA計算器
|
||
func NewEMA(n uint) *EMA {
|
||
return &EMA{
|
||
n: n,
|
||
alp: decimal.NewFromInt(2).Div(decimal.NewFromInt(int64(n + 1))),
|
||
ok: false,
|
||
}
|
||
}
|
||
|
||
// Push 輸入收盤價,返回當前EMA值
|
||
func (e *EMA) Push(close decimal.Decimal) (decimal.Decimal, bool) {
|
||
// 如果 n 無效,永遠回傳無效狀態
|
||
if e.n == 0 {
|
||
return decimal.Zero, false
|
||
}
|
||
|
||
if !e.ok {
|
||
// 第一筆資料直接當作EMA初始值,並將狀態設為 ok
|
||
e.val = close
|
||
e.ok = true
|
||
} else {
|
||
// 後續資料使用 EMA 計算公式
|
||
// EMA = α * close + (1 - α) * prev_EMA
|
||
e.val = e.alp.Mul(close).Add(decimal.NewFromInt(1).Sub(e.alp).Mul(e.val))
|
||
}
|
||
// EMA 從第一筆資料開始就是有效的
|
||
return e.val, true
|
||
}
|
||
|
||
// GetEMA 取得目前 EMA 值
|
||
func (e *EMA) GetEMA() (decimal.Decimal, bool) {
|
||
if !e.ok {
|
||
return decimal.Zero, false // 尚未初始化
|
||
}
|
||
return e.val, true
|
||
}
|