2017-01-26 203 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

不客氣。感謝賞金,我保證通過設置另一個賞金來回收它。 –