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 }