crex

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 15, 2020 License: MIT Imports: 4 Imported by: 3

README

GitHub go.mod Go version license build status

CREX

中文 | English

CREX 是一个用Golang语言开发的量化交易库。支持tick级别数字币期货平台的回测和实盘。实盘与回测无缝切换,无需更改代码。

回测

示例 @backtest

实盘

示例 @live trading

主要特性

  • 使用简单
  • Tick级别回测
  • 支持 WebSocket

支持交易所

name id ver doc
Binance Futures binancefutures 1 API
BitMEX bitmex 1 API
Deribit deribit 2 API
Bybit bybit 2 API
Huobi DM hbdm 1 API
Huobi Swap hbdmswap 1 API
OKEX Futures okexfutures 3 API
OKEX Swap okexswap 3 API

示例

package main

import (
	. "github.com/coinrust/crex"
	"github.com/coinrust/crex/brokers"
	"log"
	"time"
)

type BasicStrategy struct {
	StrategyBase
}

func (s *BasicStrategy) OnInit() {

}

func (s *BasicStrategy) OnTick() {
	currency := "BTC"
	symbol := "BTC-PERPETUAL"

	accountSummary, err := s.Broker.GetAccountSummary(currency)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("accountSummary: %#v", accountSummary)

	s.Broker.GetOrderBook(symbol, 10)

	s.Broker.PlaceOrder(symbol,
		Buy, OrderTypeLimit, 1000.0, 10, 1, true, false, nil)

	s.Broker.GetOpenOrders(symbol)
	s.Broker.GetPositions(symbol)
}

func (s *BasicStrategy) OnDeinit() {

}

func main() {
	accessKey := "[accessKey]"
	secretKey := "[secretKey]"
	broker := brokers.New(brokers.Deribit,
		accessKey, secretKey, true, map[string]string{})

	s := &BasicStrategy{}
	s.Setup(TradeModeLiveTrading, broker)

	// run loop
	for {
		s.OnTick()
		time.Sleep(1 * time.Second)
	}
}

WebSocket 示例

package main

import (
	. "github.com/coinrust/crex"
	"github.com/coinrust/crex/brokers"
	"log"
)

func main() {
	ws := brokers.NewWS(brokers.HBDM,
		"[accessKey]", "[secretKey]", false, nil)

	// 订单薄事件方法
	ws.On(WSEventL2Snapshot, func(ob *OrderBook) {
		log.Printf("ob: %#v", ob)
	})
	// 成交记录事件方法
	ws.On(WSEventTrade, func(trades []Trade) {
		log.Printf("trades: %#v", trades)
	})

	// 订单事件方法
	ws.On(WSEventOrder, func(order *Order) {
		log.Printf("order: %#v", order)
	})
	// 持仓事件方法
	ws.On(WSEventPosition, func(position *Position) {
		log.Printf("position: %#v", position)
	})

	// 订阅订单薄
	ws.SubscribeLevel2Snapshots(Market{
		ID:     "BTC",
		Params: ContractTypeW1,
	})
	// 订阅成交记录
	ws.SubscribeTrades(Market{
		ID:     "BTC",
		Params: ContractTypeW1,
	})
	// 订阅订单成交信息
	ws.SubscribeOrders(Market{
		ID:     "BTC",
		Params: ContractTypeW1,
	})
	// 订阅持仓信息
	ws.SubscribePositions(Market{
		ID:     "BTC",
		Params: ContractTypeW1,
	})

	select {}
}

回测数据

标准 CSV 数据格式
  • 列定界符: , (逗号)
  • 换行标记: \n (LF)
  • 日期时间格式: Unix 时间戳 (ms)
