package strategy import ( "sig-pub/pkg/types" "sig-pub/pkg/utils/collect" ) // 多币种多周期策略 type MultiInstanceRank struct { IIntervalSigStrategy rate float64 rate2 float64 } func (s *MultiInstanceRank) New() ISigStrategy { return &MultiInstanceRank{} } func (s *MultiInstanceRank) Meta() StrategyMeta { return StrategyMeta{ Name: "MultiInstanceRank", Desc: "多币种多周期策略", Input: []types.InputArg{ {Name: "rate", Type: types.InputTypeUFloat, Desc: "上线影线与基线比例"}, {Name: "rate2", Type: types.InputTypeUFloat, Desc: "上线影线之间比例"}, }, } } func (s *MultiInstanceRank) Init(input types.Input) (err error) { // 校验参数, 并根据参数初始化策略 s.rate = input.Float("rate") s.rate2 = input.Float("rate2") return } func (s *MultiInstanceRank) CandlePeriods(ctx IInstanceIntervalSigStrategyContext) (insts []string, iss *types.IntervalState[int16]) { insts = []string{"BTC_USDT", "SOL_USDT"} iss = types.NewIntervalState[int16]() iss.Set(types.Interval5m, 1) iss.Set(types.Interval15m, 2) iss.Set(types.Interval30m, 2) return } func Update(ctx IInstanceIntervalSigStrategyContext) (sides []types.SideInst) { insts := []string{"BTC_USDT", "SOL_USDT"} type instRank struct { inst string atr, score float64 } var ranks []instRank for _, instId := range insts { atr := ctx.Indicator(instId, types.Interval5m, "ATR", 7, 3).Get(0) adx := ctx.Indicator(instId, types.Interval5m, "ADX", 7, 3).Get(0) ranks = append(ranks, instRank{ inst: instId, atr: atr, score: atr*1.5 + adx, }) } // score rank collect.SortDesc(ranks, func(ir instRank) float64 { return ir.score }) st1 := ctx.Indicator("BTC_USDT", types.Interval5m, "SuperTrend", 7, 3) st2 := ctx.Indicator("SOL_USDT", types.Interval5m, "SuperTrend", 7, 3) _, _ = st1, st2 return }