first commit
This commit is contained in:
commit
eef261948d
19
balance.go
Normal file
19
balance.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type Currency struct {
|
||||||
|
Coin string
|
||||||
|
Base string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (currency Currency) String() string {
|
||||||
|
return fmt.Sprintf("%s_%s", currency.Coin, currency.Base)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Balance struct {
|
||||||
|
Currency string
|
||||||
|
Available float64
|
||||||
|
Frozen float64
|
||||||
|
Balance float64
|
||||||
|
}
|
87
candle.go
Normal file
87
candle.go
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Candle struct {
|
||||||
|
ID int64 `xorm:"pk autoincr null 'id'"`
|
||||||
|
Start int64 `xorm:"unique index 'start'"`
|
||||||
|
Open float64 `xorm:"notnull 'open'"`
|
||||||
|
High float64 `xorm:"notnull 'high'"`
|
||||||
|
Low float64 `xorm:"notnull 'low'"`
|
||||||
|
Close float64 `xorm:"notnull 'close'"`
|
||||||
|
Volume float64 `xorm:"notnull 'volume'"`
|
||||||
|
Turnover float64 `xorm:"turnover 'turnover'"`
|
||||||
|
Trades int64 `xorm:"notnull 'trades'"`
|
||||||
|
Table string `xorm:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Candle) TableName() string {
|
||||||
|
return c.Table
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Candle) GetTable() string {
|
||||||
|
return c.Table
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Candle) GetStart() int64 {
|
||||||
|
return c.Start
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Candle) SetTable(tbl string) {
|
||||||
|
c.Table = tbl
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Candle) Time() time.Time {
|
||||||
|
return time.Unix(c.Start, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Candle) String() string {
|
||||||
|
return fmt.Sprintf("%s open:%f close:%f low:%f high:%f volume:%f trades:%d turnover: %f", c.Time().String(), c.Open, c.Close, c.Low, c.High, c.Volume, c.Trades, c.Turnover)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CandleList candle list
|
||||||
|
type CandleList []*Candle
|
||||||
|
|
||||||
|
// Merge merge multi candle to one
|
||||||
|
func (l CandleList) Merge() (ret *Candle) {
|
||||||
|
if len(l) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ret = new(Candle)
|
||||||
|
ret.Start = l[0].Start
|
||||||
|
ret.Open = l[0].Open
|
||||||
|
ret.High = l.High()
|
||||||
|
ret.Low = l.Low()
|
||||||
|
ret.Close = l[len(l)-1].Close
|
||||||
|
for _, v := range l {
|
||||||
|
ret.Turnover = v.Turnover
|
||||||
|
ret.Volume += v.Volume
|
||||||
|
ret.Trades += v.Trades
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l CandleList) High() (ret float64) {
|
||||||
|
for _, v := range l {
|
||||||
|
if ret < v.High {
|
||||||
|
ret = v.High
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l CandleList) Low() (ret float64) {
|
||||||
|
for _, v := range l {
|
||||||
|
if ret == 0 {
|
||||||
|
ret = v.Low
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ret > v.Low {
|
||||||
|
ret = v.Low
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
21
order.go
Normal file
21
order.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
var (
|
||||||
|
OrderStatusFilled = "FILLED"
|
||||||
|
OrderStatusCanceled = "CANCELED"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Order struct {
|
||||||
|
OrderID string
|
||||||
|
Symbol string
|
||||||
|
Currency string
|
||||||
|
Amount float64
|
||||||
|
Price float64
|
||||||
|
Status string
|
||||||
|
Side string
|
||||||
|
Time time.Time
|
||||||
|
Remark string
|
||||||
|
Filled float64
|
||||||
|
}
|
16
orderbook.go
Normal file
16
orderbook.go
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type DepthInfo struct {
|
||||||
|
Price float64
|
||||||
|
Amount float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type Depth OrderBook
|
||||||
|
|
||||||
|
type OrderBook struct {
|
||||||
|
Sells []DepthInfo
|
||||||
|
Buys []DepthInfo
|
||||||
|
UpdateTime time.Time
|
||||||
|
}
|
14
pos.go
Normal file
14
pos.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
const (
|
||||||
|
Long = 1
|
||||||
|
Short = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type Position struct {
|
||||||
|
Symbol string
|
||||||
|
Type int // 合约类型,Long: 多头,Short: 空头
|
||||||
|
Hold float64 // 持有仓位
|
||||||
|
Price float64 //开仓价格
|
||||||
|
ProfitRatio float64 // 盈利比例,正数表示盈利,负数表示亏岁
|
||||||
|
}
|
45
symbol.go
Normal file
45
symbol.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SymbolTypeSpot = "spot"
|
||||||
|
SymbolTypeIndex = "index"
|
||||||
|
SymbolTypeFutures = "futures"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Symbol struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Symbol string `json:"code"`
|
||||||
|
Exchange string `json:"exchange"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
// 交易时间
|
||||||
|
Session string `json:"session"`
|
||||||
|
|
||||||
|
// price decimal places
|
||||||
|
Precision int `json:"precision"`
|
||||||
|
// amount decimal places
|
||||||
|
AmountPrecision int `json:"volume_precision"`
|
||||||
|
|
||||||
|
Expired bool `json:"expired"`
|
||||||
|
// only use if expired = true
|
||||||
|
ExpirationDate time.Time `json:"expiration_date"`
|
||||||
|
Resolutions string `json:"resolutions"`
|
||||||
|
|
||||||
|
// mini size between two price
|
||||||
|
PriceStep float64 `json:"price_step"`
|
||||||
|
// mini size between two amount
|
||||||
|
AmountStep float64 `json:"amount"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Symbol) GetResolutions() []string {
|
||||||
|
return strings.Split(s.Resolutions, ",")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Symbol) FixPrice(price float64) float64 {
|
||||||
|
return float64(int(price/s.PriceStep)) * s.PriceStep
|
||||||
|
}
|
11
ticker.go
Normal file
11
ticker.go
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
type Ticker struct {
|
||||||
|
CurrencyPair string
|
||||||
|
Last float64
|
||||||
|
High float64
|
||||||
|
Low float64
|
||||||
|
Bid float64
|
||||||
|
Ask float64
|
||||||
|
Volume float64
|
||||||
|
}
|
112
trade.go
Normal file
112
trade.go
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
package trademodel
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TradeType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
CancelOne TradeType = -2
|
||||||
|
CancelAll TradeType = -1
|
||||||
|
DirectLong TradeType = 1
|
||||||
|
DirectShort TradeType = 1 << 1
|
||||||
|
|
||||||
|
Limit TradeType = 1 << 3
|
||||||
|
Market TradeType = 1 << 4
|
||||||
|
Stop TradeType = 1 << 5
|
||||||
|
|
||||||
|
Open TradeType = 1 << 6
|
||||||
|
Close TradeType = 1 << 7
|
||||||
|
|
||||||
|
OpenLong = Open | DirectLong
|
||||||
|
OpenShort = Open | DirectShort
|
||||||
|
CloseLong = Close | DirectLong
|
||||||
|
CloseShort = Close | DirectShort // 130
|
||||||
|
StopLong = Stop | DirectLong // 33
|
||||||
|
StopShort = Stop | DirectShort // 34
|
||||||
|
)
|
||||||
|
|
||||||
|
func (t TradeType) String() (ret string) {
|
||||||
|
if t&Limit == Limit {
|
||||||
|
ret += "Limit"
|
||||||
|
} else if t&Market == Market {
|
||||||
|
ret += "Market"
|
||||||
|
} else if t&Stop == Stop {
|
||||||
|
ret += "Stop"
|
||||||
|
}
|
||||||
|
if t&Open == Open {
|
||||||
|
ret += "Open"
|
||||||
|
} else if t&Close == Close {
|
||||||
|
ret += "Close"
|
||||||
|
}
|
||||||
|
|
||||||
|
if t&DirectLong == DirectLong {
|
||||||
|
ret += "Long"
|
||||||
|
} else if t&DirectShort == DirectShort {
|
||||||
|
ret += "Short"
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTradeType(typ string) (t TradeType, err error) {
|
||||||
|
switch typ {
|
||||||
|
case "OpenLong":
|
||||||
|
t = OpenLong
|
||||||
|
case "OpenShort":
|
||||||
|
t = OpenShort
|
||||||
|
case "CloseLong":
|
||||||
|
t = CloseLong
|
||||||
|
case "CloseShort":
|
||||||
|
t = CloseShort
|
||||||
|
case "StopLong":
|
||||||
|
t = StopLong
|
||||||
|
case "StopShort":
|
||||||
|
t = StopShort
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("unsupport trade type: %d", t)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type Trade struct {
|
||||||
|
ID string
|
||||||
|
Action TradeType
|
||||||
|
Time time.Time
|
||||||
|
Price float64
|
||||||
|
Amount float64
|
||||||
|
Side string
|
||||||
|
Remark string
|
||||||
|
}
|
||||||
|
|
||||||
|
// TradeAction trade action
|
||||||
|
type TradeAction struct {
|
||||||
|
ID string
|
||||||
|
Action TradeType
|
||||||
|
Amount float64
|
||||||
|
Price float64
|
||||||
|
Time time.Time
|
||||||
|
Symbol string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a TradeType) IsLong() bool {
|
||||||
|
if a&OpenLong == OpenLong || a&CloseShort == CloseShort || a&StopShort == StopShort {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a TradeType) IsOpen() bool {
|
||||||
|
if a&Open == Open {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a TradeType) IsStop() bool {
|
||||||
|
if a&Stop == Stop {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user