vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 4
声望: 0

分钟k线合成小时k线与币安app永续合约不一样

  • 问题描述:
    1. 分钟k线没有以00分开头,导致收盘价等乱了
    2. 设置为00分开头,发现成交量不准,BTCUSDT 成交量偏差约30个
    3. 合成的小时k线发现有多余异常的bar,只有几百成交量的.比如2020/11/21 20:00 和21:00多了1个bar

解决方法

  1. 分钟k线没有以00分开头,导致收盘价等乱了
    原因: CtaEngine load_bar方法中,采用当前时间end = datetime.now(get_localzone())减去天数,当前时间不准导致
    解决方法:
end = datetime.now(get_localzone())
# 增加如下2行,修正start时间
end_hour = datetime(year=end.year, month=end.month, day=end.day, hour=end.hour, minute=0)
start = end_hour - timedelta(days)
  1. 设置为00分开头,发现成交量不准,BTCUSDT 成交量偏差约30个
    原因:BarGenerator update_bar方法中,每个k线成交量使用int强转,丢失了小数点的值
    解决方法:将成交量计算一行去除int强转self.window_bar.volume += bar.volume

  2. 合成的小时k线发现有多余异常的bar,只有几百成交量的.比如2020/11/21 20:00 和21:00多了1个bar
    原因:发现binances_gateway获取k线方法时区转换有问题,导致startTime出现有6分钟提前或者推迟:

DEBUG:urllib3.connectionpool:https://fapi.binance.com:443 "GET /fapi/v1/klines?symbol=BTCUSDT&interval=1m&limit=1000&startTime=1604340000000&endTime=1604774955000 HTTP/1.1" 200 None
2020-11-08 02:49:17,782  INFO: 获取历史数据成功,BTCUSDT - 1m,2020-11-03 02:00:00+08:06 - 2020-11-03 18:39:00+08:06
DEBUG:urllib3.connectionpool:https://fapi.binance.com:443 "GET /fapi/v1/klines?symbol=BTCUSDT&interval=1m&limit=1000&startTime=1604399640000&endTime=1604774955000 HTTP/1.1" 200 None
2020-11-08 02:49:18,496  INFO: 获取历史数据成功,BTCUSDT - 1m,2020-11-03 18:34:00+08:06 - 2020-11-04 11:13:00+08:06
DEBUG:urllib3.connectionpool:https://fapi.binance.com:443 "GET /fapi/v1/klines?symbol=BTCUSDT&interval=1m&limit=1000&startTime=1604459280000&endTime=1604774955000 HTTP/1.1" 200 None
2020-11-08 02:49:19,175  INFO: 获取历史数据成功,BTCUSDT - 1m,2020-11-04 11:08:00+08:06 - 2020-11-05 03:47:00+08:06

解决方法:

end_timestamp = 0
for l in data:
    bar = BarData(
        symbol=req.symbol,
        exchange=req.exchange,
        datetime=generate_datetime(l[0]),
        interval=req.interval,
        volume=float(l[5]),
        open_price=float(l[1]),
        high_price=float(l[2]),
        low_price=float(l[3]),
        close_price=float(l[4]),
        gateway_name=self.gateway_name
    )
    end_timestamp = l[0]
    buf.append(bar)

history.extend(buf)

begin = buf[0].datetime
end = buf[-1].datetime
msg = f"获取历史数据成功,{req.symbol} - {req.interval.value},{begin} - {end}"
self.gateway.write_log(msg)

# Break if total data count less than limit (latest date collected)
if len(data) < limit:
    break

# Update start time
bar = buf[-1]
# start_dt = bar.datetime + TIMEDELTA_MAP[req.interval]
# start_time = int(datetime.timestamp(start_dt))
time_delta_stamp = 60
if req.interval == Interval.HOUR:
    time_delta_stamp = 60 * 60
elif req.interval == Interval.DAILY:
    time_delta_stamp = 60 * 60 * 24
start_time = int(end_timestamp / 1000) + time_delta_stamp
if start_time > int(datetime.timestamp(req.end)):
    print("开始时间大于结束时间")
    break
Administrator
avatar
加入于:
帖子: 4595
声望: 262

给你加个精华

Member
avatar
加入于:
帖子: 31
声望: 0

没有看懂 1.的改进:“采用当前时间end = datetime.now(get_localzone())减去天数,当前时间不准导致”
如果做交易的服务器就放在与币安行情一个时区的话,应该当前时间是准确的吧?
“end_hour = datetime(year=end.year, month=end.month, day=end.day, hour=end.hour, minute=0)”
这里你把分钟置为0的话,这样不会导致在当根的1小时Bar合成的时候,丢失了部分这1小时Bar前面的部分分钟Bar信息吗?

关于3.”导致startTime出现有6分钟提前或者推迟:“,没有太懂为什么这样修改能够解决这个问题

Member
avatar
加入于:
帖子: 4
声望: 0

不用那么麻烦,全局变量改时区到上海,本地server时区也改到上海,都解决了。

Member
avatar
加入于:
帖子: 3
声望: 0

sfllc2016 wrote:

不用那么麻烦,全局变量改时区到上海,本地server时区也改到上海,都解决了。
这个方法好!

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号