46 lines
1.9 KiB
Go
46 lines
1.9 KiB
Go
|
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
|
|||
|
}
|