blockchain/internal/lib/strategy/ema.go

67 lines
2.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}