package demo import ( "github.com/banbox/banbot/config" "github.com/banbox/banbot/orm/ormo" "github.com/banbox/banbot/strat" ta "github.com/banbox/banta" ) func fixRiskReward(p *config.RunPolicyConfig) *strat.TradeStrat { rewardRate := 4.0 return &strat.TradeStrat{ EachMaxLong: 1, WarmupNum: 30, OnBar: func(s *strat.StratJob) { e := s.Env atr := ta.ATR(e.High, e.Low, e.Close, 14).Get(0) rsi := ta.RSI50(e.Close, 14).Get(0) ma := ta.SMA(e.Close, 5).Get(0) maMid := ta.SMA(e.Close, 10).Get(0) maBig := ta.SMA(e.Close, 40).Get(0) c := e.Close.Get(0) if s.OrderNum == 0 && maMid > maBig && rsi > 15 && c < ma { s.OpenOrder(&strat.EnterReq{ Tag: "long", StopLossVal: atr, StopLossTag: "init", }) } }, OnCheckExit: func(s *strat.StratJob, od *ormo.InOutOrder) *strat.ExitReq { sl := od.GetStopLoss() if sl.Tag == "take" { // 已设置止盈 return nil } if sl.Tag == "init" { // 检查是否回本,如果是,设置止损到成本线 if od.ProfitRate > 0 { // 保存初始止损空间 od.SetInfo("initSL", sl.Range) feeRate := od.Enter.FeeQuote * 2 / od.EnterCost() slPrice := od.Enter.Average * (1 + feeRate) od.SetStopLoss(&ormo.ExitTrigger{ Price: slPrice, Tag: "break_even", }) } } else { //已设置成本止损,检查是否触发止盈 slRange := od.GetInfoFloat64("initSL") if od.Profit > slRange*rewardRate { // 触发止盈线,设置止盈线止损 od.SetStopLoss(&ormo.ExitTrigger{ Price: od.Enter.Average + slRange*rewardRate, Tag: "take", }) } } return nil }, } }