Files
banstagy/old/xem4o.go
2026-08-24 20:53:21 +08:00

90 lines
2.1 KiB
Go
Raw Permalink 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 old
import (
"github.com/banbox/banbot/config"
"github.com/banbox/banbot/exg"
"github.com/banbox/banbot/orm/ormo"
"github.com/banbox/banbot/strat"
ta "github.com/banbox/banta"
"math"
"strconv"
)
/*
这是针对XEM/USDT:USDT的策略,其最小价格变动0.6%,挂单等待成交盈利很稳定。
但实盘时实际成交量很小,挂单十几分钟才吃进去。
*/
func xem40(p *config.RunPolicyConfig) *strat.TradeStrat {
lenAtr := 14
return &strat.TradeStrat{
WarmupNum: 300,
MinTfScore: 0.3,
EachMaxLong: 1,
EachMaxShort: 1,
OnStartUp: func(s *strat.StratJob) {
pip, err := exg.Default.PriceOnePip(s.Symbol.Symbol)
if err != nil {
panic(err)
}
s.More = pip
},
OnBar: func(s *strat.StratJob) {
e := s.Env
c := e.Close.Get(0)
pip := s.More.(float64)
if pip/c < 0.002 {
// 仅针对XEM,最小价格变动是0.6%
return
}
volMa := ta.SMA(e.Volume, 14).Get(0)
maSml := ta.SMA(e.Close, 50).Get(0)
maBig := ta.SMA(e.Close, 300).Get(0)
rsi := ta.RSI50(e.Close, 50).Get(0)
atr := ta.ATR(e.High, e.Low, e.Close, lenAtr).Get(0)
if s.OrderNum > 0 {
var od *ormo.InOutOrder
if len(s.LongOrders) > 0 {
od = s.LongOrders[0]
} else {
od = s.ShortOrders[0]
}
if od.Status == ormo.InOutStatusPartEnter && (e.TimeStop-od.RealEnterMS())/e.TFMSecs > 3 {
s.CloseOrders(&strat.ExitReq{Tag: "cancel", UnFillOnly: true})
}
return
}
sub1, sub2 := c-maSml, maSml-maBig
dirt := 0
if sub1*sub2 <= 0 && math.Abs(sub2) < atr {
// 震荡行情
if rsi > 3 {
dirt = -1
} else if rsi < -3 {
dirt = 1
}
}
if dirt == 0 && math.Abs(sub2) < pip {
// 波动很小,直接开单
dirt = 1
if c > maSml {
dirt = -1
}
}
if dirt != 0 {
amt := min(volMa*0.1, config.StakeAmount/c)
s.OpenOrder(&strat.EnterReq{
Tag: strconv.Itoa(dirt),
Short: dirt < 0,
Limit: c,
Amount: amt,
StopLossVal: pip * 2,
TakeProfitVal: pip,
StopBars: 20,
})
}
},
}
}