时间格式
列名 描述
t Unix 时间戳 (ms)
asks[0-X].price 卖单价(升序)
asks[0-X].amount 卖单量
bids[0-X].price 买单价(降序)
bids[0-X].amount 买单量
样本数据示例
t,asks[0].price,asks[0].amount,asks[1].price,asks[1].amount,asks[2].price,asks[2].amount,asks[3].price,asks[3].amount,asks[4].price,asks[4].amount,asks[5].price,asks[5].amount,asks[6].price,asks[6].amount,asks[7].price,asks[7].amount,asks[8].price,asks[8].amount,asks[9].price,asks[9].amount,bids[0].price,bids[0].amount,bids[1].price,bids[1].amount,bids[2].price,bids[2].amount,bids[3].price,bids[3].amount,bids[4].price,bids[4].amount,bids[5].price,bids[5].amount,bids[6].price,bids[6].amount,bids[7].price,bids[7].amount,bids[8].price,bids[8].amount,bids[9].price,bids[9].amount
1569888000143,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,200,8307.5,1650,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,90,8300,71320,8299.5,310
1569888000285,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,200,8307.5,1650,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000307,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,200,8307.5,11010,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000309,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,200,8307.5,20370,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000406,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,8960,8307.5,11010,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000500,8304.5,7010,8305,60,8305.5,1220,8306,80,8307,200,8307.5,20370,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000522,8304.5,10270,8305,60,8305.5,1220,8306,80,8307,200,8307.5,20370,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185750,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310
1569888000527,8304.5,10270,8305,60,8305.5,1220,8306,80,8307,200,8307.5,20370,8308,68260,8308.5,120000,8309,38400,8309.5,8400,8304,185010,8303.5,52200,8303,20600,8302.5,4500,8302,2000,8301.5,18200,8301,18000,8300.5,5090,8300,71320,8299.5,310

TODO

  • Paper trading.

QQ群

QQ群: 932289088

捐赠

欢迎支持项目,金额随意:

METHOD ADDRESS
BTC 1Nk4AsGj5HEJ5csRenTUPab1sjUySCZ3Pq
ETH 0xa74eade7ea08a8c48d7de4d582fac145afc86e3d

LICENSE

MIT ©coinrust

Documentation

Index

Constants

View Source
const (
	ContractTypeNone = ""   // Non-delivery contract 非交割合约
	ContractTypeW1   = "W1" // week 当周合约
	ContractTypeW2   = "W2" // two week 次周合约
	ContractTypeM1   = "M1" // month 月合约
	ContractTypeQ1   = "Q1" // quarter 季度合约
	ContractTypeQ2   = "Q2" // two quarter 次季度合约
)

ContractType 合约类型

View Source
const (
	PERIOD_1MIN   = "1m"
	PERIOD_3MIN   = "3m"
	PERIOD_5MIN   = "5m"
	PERIOD_15MIN  = "15m"
	PERIOD_30MIN  = "30m"
	PERIOD_60MIN  = "60m"
	PERIOD_1H     = "1h"
	PERIOD_2H     = "2h"
	PERIOD_3H     = "3h"
	PERIOD_4H     = "4h"
	PERIOD_6H     = "6h"
	PERIOD_8H     = "8h"
	PERIOD_12H    = "12h"
	PERIOD_1DAY   = "1d"
	PERIOD_3DAY   = "3d"
	PERIOD_1WEEK  = "1w"
	PERIOD_1MONTH = "1M"
	PERIOD_1YEAR  = "1y"
)

K线周期

Variables

View Source
var (
	NotImplemented = errors.New("not implement")
)

Functions

This section is empty.

Types

type AccountSummary

type AccountSummary struct {
	Balance float64
	Pnl     float64
	Equity  float64
}

type Broker

type Broker interface {
	// 获取当前Broker名称
	GetName() (name string)

	// 获取账号信息
	GetAccountSummary(currency string) (result AccountSummary, err error)

	// 获取订单薄(OrderBook)
	GetOrderBook(symbol string, depth int) (result OrderBook, err error)

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

	// 设置合约类型
	// currencyPair: 交易对,如: BTC-USD(OKEX) BTC(HBDM)
	// contractType: W1,W2,Q1,Q2
	SetContractType(currencyPair string, contractType string) (err error)

	// 获取当前设置的合约ID
	GetContractID() (symbol string, err error)

	// 设置杠杆大小
	SetLeverRate(value float64) (err error)

	// 下单
	PlaceOrder(symbol string, direction Direction, orderType OrderType, price float64, stopPx float64, size float64,
		postOnly bool, reduceOnly bool, params map[string]interface{}) (result Order, err error)

	// 获取活跃委托单列表
	GetOpenOrders(symbol string) (result []Order, err error)

	// 获取委托信息
	GetOrder(symbol string, id string) (result Order, err error)

	// 撤销全部委托单
	CancelAllOrders(symbol string) (err error)

	// 撤销单个委托单
	CancelOrder(symbol string, id string) (result Order, err error)

	// 修改委托
	AmendOrder(symbol string, id string, price float64, size float64) (result Order, err error)

	// 获取持仓
	GetPositions(symbol string) (result []Position, err error)

	// 返回WebSocket对象
	WS() (ws WebSocket, err error)

	// 运行一次(回测系统调用)
	RunEventLoopOnce() (err error) // Run sim match for backtest only
}

