JSA读取广发日线数据

wils
wils

创作者俱乐部成员

昨天有朋友问,如何读取广发证券志诚版的day文件里的日线数据

上次读取通达信的day文件时,先创建了结构体,然后把文件中的数据,复制到结构体里再读取

https://bbs.wps.cn/topic/71108


今天尝试不创建结构体,而是直接读取文件中的数据,似乎更方便一些


function rd(n)
{
    const a = n >> 28
    const b = n & 0x0FFFFFFF
    return 10 ** (a) * b
}

function tt()
{
    const d = FileSystem.ReadFileAsArrayBuffer(`${ThisWorkbook.Path}\\600000.day`)
    const p = FFI.RefPointer(d.buffer)
    const r = []
    let o = 184
    while (o < d.byteLength) {
        const t = []
        t.push(p.Read("uint32", o))
        t.push(rd(p.Read("uint32", o + 4)))
        t.push(rd(p.Read("uint32", o + 8)))
        t.push(rd(p.Read("uint32", o + 12)))
        t.push(rd(p.Read("uint32", o + 16)))
        t.push(rd(p.Read("uint32", o + 20)))
        t.push(p.Read("uint32", o + 24))
        r.push(t)
        o += 168
    }
    ActiveSheet.UsedRange.ClearContents()
    Range("A1").Resize(r.length, 7).Value2 = r
}

需要注意的是:

  • 这里的日期、成交量,是uint32直接读取就行

  • 但是,价格和成交额是自定义小数,虽然仍占用4字节,但其中高4位是有符号的指数,低28位则是尾数,所以读出来的数字需要处理一下

  • 使用命令可以看的更清楚:

🔔

hexdump -e '1/4 "%d," 5/4 "%x," 1/4 "%d," 35/4 "%x," "\n"' -s 184 -n 2000 600000.day

最后,希望知道RefPointer在这里用是否正确,还有FFI.DerefPointer()和FFI.RefPointer()两者的区别,希望大佬不吝赐教,多谢

海南省
浏览 197
收藏
3
分享
3 +1
+1
全部评论