Skip to content

一个贯穿9.0版本的vol和volume不统一导致成交量无法写入WTSBarStruct的问题 #159

@StarainX

Description

@StarainX

这个问题测试了下,在0.9以后直到最新的dev版本都存在,再往前没有试。

问题复现直接运行dev版的test_datahelper下的testDtHelper.py即可。
本来其中的以下语句会打印出WTSBarStruct的第一行和最后一行数据。

    print(buffer[0].to_dict())
    print(buffer[-1].to_dict())

不过这个问题之所以没有被发现,很大程度上是因为这两个语句虽然在def test_store_bars()方法中,但该方法本身并没有在该例子中被调用过。

在该方法下方任意位置加入调用:
test_store_bars()

可以看出输出结果如下:

{'date': 20140102, 'reserve': 0, 'time': 2401020935, 'open': 2342.2, 'high': 2343.4, 'low': 2339.2, 'close': 2343.2, 'settle': 0.0, 'turnover': 0.0, 'volume': 0.0, 'open_interest': 0.0, 'diff': 0.0}
{'date': 20191031, 'reserve': 0, 'time': 2910311500, 'open': 3872.4, 'high': 3879.0, 'low': 3872.4, 'close': 3879.0, 'settle': 0.0, 'turnover': 0.0, 'volume': 0.0, 'open_interest': 0.0, 'diff': 0.0}

成交量显示为0.

debug过程中发现WtCoreDefs.py中定义的数据结构中不是vol而是volume:
class WTSBarStruct(WTSStruct): ''' C接口传递的bar数据结构 ''' # @2IQ9d _fields_ = [("date", c_uint32), ("reserve", c_uint32), ("time", c_uint64), ("open", c_double), ("high", c_double), ("low", c_double), ("close", c_double), ("settle", c_double), ("turnover", c_double), ("volume", c_double), ("open_interest", c_double), ("diff", c_double)] _pack_ = 8

而实际写入数据是检验的是vol。比如把testDtHelper.py中下方的‘vol’修改为volume,就会报错找不到vol index:

def test_store_bars():
    df = pd.read_csv('../storage/csv/CFFEX.IF.HOT_m5.csv')
    df = df.rename(columns={
        '<Date>':'date',
        ' <Time>':'time',
        ' <Open>':'open',
        ' <High>':'high',
        ' <Low>':'low',
        ' <Close>':'close',
        ' <Volume>':'vol',
        })

报错如下:


    indexer = self.columns._get_indexer_strict(key, "columns")[1]
  File "C:\ProgramData\anaconda3\envs\python38\lib\site-packages\pandas\core\indexes\base.py", line 5877, in _get_indexer_strict
    self._raise_if_missing(keyarr, indexer, axis_name)
  File "C:\ProgramData\anaconda3\envs\python38\lib\site-packages\pandas\core\indexes\base.py", line 5941, in _raise_if_missing
    raise KeyError(f"{not_found} not in index")
KeyError: "['vol'] not in index"

解决办法是把WTSBarStruct的volume修改为vol。当然最终写入数据库的还是volume字段,这个应该是版本迭代留下的命名不统一的问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions