forked from sdcoffey/techan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
strategy_test.go
130 lines (101 loc) · 2.44 KB
/
strategy_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package techan
import (
"testing"
"github.com/sdcoffey/big"
"github.com/stretchr/testify/assert"
)
type alwaysSatisfiedRule struct{}
func (a alwaysSatisfiedRule) IsSatisfied(index int, record *TradingRecord) bool {
return true
}
func TestRuleStrategy_ShouldEnter(t *testing.T) {
t.Run("Returns false if index < unstable period", func(t *testing.T) {
record := NewTradingRecord()
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.False(t, s.ShouldEnter(0, record))
})
t.Run("Returns false if a position is open", func(t *testing.T) {
record := NewTradingRecord()
record.Operate(Order{
Side: BUY,
Amount: big.ONE,
Price: big.ONE,
})
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.False(t, s.ShouldEnter(6, record))
})
t.Run("Returns true when position is closed", func(t *testing.T) {
record := NewTradingRecord()
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.True(t, s.ShouldEnter(6, record))
})
t.Run("panics when entry rule is nil", func(t *testing.T) {
s := RuleStrategy{
ExitRule: alwaysSatisfiedRule{},
UnstablePeriod: 10,
}
assert.PanicsWithValue(t, "entry rule cannot be nil", func() {
s.ShouldEnter(0, nil)
})
})
}
func TestRuleStrategy_ShouldExit(t *testing.T) {
t.Run("Returns false if index < unstablePeriod", func(t *testing.T) {
record := NewTradingRecord()
record.Operate(Order{
Side: BUY,
Amount: big.ONE,
Price: big.ONE,
})
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.False(t, s.ShouldExit(0, record))
})
t.Run("Returns false when position is closed", func(t *testing.T) {
record := NewTradingRecord()
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.False(t, s.ShouldExit(6, record))
})
t.Run("Returns true when position is open", func(t *testing.T) {
record := NewTradingRecord()
record.Operate(Order{
Side: BUY,
Amount: big.ONE,
Price: big.ONE,
})
s := RuleStrategy{
alwaysSatisfiedRule{},
alwaysSatisfiedRule{},
5,
}
assert.True(t, s.ShouldExit(6, record))
})
t.Run("panics when exit rule is nil", func(t *testing.T) {
s := RuleStrategy{
EntryRule: alwaysSatisfiedRule{},
UnstablePeriod: 10,
}
assert.PanicsWithValue(t, "exit rule cannot be nil", func() {
s.ShouldExit(0, nil)
})
})
}