Broker 交易所接口

type Direction

type Direction int

Direction 委托/持仓方向

const (
	Buy  Direction = iota // 做多
	Sell                  // 做空
)

func (Direction) String

func (d Direction) String() string

type Event

type Event struct {
	// contains filtered or unexported fields
}

func (*Event) SetSymbol

func (e *Event) SetSymbol(s string)

SetSymbol returns the symbol string of the event

func (*Event) SetTime

func (e *Event) SetTime(t time.Time)

SetTime returns the timestamp of an event

func (Event) Symbol

func (e Event) Symbol() string

Symbol returns the symbol string of the event

func (Event) Time

func (e Event) Time() time.Time

Time returns the timestamp of an event

type Item

type Item struct {
	Price  float64
	Amount float64
}

type LogItem

type LogItem struct {
	Time    time.Time  `json:"time"`
	RawTime time.Time  `json:"raw_time"`
	Ask     float64    `json:"ask"`
	Bid     float64    `json:"bid"`
	Stats   []LogStats `json:"stats"`
}

func (*LogItem) Price

func (i *LogItem) Price() float64

func (*LogItem) TotalEquity

func (i *LogItem) TotalEquity() float64

type LogItems

type LogItems []*LogItem

type LogStats

type LogStats struct {
	Balance float64 `json:"balance"`
	Equity  float64 `json:"equity"`
}

type Market added in v0.9.9

type Market struct {
	ID     string // BTCUSDT(OKEX)/XBTUSD(BitMEX)/...
	Params string
}

Market 市场信息

type Order

type Order struct {
	ID           string      `json:"id"`            // ID
	Symbol       string      `json:"symbol"`        // 标
	Price        float64     `json:"price"`         // 价格
	StopPx       float64     `json:"stop_px"`       // 触发价
	Size         float64     `json:"size"`          // 委托数量
	AvgPrice     float64     `json:"avg_price"`     // 平均成交价
	FilledAmount float64     `json:"filled_amount"` // 成交数量
	Direction    Direction   `json:"direction"`     // 委托方向
	Type         OrderType   `json:"type"`          // 委托类型
	PostOnly     bool        `json:"post_only"`     // 只做Maker选项
	ReduceOnly   bool        `json:"reduce_only"`   // 只减仓选项
	Status       OrderStatus `json:"status"`        // 委托状态
}

Order 委托

func (*Order) IsOpen

func (o *Order) IsOpen() bool

IsOpen 是否活跃委托

type OrderBook

type OrderBook struct {
	Symbol string
	Time   time.Time
	Asks   []Item
	Bids   []Item
}

func (*OrderBook) Ask

func (o *OrderBook) Ask() (result Item)

Ask 卖一

func (*OrderBook) AskPrice

func (o *OrderBook) AskPrice() (result float64)

AskPrice 卖一价

func (*OrderBook) Bid

func (o *OrderBook) Bid() (result Item)

Bid 买一

func (*OrderBook) BidPrice

func (o *OrderBook) BidPrice() (result float64)

BidPrice 买一价

func (*OrderBook) Price

func (o *OrderBook) Price() float64

Price returns the middle of Bid and Ask.

type OrderStatus

type OrderStatus int

OrderStatus 委托状态

const (
	OrderStatusCreated         OrderStatus = iota // 创建委托
	OrderStatusRejected                           // 委托被拒绝
	OrderStatusNew                                // 委托待成交
	OrderStatusPartiallyFilled                    // 委托部分成交
	OrderStatusFilled                             // 委托完全成交
	OrderStatusCancelPending                      // 委托取消
	OrderStatusCancelled                          // 委托被取消
	OrderStatusUntriggered                        // 等待触发条件委托单
	OrderStatusTriggered                          // 已触发条件单
)

func (OrderStatus) String

func (s OrderStatus) String() string

type OrderType

type OrderType int

OrderType 委托类型

