Skip to content

Commit

Permalink
Add GetRecords
Browse files Browse the repository at this point in the history
  • Loading branch information
f0cii committed Apr 9, 2020
1 parent 70e141e commit 8f44e1f
Show file tree
Hide file tree
Showing 23 changed files with 564 additions and 45 deletions.
10 changes: 0 additions & 10 deletions bar.go

This file was deleted.

4 changes: 4 additions & 0 deletions broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ type Broker interface {
// 获取订单薄(OrderBook)
GetOrderBook(symbol string, depth int) (result OrderBook, err error)

// 获取K线数据
// interval: 数据更新频率. 分钟或者关键字1m(minute) 1h 1d 1w 1M(month) 1y 枚举值:1 3 5 15 30 60 120 240 360 720 "5m" "4h" "1d" ...
GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error)

// 设置合约类型
// currencyPair: 交易对,如: BTC-USD(OKEX) BTC(HBDM)
// contractType: W1,W2,Q1,Q2
Expand Down
41 changes: 41 additions & 0 deletions brokers/bitmex-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/frankrap/bitmex-api"
"github.com/frankrap/bitmex-api/swagger"
"strings"
"time"
)

// BitMEXBroker the BitMEX broker
Expand Down Expand Up @@ -55,6 +56,46 @@ func (b *BitMEXBroker) GetOrderBook(symbol string, depth int) (result OrderBook,
return
}

func (b *BitMEXBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
//@param "binSize" (string) Time interval to bucket by. Available options: [1m,5m,1h,1d].
var binSize string
if strings.HasSuffix(interval, "m") {
binSize = interval
} else if strings.HasSuffix(interval, "h") {
binSize = interval
} else if strings.HasSuffix(interval, "d") {
binSize = interval
} else {
binSize = interval + "m"
}
var o []swagger.TradeBin
o, err = b.client.GetBucketed(symbol,
binSize,
false,
"",
"",
float32(limit),
-1,
false,
time.Unix(from, 0),
time.Unix(end, 0))
if err != nil {
return
}
for _, v := range o {
records = append(records, Record{
Symbol: v.Symbol,
Timestamp: v.Timestamp,
Open: v.Open,
High: v.High,
Low: v.Low,
Close: v.Close,
Volume: float64(v.Volume),
})
}
return
}

func (b *BitMEXBroker) SetContractType(currencyPair string, contractType string) (err error) {
b.symbol = currencyPair
return
Expand Down
16 changes: 16 additions & 0 deletions brokers/bitmex-broker/broker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
. "github.com/coinrust/crex"
"github.com/frankrap/bitmex-api"
"testing"
"time"
)

