Browse Source

trading strategy series, all series sort desc

main
strange 10 months ago
parent
commit
b2c3c30eac
  1. 4
      config/exchange.toml
  2. 1
      internal/trading/indicator_series.go
  3. 8
      internal/trading/kline_series.go
  4. 42
      internal/trading/trading_service.go
  5. 6
      pkg/types/series/floats.go

4
config/exchange.toml

@ -18,8 +18,8 @@ receiveBuffer = 4096
marketSubscribeLimit = 16 marketSubscribeLimit = 16
consumeBatch = 1024 consumeBatch = 1024
consumeLater = 2000 # 时间到达later或者数据累计到batch触发consume consumeLater = 2000 # 时间到达later或者数据累计到batch触发consume
# httpProxy = "http://192.168.1.5:7890" httpProxy = "http://192.168.1.5:7890"
httpProxy = "http://10.255.183.209:7890" # httpProxy = "http://10.255.183.209:7890"
# 模拟盘API交易地址如下: # 模拟盘API交易地址如下:
# REST:https://www.okx.com # REST:https://www.okx.com

1
internal/trading/indicator_series.go

@ -30,6 +30,7 @@ func (s *WindowIndicatorSeries) Get(offset int16) (vector float64) {
return return
} }
// Series 返回指标值序列降序
func (s *WindowIndicatorSeries) Series(offset, count int16) (matrix series.Floats) { func (s *WindowIndicatorSeries) Series(offset, count int16) (matrix series.Floats) {
// 设置当前相对offset // 设置当前相对offset
s.indicatorContext.AddOffset(offset) s.indicatorContext.AddOffset(offset)

8
internal/trading/kline_series.go

@ -73,7 +73,7 @@ func (s *KlineSeries) Get(offset int16) (k types.Kline, ok bool) {
return *(s.klines[index]), true return *(s.klines[index]), true
} }
// Series 时间序序列[count...offset] // Series 时间序序列[count...offset]
// offset: 从序列尾部开始偏移量 // offset: 从序列尾部开始偏移量
// count: 从offset位置开始向序列头部k线条数 // count: 从offset位置开始向序列头部k线条数
func (s *KlineSeries) Series(offset, count int16) (klines series.Klines, ok bool) { func (s *KlineSeries) Series(offset, count int16) (klines series.Klines, ok bool) {
@ -93,9 +93,11 @@ func (s *KlineSeries) Series(offset, count int16) (klines series.Klines, ok bool
if ok = indexEnd >= 0 && indexEnd < length && indexStart >= 0 && indexStart < length; !ok { if ok = indexEnd >= 0 && indexEnd < length && indexStart >= 0 && indexStart < length; !ok {
return return
} }
klines = make(series.Klines, 0, indexEnd-indexStart+1) total := indexEnd - indexStart + 1
klines = make(series.Klines, total)
for i := indexStart; i <= indexEnd; i++ { for i := indexStart; i <= indexEnd; i++ {
klines = append(klines, *(s.klines[i])) offset := total - 1 - (i - indexStart)
klines[offset] = *(s.klines[i])
} }
return klines, true return klines, true
} }

42
internal/trading/trading_service.go

@ -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)
}
} }
} }
// 信号点胜率判断 // 信号点胜率判断

6
pkg/types/series/floats.go

@ -6,6 +6,7 @@ import (
"gonum.org/v1/gonum/floats" "gonum.org/v1/gonum/floats"
) )
// 时间降序指标
type Floats []float64 type Floats []float64
func NewFloats(vs ...float64) Floats { func NewFloats(vs ...float64) Floats {
@ -25,12 +26,13 @@ func (s Floats) Length() int {
} }
func (s Floats) Diff() (values Floats) { func (s Floats) Diff() (values Floats) {
length := s.Length()
for i, v := range s { for i, v := range s {
if i == 0 { if i == length-1 {
values.Push(0) values.Push(0)
continue continue
} }
values.Push(v - s[i-1]) values.Push(v - s[i+1])
} }
return values return values
} }

Loading…
Cancel
Save