const (
	OrderTypeMarket     OrderType = iota // 市价单
	OrderTypeLimit                       // 限价单
	OrderTypeStopMarket                  // 市价止损单
	OrderTypeStopLimit                   // 限价止损单
)

func (OrderType) String

func (t OrderType) String() string

type Position

type Position struct {
	Symbol    string    `json:"symbol"`     // 标
	OpenTime  time.Time `json:"open_time"`  // 开仓时间
	OpenPrice float64   `json:"open_price"` // 开仓价
	Size      float64   `json:"size"`       // 仓位大小
	AvgPrice  float64   `json:"avg_price"`  // 平均价
}

Position 持仓

func (*Position) Amount

func (p *Position) Amount() float64

Amount 持仓量

func (*Position) IsLong

func (p *Position) IsLong() bool

IsLong 是否多仓

func (*Position) IsOpen

func (p *Position) IsOpen() bool

IsOpen 是否持仓

func (*Position) IsShort

func (p *Position) IsShort() bool

IsShort 是否空仓

func (*Position) Side

func (p *Position) Side() Direction

type Record added in v0.9.8

type Record struct {
	Symbol    string    `json:"symbol"`    // 标
	Timestamp time.Time `json:"timestamp"` // 时间
	Open      float64   `json:"open"`      // 开盘价
	High      float64   `json:"high"`      // 最高价
	Low       float64   `json:"low"`       // 最低价
	Close     float64   `json:"close"`     // 收盘价
	Volume    float64   `json:"volume"`    // 量
}

Record 表示K线数据

type Stats

type Stats struct {
	Start           time.Time     `json:"start"`
	End             time.Time     `json:"end"`
	Duration        time.Duration `json:"duration"`
	EntryPrice      float64       `json:"entry_price"`
	ExitPrice       float64       `json:"exit_price"`
	EntryEquity     float64       `json:"entry_equity"`
	ExitEquity      float64       `json:"exit_equity"`
	BaHReturn       float64       `json:"bah_return"`     // Buy & Hold Return
	BaHReturnPnt    float64       `json:"bah_return_pnt"` // Buy & Hold Return
	EquityReturn    float64       `json:"equity_return"`
	EquityReturnPnt float64       `json:"equity_return_pnt"`
}

Stats Backtesting Statistics

func (*Stats) PrintResult

func (s *Stats) PrintResult()

type Strategy

type Strategy interface {
	Setup(mode TradeMode, brokers ...Broker)
	GetTradeMode() TradeMode
	OnInit()
	OnTick()
	OnDeinit()
}

Strategy interface

type StrategyBase

type StrategyBase struct {
	Brokers []Broker
	Broker  Broker
	// contains filtered or unexported fields
}

StrategyBase Strategy base class

func (*StrategyBase) GetTradeMode

func (s *StrategyBase) GetTradeMode() TradeMode

func (*StrategyBase) Setup

func (s *StrategyBase) Setup(mode TradeMode, brokers ...Broker)

Setup Setup the brokers

type Trade added in v0.9.10

type Trade struct {
	ID        string    `json:"id"`     // ID
	Direction Direction `json:"type"`   // 主动成交方向
	Price     float64   `json:"price"`  // 价格
	Amount    float64   `json:"amount"` // 成交量(张),买卖双边成交量之和
	Ts        int64     `json:"ts"`     // 订单成交时间 unix time (ms)
	Symbol    string    `json:"omitempty"`
}

Trade 成交记录

type TradeMode

type TradeMode int

TradeMode 策略模式

const (
	TradeModeBacktest TradeMode = iota
	TradeModePaperTrading
	TradeModeLiveTrading
)

func (TradeMode) String

func (t TradeMode) String() string

type WSEvent added in v0.9.9

type WSEvent int

WS 事件

const (
	WSEventTrade WSEvent = iota + 1
	WSEventL2Snapshot
	WSEventOrder
	WSEventPosition
	WSEventError
	WSEventDisconnected
	WSEventReconnected
)

WS 事件枚举

type WebSocket added in v0.9.9

type WebSocket interface {
	On(event WSEvent, listener interface{})
	SubscribeTrades(market Market)
	SubscribeLevel2Snapshots(market Market)
	SubscribeOrders(market Market)
	SubscribePositions(market Market)
}

WebSocket 代表WS连接

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL