242 lines
5.0 KiB
Go
242 lines
5.0 KiB
Go
package wImpl
|
||
|
||
import (
|
||
"regexp"
|
||
)
|
||
|
||
/*
|
||
|
||
*/
|
||
|
||
const (
|
||
MSG_NORMAL = iota
|
||
MSG_JRPC
|
||
)
|
||
|
||
//事件
|
||
type Event int
|
||
|
||
/*
|
||
EventID
|
||
*/
|
||
const (
|
||
EVENT_UNKNOWN Event = iota
|
||
EVENT_ERROR
|
||
EVENT_PING
|
||
EVENT_LOGIN
|
||
|
||
//订阅公共频道
|
||
EVENT_BOOK_INSTRUMENTS
|
||
EVENT_STATUS
|
||
EVENT_BOOK_TICKERS
|
||
EVENT_BOOK_OPEN_INTEREST
|
||
EVENT_BOOK_KLINE
|
||
EVENT_BOOK_TRADE
|
||
EVENT_BOOK_ESTIMATE_PRICE
|
||
EVENT_BOOK_MARK_PRICE
|
||
EVENT_BOOK_MARK_PRICE_CANDLE_CHART
|
||
EVENT_BOOK_LIMIT_PRICE
|
||
EVENT_BOOK_ORDER_BOOK
|
||
EVENT_BOOK_ORDER_BOOK5
|
||
EVENT_BOOK_ORDER_BOOK_TBT
|
||
EVENT_BOOK_ORDER_BOOK50_TBT
|
||
EVENT_BOOK_OPTION_SUMMARY
|
||
EVENT_BOOK_FUND_RATE
|
||
EVENT_BOOK_KLINE_INDEX
|
||
EVENT_BOOK_INDEX_TICKERS
|
||
|
||
//订阅私有频道
|
||
EVENT_BOOK_ACCOUNT
|
||
EVENT_BOOK_POSTION
|
||
EVENT_BOOK_ORDER
|
||
EVENT_BOOK_ALG_ORDER
|
||
EVENT_BOOK_B_AND_P
|
||
|
||
// JRPC
|
||
EVENT_PLACE_ORDER
|
||
EVENT_PLACE_BATCH_ORDERS
|
||
EVENT_CANCEL_ORDER
|
||
EVENT_CANCEL_BATCH_ORDERS
|
||
EVENT_AMEND_ORDER
|
||
EVENT_AMEND_BATCH_ORDERS
|
||
|
||
//订阅返回数据
|
||
EVENT_BOOKED_DATA
|
||
EVENT_DEPTH_DATA
|
||
)
|
||
|
||
/*
|
||
EventID,事件名称,channel
|
||
注: 带有周期参数的频道 如 行情频道 ,需要将channel写为 正则表达模式方便 类型匹配,如 "^candle*"
|
||
*/
|
||
var EVENT_TABLE = [][]interface{}{
|
||
// 未知的消息
|
||
{EVENT_UNKNOWN, "未知", ""},
|
||
// 错误的消息
|
||
{EVENT_ERROR, "错误", ""},
|
||
// Ping
|
||
{EVENT_PING, "ping", ""},
|
||
// 登陆
|
||
{EVENT_LOGIN, "登录", ""},
|
||
|
||
/*
|
||
订阅公共频道
|
||
*/
|
||
|
||
{EVENT_BOOK_INSTRUMENTS, "产品", "instruments"},
|
||
{EVENT_STATUS, "status", "status"},
|
||
{EVENT_BOOK_TICKERS, "行情", "tickers"},
|
||
{EVENT_BOOK_OPEN_INTEREST, "持仓总量", "open-interest"},
|
||
{EVENT_BOOK_KLINE, "K线", "candle"},
|
||
{EVENT_BOOK_TRADE, "交易", "trades"},
|
||
{EVENT_BOOK_ESTIMATE_PRICE, "预估交割/行权价格", "estimated-price"},
|
||
{EVENT_BOOK_MARK_PRICE, "标记价格", "mark-price"},
|
||
{EVENT_BOOK_MARK_PRICE_CANDLE_CHART, "标记价格K线", "mark-price-candle"},
|
||
{EVENT_BOOK_LIMIT_PRICE, "限价", "price-limit"},
|
||
{EVENT_BOOK_ORDER_BOOK, "400档深度", "books"},
|
||
{EVENT_BOOK_ORDER_BOOK5, "5档深度", "books5"},
|
||
{EVENT_BOOK_ORDER_BOOK_TBT, "tbt深度", "books-l2-tbt"},
|
||
{EVENT_BOOK_ORDER_BOOK50_TBT, "tbt50深度", "books50-l2-tbt"},
|
||
{EVENT_BOOK_OPTION_SUMMARY, "期权定价", "opt-summary"},
|
||
{EVENT_BOOK_FUND_RATE, "资金费率", "funding-rate"},
|
||
{EVENT_BOOK_KLINE_INDEX, "指数K线", "index-candle"},
|
||
{EVENT_BOOK_INDEX_TICKERS, "指数行情", "index-tickers"},
|
||
|
||
/*
|
||
订阅私有频道
|
||
*/
|
||
{EVENT_BOOK_ACCOUNT, "账户", "account"},
|
||
{EVENT_BOOK_POSTION, "持仓", "positions"},
|
||
{EVENT_BOOK_ORDER, "订单", "orders"},
|
||
{EVENT_BOOK_ALG_ORDER, "策略委托订单", "orders-algo"},
|
||
{EVENT_BOOK_B_AND_P, "账户余额和持仓", "balance_and_position"},
|
||
|
||
/*
|
||
JRPC
|
||
*/
|
||
{EVENT_PLACE_ORDER, "下单", "order"},
|
||
{EVENT_PLACE_BATCH_ORDERS, "批量下单", "batch-orders"},
|
||
{EVENT_CANCEL_ORDER, "撤单", "cancel-order"},
|
||
{EVENT_CANCEL_BATCH_ORDERS, "批量撤单", "batch-cancel-orders"},
|
||
{EVENT_AMEND_ORDER, "改单", "amend-order"},
|
||
{EVENT_AMEND_BATCH_ORDERS, "批量改单", "batch-amend-orders"},
|
||
|
||
/*
|
||
订阅返回数据
|
||
注意:推送数据channle统一为""
|
||
*/
|
||
{EVENT_BOOKED_DATA, "普通推送", ""},
|
||
{EVENT_DEPTH_DATA, "深度推送", ""},
|
||
}
|
||
|
||
/*
|
||
获取事件名称
|
||
*/
|
||
func (e Event) String() string {
|
||
for _, v := range EVENT_TABLE {
|
||
eventId := v[0].(Event)
|
||
if e == eventId {
|
||
return v[1].(string)
|
||
}
|
||
}
|
||
|
||
return ""
|
||
}
|
||
|
||
/*
|
||
通过事件获取对应的channel信息
|
||
对于频道名称有时间周期的 通过参数 pd 传入,拼接后返回完整channel信息
|
||
*/
|
||
func (e Event) GetChannel(pd Period) string {
|
||
|
||
channel := ""
|
||
|
||
for _, v := range EVENT_TABLE {
|
||
eventId := v[0].(Event)
|
||
if e == eventId {
|
||
channel = v[2].(string)
|
||
break
|
||
}
|
||
}
|
||
|
||
if channel == "" {
|
||
return ""
|
||
}
|
||
|
||
return channel + string(pd)
|
||
}
|
||
|
||
/*
|
||
通过channel信息匹配获取事件类型
|
||
*/
|
||
func GetEventId(raw string) Event {
|
||
evt := EVENT_UNKNOWN
|
||
|
||
for _, v := range EVENT_TABLE {
|
||
channel := v[2].(string)
|
||
if raw == channel {
|
||
evt = v[0].(Event)
|
||
break
|
||
}
|
||
|
||
regexp := regexp.MustCompile(`^(.*)([1-9][0-9]?[\w])$`)
|
||
//regexp := regexp.MustCompile(`^http://www.flysnow.org/([\d]{4})/([\d]{2})/([\d]{2})/([\w-]+).html$`)
|
||
|
||
substr := regexp.FindStringSubmatch(raw)
|
||
//fmt.Println(substr)
|
||
if len(substr) >= 2 {
|
||
if substr[1] == channel {
|
||
evt = v[0].(Event)
|
||
break
|
||
}
|
||
}
|
||
}
|
||
|
||
return evt
|
||
}
|
||
|
||
// 时间维度
|
||
type Period string
|
||
|
||
const (
|
||
// 年
|
||
PERIOD_1YEAR Period = "1Y"
|
||
|
||
// 月
|
||
PERIOD_6Mon Period = "6M"
|
||
PERIOD_3Mon Period = "3M"
|
||
PERIOD_1Mon Period = "1M"
|
||
|
||
// 周
|
||
PERIOD_1WEEK Period = "1W"
|
||
|
||
// 天
|
||
PERIOD_5DAY Period = "5D"
|
||
PERIOD_3DAY Period = "3D"
|
||
PERIOD_2DAY Period = "2D"
|
||
PERIOD_1DAY Period = "1D"
|
||
|
||
// 小时
|
||
PERIOD_12HOUR Period = "12H"
|
||
PERIOD_6HOUR Period = "6H"
|
||
PERIOD_4HOUR Period = "4H"
|
||
PERIOD_2HOUR Period = "2H"
|
||
PERIOD_1HOUR Period = "1H"
|
||
|
||
// 分钟
|
||
PERIOD_30MIN Period = "30m"
|
||
PERIOD_15MIN Period = "15m"
|
||
PERIOD_5MIN Period = "5m"
|
||
PERIOD_3MIN Period = "3m"
|
||
PERIOD_1MIN Period = "1m"
|
||
|
||
// 缺省
|
||
PERIOD_NONE Period = ""
|
||
)
|
||
|
||
// 深度枚举
|
||
const (
|
||
DEPTH_SNAPSHOT = "snapshot"
|
||
DEPTH_UPDATE = "update"
|
||
)
|