func newBrokerForTest() *BitMEXBroker {
Expand All @@ -24,6 +25,21 @@ func TestBitMEXBroker_GetOrderBook(t *testing.T) {
t.Logf("%#v", ob)
}

func TestBitMEXBroker_GetRecords(t *testing.T) {
b := newBrokerForTest()
start := time.Now().Add(-time.Hour)
end := time.Now()
records, err := b.GetRecords("XBTUSD",
"1m", start.Unix(), end.Unix(), 10)
if err != nil {
t.Error(err)
return
}
for _, v := range records {
t.Logf("%#v", v)
}
}

func TestBitMEXBroker_PlaceOrder(t *testing.T) {
b := newBrokerForTest()
order, err := b.PlaceOrder("XBTUSD",
Expand Down
4 changes: 4 additions & 0 deletions brokers/bitmex-sim-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ func (b *BitMEXSimBroker) GetOrderBook(symbol string, depth int) (result OrderBo
return
}

func (b *BitMEXSimBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
return
}

func (b *BitMEXSimBroker) SetContractType(currencyPair string, contractType string) (err error) {
b.symbol = currencyPair
return
Expand Down
21 changes: 21 additions & 0 deletions brokers/bybit-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/frankrap/bybit-api/rest"
"log"
"strings"
"time"
)

// BybitBroker the Bybit broker
Expand Down Expand Up @@ -60,6 +61,26 @@ func (b *BybitBroker) GetOrderBook(symbol string, depth int) (result OrderBook,
return
}

func (b *BybitBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
var values []rest.OHLC
values, err = b.client.GetKLine(symbol, interval, from, limit)
if err != nil {
return
}
for _, v := range values {
records = append(records, Record{
Symbol: v.Symbol,
Timestamp: time.Unix(v.OpenTime, 0),
Open: v.Open,
High: v.High,
Low: v.Low,
Close: v.Close,
Volume: v.Volume,
})
}
return
}

func (b *BybitBroker) SetContractType(currencyPair string, contractType string) (err error) {
b.symbol = currencyPair
return
Expand Down
28 changes: 26 additions & 2 deletions brokers/bybit-broker/broker_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
package bybit_broker

import "testing"
import (
. "github.com/coinrust/crex"
"testing"
"time"
)

func newForTest() Broker {
b := NewBroker("https://api-testnet.bybit.com/",
"6IASD6KDBdunn5qLpT", "nXjZMUiB3aMiPaQ9EUKYFloYNd0zM39RjRWF")
return b
}

func TestBybitBroker_GetOpenOrders(t *testing.T) {
b := NewBroker("https://api-testnet.bybit.com/", "6IASD6KDBdunn5qLpT", "nXjZMUiB3aMiPaQ9EUKYFloYNd0zM39RjRWF")
b := newForTest()
orders, err := b.GetOpenOrders("BTCUSD")
if err != nil {
t.Error(err)
Expand All @@ -13,3 +23,17 @@ func TestBybitBroker_GetOpenOrders(t *testing.T) {
t.Logf("%#v", v)
}
}

func TestBybitBroker_GetRecords(t *testing.T) {
b := newForTest()
start := time.Now().Add(-time.Hour)
records, err := b.GetRecords("BTCUSD",
"1", start.Unix(), 0, 10)
if err != nil {
t.Error(err)
return
}
for _, v := range records {
t.Logf("%#v", v)
}
}
30 changes: 30 additions & 0 deletions brokers/deribit-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,36 @@ func (b *DiribitBroker) GetOrderBook(symbol string, depth int) (result OrderBook
return
}

func (b *DiribitBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
if end == 0 {
end = time.Now().Unix()
}
params := &models.GetTradingviewChartDataParams{
InstrumentName: symbol,
StartTimestamp: from * 1000,
EndTimestamp: end * 1000,
Resolution: interval,
}
var resp models.GetTradingviewChartDataResponse
resp, err = b.client.GetTradingviewChartData(params)
if err != nil {
return
}
n := len(resp.Ticks)
for i := 0; i < n; i++ {
records = append(records, Record{
Symbol: symbol,
Timestamp: time.Unix(0, resp.Ticks[i]*1e6),
Open: resp.Open[i],
High: resp.High[i],
Low: resp.Low[i],
Close: resp.Close[i],
Volume: resp.Volume[i],
})
}
return
}

func (b *DiribitBroker) SetContractType(currencyPair string, contractType string) (err error) {
return
}
Expand Down
15 changes: 15 additions & 0 deletions brokers/deribit-broker/broker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,21 @@ func TestDiribitBroker_GetOrderBook(t *testing.T) {
b.GetOrderBook("BTC-PERPETUAL", 10)
}

func TestDiribitBroker_GetRecords(t *testing.T) {
b := newBroker()
start := time.Now().Add(-time.Hour)
end := time.Now().UnixNano() / 1e6
records, err := b.GetRecords("BTC-PERPETUAL",
"1", start.Unix(), end, 10)
if err != nil {
t.Error(err)
return
}
for _, v := range records {
t.Logf("%#v", v)
}
}

func TestDiribitBroker_Subscribe(t *testing.T) {
b := newBroker()
//event := "book.ETH-PERPETUAL.100.1.100ms"
Expand Down
4 changes: 4 additions & 0 deletions brokers/deribit-sim-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ func (b *DiribitSimBroker) GetOrderBook(symbol string, depth int) (result OrderB
return
}

func (b *DiribitSimBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
return
}

func (b *DiribitSimBroker) SetContractType(pair string, contractType string) (err error) {
return
}
Expand Down
43 changes: 43 additions & 0 deletions brokers/hbdm-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,49 @@ func (b *HBDMBroker) GetOrderBook(symbol string, depth int) (result OrderBook, e
return
}

func (b *HBDMBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
var period string
if strings.HasSuffix(interval, "m") {
period = interval[:len(interval)-1] + "min"
} else if strings.HasSuffix(interval, "h") {
period = interval[:len(interval)-1] + "hour"
} else if strings.HasSuffix(interval, "d") {
period = interval[:len(interval)-1] + "day"
} else if strings.HasSuffix(interval, "d") {
period = interval[:len(interval)-1] + "day"
} else if strings.HasSuffix(interval, "w") {
//period = interval[:len(interval)-1]+"week"
} else if strings.HasSuffix(interval, "M") {
period = interval[:len(interval)-1] + "mon"
} else {
period = interval + "min"
}
// 1min, 5min, 15min, 30min, 60min, 4hour, 1day, 1mon
var ret hbdm.KLineResult
ret, err = b.client.GetKLine(b.symbol, period, limit, from, end)
if err != nil {
return
}
if ret.Status != StatusOK {
err = fmt.Errorf("error code=%v msg=%v",
ret.ErrCode,
ret.ErrMsg)
return
}
for _, v := range ret.Data {
records = append(records, Record{
Symbol: symbol,
Timestamp: time.Unix(int64(v.ID), 0),
Open: v.Open,
High: v.High,
Low: v.Low,
Close: v.Close,
Volume: float64(v.Vol),
})
}
return
}

// 设置合约类型
// pair: BTC/ETH/...
func (b *HBDMBroker) SetContractType(pair string, contractType string) (err error) {
Expand Down
22 changes: 22 additions & 0 deletions brokers/hbdm-broker/broker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/spf13/viper"
"log"
"testing"
"time"
)

func newTestBroker() Broker {
Expand Down Expand Up @@ -42,6 +43,27 @@ func TestHBDMBroker_GetOrderBook(t *testing.T) {
t.Logf("%#v", ob)
}

func TestHBDMBroker_GetRecords(t *testing.T) {
b := newTestBroker()
b.SetContractType("BTC", ContractTypeW1)
symbol, err := b.GetContractID()
if err != nil {
t.Error(err)
return
}
t.Logf("%v", symbol)
start := time.Now().Add(-time.Hour)
end := time.Now()
records, err := b.GetRecords(symbol,
"1m", start.Unix(), end.Unix(), 10)
if err != nil {
return
}
for _, v := range records {
t.Logf("%#v", v)
}
}

func TestHBDMBroker_GetContractID(t *testing.T) {
b := newTestBroker()
b.SetContractType("BTC", ContractTypeW1)
Expand Down
43 changes: 43 additions & 0 deletions brokers/hbdm-swap-broker/broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,49 @@ func (b *HBDMSwapBroker) GetOrderBook(symbol string, depth int) (result OrderBoo
return
}

func (b *HBDMSwapBroker) GetRecords(symbol string, interval string, from int64, end int64, limit int) (records []Record, err error) {
var period string
if strings.HasSuffix(interval, "m") {
period = interval[:len(interval)-1] + "min"
} else if strings.HasSuffix(interval, "h") {
period = interval[:len(interval)-1] + "hour"
} else if strings.HasSuffix(interval, "d") {
period = interval[:len(interval)-1] + "day"
} else if strings.HasSuffix(interval, "d") {
period = interval[:len(interval)-1] + "day"
} else if strings.HasSuffix(interval, "w") {
//period = interval[:len(interval)-1]+"week"
} else if strings.HasSuffix(interval, "M") {
period = interval[:len(interval)-1] + "mon"
} else {
period = interval + "min"
}
// 1min, 5min, 15min, 30min, 60min, 4hour, 1day, 1mon
var ret hbdmswap.KLineResult
ret, err = b.client.GetKLine(symbol, period, limit, from, end)
if err != nil {
return
}
if ret.Status != StatusOK {
//err = fmt.Errorf("error code=%v msg=%v",
// ret.ErrCode,
// ret.ErrMsg)
return
}
for _, v := range ret.Data {
records = append(records, Record{
Symbol: symbol,
Timestamp: time.Unix(int64(v.ID), 0),
Open: v.Open,
High: v.High,
Low: v.Low,
Close: v.Close,
Volume: float64(v.Vol),
})
}
return
}

// 设置合约类型
func (b *HBDMSwapBroker) SetContractType(pair string, contractType string) (err error) {
return
Expand Down
Loading

0 comments on commit 8f44e1f

Please sign in to comment.