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 }