时区修改, 我好像理解有误? 居然出现4H开盘时间是23:00
我试了一下: examples/4.3 APP K线服务 维护实时历史K线.ipynb
改了一下时区, 尝试下载两个品种的k线, 然后开盘时间不对啊, 4H开盘时间怎么能是23:00
时间相关的代码:
from okx.app.candle_server import CandleRule,CandleServer
class MyCandleRule(CandleRule):
TIMEZONE = 'Asia/Shanghai'
.......
import datetime
def stmptotime(stmp):
temp = int(stmp)/1000.0 # open time from milisec to sec
return datetime.datetime.fromtimestamp(temp)
这样看, 时区修改好像无效, 仍然是跑py代码的服务器的时间, 不是上海时间?
4H小时的我没有测试过,时区问题有测试,没有问题的。 我还是比较建议下载1m的K线,然后自己可以随意压缩成1H、4H等等的数据,在candlelite中有compress这个方法。
4H小时的我没有测试过,时区问题有测试,没有问题的。 我还是比较建议下载1m的K线,然后自己可以随意压缩成1H、4H等等的数据,在candlelite中有compress这个方法。
感谢解答. 结合compress, 我实验了一下, 不知道我哪里没设置对, 出现了如下问题:
okx官方的API, 下载的k线数据, 数组的第0个是最新的1根k线, 而你这个库是反过来的, 下载的k线数据, 最后一个值才是最新的1根k线之前的那个k线. 于是, 当我下载维护1分钟数据, 然后compress成5分钟数据, 我做了个小实验, 当时钟到达20分13秒的时候, 压缩一次5分钟数据, 看收盘价是正确的(最新k线之前的那个k线), 然后分别在21:13, 22:13, 23:13, 24;13的时候压缩一次5分钟数据, 收盘价都不对, 然后25:13压缩又是正确的了. 也就是说, 每过1分钟, 随着1分钟k线数量的增加, 都是把最新的5根k线压缩成5分钟, 于是5分钟k线不是从0或5开始的了......难道压缩的时候先要判断一下当前的分钟数是不是0或5? 似乎不太对
import transform
import numpy as np
import time
from okx.app.candle_server import CandleRule,CandleServer
class MyCandleRule(CandleRule):
INSTIDS = [
'ETH-USDT-SWAP',
'LTC-USDT-SWAP',
]
INSTID_ENDSWITH = '-USDT-SWAP'
LENGTH = 1440
BAR = '1m'
DOWNLOAD_TIME = None
instType = 'SWAP'
candleServer = CandleServer(
instType=instType,
rule=MyCandleRule,
proxies={},
proxy_host=None,
)
candleServer.run_candle_map()
#----- 在不同时间多次手动运行本脚本, 观察对比单一品种的倒数第2新k线的收盘价变化或者开盘时间变化
new_dict = {key: transform.compress_candle(value,target_bar='5m',org_bar='1m') for key, value in candleServer.candle_map.items()}
lst=list(new_dict.values())
print(lst[0][-1])
最终, 我乱改了一下, 请指正:
# 压缩历史K线
def compress_candle(
candle: np.array,
target_bar: str,
org_bar: str = 'auto'
) -> np.ndarray:
'''
:param candle: 历史K线数据
:param target_bar: 目标K线的bar
:param org_bar: 原始K线的bar
auto: 自动识别原始K线的bar
:return:压缩后的历史K线数据
array([
[ts,open,high,low,close,volume...],
[ts,open,high,low,close,volume...],
[ts,open,high,low,close,volume...],
])
example:
将1Minute的K线数据压缩成5Minute的K线数据
compress_candle(candle,target_bar='5m',org_bar='1m')
将1Hour的K线数据压缩成1Day的K线数据
compress_candle(candle,target_bar='1d',org_bar='1h'
'''
if org_bar == 'auto':
org_bar = _bar.predict_bar(candle)
# 目标K线ts间隔
target_bar_interval = _interval.get_interval(target_bar)
# 原始K线ts间隔
org_tar_interval = _interval.get_interval(org_bar)
# 压缩的数量
compress_quantity = target_bar_interval / org_tar_interval
if compress_quantity != int(compress_quantity):
raise exception.ExecuteException(
func='compress_candle',
msg="Can't transform candle from org_bar=({org_bar}) to target_bar={target_bar}".format(
org_bar=org_bar,
target_bar=target_bar,
)
)
compress_quantity = int(compress_quantity)
# 目标K线数据
target_datas = []
candle_shape = candle.shape
#---------------------- 乱改了以下两行 ----------------------------------------------------
# for i in range(0, candle.shape[0], compress_quantity):
for i in range(0, candle.shape[0]):
# if i + compress_quantity <= candle_shape[0]:
if datetime.datetime.fromtimestamp(int(candle[i, 0])/1000).minute % (target_bar_interval/1000/60) == 0 and i + compress_quantity <= candle_shape[0] :
this_data = [
candle[i, 0], # ts
candle[i, 1], # open
candle[i:i + compress_quantity, 2].max(), # high
candle[i:i + compress_quantity, 3].min(), # low
candle[i + compress_quantity - 1, 4], # close
# candle[i:i + compress_quantity, 5].sum() # volume
candle[i:i + compress_quantity, 7].sum() # volume
]
# 如果有其他数据
for i in range(6, candle_shape[1]):
this_data.append(
candle[i:i + compress_quantity, i].sum()
)
target_datas.append(this_data)
# 目标K线Candle
target_candle = np.array(target_datas)
return target_candle
4H小时的我没有测试过,时区问题有测试,没有问题的。 我还是比较建议下载1m的K线,然后自己可以随意压缩成1H、4H等等的数据,在candlelite中有compress这个方法。
compress怎么用?