【问题标题】:Calling an existing DDE from Python (Bloomberg data provider)从 Python(Bloomberg 数据提供者)调用现有的 DDE
【发布时间】:2017-06-11 20:16:45
【问题描述】:

这是我用来通过 DDE 服务器(在本例中为 Bloomberg 数据提供者 DDE 服务器)从提供者获取数据的一些 VBA 代码:

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 服务器的方法。

此代码以某种方式特定于 Bloomberg DDE 服务器,但即使您可以为我提供更通用的方法,这也会很有帮助。我只是不知道如何解决这个问题,因为 DDE 是 Microsoft 应用程序的特殊性。

可能有帮助的事情包括:

  • 允许从 Python 调用 DDE 的包的名称
  • 使用第三个应用程序的解决方法,可能是在 VB 或 VB.NET 中编码,它本身是从 Python 调用的,有点像在 C++ 中创建 DDL 然后从 VBA 调用,但相反?

编辑:不,请求的数据无法通过官方 API 获得。

谢谢

【问题讨论】:

  • 使用原生 Python API 可能会更高效、更简单...bloomberglabs.com/api/libraries
  • 对于这种特定类型的指数(受美林证券保护),必须通过 DDE。 API 的常用历史功能不起作用。或者你知道正确的覆盖吗? (我无法从彭博帮助台获得它们...)

标签: python vba excel bloomberg dde


【解决方案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 MessageBox 与 Python 不同, you'll need to import a Window's API MessageBox(因此前 3 行)。 Python 将字符串与+ 连接,而不是与符号&。字符串可以用单引号和双引号分隔。使用方括号访问数组。而且您还拥有其他 SO 问题中所见的 COM Dispatch 接口代码。我没有彭博社,因此无法运行此代码。

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

【讨论】:

  • 非常感谢@S Measden。这是一个了不起的答案。我更新了经过一些小调整后实际工作的代码。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多