Published on

量化交易中的地理延迟测试

Authors
  • avatar
    Name
    Lif
    Twitter

Lantency

延迟,对于高频交易/量化交易是非常重要的因素。

客户端是没有办法缩减线路延迟的,所以我们需要尽可能的将我们的服务器放在交易所的服务器旁边。

一般来说,交易所会给提供api但不会提供交易所服务器的位置和延迟信息。所以我们要做的就是在自己的服务器测试延迟。

RTT

round-trip delay(RTD) 或者round-trip time(RTT) 是指一个信号从发送到确认接收到该信号的时间。这个时间包括两个通信端点路径之间的传播时间。在计算机网络的上下文中,信号通常是数据包。RTT也被称为ping时间,可以通过ping命令确认。

这里我们使用rtt来测量延迟,因为实际上下单的话,也是应用的这个延迟。

通常的测试方法

通常可以通过请求的方式来测量请求所花的时间。 以CB交易所为例

# python version
# use coinbase exchange for exchange
import requests
from datetime import datetime


url = 'https://api.exchange.coinbase.com/products/USDT-GBP/'

headers = {"Accept": "application/json"}

start_time = datetime.now()

for i in range(10):
	response = requests.get(url)
	# if need 
	# print(response.json()) 
end_time = datetime.now()

print('rtt is ', (end_time - start_time) / 10)

# output: rtt is  0:00:00.444431
// Golang version
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

func main() {

	url := "https://api.exchange.coinbase.com/products/USDT-GBP/"

	startTime := time.Now()

	req, _ := http.NewRequest("GET", url, nil)

	// here is err handle

	req.Header.Add("Accept", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	endTime := time.Now()

	fmt.Println("res is ", endTime.Sub(startTime)/10)
	// fmt.Println("res is ", Time.Since(startTime)/10) same sample

	fmt.Println(res)
	fmt.Println(string(body))

}

# output: res is  33.981093ms

ccxt

为了节省时间,可以用一些现有的轮子,比如Python中的ccxt库。

这是一个多语言的加密交易库,有写好的多个交易所的api。可以直接拿来使用,这样就不用每个交易所的api都看一遍,但是,还是有必要浏览一下的!

usage

pip install ccxt

我们主要使用cctx中的exchange.py里面的方法即可。

import ccxt
from datetime import datetime

# print(ccxt.exchanges) see all exchanges which cctx support

start_time = datetime.now()
exchange = ccxt.bitstamp() # cctx.kraken()  cctx.binance() etc.....
for i in range(10):
    exchange.fetch_ticker('BTC/USDT')
    
end_time = datetime.now()
print('rtt is :', (end_time - start_time)/10)