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.
 
 

69 lines
1.8 KiB

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
}