Skip to content

Commit f3c59e0

Browse files
committed
add NewBarEnv
1 parent 89ebe4c commit f3c59e0

File tree

3 files changed

+80
-19
lines changed

3 files changed

+80
-19
lines changed

core.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ import (
88
"sync"
99
)
1010

11+
func NewBarEnv(exgName, market, symbol, timeframe string) (*BarEnv, error) {
12+
tfSecs, err := ParseTimeFrame(timeframe)
13+
if err != nil {
14+
return nil, err
15+
}
16+
return &BarEnv{
17+
Exchange: exgName,
18+
MarketType: market,
19+
Symbol: symbol,
20+
TimeFrame: timeframe,
21+
TFMSecs: int64(tfSecs * 1000),
22+
MaxCache: 1500,
23+
Data: make(map[string]interface{}),
24+
Items: make(map[int]*Series),
25+
}, nil
26+
}
27+
1128
func (e *BarEnv) OnBar(barMs int64, open, high, low, close, volume, info float64) error {
1229
if e.TimeStop > barMs {
1330
return fmt.Errorf("%s/%s old Bar Receive: %d, Current: %d", e.Symbol, e.TimeFrame, barMs, e.TimeStop)

core_test.go

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@ type CaseItem struct {
1515
Run func(e *BarEnv) float64
1616
}
1717

18-
var env = &BarEnv{
19-
TimeFrame: "1d",
20-
TFMSecs: 86400000,
21-
Exchange: "binance",
22-
MarketType: "future",
23-
}
18+
var env, _ = NewBarEnv("binance", "spot", "", "1d")
2419

2520
func runIndCases(t *testing.T, items []CaseItem) {
2621
var fails = make(map[string]int)
@@ -141,23 +136,18 @@ func TestSeries(t *testing.T) {
141136

142137
// TestConcurrent 测试多线程并发访问
143138
func TestConcurrent(t *testing.T) {
144-
testEnv := &BarEnv{
145-
TimeFrame: "1d",
146-
TFMSecs: 86400000,
147-
Exchange: "binance",
148-
MarketType: "future",
149-
}
150-
139+
testEnv, _ := NewBarEnv("binance", "spot", "", "1d")
140+
151141
// 先加载一些数据
152142
for i := 0; i < 20; i++ {
153143
k := DataKline[i]
154144
testEnv.OnBar(k.Time, k.Open, k.High, k.Low, k.Close, k.Volume, k.Info)
155145
}
156-
146+
157147
// 并发读取和计算
158148
var wg sync.WaitGroup
159149
goroutineNum := 10
160-
150+
161151
for i := 0; i < goroutineNum; i++ {
162152
wg.Add(1)
163153
go func() {
@@ -166,21 +156,21 @@ func TestConcurrent(t *testing.T) {
166156
_ = testEnv.Close.Get(0)
167157
_ = testEnv.High.Get(1)
168158
_ = testEnv.Low.Get(2)
169-
159+
170160
// 测试计算操作
171161
_ = testEnv.Close.Add(100).Get(0)
172162
_ = testEnv.Close.Sub(50).Get(0)
173163
_ = testEnv.Close.Mul(1.1).Get(0)
174164
_ = testEnv.High.Sub(testEnv.Low).Abs().Get(0)
175-
165+
176166
// 测试交叉计算
177167
_ = testEnv.Close.Cross(30000)
178-
168+
179169
// 测试范围操作
180170
_ = testEnv.Close.Range(0, 5)
181171
}()
182172
}
183-
173+
184174
wg.Wait()
185175
t.Log("Concurrent test passed")
186176
}

utils.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package banta
22

33
import (
4+
"errors"
45
"fmt"
56
"math"
7+
"strconv"
68
)
79

810
const thresFloat64Eq = 1e-9
@@ -68,3 +70,55 @@ func RemoveFromArr[T comparable](arr []T, it T, num int) []T {
6870
}
6971
return res
7072
}
73+
74+
const (
75+
SecsMin = 60
76+
SecsHour = SecsMin * 60
77+
SecsDay = SecsHour * 24
78+
SecsWeek = SecsDay * 7
79+
SecsMon = SecsDay * 30
80+
SecsQtr = SecsMon * 3
81+
SecsYear = SecsDay * 365
82+
)
83+
84+
var (
85+
errTfTooShort = errors.New("timeframe string too short")
86+
)
87+
88+
func ParseTimeFrame(timeframe string) (int, error) {
89+
if len(timeframe) < 2 {
90+
return 0, errTfTooShort
91+
}
92+
93+
amountStr := timeframe[:len(timeframe)-1]
94+
unit := timeframe[len(timeframe)-1]
95+
96+
amount, err := strconv.Atoi(amountStr)
97+
if err != nil {
98+
return 0, err
99+
}
100+
101+
var scale int
102+
switch unit {
103+
case 'y', 'Y':
104+
scale = SecsYear
105+
case 'q', 'Q':
106+
scale = SecsQtr
107+
case 'M':
108+
scale = SecsMon
109+
case 'w', 'W':
110+
scale = SecsWeek
111+
case 'd', 'D':
112+
scale = SecsDay
113+
case 'h', 'H':
114+
scale = SecsHour
115+
case 'm':
116+
scale = SecsMin
117+
case 's', 'S':
118+
scale = 1
119+
default:
120+
return 0, fmt.Errorf("timeframe unit %v is not supported", string(unit))
121+
}
122+
123+
return amount * scale, nil
124+
}

0 commit comments

Comments
 (0)