我是编程和学习python3的新手。
最近我正在尝试使用binance的api制作加密货币交易系统。
这是api文档。
关于文档中时间戳的逻辑和解释如下:
Timestamp, to be sent which should be the millisecond timestamp of when the request was created and sent.
if (timestamp < serverTime && (serverTime - timestamp) <= recvWindow)
{ // process request } else { // reject request }
根据这个逻辑,我发送请求的时间应该少于服务器上的时间。 问题是我没有通过这个逻辑。
当我使用此代码调用time.time()和服务器时间时,
import requests
import simplejson as json
import time
base_url ="https://api.binance.com"
servertime_endpoint="/api/v1/time"
url = base_url + servertime_endpoint
t = time.time()*1000
r = requests.get(url)
result = json.loads(r.content)
print(int(t)-result["serverTime"])
time.time()大于服务器时间,以便从最后一个句子返回正值。 我该怎么办?
您是否检查过您的时间不会偏离服务器,并且您的平台返回的时间至少为毫秒精度?如果time.time()返回的值仅精确到秒,那么您可能会看到量化噪声。
尝试将您的时钟固定(同步)到互联网时间?
@taesu我做了同步(在Windows设置中),但问题发生了
@PaSTE请告诉我如何检查和修复它。
多次尝试,平均比服务器时间大0.4秒。
print(time.time())是打印整数还是包含有意义的小数部分?
为什么不简单地假设你的时间比服务器时间大,硬编码每次调用time.time()时删除~1秒?
@PaSTE它返回整数
@Loquacious问题是最后一句的结果是随机返回的。在某些时间点出现正值,在其他时间出现负值。并且不仅价值的符号而且价值的大小也随机改变。
我已尝试在Windows 10中同步时间并将同步间隔调整为10分钟。但它发生了。
这很可能是由于您使用分辨率低于服务器运行速度的时钟运行的操作系统。在Linux或Mac OS上运行时,Python使用time.time()的系统调用,将时间返回到微秒分辨率(或更好)。在Windows机器上运行时,它只返回毫秒分辨率的时间。
您可以通过编程忙循环并等到时间变化来检查time.time()函数的分辨率:使用这个非常有用的答案中的代码来查看您的分辨率。
如果您运行的分辨率为~0.002秒(1毫秒),而服务器报告的分辨率为~0.000001秒(1微秒),那么即使您的时钟完全同步且网络为零延迟,你仍然希望你的时间超过服务器时间50%的呼叫只是由于量化噪音。例如,如果服务器报告的时间为12345.678501(微秒分辨率),则您的计算机将报告12345.679(毫秒分辨率)的时间,并且前方似乎是499微秒。
一些快速解决方案是:
检查服务器时间是否达到您的机器时间并且即使您的时间超出服务器时间,也可以调用可接受的时间;
减去500微秒到你的时间,以保证量化噪音不会让你领先于服务器;
将时间阈值增加500微秒,并检查您的时间和服务器时间之间的差值的绝对值是否在界限范围内;
在具有更高分辨率系统时钟的操作系统上运行代码。