github.com/frankrap/okex-api@v1.0.4/futures_ws.go (about)

     1  package okex
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"github.com/recws-org/recws"
     7  	"github.com/tidwall/gjson"
     8  	"log"
     9  	"net/http"
    10  	"net/url"
    11  	"sync"
    12  	"time"
    13  )
    14  
    15  const (
    16  	TableFuturesTicker     = "futures/ticker"       // 公共-Ticker频道
    17  	TableFuturesTrade      = "futures/trade"        // 公共-交易频道
    18  	TableFuturesDepthL2Tbt = "futures/depth_l2_tbt" // 公共-400档增量数据频道
    19  	TableFuturesPosition   = "futures/position"     // 用户持仓频道
    20  	TableFuturesAccount    = "futures/account"      // 用户账户频道
    21  	TableFuturesOrder      = "futures/order"        // 用户交易频道
    22  )
    23  
    24  type FuturesWS struct {
    25  	sync.RWMutex
    26  
    27  	wsURL      string
    28  	accessKey  string
    29  	secretKey  string
    30  	passphrase string
    31  	debugMode  bool
    32  
    33  	ctx    context.Context
    34  	cancel context.CancelFunc
    35  	conn   recws.RecConn
    36  
    37  	subscriptions map[string]interface{}
    38  
    39  	tickersCallback         func(tickers []WSTicker)
    40  	tradesCallback          func(trades []WSTrade)
    41  	depthL2TbtCallback      func(action string, data []WSDepthL2Tbt)
    42  	depth20SnapshotCallback func(ob *OrderBook) // 20档盘口
    43  	accountCallback         func(accounts []WSAccount)
    44  	positionCallback        func(positions []WSFuturesPosition)
    45  	orderCallback           func(orders []WSOrder)
    46  
    47  	dobMap map[string]*DepthOrderBook
    48  }
    49  
    50  // SetProxy 设置代理地址
    51  // porxyURL:
    52  // socks5://127.0.0.1:1080
    53  // https://127.0.0.1:1080
    54  func (ws *FuturesWS) SetProxy(proxyURL string) (err error) {
    55  	var purl *url.URL
    56  	purl, err = url.Parse(proxyURL)
    57  	if err != nil {
    58  		return
    59  	}
    60  	log.Printf("[ws][%s] proxy url:%s", proxyURL, purl)
    61  	ws.conn.Proxy = http.ProxyURL(purl)
    62  	return
    63  }
    64  
    65  func (ws *FuturesWS) SetTickerCallback(callback func(tickers []WSTicker)) {
    66  	ws.tickersCallback = callback
    67  }
    68  
    69  func (ws *FuturesWS) SetTradeCallback(callback func(trades []WSTrade)) {
    70  	ws.tradesCallback = callback
    71  }
    72  
    73  func (ws *FuturesWS) SetDepthL2TbtCallback(callback func(action string, data []WSDepthL2Tbt)) {
    74  	ws.depthL2TbtCallback = callback
    75  }
    76  
    77  func (ws *FuturesWS) SetDepth20SnapshotCallback(callback func(ob *OrderBook)) {
    78  	ws.depth20SnapshotCallback = callback
    79  }
    80  
    81  func (ws *FuturesWS) SetAccountCallback(callback func(accounts []WSAccount)) {
    82  	ws.accountCallback = callback
    83  }
    84  
    85  func (ws *FuturesWS) SetPositionCallback(callback func(positions []WSFuturesPosition)) {
    86  	ws.positionCallback = callback
    87  }
    88  
    89  func (ws *FuturesWS) SetOrderCallback(callback func(orders []WSOrder)) {
    90  	ws.orderCallback = callback
    91  }
    92  
    93  func (ws *FuturesWS) SubscribeTicker(id string, symbol string) error {
    94  	ch := fmt.Sprintf("%v:%v", TableFuturesTicker, symbol)
    95  	return ws.Subscribe(id, []string{ch})
    96  }
    97  
    98  func (ws *FuturesWS) SubscribeTrade(id string, symbol string) error {
    99  	ch := fmt.Sprintf("%v:%v", TableFuturesTrade, symbol)
   100  	return ws.Subscribe(id, []string{ch})
   101  }
   102  
   103  // SubscribeDepthL2Tbt 公共-400档增量数据频道
   104  // 订阅后首次返回市场订单簿的400档深度数据并推送;后续只要订单簿深度有变化就推送有更改的数据。
   105  func (ws *FuturesWS) SubscribeDepthL2Tbt(id string, symbol string) error {
   106  	ch := fmt.Sprintf("%v:%v", TableFuturesDepthL2Tbt, symbol)
   107  	return ws.Subscribe(id, []string{ch})
   108  }
   109  
   110  func (ws *FuturesWS) SubscribePosition(id string, symbol string) error {
   111  	ch := fmt.Sprintf("%v:%v", TableFuturesPosition, symbol)
   112  	return ws.Subscribe(id, []string{ch})
   113  }
   114  
   115  func (ws *FuturesWS) SubscribeAccount(id string, symbol string) error {
   116  	ch := fmt.Sprintf("%v:%v", TableFuturesAccount, symbol)
   117  	return ws.Subscribe(id, []string{ch})
   118  }
   119  
   120  func (ws *FuturesWS) SubscribeOrder(id string, symbol string) error {
   121  	ch := fmt.Sprintf("%v:%v", TableFuturesOrder, symbol)
   122  	return ws.Subscribe(id, []string{ch})
   123  }
   124  
   125  // Subscribe 订阅
   126  func (ws *FuturesWS) Subscribe(id string, args []string) error {
   127  	ws.Lock()
   128  	defer ws.Unlock()
   129  
   130  	type Op struct {
   131  		Op   string   `json:"op"`
   132  		Args []string `json:"args"`
   133  	}
   134  
   135  	op := Op{
   136  		Op:   "subscribe",
   137  		Args: args,
   138  	}
   139  	ws.subscriptions[id] = op
   140  	return ws.sendWSMessage(op)
   141  }
   142  
   143  // Unsubscribe 取消订阅
   144  func (ws *FuturesWS) Unsubscribe(id string) error {
   145  	ws.Lock()
   146  	defer ws.Unlock()
   147  
   148  	if _, ok := ws.subscriptions[id]; ok {
   149  		delete(ws.subscriptions, id)
   150  	}
   151  	return nil
   152  }
   153  
   154  func (ws *FuturesWS) Login() error {
   155  	if ws.accessKey == "" || ws.secretKey == "" || ws.passphrase == "" {
   156  		return fmt.Errorf("missing key")
   157  	}
   158  	timestamp := EpochTime()
   159  
   160  	preHash := PreHashString(timestamp, GET, "/users/self/verify", "")
   161  	if sign, err := HmacSha256Base64Signer(preHash, ws.secretKey); err != nil {
   162  		return err
   163  	} else {
   164  		op, err := loginOp(ws.accessKey, ws.passphrase, timestamp, sign)
   165  		if err != nil {
   166  			return err
   167  		}
   168  		//data, err := Struct2JsonString(op)
   169  		log.Printf("Send Msg: %#v", *op)
   170  		//err = a.conn.WriteMessage(websocket.TextMessage, []byte(data))
   171  		err = ws.sendWSMessage(op)
   172  		if err != nil {
   173  			return err
   174  		}
   175  		time.Sleep(time.Millisecond * 100)
   176  	}
   177  	return nil
   178  }
   179  
   180  func (ws *FuturesWS) subscribeHandler() error {
   181  	//log.Printf("subscribeHandler")
   182  	ws.Lock()
   183  	defer ws.Unlock()
   184  
   185  	err := ws.Login()
   186  	if err != nil {
   187  		log.Printf("login error: %v", err)
   188  	}
   189  
   190  	for _, v := range ws.subscriptions {
   191  		//log.Printf("sub: %#v", v)
   192  		err := ws.sendWSMessage(v)
   193  		if err != nil {
   194  			log.Printf("%v", err)
   195  		}
   196  	}
   197  	return nil
   198  }
   199  
   200  func (ws *FuturesWS) sendWSMessage(msg interface{}) error {
   201  	return ws.conn.WriteJSON(msg)
   202  }
   203  
   204  func (ws *FuturesWS) Start() {
   205  	log.Printf("wsURL: %v", ws.wsURL)
   206  	ws.conn.Dial(ws.wsURL, nil)
   207  	go ws.run()
   208  }
   209  
   210  func (ws *FuturesWS) run() {
   211  	ctx := context.Background()
   212  	for {
   213  		select {
   214  		case <-ctx.Done():
   215  			go ws.conn.Close()
   216  			log.Printf("Websocket closed %s", ws.conn.GetURL())
   217  			return
   218  		default:
   219  			messageType, msg, err := ws.conn.ReadMessage()
   220  			if err != nil {
   221  				log.Printf("Read error: %v", err)
   222  				time.Sleep(100 * time.Millisecond)
   223  				continue
   224  			}
   225  
   226  			msg, err = FlateUnCompress(msg)
   227  			if err != nil {
   228  				log.Printf("%v", err)
   229  				continue
   230  			}
   231  
   232  			ws.handleMsg(messageType, msg)
   233  		}
   234  	}
   235  }
   236  
   237  func (ws *FuturesWS) handleMsg(messageType int, msg []byte) {
   238  	ret := gjson.ParseBytes(msg)
   239  
   240  	if ws.debugMode {
   241  		log.Printf("%v", string(msg))
   242  	}
   243  
   244  	// 登录成功
   245  	// {"event":"login","success":true}
   246  
   247  	// Ticker 订阅成功
   248  	// {"event":"subscribe","channel":"futures/ticker:BTC-USD-200626"}
   249  
   250  	// 错误消息
   251  	// {"event":"error","message":"User not logged in / User must be logged in","errorCode":30041}
   252  
   253  	// 委托
   254  	// {"table":"futures/order","data":[{"leverage":"10","last_fill_time":"1970-01-01T00:00:00.000Z","filled_qty":"0","fee":"0","price_avg":"0","type":"1","client_oid":"","last_fill_qty":"0","instrument_id":"BTC-USD-200626","last_fill_px":"0","pnl":"0","size":"1","price":"6200","last_fill_id":"0","error_code":"0","state":"0","contract_val":"100","order_id":"4718613348289537","order_type":"0","timestamp":"2020-04-13T00:05:25.760Z","status":"0"}]}
   255  
   256  	// 账户资产变动
   257  	// {"table":"futures/account","data":[{"BTC":{"available":"0.01867179","can_withdraw":"0.01867179","currency":"BTC","equity":"0.02018113","liqui_mode":"tier","maint_margin_ratio":"0.005","margin":"0.00150934","margin_for_unfilled":"0","margin_frozen":"0.00150934","margin_mode":"crossed","margin_ratio":"1.3370831","open_max":"0","realized_pnl":"-0.00034029","timestamp":"2020-04-12T08:00:13.975Z","total_avail_balance":"0.02046331","underlying":"BTC-USD","unrealized_pnl":"0.00005811"}}]}
   258  
   259  	// Ticker 消息
   260  	// {"table":"futures/ticker","data":[{"last":"6768.28","open_24h":"6887.16","best_bid":"6765.49","high_24h":"6889.64","low_24h":"6711","volume_24h":"4012676","volume_token_24h":"59026.9171","best_ask":"6765.5","open_interest":"2789329","instrument_id":"BTC-USD-200626","timestamp":"2020-04-12T06:19:03.829Z","best_bid_size":"129","best_ask_size":"6","last_qty":"2"}]}
   261  
   262  	if tableValue := ret.Get("table"); tableValue.Exists() {
   263  		table := tableValue.String()
   264  		if table == TableFuturesDepthL2Tbt { // 优先判断最高频数据
   265  			// {"table":"futures/depth_l2_tbt","action":"partial","data":[{"instrument_id":"BTC-USD-200626","asks":[["6773.41","344","0","8"],["6773.8","13","0","10"],["6773.81","40","0","1"],["6773.84","26","0","4"],["6773.86","1","0","1"],["6773.89","1","0","1"],["6774","4","0","2"],["6774.1","1","0","1"],["6774.14","2","0","1"],["6774.35","1","0","1"],["6774.36","70","0","3"],["6774.41","21","0","1"],["6774.44","1","0","1"],["6774.5","1","0","1"],["6774.95","1","0","1"],["6774.96","21","0","2"],["6775.21","1","0","1"],["6775.22","30","0","1"],["6775.28","1","0","1"],["6775.29","3","0","1"],["6775.6","1","0","1"],["6775.64","20","0","1"],["6775.72","84","0","1"],["6775.75","296","0","1"],["6775.76","2","0","2"],["6775.84","5","0","1"],["6775.86","134","0","2"],["6775.9","20","0","1"],["6776","3","0","1"],["6776.06","99","0","1"],["6776.07","1","0","1"],["6776.16","13","0","1"],["6776.19","13","0","1"],["6776.22","6","0","1"],["6776.26","14","0","2"],["6776.29","15","0","2"],["6776.31","20","0","1"],["6776.32","14","0","2"],["6776.36","8","0","1"],["6776.38","5","0","5"],["6776.42","2","0","1"],["6776.44","3","0","1"],["6776.45","2","0","1"],["6776.46","20","0","1"],["6776.47","9","0","2"],["6776.5","11","0","1"],["6776.53","39","0","3"],["6776.57","20","0","2"],["6776.61","18","0","1"],["6776.62","11","0","2"],["6776.63","6","0","1"],["6776.67","3","0","1"],["6776.69","12","0","1"],["6776.76","2","0","2"],["6776.79","3","0","3"],["6776.83","1","0","1"],["6776.9","1","0","1"],["6776.91","1","0","1"],["6776.97","100","0","1"],["6776.98","13","0","1"],["6777","3","0","1"],["6777.14","6","0","1"],["6777.16","10","0","1"],["6777.2","16","0","8"],["6777.24","26","0","3"],["6777.33","1","0","1"],["6777.38","1","0","1"],["6777.41","4","0","2"],["6777.43","7","0","7"],["6777.45","5","0","1"],["6777.49","5","0","1"],["6777.5","1","0","1"],["6777.53","15","0","1"],["6777.55","14","0","1"],["6777.58","6","0","1"],["6777.59","2","0","1"],["6777.6","1","0","1"],["6777.61","2","0","1"],["6777.66","1","0","1"],["6777.69","17","0","1"],["6777.72","2","0","2"],["6777.77","1","0","1"],["6777.78","10","0","1"],["6777.84","2","0","1"],["6777.88","50","0","1"],["6777.89","2","0","1"],["6777.92","5","0","1"],["6777.93","12","0","2"],["6777.96","9","0","1"],["6777.97","1","0","1"],["6778","3","0","1"],["6778.05","2","0","1"],["6778.06","3","0","1"],["6778.15","201","0","2"],["6778.25","18","0","9"],["6778.29","18","0","2"],["6778.3","60","0","1"],["6778.33","3","0","1"],["6778.39","16","0","1"],["6778.46","1","0","1"],["6778.48","1","0","1"],["6778.52","1075","0","1"],["6778.53","12","0","1"],["6778.59","5","0","5"],["6778.68","1","0","1"],["6778.82","12","0","4"],["6778.94","1","0","1"],["6778.99","5","0","1"],["6779","3","0","1"],["6779.06","18","0","1"],["6779.2","2","0","2"],["6779.23","4","0","4"],["6779.24","6","0","1"],["6779.27","656","0","1"],["6779.35","21","0","1"],["6779.39","40","0","1"],["6779.41","5","0","1"],["6779.44","67","0","1"],["6779.49","50","0","1"],["6779.56","50","0","1"],["6779.58","1","0","1"],["6779.6","1","0","1"],["6779.63","1","0","1"],["6779.67","5","0","1"],["6779.68","1","0","1"],["6779.73","1","0","1"],["6779.8","1","0","1"],["6779.95","83","0","1"],["6779.96","1","0","1"],["6780","1","0","1"],["6780.03","3","0","1"],["6780.04","5","0","5"],["6780.11","6","0","6"],["6780.17","5","0","1"],["6780.29","50","0","1"],["6780.3","100","0","1"],["6780.34","1","0","1"],["6780.4","73","0","1"],["6780.42","317","0","1"],["6780.49","111","0","1"],["6780.61","13","0","1"],["6780.62","14","0","1"],["6780.63","1","0","1"],["6780.65","159","0","1"],["6780.66","50","0","1"],["6780.74","197","0","2"],["6780.8","60","0","1"],["6780.83","234","0","2"],["6780.96","82","0","3"],["6780.97","1","0","1"],["6780.98","94","0","1"],["6781","3","0","1"],["6781.01","78","0","1"],["6781.06","12","0","1"],["6781.08","50","0","1"],["6781.09","89","0","1"],["6781.1","76","0","1"],["6781.11","10","0","1"],["6781.2","1","0","1"],["6781.22","121","0","1"],["6781.24","9","0","1"],["6781.25","134","0","1"],["6781.28","1","0","1"],["6781.36","5","0","1"],["6781.4","105","0","1"],["6781.42","200","0","1"],["6781.44","40","0","1"],["6781.47","18","0","1"],["6781.48","20","0","1"],["6781.6","40","0","1"],["6781.63","11","0","1"],["6781.64","11","0","1"],["6781.71","50","0","1"],["6781.85","10","0","1"],["6781.9","10","0","1"],["6781.93","33","0","1"],["6781.97","50","0","1"],["6782","135","0","2"],["6782.17","127","0","1"],["6782.21","116","0","1"],["6782.24","10","0","1"],["6782.25","50","0","1"],["6782.27","20","0","1"],["6782.29","3","0","1"],["6782.3","14","0","1"],["6782.31","100","0","2"],["6782.34","138","0","1"],["6782.35","50","0","1"],["6782.37","11","0","1"],["6782.41","29","0","2"],["6782.42","4","0","1"],["6782.45","71","0","1"],["6782.46","170","0","1"],["6782.47","10","0","1"],["6782.65","51","0","2"],["6782.66","154","0","1"],["6782.67","2","0","2"],["6782.69","1","0","1"],["6782.71","50","0","1"],["6782.73","50","0","1"],["6782.76","51","0","1"],["6782.86","28","0","1"],["6782.89","30","0","1"],["6782.99","7","0","1"],["6783","4","0","2"],["6783.05","50","0","1"],["6783.06","148","0","1"],["6783.14","132","0","1"],["6783.22","143","0","1"],["6783.23","4","0","4"],["6783.27","1","0","1"],["6783.28","50","0","1"],["6783.31","20","0","2"],["6783.37","50","0","1"],["6783.42","30","0","1"],["6783.48","165","0","1"],["6783.53","32","0","1"],["6783.54","15","0","1"],["6783.56","1","0","1"],["6783.59","3","0","3"],["6783.61","1","0","1"],["6783.64","10","0","1"],["6783.66","1","0","1"],["6783.69","181","0","1"],["6783.72","50","0","1"],["6783.73","11","0","2"],["6783.87","200","0","1"],["6783.91","1","0","1"],["6783.94","1","0","1"],["6784","74","0","2"],["6784.01","1","0","1"],["6784.02","84","0","1"],["6784.1","27","0","1"],["6784.15","7","0","7"],["6784.19","27","0","1"],["6784.23","186","0","1"],["6784.26","14","0","1"],["6784.32","16","0","1"],["6784.36","10","0","1"],["6784.48","1","0","1"],["6784.5","26","0","2"],["6784.57","3","0","1"],["6784.59","176","0","1"],["6784.63","4","0","1"],["6784.67","15","0","1"],["6784.78","2","0","1"],["6784.8","40","0","1"],["6784.83","2","0","1"],["6784.86","68","0","2"],["6784.88","1","0","1"],["6784.9","2","0","1"],["6784.92","6","0","1"],["6784.93","1","0","1"],["6784.98","1","0","1"],["6785","23","0","2"],["6785.03","1","0","1"],["6785.04","34","0","1"],["6785.07","71","0","2"],["6785.08","100","0","2"],["6785.14","16","0","1"],["6785.52","16","0","1"],["6785.82","1322","0","1"],["6785.91","30","0","1"],["6785.98","56","0","1"],["6786","25","0","4"],["6786.1","5","0","1"],["6786.2","34","0","1"],["6786.38","1","0","1"],["6786.41","1","0","1"],["6786.57","9","0","1"],["6786.76","50","0","1"],["6786.78","50","0","1"],["6786.87","1","0","1"],["6786.95","373","0","1"],["6787","3","0","1"],["6787.05","1","0","1"],["6787.15","10","0","1"],["6787.18","1","0","1"],["6787.23","70","0","3"],["6787.36","1","0","1"],["6787.41","264","0","1"],["6787.5","70","0","1"],["6787.57","9","0","1"],["6787.6","15","0","1"],["6787.67","50","0","1"],["6788.01","3","0","1"],["6788.08","40","0","1"],["6788.12","44","0","1"],["6788.17","10","0","1"],["6788.19","1","0","1"],["6788.27","1","0","1"],["6788.35","200","0","1"],["6788.37","203","0","1"],["6788.45","50","0","1"],["6788.47","5","0","1"],["6788.51","2","0","1"],["6788.52","4","0","1"],["6788.57","1","0","1"],["6788.78","10","0","1"],["6788.85","3","0","1"],["6789","3","0","1"],["6789.04","34","0","1"],["6789.09","1","0","1"],["6789.13","50","0","1"],["6789.14","50","0","1"],["6789.47","20","0","1"],["6789.5","1","0","1"],["6789.65","27","0","1"],["6789.79","20","0","1"],["6789.83","1","0","1"],["6789.97","40","0","1"],["6790","3","0","1"],["6790.22","33","0","1"],["6790.41","1","0","1"],["6790.45","26","0","2"],["6790.51","32","0","2"],["6790.83","5","0","1"],["6791","3","0","1"],["6791.08","200","0","2"],["6791.13","1","0","1"],["6791.19","22","0","1"],["6791.35","45","0","1"],["6791.42","27","0","1"],["6791.54","34","0","1"],["6791.64","22","0","1"],["6791.81","1","0","1"],["6791.89","64","0","2"],["6792","4","0","2"],["6792.1","5","0","1"],["6792.2","1","0","1"],["6792.3","1","0","1"],["6792.43","33","0","1"],["6792.58","57","0","1"],["6792.79","33","0","1"],["6792.92","4","0","1"],["6792.95","22","0","1"],["6793","3","0","1"],["6793.09","15","0","1"],["6793.11","199","0","1"],["6793.17","1","0","1"],["6793.21","4","0","1"],["6793.23","15","0","1"],["6793.24","34","0","1"],["6793.31","50","0","2"],["6793.59","20","0","1"],["6793.73","2","0","2"],["6793.77","15","0","1"],["6793.9","1","0","1"],["6793.93","34","0","1"],["6794.03","150","0","1"],["6794.06","34","0","1"],["6794.14","20","0","1"],["6794.19","3","0","1"],["6794.36","24","0","1"],["6794.4","218","0","2"],["6794.49","33","0","1"],["6794.57","21","0","1"],["6794.72","22","0","1"],["6794.77","1","0","1"],["6794.82","19","0","1"],["6794.92","12","0","1"],["6794.97","43","0","1"],["6795","193","0","6"],["6795.21","1","0","1"],["6795.3","34","0","1"],["6795.44","2","0","2"],["6795.53","475","0","1"],["6795.59","5","0","1"],["6795.65","1","0","1"],["6796","1003","0","3"],["6796.01","20","0","1"],["6796.03","19","0","1"],["6796.08","100","0","1"],["6796.35","2","0","1"],["6796.42","240","0","1"],["6796.45","2","0","1"],["6796.51","13","0","1"],["6796.56","14","0","1"],["6796.74","1","0","1"],["6796.84","101","0","1"],["6796.86","27","0","1"],["6796.88","40","0","1"],["6796.99","5","0","1"],["6797","189","0","4"],["6797.02","22","0","1"],["6797.24","2","0","2"],["6797.25","1","0","1"],["6797.69","34","0","1"],["6797.72","1","0","1"],["6797.78","304","0","1"],["6797.8","1","0","1"],["6797.94","5","0","1"],["6797.98","5","0","1"],["6797.99","100","0","1"],["6798","3411","0","6"],["6798.34","22","0","1"],["6798.49","1000","0","1"],["6798.5","1223","0","1"],["6798.55","60","0","1"],["6798.6","22","0","1"]],"bids":[["6773.4","29","0","4"],["6773.3","3","0","1"],["6773.29","15","0","1"],["6772.94","1","0","1"],["6772.92","3","0","1"],["6772.89","34","0","2"],["6772.85","1","0","1"],["6772.8","1","0","1"],["6772.79","1","0","1"],["6772.58","40","0","1"],["6772.31","1","0","1"],["6772.24","1","0","1"],["6772.15","1","0","1"],["6772.01","9","0","9"],["6772","2239","0","4"],["6771.97","1","0","1"],["6771.85","20","0","1"],["6771.76","1","0","1"],["6771.71","1","0","1"],["6771.7","1","0","1"],["6771.59","24","0","1"],["6771.58","21","0","2"],["6771.57","1","0","1"],["6771.54","1","0","1"],["6771.43","1","0","1"],["6771.4","1","0","1"],["6771.39","1","0","1"],["6771.37","2","0","2"],["6771.23","1","0","1"],["6771.17","20","0","1"],["6771.13","5","0","1"],["6771.06","1","0","1"],["6771.02","5","0","1"],["6771","21","0","2"],["6770.94","303","0","2"],["6770.93","200","0","1"],["6770.91","20","0","1"],["6770.87","291","0","1"],["6770.78","5","0","1"],["6770.75","5","0","1"],["6770.71","60","0","2"],["6770.67","1","0","1"],["6770.65","50","0","1"],["6770.64","38","0","1"],["6770.63","1","0","1"],["6770.62","17","0","1"],["6770.61","44","0","1"],["6770.58","39","0","1"],["6770.57","9","0","1"],["6770.5","20","0","1"],["6770.49","50","0","1"],["6770.48","2","0","2"],["6770.45","6","0","1"],["6770.43","1","0","1"],["6770.42","19","0","2"],["6770.4","12","0","2"],["6770.36","9","0","2"],["6770.35","33","0","2"],["6770.32","67","0","1"],["6770.2","51","0","1"],["6770.17","2","0","2"],["6770.16","3","0","3"],["6770.14","3","0","1"],["6770.12","1","0","1"],["6770.11","64","0","2"],["6770.07","1","0","1"],["6770.06","14","0","1"],["6770.04","3","0","1"],["6770.03","129","0","5"],["6770.02","4","0","1"],["6770.01","56","0","1"],["6770","353","0","4"],["6769.99","4","0","1"],["6769.92","1","0","1"],["6769.9","1","0","1"],["6769.74","37","0","1"],["6769.73","56","0","2"],["6769.7","14","0","1"],["6769.69","14","0","1"],["6769.68","3","0","1"],["6769.66","50","0","1"],["6769.64","1","0","1"],["6769.61","11","0","1"],["6769.6","2","0","2"],["6769.59","50","0","1"],["6769.55","11","0","1"],["6769.51","2","0","2"],["6769.5","2","0","1"],["6769.47","3","0","2"],["6769.4","54","0","3"],["6769.38","4","0","1"],["6769.35","1","0","1"],["6769.33","4","0","1"],["6769.23","3","0","1"],["6769.22","23","0","2"],["6769.16","1","0","1"],["6769.1","50","0","1"],["6769.07","45","0","2"],["6769.04","50","0","1"],["6769","5","0","2"],["6768.99","11","0","1"],["6768.98","17","0","1"],["6768.97","1","0","1"],["6768.95","10","0","1"],["6768.94","1","0","1"],["6768.91","18","0","2"],["6768.88","20","0","1"],["6768.86","17","0","1"],["6768.8","18","0","1"],["6768.78","2","0","1"],["6768.77","5","0","1"],["6768.74","7","0","6"],["6768.73","71","0","6"],["6768.64","1","0","1"],["6768.61","1","0","1"],["6768.6","20","0","1"],["6768.57","1","0","1"],["6768.56","2","0","2"],["6768.53","50","0","1"],["6768.52","1","0","1"],["6768.48","201","0","2"],["6768.47","1","0","1"],["6768.45","335","0","2"],["6768.43","88","0","2"],["6768.42","56","0","4"],["6768.39","2","0","1"],["6768.36","1","0","1"],["6768.34","2","0","1"],["6768.33","50","0","1"],["6768.3","10","0","2"],["6768.25","20","0","2"],["6768.2","14","0","1"],["6768.19","1","0","1"],["6768.17","13","0","1"],["6768.16","3","0","1"],["6768.13","1","0","1"],["6768.12","70","0","2"],["6768.1","826","0","2"],["6768.09","73","0","1"],["6768.03","12","0","1"],["6768.01","14","0","1"],["6768","57","0","3"],["6767.98","1","0","1"],["6767.97","89","0","1"],["6767.89","94","0","1"],["6767.88","2","0","2"],["6767.85","132","0","1"],["6767.83","1","0","1"],["6767.82","1","0","1"],["6767.81","1","0","1"],["6767.76","1","0","1"],["6767.73","124","0","9"],["6767.72","2","0","2"],["6767.71","10","0","1"],["6767.69","1","0","1"],["6767.65","1","0","1"],["6767.62","11","0","2"],["6767.6","1","0","1"],["6767.53","1","0","1"],["6767.52","1","0","1"],["6767.47","105","0","1"],["6767.45","20","0","3"],["6767.43","7","0","2"],["6767.41","67","0","1"],["6767.4","12","0","3"],["6767.39","6","0","1"],["6767.38","199","0","3"],["6767.37","1","0","1"],["6767.33","42","0","3"],["6767.31","1","0","1"],["6767.25","4","0","1"],["6767.21","4","0","1"],["6767.19","37","0","1"],["6767.17","3","0","1"],["6767.15","21","0","1"],["6767.14","46","0","1"],["6767.13","176","0","1"],["6767.12","4","0","2"],["6767.1","83","0","1"],["6767.06","1","0","1"],["6767","404","0","4"],["6766.99","6","0","3"],["6766.98","111","0","1"],["6766.94","7","0","2"],["6766.93","100","0","1"],["6766.92","50","0","1"],["6766.89","4","0","1"],["6766.87","2","0","1"],["6766.85","127","0","1"],["6766.82","40","0","1"],["6766.8","1","0","1"],["6766.73","11","0","1"],["6766.72","5","0","1"],["6766.66","6","0","1"],["6766.65","148","0","1"],["6766.62","4","0","1"],["6766.61","6","0","1"],["6766.6","13","0","1"],["6766.58","17","0","2"],["6766.56","174","0","2"],["6766.52","50","0","1"],["6766.51","1","0","1"],["6766.49","32","0","1"],["6766.48","138","0","1"],["6766.47","121","0","1"],["6766.46","20","0","1"],["6766.4","17","0","2"],["6766.39","48","0","2"],["6766.37","9","0","1"],["6766.31","33","0","2"],["6766.3","38","0","2"],["6766.29","161","0","2"],["6766.28","11","0","1"],["6766.27","9","0","2"],["6766.22","4","0","1"],["6766.19","11","0","1"],["6766.18","1","0","1"],["6766.16","12","0","1"],["6766.11","1","0","1"],["6766.06","2","0","1"],["6766.02","2","0","1"],["6766","3","0","1"],["6765.99","50","0","1"],["6765.98","18","0","1"],["6765.96","181","0","1"],["6765.92","186","0","1"],["6765.87","50","0","1"],["6765.85","11","0","1"],["6765.81","1","0","1"],["6765.77","1","0","1"],["6765.67","50","0","1"],["6765.58","4","0","1"],["6765.56","170","0","1"],["6765.54","4","0","1"],["6765.49","65","0","1"],["6765.47","1","0","1"],["6765.39","201","0","2"],["6765.16","250","0","1"],["6765.06","43","0","3"],["6765.01","50","0","1"],["6765","121","0","4"],["6764.93","56","0","1"],["6764.87","50","0","1"],["6764.84","11","0","2"],["6764.81","1","0","1"],["6764.8","2","0","1"],["6764.77","1","0","1"],["6764.71","10","0","1"],["6764.7","1","0","1"],["6764.67","14","0","1"],["6764.62","1","0","1"],["6764.6","40","0","1"],["6764.57","1","0","1"],["6764.55","1","0","1"],["6764.31","1","0","1"],["6764.3","174","0","2"],["6764.24","30","0","3"],["6764.2","57","0","1"],["6764.14","1","0","1"],["6764.05","26","0","3"],["6764.01","20","0","1"],["6764","3","0","1"],["6763.86","473","0","1"],["6763.82","1","0","1"],["6763.77","1","0","1"],["6763.64","1","0","1"],["6763.62","50","0","1"],["6763.59","1","0","1"],["6763.58","16","0","1"],["6763.48","10","0","1"],["6763.44","2","0","1"],["6763.38","1","0","1"],["6763.33","52","0","2"],["6763.31","50","0","1"],["6763.28","50","0","1"],["6763.25","18","0","1"],["6763.14","12","0","1"],["6763.1","51","0","1"],["6763.05","5","0","1"],["6763","3","0","1"],["6762.97","100","0","2"],["6762.96","50","0","1"],["6762.95","100","0","2"],["6762.94","50","0","1"],["6762.83","51","0","2"],["6762.82","3","0","1"],["6762.8","10","0","1"],["6762.77","3","0","1"],["6762.76","1","0","1"],["6762.66","7","0","2"],["6762.61","50","0","1"],["6762.58","1","0","1"],["6762.52","51","0","2"],["6762.48","50","0","1"],["6762.46","192","0","1"],["6762.28","197","0","1"],["6762.21","30","0","1"],["6762.12","264","0","1"],["6762.01","16","0","1"],["6762","143","0","3"],["6761.84","1","0","1"],["6761.82","194","0","1"],["6761.8","1","0","1"],["6761.78","1","0","1"],["6761.73","54","0","1"],["6761.66","5","0","1"],["6761.61","1","0","1"],["6761.59","1","0","1"],["6761.56","1","0","1"],["6761.55","200","0","1"],["6761.53","1","0","1"],["6761.47","1","0","1"],["6761.22","20","0","1"],["6761","70","0","2"],["6760.92","65","0","4"],["6760.88","1","0","1"],["6760.82","1076","0","1"],["6760.66","1","0","1"],["6760.64","50","0","1"],["6760.49","1","0","1"],["6760.32","4","0","1"],["6760","70","0","2"],["6759.47","2","0","1"],["6759.34","3","0","1"],["6759.3","1","0","1"],["6759.29","5","0","1"],["6759.27","4","0","1"],["6759.13","1","0","1"],["6759.12","50","0","1"],["6759","3","0","1"],["6758.95","15","0","1"],["6758.81","1","0","1"],["6758.77","53","0","1"],["6758.66","1","0","1"],["6758.46","201","0","2"],["6758.28","33","0","1"],["6758.27","11","0","1"],["6758","206","0","2"],["6757.89","65","0","1"],["6757.86","48","0","1"],["6757.77","27","0","1"],["6757.69","50","0","1"],["6757.65","22","0","1"],["6757.62","1","0","1"],["6757.38","79","0","2"],["6757.36","199","0","1"],["6757.12","30","0","1"],["6757.11","1","0","1"],["6757.09","27","0","1"],["6757.06","34","0","1"],["6757.03","22","0","1"],["6757","3","0","1"],["6756.96","33","0","1"],["6756.94","20","0","1"],["6756.76","33","0","1"],["6756.67","1","0","1"],["6756.6","22","0","1"],["6756.44","1","0","1"],["6756.38","40","0","2"],["6756.3","22","0","1"],["6756.2","9","0","1"],["6756.08","3","0","1"],["6756.03","40","0","1"],["6756","3","0","1"],["6755.94","34","0","1"],["6755.84","1","0","1"],["6755.78","211","0","1"],["6755.7","20","0","1"],["6755.68","2","0","1"],["6755.59","5","0","1"],["6755.5","1","0","1"],["6755.49","20","0","1"],["6755.27","4","0","1"],["6755.22","15","0","1"],["6755.14","1","0","1"],["6755","53","0","2"],["6754.98","45","0","1"],["6754.9","1","0","1"],["6754.6","24","0","1"],["6754.54","7","0","1"],["6754.42","13","0","1"],["6754.41","1","0","1"],["6754.37","14","0","1"],["6754.36","1","0","1"],["6754.31","22","0","1"],["6754.26","1","0","1"],["6754.22","19","0","1"],["6754.21","1","0","1"],["6754.14","45","0","1"],["6754.09","6","0","1"],["6754.02","34","0","1"],["6754","3","0","1"],["6753.95","33","0","1"],["6753.89","1","0","1"],["6753.79","372","0","1"],["6753.4","23","0","1"],["6753.23","45","0","2"],["6753.21","1","0","1"],["6753","48","0","2"],["6752.97","22","0","1"]],"timestamp":"2020-04-12T10:24:19.913Z","checksum":854586422}]}
   266  			// {"table":"futures/depth_l2_tbt","action":"update","data":[{"instrument_id":"BTC-USD-200626","asks":[["6773.3","0","0","0"],["6773.39","0","0","0"]],"bids":[["6774.41","0","0","0"],["6773.51","0","0","0"],["6773.42","0","0","0"]],"timestamp":"2020-04-12T10:24:19.925Z","checksum":854586422}]}
   267  			// {"table":"futures/depth_l2_tbt","action":"update","data":[{"instrument_id":"BTC-USD-200626","asks":[["6772.8","0","0","0"],["6777.55","0","0","0"],["6781.25","0","0","0"],["6782.5","11","0","1"],["6783.14","171","0","2"]],"bids":[["6774.21","0","0","0"],["6774.01","0","0","0"],["6773.42","0","0","0"],["6766.01","133","0","1"],["6025.23","0","0","0"],["6025.18","0","0","0"]],"timestamp":"2020-04-12T10:24:19.938Z","checksum":854586422}]}
   268  			// action := ret.Get("action").String()
   269  			var depthL2 WSDepthL2TbtResult
   270  			err := json.Unmarshal(msg, &depthL2)
   271  			if err != nil {
   272  				log.Printf("%v", err)
   273  				return
   274  			}
   275  
   276  			if ws.depthL2TbtCallback != nil {
   277  				ws.depthL2TbtCallback(depthL2.Action, depthL2.Data)
   278  			}
   279  
   280  			if ws.depth20SnapshotCallback != nil {
   281  				for _, v := range depthL2.Data {
   282  					var ob OrderBook
   283  					if v1, ok := ws.dobMap[v.InstrumentID]; ok {
   284  						v1.Update(depthL2.Action, &v)
   285  						ob = v1.GetOrderBook(20)
   286  					} else {
   287  						dob := NewDepthOrderBook(v.InstrumentID)
   288  						dob.Update(depthL2.Action, &v)
   289  						ws.dobMap[v.InstrumentID] = dob
   290  						ob = dob.GetOrderBook(20)
   291  					}
   292  					ws.depth20SnapshotCallback(&ob)
   293  				}
   294  			}
   295  			return
   296  		} else if table == TableFuturesTicker {
   297  			var tickerResult WSTickerResult
   298  			err := json.Unmarshal(msg, &tickerResult)
   299  			if err != nil {
   300  				log.Printf("%v", err)
   301  				return
   302  			}
   303  
   304  			if ws.tickersCallback != nil {
   305  				ws.tickersCallback(tickerResult.Data)
   306  			}
   307  			return
   308  		} else if table == TableFuturesTrade {
   309  			var tradeResult WSTradeResult
   310  			err := json.Unmarshal(msg, &tradeResult)
   311  			if err != nil {
   312  				log.Printf("%v", err)
   313  				return
   314  			}
   315  
   316  			if ws.tradesCallback != nil {
   317  				ws.tradesCallback(tradeResult.Data)
   318  			}
   319  			return
   320  		} else if table == TableFuturesAccount {
   321  			var accountResult WSAccountResult
   322  			err := json.Unmarshal(msg, &accountResult)
   323  			if err != nil {
   324  				log.Printf("%v", err)
   325  				return
   326  			}
   327  
   328  			if ws.accountCallback != nil {
   329  				var accounts []WSAccount
   330  				for _, v := range accountResult.Data {
   331  					if v.BTC != nil {
   332  						accounts = append(accounts, *v.BTC)
   333  						continue
   334  					}
   335  					if v.ETH != nil {
   336  						accounts = append(accounts, *v.ETH)
   337  						continue
   338  					}
   339  					if v.ETC != nil {
   340  						accounts = append(accounts, *v.ETC)
   341  						continue
   342  					}
   343  					if v.XRP != nil {
   344  						accounts = append(accounts, *v.XRP)
   345  						continue
   346  					}
   347  					if v.EOS != nil {
   348  						accounts = append(accounts, *v.EOS)
   349  						continue
   350  					}
   351  					if v.BCH != nil {
   352  						accounts = append(accounts, *v.BCH)
   353  						continue
   354  					}
   355  					if v.BSV != nil {
   356  						accounts = append(accounts, *v.BSV)
   357  						continue
   358  					}
   359  					if v.TRX != nil {
   360  						accounts = append(accounts, *v.TRX)
   361  						continue
   362  					}
   363  				}
   364  				ws.accountCallback(accounts)
   365  			}
   366  			return
   367  		} else if table == TableFuturesPosition {
   368  			var positionResult WSFuturesPositionResult
   369  			err := json.Unmarshal(msg, &positionResult)
   370  			if err != nil {
   371  				log.Printf("%v", err)
   372  				return
   373  			}
   374  
   375  			if ws.positionCallback != nil {
   376  				ws.positionCallback(positionResult.Data)
   377  			}
   378  			return
   379  		} else if table == TableFuturesOrder {
   380  			var orderResult WSOrderResult
   381  			err := json.Unmarshal(msg, &orderResult)
   382  			if err != nil {
   383  				log.Printf("%v", err)
   384  				return
   385  			}
   386  
   387  			if ws.orderCallback != nil {
   388  				ws.orderCallback(orderResult.Data)
   389  			}
   390  			return
   391  		}
   392  		log.Printf("%v", string(msg))
   393  		return
   394  	}
   395  
   396  	if eventValue := ret.Get("event"); eventValue.Exists() {
   397  		event := eventValue.String()
   398  		if event == "error" {
   399  			log.Printf("error: %v", string(msg))
   400  			return
   401  		}
   402  		log.Printf("%v", string(msg))
   403  		return
   404  	}
   405  
   406  	log.Printf("%v", string(msg))
   407  }
   408  
   409  // NewFuturesWS 创建合约WS
   410  // wsURL:
   411  // wss://real.okex.com:8443/ws/v3
   412  func NewFuturesWS(wsURL string, accessKey string, secretKey string, passphrase string, debugMode bool) *FuturesWS {
   413  	ws := &FuturesWS{
   414  		wsURL:         wsURL,
   415  		accessKey:     accessKey,
   416  		secretKey:     secretKey,
   417  		passphrase:    passphrase,
   418  		debugMode:     debugMode,
   419  		subscriptions: make(map[string]interface{}),
   420  		dobMap:        make(map[string]*DepthOrderBook),
   421  	}
   422  	ws.ctx, ws.cancel = context.WithCancel(context.Background())
   423  	ws.conn = recws.RecConn{
   424  		KeepAliveTimeout: 10 * time.Second,
   425  	}
   426  	ws.conn.SubscribeHandler = ws.subscribeHandler
   427  	return ws
   428  }