blockchain/internal/lib/strategy/sma.go

47 lines
1.9 KiB
Go
Raw 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"
/* 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 uint) *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
}