You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
83 lines
2.2 KiB
package strategy |
|
|
|
import ( |
|
"math" |
|
"sig-pub/pkg/types" |
|
) |
|
|
|
// TrendTrackV1 趋势追踪策略v1 |
|
type TrendTrackV1 struct { |
|
} |
|
|
|
func (s *TrendTrackV1) New() ISigStrategy { |
|
return &TrendTrackV1{} |
|
} |
|
|
|
func (s *TrendTrackV1) Meta() StrategyMeta { |
|
return StrategyMeta{ |
|
Name: "TrendTrackV1", |
|
Desc: "趋势追踪策略v1", |
|
Input: []types.InputArg{ |
|
// {Name: "trend1Window", Type: types.InputTypeUInt, Desc: "SuperTrend ATR周期"}, |
|
}, |
|
} |
|
} |
|
|
|
// Init 校验参数, 并根据参数初始化策略 |
|
func (s *TrendTrackV1) Init(input types.Input) (err error) { |
|
return |
|
} |
|
|
|
func (s *TrendTrackV1) CandlePeriods(ctx ISingleSigStrategyContext) int16 { |
|
return max( |
|
ctx.Indicator("RSI", types.Input{"window": 14}).CandlePeriods(), |
|
ctx.Indicator("ADX", types.Input{"window": 14}).CandlePeriods(), |
|
ctx.Indicator("SuperTrend", types.Input{"window": 14, "mul": 2}).CandlePeriods(), |
|
) |
|
} |
|
|
|
func (s *TrendTrackV1) Update(ctx ISingleSigStrategyContext) (side types.Side) { |
|
// RSI向上强度衰减后,RSI转向下且强度增加,考虑趋势反转,发出卖出信号 |
|
rsi := ctx.Indicator("RSI", types.Input{"window": 14}) |
|
r0 := rsi.Get(0) |
|
r1 := rsi.Get(1) |
|
r2 := rsi.Get(2) |
|
r3 := rsi.Get(3) |
|
|
|
d1 := r0 - r1 |
|
d2 := r1 - r2 |
|
d3 := r2 - r3 |
|
|
|
upWeakening := d3 > d2 && d2 > 0 |
|
turnDown := d1 < 0 |
|
downStrengthUp := math.Abs(d1) > d2 |
|
|
|
if upWeakening && turnDown && downStrengthUp { |
|
return types.SideShort |
|
} |
|
return |
|
|
|
// adx := ctx.Indicator("ADX", types.Input{"window": 14}) |
|
// superTrend := ctx.Indicator("SuperTrend", types.Input{"window": 14, "mul": 2}) |
|
|
|
// rsi |
|
// adxValue := adx.Get(0) // 趋势强度 |
|
// direction := superTrend.State("direction", 0) // 趋势方向 |
|
|
|
// if direction == 1 && adxValue > 25 { |
|
// return types.SideLong |
|
// } |
|
|
|
// if direction == -1 && adxValue > 25 { |
|
// return types.SideShort |
|
// } |
|
|
|
// macd := ctx.Indicator("MACD", types.Input{"fast": 12, "slow": 26, "singal": 9}) |
|
// macdDea := macd.StateSeries("dea", 0, 2) |
|
// macdDif := macd.StateSeries("dif", 0, 2) |
|
// crossover := macdDif[0] > macdDea[0] && macdDif[1] < macdDea[1] // 金叉 |
|
// crossunder := macdDif[0] < macdDea[0] && macdDif[1] > macdDea[1] // 死叉 |
|
|
|
// volAvg := ctx.Series(1, 20).Vol().Avg() |
|
// vol := ctx.Get(0).VolF64() |
|
}
|
|
|