ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1254|回复: 0

[转帖] EXCEL VBA调用聚宽分时数据接口

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-21 21:34 | 显示全部楼层 |阅读模式
原帖连接:
https://www.joinquant.com/view/community/detail/6da3ec606f80aca0646a8476cadd199c


找了好久的分时数据接口,朋友推荐了聚宽,在win10,EXCEL 2019下测试有效,分享给大家。
大家再配合API接口文档,应该在1个小时内能调通。
注意帐号密码需要替代。Public Const JK_USER_NAME           As String = """XXX"""   '自带了前后",方便拼接Public Const JK_PASSWORD            As String = """XXX"""Public g_JKToken As String      '存储聚宽的tokenPublic g_JKTokenUpdateDate As Date     '存储更新token的日期,每天需要更新一次' 1m, 5m, 15m, 30m, 60m, 120m, 1d, 1w, 1M。其中m表示分钟,d表示天,w表示周,M表示月Public Const JK_PERIOD_1MIN     As String = """1m"""Public Const JK_PERIOD_5MIN     As String = """5m"""Public Const JK_PERIOD_15MIN    As String = """15m"""Public Const JK_PERIOD_30MIN    As String = """30m"""Public Const JK_PERIOD_60MIN    As String = """60m"""Public Const JK_PERIOD_120MIN   As String = """120m"""Public Const JK_PERIOD_1DAY     As String = """1d"""Public Const JK_PERIOD_1WEEK    As String = """1w"""Public Const JK_PERIOD_1MONTH   As String = """1M"""
'**' 获取聚宽数据token'**Private Function DRV_JK_GetNewToken(vToken As String) As Long    Dim oXML As Variant, vBody As String, vMsgRx As String
Set oXML = CreateObject("Msxml2.XMLHTTP")
oXML.Open "POST", "https://dataapi.joinquant.com/apis", False
oXML.setRequestHeader "Content-Type", "application/json;charset=UTF-8"
vBody = "{""method"":""get_token"",""mob"":" & JK_USER_NAME & ",""pwd"":" & JK_PASSWORD & "}"
oXML.send (vBody)
vMsgRx = oXML.responsetext
'DRV_DebugLog LOG_LVL_DEBUG, vBuf
If InStr(vMsgRx, "error") Then
    DRV_DebugLog LOG_LVL_ERR, "Get JK token faild, " & vMsgRx
    DRV_JK_GetNewToken = EC_ERR
Else
    vToken = vMsgRx
    DRV_JK_GetNewToken = EC_OK
End If
End Function
'**' 获取聚宽数据token'**Private Function DRV_JK_GetToken() As String    Dim vToken As String
If ("" = g_JKToken) Or (g_JKTokenUpdateDate < > Date) Then
    If EC_OK = DRV_JK_GetNewToken(vToken) Then
        '非原子操作,在零点附近首次调用这个接口可能导致一直失败,关掉程序,重新调用一次即可
        g_JKToken = vToken
        g_JKTokenUpdateDate = Date
    End If
End If
DRV_JK_GetToken = g_JKToken
'DRV_DebugLog LOG_LVL_DEBUG, g_JKToken &amp; " " &amp; g_JKTokenUpdateDate
End Function
'**' 获取聚宽数据剩余可用次数'**Private Function DRV_JK_GetRestCnt(vToken As String, vCnt As Long) As Long    Dim oXML As Variant, vBody As String, vMsgRx As String
Set oXML = CreateObject("Msxml2.XMLHTTP")
oXML.Open "POST", "https://dataapi.joinquant.com/apis", False
oXML.setRequestHeader "Content-Type", "application/json;charset=UTF-8"
vBody = "{""method"" : ""get_query_count"", ""token"":""" &amp; vToken &amp; """}"
oXML.send (vBody)
vMsgRx = oXML.responsetext
'DRV_DebugLog LOG_LVL_DEBUG, vBuf
If InStr(vMsgRx, "error") Then
    DRV_DebugLog LOG_LVL_ERR, "Get JK rest cnt faild, " &amp; vMsgRx
    DRV_JK_GetRestCnt = EC_ERR
Else
    vCnt = vMsgRx
    DRV_JK_GetRestCnt = EC_OK
End If
End Function
'**' 预留50000次作为平时计算使用'**Private Function DRV_JK_StopQuery() As Boolean    Dim vToken As String, vCnt As Long, iRet As Long
DRV_JK_StopQuery = False
If EC_OK = DRV_JK_GetRestCnt(DRV_JK_GetToken(), vCnt) Then
    ' Debug.Print "Rest query cnt " &amp; vCnt
    If vCnt < = JK_RESERVED_QUERY_CNT Then
        DRV_JK_StopQuery = True
    End If
End If
End Function
'**' 获取聚宽数据指定时间段的数据' 开始结束日期格式 2019-10-11 09:29:00' 除权信息格式 2019-10-18'**Private Function DRVJK_GetData(vToken As String, vCode As String, vMode As String,     vStartTime As String, vEndTime As String, vFqDate As String, vBuf As Variant) As Long
Dim oXML As Variant, vBody As String, vMsgRx As String, vRowNum As Long, i As Long, vColNum As Long, j As Long
Dim vTmp As Variant, vTmpRow As Variant
Set oXML = CreateObject("Msxml2.XMLHTTP")
oXML.Open "POST", "https://dataapi.joinquant.com/apis", False
oXML.setRequestHeader "Content-Type", "application/json;charset=UTF-8"
vBody = "{""method"":""get_price_period"",""token"":""" &amp; vToken &amp; """,""code"":""" &amp; vCode &amp; ".XSHE""," &amp; _
    """unit"":" &amp; vMode &amp; ",""date"":""" &amp; vStartTime &amp; """,""end_date"":""" &amp; vEndTime &amp; _
    """,""fq_ref_date"":""" &amp; vFqDate &amp; """}"
oXML.send (vBody)
vMsgRx = oXML.responsetext
If InStr(vMsgRx, "error") Then
    DRV_DebugLog LOG_LVL_ERR, "Get JK data faild, " &amp; vMsgRx
    DRV_JK_GetData = EC_ERR
Else
    vTmp = vMsgRx
    vTmp = Split(vTmp, Chr(10))
    vRowNum = UBound(vTmp)
    vTmpRow = Split(vTmp(0), ",")
    vColNum = UBound(vTmpRow)
    ReDim vBuf(vRowNum, vColNum)
    For i = 0 To vRowNum Step 1
        For j = 0 To vColNum Step 1
            vTmpRow = Split(vTmp(i), ",")
            vBuf(i, j) = vTmpRow(j)
        Next j
    Next i
    DRV_JK_GetData = EC_OK
End If
End Function
示例代码片段:                vStartTime = vDate & " " & Format(TimeValue(vHTime) - TimeValue(JK_FS_15MIN), "HH:MM:SS")                vEndTime = vDate & " " & Format(TimeValue(vHTime), "HH:MM:SS")
            vRet = DRV_JK_GetData(vToken, vCode, JK_PERIOD_1MIN, vStartTime, vEndTime, vFqDate, vBuf1Min)
            If EC_OK < > vRet Then
                DRV_DebugLog LOG_LVL_ERR, "Get JK 1MIN data failed, " &amp; vRet &amp; ", " &amp; vCode &amp; ", " &amp; vStartTime
                DRV_GetOneDayHLSeq = EC_ERR
                GoTo ERR_HANDLE
            End If
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 16:03 , Processed in 0.036287 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表