mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-22 14:55:16 +00:00
Merge pull request #1188 from c9s/feature/v2-indicator-multiply
FEATURE: [indicator] add multiply operator
This commit is contained in:
commit
8a8111140e
|
@ -80,9 +80,6 @@ func (inc *SSF) Index(i int) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (inc *SSF) Length() int {
|
func (inc *SSF) Length() int {
|
||||||
if inc.Values == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return inc.Values.Length()
|
return inc.Values.Length()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,14 +101,3 @@ func (inc *SSF) CalculateAndUpdate(allKLines []types.KLine) {
|
||||||
inc.EmitUpdate(inc.Last(0))
|
inc.EmitUpdate(inc.Last(0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (inc *SSF) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) {
|
|
||||||
if inc.Interval != interval {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
inc.CalculateAndUpdate(window)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inc *SSF) Bind(updater KLineWindowUpdater) {
|
|
||||||
updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate)
|
|
||||||
}
|
|
||||||
|
|
|
@ -54,32 +54,3 @@ func (inc *StdDev) PushK(k types.KLine) {
|
||||||
inc.Update(k.Close.Float64())
|
inc.Update(k.Close.Float64())
|
||||||
inc.EndTime = k.EndTime.Time()
|
inc.EndTime = k.EndTime.Time()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (inc *StdDev) CalculateAndUpdate(allKLines []types.KLine) {
|
|
||||||
var last = allKLines[len(allKLines)-1]
|
|
||||||
|
|
||||||
if inc.rawValues == nil {
|
|
||||||
for _, k := range allKLines {
|
|
||||||
if inc.EndTime != zeroTime && k.EndTime.Before(inc.EndTime) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
inc.PushK(k)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
inc.PushK(last)
|
|
||||||
}
|
|
||||||
|
|
||||||
inc.EmitUpdate(inc.Values.Last(0))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inc *StdDev) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) {
|
|
||||||
if inc.Interval != interval {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
inc.CalculateAndUpdate(window)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inc *StdDev) Bind(updater KLineWindowUpdater) {
|
|
||||||
updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate)
|
|
||||||
}
|
|
||||||
|
|
15
pkg/indicator/stochstream_callbacks.go
Normal file
15
pkg/indicator/stochstream_callbacks.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Code generated by "callbackgen -type StochStream"; DO NOT EDIT.
|
||||||
|
|
||||||
|
package indicator
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
func (S *StochStream) OnUpdate(cb func(k float64, d float64)) {
|
||||||
|
S.updateCallbacks = append(S.updateCallbacks, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (S *StochStream) EmitUpdate(k float64, d float64) {
|
||||||
|
for _, cb := range S.updateCallbacks {
|
||||||
|
cb(k, d)
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,28 +48,3 @@ var _ types.SeriesExtend = &TMA{}
|
||||||
func (inc *TMA) PushK(k types.KLine) {
|
func (inc *TMA) PushK(k types.KLine) {
|
||||||
inc.Update(k.Close.Float64())
|
inc.Update(k.Close.Float64())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (inc *TMA) CalculateAndUpdate(allKLines []types.KLine) {
|
|
||||||
if inc.s1 == nil {
|
|
||||||
for _, k := range allKLines {
|
|
||||||
inc.PushK(k)
|
|
||||||
inc.EmitUpdate(inc.Last(0))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
k := allKLines[len(allKLines)-1]
|
|
||||||
inc.PushK(k)
|
|
||||||
inc.EmitUpdate(inc.Last(0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inc *TMA) handleKLineWindowUpdate(interval types.Interval, window types.KLineWindow) {
|
|
||||||
if inc.Interval != interval {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
inc.CalculateAndUpdate(window)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inc *TMA) Bind(updater KLineWindowUpdater) {
|
|
||||||
updater.OnKLineWindowUpdate(inc.handleKLineWindowUpdate)
|
|
||||||
}
|
|
||||||
|
|
19
pkg/indicator/v2_multiply.go
Normal file
19
pkg/indicator/v2_multiply.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package indicator
|
||||||
|
|
||||||
|
type MultiplyStream struct {
|
||||||
|
Float64Series
|
||||||
|
multiplier float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func Multiply(source Float64Source, multiplier float64) *MultiplyStream {
|
||||||
|
s := &MultiplyStream{
|
||||||
|
Float64Series: NewFloat64Series(),
|
||||||
|
multiplier: multiplier,
|
||||||
|
}
|
||||||
|
s.Bind(source, s)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MultiplyStream) Calculate(v float64) float64 {
|
||||||
|
return v * s.multiplier
|
||||||
|
}
|
28
pkg/indicator/v2_stddev.go
Normal file
28
pkg/indicator/v2_stddev.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package indicator
|
||||||
|
|
||||||
|
import "github.com/c9s/bbgo/pkg/types"
|
||||||
|
|
||||||
|
type StdDevStream struct {
|
||||||
|
Float64Series
|
||||||
|
|
||||||
|
rawValues *types.Queue
|
||||||
|
|
||||||
|
window int
|
||||||
|
multiplier float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func StdDev2(source Float64Source, window int) *StdDevStream {
|
||||||
|
s := &StdDevStream{
|
||||||
|
Float64Series: NewFloat64Series(),
|
||||||
|
rawValues: types.NewQueue(window),
|
||||||
|
window: window,
|
||||||
|
}
|
||||||
|
s.Bind(source, s)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StdDevStream) Calculate(x float64) float64 {
|
||||||
|
s.rawValues.Update(x)
|
||||||
|
var std = s.rawValues.Stdev()
|
||||||
|
return std
|
||||||
|
}
|
62
pkg/indicator/v2_stoch.go
Normal file
62
pkg/indicator/v2_stoch.go
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
package indicator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/c9s/bbgo/pkg/datatype/floats"
|
||||||
|
"github.com/c9s/bbgo/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Stochastic Oscillator
|
||||||
|
// - https://www.investopedia.com/terms/s/stochasticoscillator.asp
|
||||||
|
//
|
||||||
|
// The Stochastic Oscillator is a technical analysis indicator that is used to identify potential overbought or oversold conditions
|
||||||
|
// in a security's price. It is calculated by taking the current closing price of the security and comparing it to the high and low prices
|
||||||
|
// over a specified period of time. This comparison is then plotted as a line on the price chart, with values above 80 indicating overbought
|
||||||
|
// conditions and values below 20 indicating oversold conditions. The Stochastic Oscillator can be used by traders to identify potential
|
||||||
|
// entry and exit points for trades, or to confirm other technical analysis signals. It is typically used in conjunction with other indicators
|
||||||
|
// to provide a more comprehensive view of the security's price.
|
||||||
|
|
||||||
|
//go:generate callbackgen -type StochStream
|
||||||
|
type StochStream struct {
|
||||||
|
types.SeriesBase
|
||||||
|
|
||||||
|
K, D floats.Slice
|
||||||
|
|
||||||
|
window int
|
||||||
|
dPeriod int
|
||||||
|
|
||||||
|
highPrices, lowPrices *PriceStream
|
||||||
|
|
||||||
|
updateCallbacks []func(k, d float64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stochastic Oscillator
|
||||||
|
func Stoch2(source KLineSubscription, window, dPeriod int) *StochStream {
|
||||||
|
highPrices := HighPrices(source)
|
||||||
|
lowPrices := LowPrices(source)
|
||||||
|
|
||||||
|
s := &StochStream{
|
||||||
|
window: window,
|
||||||
|
dPeriod: dPeriod,
|
||||||
|
highPrices: highPrices,
|
||||||
|
lowPrices: lowPrices,
|
||||||
|
}
|
||||||
|
|
||||||
|
source.AddSubscriber(func(kLine types.KLine) {
|
||||||
|
lowest := s.lowPrices.slice.Tail(s.window).Min()
|
||||||
|
highest := s.highPrices.slice.Tail(s.window).Max()
|
||||||
|
|
||||||
|
var k float64 = 50.0
|
||||||
|
var d float64 = 0.0
|
||||||
|
|
||||||
|
if highest != lowest {
|
||||||
|
k = 100.0 * (kLine.Close.Float64() - lowest) / (highest - lowest)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.K.Push(k)
|
||||||
|
|
||||||
|
d = s.K.Tail(s.dPeriod).Mean()
|
||||||
|
s.D.Push(d)
|
||||||
|
s.EmitUpdate(k, d)
|
||||||
|
})
|
||||||
|
return s
|
||||||
|
}
|
80
pkg/indicator/v2_stoch_test.go
Normal file
80
pkg/indicator/v2_stoch_test.go
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
package indicator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"math"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
||||||
|
"github.com/c9s/bbgo/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
python
|
||||||
|
import pandas as pd
|
||||||
|
import pandas_ta as ta
|
||||||
|
|
||||||
|
klines = ...
|
||||||
|
df = pd.DataFrame(klines, columns=['open', 'high', 'low', 'close', 'volume'])
|
||||||
|
|
||||||
|
print(df.ta.stoch(df['high'], df['low'], df['close'], k=14, d=3, smooth_k=1))
|
||||||
|
*/
|
||||||
|
func TestSTOCH2_update(t *testing.T) {
|
||||||
|
open := []byte(`[8273.0, 8280.0, 8280.0, 8275.0, 8281.0, 8277.0, 8279.0, 8280.0, 8284.0, 8286.0, 8283.0, 8283.0, 8284.0, 8286.0, 8285.0, 8287.0, 8289.0, 8282.0, 8286.0, 8279.0, 8275.0, 8276.0, 8276.0, 8281.0, 8269.0, 8256.0, 8258.0, 8252.0, 8241.0, 8232.0, 8218.0, 8221.0, 8216.0, 8210.0, 8212.0, 8201.0, 8197.0, 8200.0, 8193.0, 8181.0, 8185.0, 8190.0, 8184.0, 8185.0, 8163.0, 8153.0, 8162.0, 8165.0, 8162.0, 8157.0, 8159.0, 8141.0, 8140.0, 8141.0, 8130.0, 8144.0, 8141.0, 8148.0, 8145.0, 8134.0, 8123.0, 8127.0, 8130.0, 8125.0, 8122.0, 8105.0, 8096.0, 8103.0, 8102.0, 8110.0, 8104.0, 8109.0, 8103.0, 8111.0, 8112.0, 8109.0, 8092.0, 8100.0, 8101.0, 8100.0, 8096.0, 8095.0, 8094.0, 8101.0, 8095.0, 8069.0, 8067.0, 8070.0, 8069.0, 8066.0, 8047.0, 8046.0, 8042.0, 8039.0, 8049.0, 8055.0, 8063.0, 8061.0, 8056.0, 8057.0, 8056.0, 8057.0, 8057.0, 8054.0, 8056.0, 8056.0, 8065.0, 8065.0, 8070.0, 8065.0, 8064.0, 8063.0, 8060.0, 8065.0, 8068.0, 8068.0, 8069.0, 8073.0, 8073.0, 8084.0, 8084.0, 8076.0, 8074.0, 8074.0, 8074.0, 8078.0, 8080.0, 8082.0, 8085.0, 8083.0, 8087.0, 8087.0, 8083.0, 8083.0, 8082.0, 8074.0, 8074.0, 8071.0, 8071.0, 8072.0, 8075.0, 8075.0, 8076.0, 8073.0, 8071.0, 8070.0, 8075.0, 8078.0, 8077.0, 8075.0, 8073.0, 8079.0, 8084.0, 8082.0, 8085.0, 8085.0, 8085.0, 8101.0, 8106.0, 8113.0, 8109.0, 8104.0, 8105.0, 8105.0, 8107.0, 8106.0, 8104.0, 8106.0, 8106.0, 8110.0, 8107.0, 8110.0, 8111.0, 8104.0, 8098.0, 8098.0, 8098.0, 8098.0, 8094.0, 8097.0, 8096.0, 8099.0, 8098.0, 8099.0, 8098.0, 8095.0, 8096.0, 8086.0, 8088.0, 8093.0, 8092.0, 8096.0, 8100.0, 8104.0, 8104.0, 8108.0, 8107.0, 8103.0, 8104.0, 8110.0, 8105.0, 8102.0, 8104.0, 8096.0, 8099.0, 8103.0, 8102.0, 8108.0, 8107.0, 8107.0, 8104.0, 8095.0, 8091.0, 8092.0, 8090.0, 8093.0, 8093.0, 8094.0, 8095.0, 8096.0, 8088.0, 8090.0, 8079.0, 8077.0, 8079.0, 8081.0, 8083.0, 8084.0, 8084.0, 8087.0, 8091.0, 8089.0, 8089.0, 8091.0, 8087.0, 8093.0, 8090.0, 8090.0, 8095.0, 8093.0, 8088.0, 8087.0, 8090.0, 8089.0, 8087.0, 8084.0, 8087.0, 8084.0, 8080.0, 8078.0, 8077.0, 8077.0, 8076.0, 8072.0, 8072.0, 8075.0, 8076.0, 8074.0, 8077.0, 8081.0, 8080.0, 8076.0, 8075.0, 8077.0, 8080.0, 8077.0, 8076.0, 8076.0, 8070.0, 8071.0, 8070.0, 8073.0, 8069.0, 8069.0, 8068.0, 8072.0, 8078.0, 8077.0, 8079.0, 8081.0, 8076.0, 8076.0, 8077.0, 8077.0, 8078.0, 8075.0, 8066.0, 8064.0, 8064.0, 8062.0, 8062.0, 8065.0, 8062.0, 8063.0, 8074.0, 8070.0, 8069.0, 8068.0, 8074.0, 8075.0]`)
|
||||||
|
high := []byte(`[8279.0, 8282.0, 8280.0, 8280.0, 8284.0, 8284.0, 8280.0, 8282.0, 8284.0, 8289.0, 8288.0, 8285.0, 8284.0, 8287.0, 8286.0, 8294.0, 8290.0, 8292.0, 8289.0, 8288.0, 8278.0, 8279.0, 8279.0, 8284.0, 8282.0, 8270.0, 8261.0, 8260.0, 8252.0, 8244.0, 8233.0, 8227.0, 8222.0, 8217.0, 8217.0, 8211.0, 8202.0, 8203.0, 8203.0, 8196.0, 8186.0, 8193.0, 8194.0, 8187.0, 8185.0, 8168.0, 8165.0, 8169.0, 8166.0, 8163.0, 8162.0, 8159.0, 8143.0, 8148.0, 8143.0, 8146.0, 8152.0, 8149.0, 8152.0, 8147.0, 8138.0, 8128.0, 8134.0, 8131.0, 8133.0, 8123.0, 8106.0, 8105.0, 8104.0, 8113.0, 8112.0, 8112.0, 8111.0, 8114.0, 8115.0, 8114.0, 8110.0, 8101.0, 8107.0, 8103.0, 8100.0, 8101.0, 8100.0, 8102.0, 8101.0, 8100.0, 8070.0, 8076.0, 8072.0, 8072.0, 8069.0, 8050.0, 8048.0, 8044.0, 8049.0, 8055.0, 8063.0, 8070.0, 8067.0, 8061.0, 8059.0, 8060.0, 8063.0, 8058.0, 8061.0, 8061.0, 8068.0, 8066.0, 8071.0, 8073.0, 8068.0, 8066.0, 8066.0, 8065.0, 8070.0, 8072.0, 8072.0, 8075.0, 8078.0, 8084.0, 8085.0, 8084.0, 8077.0, 8076.0, 8075.0, 8079.0, 8081.0, 8083.0, 8088.0, 8086.0, 8088.0, 8088.0, 8092.0, 8086.0, 8086.0, 8083.0, 8075.0, 8074.0, 8073.0, 8073.0, 8077.0, 8077.0, 8078.0, 8077.0, 8076.0, 8073.0, 8075.0, 8079.0, 8079.0, 8078.0, 8074.0, 8080.0, 8086.0, 8086.0, 8085.0, 8085.0, 8087.0, 8102.0, 8109.0, 8113.0, 8114.0, 8110.0, 8105.0, 8106.0, 8109.0, 8114.0, 8107.0, 8106.0, 8106.0, 8110.0, 8111.0, 8110.0, 8112.0, 8112.0, 8109.0, 8102.0, 8098.0, 8099.0, 8098.0, 8097.0, 8099.0, 8099.0, 8099.0, 8102.0, 8099.0, 8099.0, 8096.0, 8097.0, 8091.0, 8094.0, 8094.0, 8096.0, 8102.0, 8106.0, 8109.0, 8109.0, 8110.0, 8108.0, 8106.0, 8110.0, 8122.0, 8105.0, 8105.0, 8104.0, 8103.0, 8104.0, 8103.0, 8110.0, 8110.0, 8107.0, 8109.0, 8105.0, 8097.0, 8095.0, 8093.0, 8094.0, 8097.0, 8096.0, 8096.0, 8096.0, 8097.0, 8092.0, 8090.0, 8081.0, 8081.0, 8083.0, 8087.0, 8085.0, 8085.0, 8087.0, 8092.0, 8094.0, 8090.0, 8093.0, 8092.0, 8094.0, 8093.0, 8091.0, 8095.0, 8095.0, 8092.0, 8089.0, 8090.0, 8090.0, 8091.0, 8088.0, 8089.0, 8089.0, 8085.0, 8081.0, 8080.0, 8078.0, 8078.0, 8076.0, 8073.0, 8077.0, 8078.0, 8077.0, 8077.0, 8083.0, 8082.0, 8082.0, 8077.0, 8079.0, 8082.0, 8080.0, 8077.0, 8078.0, 8076.0, 8073.0, 8074.0, 8073.0, 8073.0, 8070.0, 8070.0, 8072.0, 8079.0, 8078.0, 8079.0, 8081.0, 8083.0, 8077.0, 8078.0, 8080.0, 8079.0, 8080.0, 8077.0, 8069.0, 8071.0, 8066.0, 8064.0, 8066.0, 8066.0, 8063.0, 8074.0, 8075.0, 8071.0, 8070.0, 8075.0, 8075.0]`)
|
||||||
|
low := []byte(`[8260.0, 8272.0, 8275.0, 8274.0, 8275.0, 8277.0, 8276.0, 8278.0, 8277.0, 8283.0, 8282.0, 8283.0, 8283.0, 8283.0, 8283.0, 8279.0, 8281.0, 8282.0, 8277.0, 8276.0, 8273.0, 8275.0, 8274.0, 8275.0, 8266.0, 8256.0, 8255.0, 8250.0, 8239.0, 8230.0, 8214.0, 8218.0, 8216.0, 8208.0, 8209.0, 8201.0, 8190.0, 8195.0, 8193.0, 8181.0, 8175.0, 8183.0, 8182.0, 8181.0, 8159.0, 8152.0, 8150.0, 8160.0, 8161.0, 8153.0, 8153.0, 8137.0, 8135.0, 8139.0, 8130.0, 8130.0, 8140.0, 8137.0, 8145.0, 8134.0, 8123.0, 8116.0, 8122.0, 8124.0, 8122.0, 8105.0, 8096.0, 8096.0, 8097.0, 8100.0, 8100.0, 8104.0, 8101.0, 8103.0, 8109.0, 8108.0, 8089.0, 8092.0, 8097.0, 8098.0, 8094.0, 8092.0, 8087.0, 8094.0, 8094.0, 8069.0, 8058.0, 8065.0, 8066.0, 8065.0, 8046.0, 8041.0, 8036.0, 8038.0, 8039.0, 8047.0, 8053.0, 8058.0, 8056.0, 8056.0, 8053.0, 8052.0, 8054.0, 8051.0, 8053.0, 8056.0, 8055.0, 8063.0, 8064.0, 8063.0, 8062.0, 8061.0, 8059.0, 8059.0, 8063.0, 8066.0, 8067.0, 8068.0, 8071.0, 8071.0, 8079.0, 8074.0, 8073.0, 8074.0, 8073.0, 8073.0, 8076.0, 8079.0, 8080.0, 8083.0, 8083.0, 8085.0, 8082.0, 8082.0, 8081.0, 8072.0, 8072.0, 8068.0, 8070.0, 8070.0, 8072.0, 8074.0, 8075.0, 8073.0, 8071.0, 8070.0, 8067.0, 8074.0, 8076.0, 8072.0, 8070.0, 8072.0, 8079.0, 8081.0, 8082.0, 8082.0, 8084.0, 8083.0, 8097.0, 8103.0, 8107.0, 8104.0, 8103.0, 8104.0, 8103.0, 8105.0, 8103.0, 8102.0, 8102.0, 8103.0, 8106.0, 8107.0, 8108.0, 8102.0, 8098.0, 8096.0, 8095.0, 8096.0, 8093.0, 8094.0, 8094.0, 8096.0, 8097.0, 8097.0, 8096.0, 8094.0, 8094.0, 8086.0, 8086.0, 8087.0, 8090.0, 8091.0, 8095.0, 8099.0, 8104.0, 8102.0, 8106.0, 8101.0, 8103.0, 8104.0, 8104.0, 8101.0, 8102.0, 8096.0, 8096.0, 8098.0, 8100.0, 8102.0, 8106.0, 8103.0, 8103.0, 8094.0, 8090.0, 8090.0, 8089.0, 8088.0, 8090.0, 8093.0, 8094.0, 8094.0, 8088.0, 8087.0, 8079.0, 8075.0, 8076.0, 8077.0, 8081.0, 8083.0, 8083.0, 8084.0, 8087.0, 8089.0, 8088.0, 8088.0, 8086.0, 8087.0, 8090.0, 8088.0, 8090.0, 8091.0, 8087.0, 8087.0, 8086.0, 8088.0, 8087.0, 8082.0, 8083.0, 8083.0, 8078.0, 8077.0, 8077.0, 8072.0, 8074.0, 8071.0, 8070.0, 8072.0, 8073.0, 8073.0, 8072.0, 8076.0, 8079.0, 8075.0, 8075.0, 8075.0, 8076.0, 8076.0, 8074.0, 8076.0, 8069.0, 8068.0, 8069.0, 8069.0, 8065.0, 8067.0, 8067.0, 8067.0, 8073.0, 8075.0, 8076.0, 8077.0, 8075.0, 8072.0, 8074.0, 8075.0, 8074.0, 8072.0, 8066.0, 8063.0, 8062.0, 8058.0, 8060.0, 8059.0, 8060.0, 8059.0, 8062.0, 8067.0, 8068.0, 8067.0, 8068.0, 8071.0]`)
|
||||||
|
cloze := []byte(`[8262.0, 8273.0, 8279.0, 8279.0, 8275.0, 8282.0, 8278.0, 8279.0, 8281.0, 8285.0, 8287.0, 8284.0, 8283.0, 8283.0, 8285.0, 8286.0, 8287.0, 8290.0, 8283.0, 8287.0, 8278.0, 8275.0, 8276.0, 8275.0, 8281.0, 8270.0, 8257.0, 8258.0, 8252.0, 8243.0, 8231.0, 8219.0, 8220.0, 8216.0, 8210.0, 8211.0, 8201.0, 8197.0, 8201.0, 8193.0, 8183.0, 8184.0, 8191.0, 8184.0, 8185.0, 8161.0, 8154.0, 8163.0, 8164.0, 8162.0, 8156.0, 8158.0, 8141.0, 8139.0, 8142.0, 8130.0, 8145.0, 8140.0, 8149.0, 8146.0, 8136.0, 8123.0, 8126.0, 8130.0, 8125.0, 8122.0, 8106.0, 8096.0, 8103.0, 8102.0, 8111.0, 8105.0, 8111.0, 8103.0, 8112.0, 8113.0, 8109.0, 8093.0, 8101.0, 8101.0, 8100.0, 8095.0, 8096.0, 8095.0, 8100.0, 8095.0, 8069.0, 8068.0, 8072.0, 8068.0, 8067.0, 8046.0, 8045.0, 8043.0, 8040.0, 8049.0, 8055.0, 8062.0, 8062.0, 8058.0, 8056.0, 8055.0, 8058.0, 8057.0, 8054.0, 8056.0, 8057.0, 8066.0, 8065.0, 8069.0, 8064.0, 8063.0, 8064.0, 8059.0, 8065.0, 8069.0, 8068.0, 8069.0, 8072.0, 8074.0, 8084.0, 8084.0, 8076.0, 8074.0, 8074.0, 8075.0, 8077.0, 8080.0, 8082.0, 8086.0, 8084.0, 8087.0, 8087.0, 8083.0, 8083.0, 8082.0, 8074.0, 8073.0, 8072.0, 8071.0, 8072.0, 8075.0, 8076.0, 8076.0, 8074.0, 8071.0, 8071.0, 8075.0, 8079.0, 8077.0, 8074.0, 8072.0, 8079.0, 8084.0, 8082.0, 8085.0, 8086.0, 8084.0, 8102.0, 8107.0, 8113.0, 8109.0, 8104.0, 8104.0, 8105.0, 8108.0, 8106.0, 8104.0, 8106.0, 8105.0, 8110.0, 8107.0, 8109.0, 8112.0, 8104.0, 8099.0, 8097.0, 8097.0, 8098.0, 8095.0, 8096.0, 8097.0, 8099.0, 8098.0, 8099.0, 8099.0, 8095.0, 8097.0, 8086.0, 8088.0, 8093.0, 8092.0, 8096.0, 8101.0, 8105.0, 8105.0, 8109.0, 8107.0, 8103.0, 8104.0, 8109.0, 8105.0, 8102.0, 8104.0, 8097.0, 8100.0, 8103.0, 8103.0, 8109.0, 8107.0, 8106.0, 8104.0, 8096.0, 8090.0, 8092.0, 8089.0, 8093.0, 8093.0, 8094.0, 8095.0, 8096.0, 8088.0, 8089.0, 8079.0, 8077.0, 8079.0, 8082.0, 8083.0, 8084.0, 8084.0, 8087.0, 8091.0, 8088.0, 8088.0, 8091.0, 8087.0, 8092.0, 8090.0, 8091.0, 8095.0, 8092.0, 8088.0, 8087.0, 8090.0, 8089.0, 8087.0, 8084.0, 8088.0, 8084.0, 8079.0, 8078.0, 8078.0, 8076.0, 8075.0, 8071.0, 8072.0, 8074.0, 8077.0, 8074.0, 8077.0, 8081.0, 8080.0, 8076.0, 8076.0, 8078.0, 8079.0, 8076.0, 8076.0, 8076.0, 8070.0, 8072.0, 8069.0, 8072.0, 8070.0, 8069.0, 8069.0, 8073.0, 8078.0, 8077.0, 8079.0, 8080.0, 8076.0, 8076.0, 8076.0, 8077.0, 8078.0, 8075.0, 8067.0, 8064.0, 8064.0, 8062.0, 8062.0, 8065.0, 8062.0, 8063.0, 8074.0, 8070.0, 8069.0, 8068.0, 8074.0]`)
|
||||||
|
|
||||||
|
buildKLines := func(open, high, low, cloze []fixedpoint.Value) (kLines []types.KLine) {
|
||||||
|
for i := range high {
|
||||||
|
kLines = append(kLines, types.KLine{Open: open[i], High: high[i], Low: low[i], Close: cloze[i], EndTime: types.Time(time.Now())})
|
||||||
|
}
|
||||||
|
return kLines
|
||||||
|
}
|
||||||
|
var o, h, l, c []fixedpoint.Value
|
||||||
|
_ = json.Unmarshal(open, &o)
|
||||||
|
_ = json.Unmarshal(high, &h)
|
||||||
|
_ = json.Unmarshal(low, &l)
|
||||||
|
_ = json.Unmarshal(cloze, &c)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
kLines []types.KLine
|
||||||
|
window int
|
||||||
|
wantK float64
|
||||||
|
wantD float64
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "TXF1-1min_2016/1/4",
|
||||||
|
kLines: buildKLines(o, h, l, c),
|
||||||
|
window: 14,
|
||||||
|
wantK: 84.210526,
|
||||||
|
wantD: 59.888357,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
stream := &types.StandardStream{}
|
||||||
|
kLines := KLines(stream, "", "")
|
||||||
|
kd := Stoch2(kLines, tt.window, DPeriod)
|
||||||
|
|
||||||
|
for _, k := range tt.kLines {
|
||||||
|
stream.EmitKLineClosed(k)
|
||||||
|
}
|
||||||
|
|
||||||
|
gotK := kd.K.Last(0)
|
||||||
|
diff_k := math.Trunc((gotK-tt.wantK)*100) / 100
|
||||||
|
if diff_k != 0 {
|
||||||
|
t.Errorf("%%K() = %v, want %v", gotK, tt.wantK)
|
||||||
|
}
|
||||||
|
|
||||||
|
gotD := kd.D.Last(0)
|
||||||
|
diff_d := math.Trunc((gotD-tt.wantD)*100) / 100
|
||||||
|
if diff_d != 0 {
|
||||||
|
t.Errorf("%%D() = %v, want %v", gotD, tt.wantD)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user