56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
|
package xmaker
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
|
||
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
||
|
"github.com/c9s/bbgo/pkg/types"
|
||
|
|
||
|
. "github.com/c9s/bbgo/pkg/testing/testhelper"
|
||
|
)
|
||
|
|
||
|
var tradeId = 0
|
||
|
|
||
|
func Trade(symbol string, side types.SideType, price, quantity fixedpoint.Value, t time.Time) types.Trade {
|
||
|
tradeId++
|
||
|
return types.Trade{
|
||
|
ID: uint64(tradeId),
|
||
|
Symbol: symbol,
|
||
|
Side: side,
|
||
|
Price: price,
|
||
|
IsBuyer: side == types.SideTypeBuy,
|
||
|
Quantity: quantity,
|
||
|
Time: types.Time(t),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestMarketTradeWindowSignal(t *testing.T) {
|
||
|
now := time.Now()
|
||
|
symbol := "BTCUSDT"
|
||
|
sig := &TradeVolumeWindowSignal{
|
||
|
symbol: symbol,
|
||
|
Threshold: fixedpoint.NewFromFloat(0.65),
|
||
|
Window: types.Duration(time.Minute),
|
||
|
}
|
||
|
|
||
|
sig.trades = []types.Trade{
|
||
|
Trade(symbol, types.SideTypeBuy, Number(18000.0), Number(1.0), now.Add(-2*time.Minute)),
|
||
|
Trade(symbol, types.SideTypeSell, Number(18000.0), Number(0.5), now.Add(-2*time.Second)),
|
||
|
Trade(symbol, types.SideTypeBuy, Number(18000.0), Number(1.0), now.Add(-1*time.Second)),
|
||
|
}
|
||
|
|
||
|
ctx := context.Background()
|
||
|
sigNum, err := sig.CalculateSignal(ctx)
|
||
|
if assert.NoError(t, err) {
|
||
|
// buy ratio: 1/1.5 = 0.6666666666666666
|
||
|
// sell ratio: 0.5/1.5 = 0.3333333333333333
|
||
|
assert.InDelta(t, 0.0083333, sigNum, 0.0001)
|
||
|
}
|
||
|
|
||
|
assert.Len(t, sig.trades, 2)
|
||
|
}
|