blockchain/internal/lib/strategy/sma.go

46 lines
1.9 KiB
Go
Raw Normal View History

2025-08-14 23:41:29 +00:00
package strategy
import "github.com/shopspring/decimal"
/* SMA (Simple Moving Average) 簡單移動平均線 它透過計算一段時間內股價的平均值來判斷趨勢和提供交易信號
SMA 的計算方式
SMA 簡單地將一段時間內的收盤價加總再除以該期間的交易日數 例如5 日SMA 就是將過去 5 個交易日的收盤價加總後除以 5
SMA 的應用
1. 趨勢判斷:
SMA 可以用來判斷價格的趨勢 當股價在 SMA 上方 SMA 向上移動時表示股價處於上升趨勢
反之當股價在 SMA 下方且SMA 向下移動時表示股價處於下降趨勢
2. 支撐與阻力:
SMA 也可以被視為支撐位和阻力位 當股價下跌到SMA 附近時SMA 可能會提供支撐而當股價上漲到SMA 附近時SMA 可能會提供阻力
3. 交易信號:
移動平均線的交叉也可以產生交易信號 例如當短期SMA 線向上穿越長期SMA 線時被稱為黃金交叉可能是一個買入信號
反之當短期SMA 線向下穿越長期SMA 線時被稱為死亡交叉可能是一個賣出信號
SMA 的優缺點:
優點: SMA 計算簡單易於理解適合新手使用
缺點: SMA 對於價格變動的反應較為遲鈍可能會落後於市場特別是短期波動時可能不如其他移動平均線指標準確
*/
type SMA struct {
q *ringQD
}
// NewSMA 建立SMA計算器
func NewSMA(n int) *SMA { return &SMA{q: newRingQD(n)} }
// Push 輸入收盤價返回當前SMA值
func (s *SMA) Push(close decimal.Decimal) (decimal.Decimal, bool) {
s.q.push(close)
if !s.q.ready() {
return decimal.Zero, false // 尚未湊滿資料
}
return s.q.mean(), true
}
// GetSMA 取得目前 SMA 值
func (s *SMA) GetSMA() (decimal.Decimal, bool) {
if !s.q.ready() {
return decimal.Zero, false // 尚未湊滿資料
}
return s.q.mean(), true
}