pyted / okx

Python OKX API interface
138 stars 44 forks source link

时区修改, 我好像理解有误? 居然出现4H开盘时间是23:00 #8

Open ydqsbfsyi opened 6 months ago

ydqsbfsyi commented 6 months ago

我试了一下: 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代码的服务器的时间, 不是上海时间?

pyted commented 6 months ago

4H小时的我没有测试过,时区问题有测试,没有问题的。 我还是比较建议下载1m的K线,然后自己可以随意压缩成1H、4H等等的数据,在candlelite中有compress这个方法。

ydqsbfsyi commented 6 months ago

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
jhk5263 commented 4 months ago

4H小时的我没有测试过,时区问题有测试,没有问题的。 我还是比较建议下载1m的K线,然后自己可以随意压缩成1H、4H等等的数据,在candlelite中有compress这个方法。

compress怎么用?