2017-01-26 175 views
1

下面是一些VBA代码,我使用通过DDE服务器,以获得从提供的数据(在这种情况下,彭博数据提供DDE服务器):Python调用(彭博社的数据提供商)现有的DDE

Sub bloom_get() 

    nChan = DDEInitiate("BLP", "S") 
    sSecurity1 = "JBIG Index" & ", [MLI_DATE=" & datestr & ",MLI_TOT_RTN_LOC="", MLI_PX_RTN_LOC="", MLI_EFF_DUR=""]""" 
    vrtResult1 = DDERequest(nChan, sSecurity1) 
    MsgBox (vrtResult1(1) & " " & vrtResult1(2) & " " & vrtResult1(3) & " " & vrtResult1(4) & " ") 
    DDETerminate (nChan) 

End Sub 

我正在寻找一种方法来从Python代码中调用这样的DDE服务器。

这段代码具体到彭博DDE服务器,但即使您可以提供一个更通用的方法,这将是非常有用的。由于DDE是微软应用程序的细节,我不知道如何解决这个问题。

其中的东西,可能是helful:

  • 包允许通过Python
  • 使用第三APP一种解决方法调用DDE的名字,也许编码在VB或VB.NET本身叫Python,不知何故,当你在C++中创建DDL然后从VBA调用时,反之呢?

编辑:不,请求的数据不能通过官方API获取。

感谢

+0

它可能会更高效和更简单的使用本地Python API ... https://www.bloomberglabs.com/api/libraries/ – assylias

+1

对于这样一种特定类型的指数(受Merril-Lynch保护)有必要通过DDE。 API的常规历史功能不起作用。或者,也许你知道正确的覆盖? (我无法从彭博服务台获取他们......) – ylnor

回答

1

好了,所以这三种方法DDExxx是Excel.Application对象事实的方法,但通常省略所以实际上你的代码,其实也可以这样所以现在表示

Sub bloom_get() 

    nChan = Application.DDEInitiate("BLP", "S") 
    sSecurity1 = "JBIG Index" & ", [MLI_DATE=" & datestr & ",MLI_TOT_RTN_LOC="", MLI_PX_RTN_LOC="", MLI_EFF_DUR=""]""" 
    vrtResult1 = Application.DDERequest(nChan, sSecurity1) 
    MsgBox (vrtResult1(1) & " " & vrtResult1(2) & " " & vrtResult1(3) & " " & vrtResult1(4) & " ") 
    Application.DDETerminate (nChan) 

End Sub 

你需要掌握一个Excel.Application对象。 StackOverflow在这里有一些代码Driving Excel from Python in Windows

所以做的makepy.py "Microsoft Excel 11.0 Object Library"的初始步骤将Excel类型库导入Python库,然后一些Python代码看起来像这样(我可以承认我不写Python,但一点点谷歌搜索我可以做一个猜测)

Import ctypes 
from win32com.client import Dispatch 
MessageBox = ctypes.windll.user32.MessageBoxA 

xlApp = Dispatch("Excel.Application") 
#hide app and alerts 
xlApp.Visible = 0 
xlApp.Application.DisplayAlerts = 0 
nChan = xlApp.Application.DDEInitiate("BLP", "S") 
time.sleep(1) # wait for the dde to load 
sSecurity = t + ", [MLI_DATE=" + datestring + "," + fieldstring + "=""]""" 
vrtResult = xlApp.DDErequest(nChan, sSecurity) 

所以一些解释,VBA消息框是Python的, you'll need to import a Window's API MessageBox(因此顶部3线)不同。 Python将字符串连接到+,而不是连接号&。字符串可以用单引号和双引号分隔。数组用方括号访问。并且您还有其他SO问题中看到的COM Dispatch接口代码。我无法运行此代码,因为我没有彭博社。

一些Python程序员可能需要整理一些。

+0

感谢LOT @S Measden。这是一个了不起的答案。我更新了经过一些小调整后实际运行的代码。再次感谢! – ylnor

+0

不客气。感谢赏金,我保证通过设置另一个赏金来回收它。 –