|
|
|
@ -180,11 +180,11 @@ func (svc *TradingService) IndicatorSeries(indicatorName string, window uint32, |
|
|
|
if totalK, err = indCtx.Init(sr); err != nil { |
|
|
|
if totalK, err = indCtx.Init(sr); err != nil { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
count := uint32(totalK) - window |
|
|
|
count := totalK - int(window) |
|
|
|
|
|
|
|
|
|
|
|
matrix = make([]float64, 0, sr.Count) |
|
|
|
matrix = make([]float64, 0, sr.Count) |
|
|
|
times = make([]int64, 0, sr.Count) |
|
|
|
times = make([]int64, 0, sr.Count) |
|
|
|
for i := range count { |
|
|
|
for i := count - 1; i >= 0; i-- { |
|
|
|
indCtx.SetOffset(int16(i)) |
|
|
|
indCtx.SetOffset(int16(i)) |
|
|
|
vector := indicator.Calculate(indCtx, int16(window)) |
|
|
|
vector := indicator.Calculate(indCtx, int16(window)) |
|
|
|
matrix = append(matrix, vector) |
|
|
|
matrix = append(matrix, vector) |
|
|
|
@ -227,30 +227,34 @@ func (svc *TradingService) StrategySeries(req *pb.ReqStrategySeries, rsp *pb.Rsp |
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// recover todo out of range
|
|
|
|
// recover todo out of range
|
|
|
|
count, totalK := 0, 0 |
|
|
|
count, totalK := 0, 0 |
|
|
|
indCtx := NewHistoryIndicatorContext(svc.exchangeClient) |
|
|
|
indicatorContext := NewHistoryIndicatorContext(svc.exchangeClient) |
|
|
|
req.Series.Window += MaxIndicatorWindow |
|
|
|
req.Series.Window += MaxIndicatorWindow |
|
|
|
if totalK, err = indCtx.Init(req.Series); err != nil { |
|
|
|
if totalK, err = indicatorContext.Init(req.Series); err != nil { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
count = totalK - MaxIndicatorWindow |
|
|
|
count = totalK - MaxIndicatorWindow |
|
|
|
|
|
|
|
|
|
|
|
strategyCtx := NewStrategyContext(indCtx, svc.indicatorReg) |
|
|
|
strategyContext := NewStrategyContext(indicatorContext, svc.indicatorReg) |
|
|
|
for i := range count { |
|
|
|
for i := count - 1; i >= 0; i-- { |
|
|
|
strategyCtx.SetOffset(int16(i)) |
|
|
|
strategyContext.SetOffset(int16(i)) |
|
|
|
side := sigStrategy.Update(strategyCtx) |
|
|
|
side := sigStrategy.Update(strategyContext) |
|
|
|
if side == pb.Side_BUY || side == pb.Side_SELL { |
|
|
|
if side == pb.Side_BUY || side == pb.Side_SELL { |
|
|
|
k := strategyCtx.Get(0) |
|
|
|
signalK := strategyContext.Get(0) |
|
|
|
rsp.Signal = append(rsp.Signal, side) |
|
|
|
rsp.Signal = append(rsp.Signal, side) |
|
|
|
rsp.Times = append(rsp.Times, k.Ts) |
|
|
|
rsp.Times = append(rsp.Times, signalK.Ts) |
|
|
|
|
|
|
|
{ |
|
|
|
strategyCtx.indicatorContext.AddOffset(1) |
|
|
|
// todo delete
|
|
|
|
nextK := strategyCtx.Get(0) |
|
|
|
win := false |
|
|
|
strategyCtx.indicatorContext.AddOffset(-1) |
|
|
|
if indicatorContext.GetOffset() > 0 { |
|
|
|
// win = c.Get(0).Close.Cmp(signalPrice) < 0
|
|
|
|
nextK := indicatorContext.Get(-1) |
|
|
|
rsp.Wins = strategyCtx.wins |
|
|
|
if side == pb.Side_BUY { |
|
|
|
// signal []pb.Side // 0.sell,1.buy
|
|
|
|
win = nextK.Close.Cmp(signalK.Close) > 0 |
|
|
|
// signalTimes []int64
|
|
|
|
} else { |
|
|
|
// wins []bool
|
|
|
|
win = nextK.Close.Cmp(signalK.Close) < 0 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
rsp.Wins = append(rsp.Wins, win) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// 信号点胜率判断
|
|
|
|
// 信号点胜率判断
|
|
|
|
|