package indicator import ( "errors" "git.beejay.kim/Gshopper/sentio" "git.beejay.kim/Gshopper/sentio/talib" "time" ) func AtrTrailingStopLoss(m sentio.Market, period uint, length uint, multiplier float64, hhv int, symbols ...string, ) (map[string]float64, error) { var ( stoplosses map[string]float64 bars map[string][]sentio.Bar err error ) if bars, err = m.HistoricalBars(symbols, time.Minute*time.Duration(period), nil); err != nil { return nil, err } stoplosses = make(map[string]float64) for s := range bars { if bars == nil || len(bars[s]) < int(length) { return nil, errors.New("AtrStopLoss: could not calculate stoploss for too short timeseries") } h := make([]float64, len(bars[s])) l := make([]float64, len(bars[s])) c := make([]float64, len(bars[s])) for i := range bars[s] { h[i] = bars[s][i].High l[i] = bars[s][i].Low c[i] = bars[s][i].Close } atr := talib.Atr(h, l, c, int(length)) trailing := make([]float64, len(atr)) for i := range atr { trailing[i] = c[i] - multiplier*atr[i] } if hhv > 1 { trailing = talib.Max(trailing, hhv) } stoplosses[s] = trailing[len(trailing)-1] } return stoplosses, nil }