我想我明白了。該功能需要在IBrokers軟件包的幾個文件中實施。在processMsg.R
,我們需要將以下內容添加到部分if(curMsg == .twsIncomingMSG$OPEN_ORDER)
:
if(curMsg == .twsIncomingMSG$OPEN_ORDER) {
msg <- readBin(con, "character", 84)
x = eWrapper$openOrder(curMsg, msg, timestamp, file, ...)
return(x)
下,實現該功能openOrder
在eWrapper.R
如下:
openOrder <- function(curMsg, msg, timestamp, file, ...) {
x = e_open_order(msg)
return(x)
}
然後在eventHandlers.R
,改變e_open_order
如下:
`e_open_order` <- function(msg) {
contents = msg
...
return(eoo)
}
該事件處理程序很好地引導TWS ret中的數據將消息放入適當的結構中,twsContract,twsOrder和twsOrderState。然後,我創建了以下功能:
gs_GetOpenOrders = function(twscon){
# Check if connected to TWS
if(!is.twsConnection(twscon))
stop('requires twsConnection object')
else
con = twscon[[1]]
# Send message requesting open orders
ver = "1"
writeBin(c(.twsOutgoingMSG$REQ_OPEN_ORDERS,ver),con)
# Receive message with content of open orders
ewr = eWrapper()
socketSelect(list(con),FALSE,NULL)
msg = list()
k = 0
while(TRUE) {
curmsg = readBin(con, character(), 1)
if(length(curmsg)==0)
break
if (curmsg==.twsIncomingMSG$OPEN_ORDER){
k = k+1
msg[[k]] = processMsg(curmsg,con,ewr)
}
else
processMsg(curmsg,con,ewr)
}
return(msg)
}
結果是列表變量msg
。列表中的每個元素依次是包含打開的訂單數據到結構twsContract,twsOrder和twsOrderState的列表。從那裏可以簡單地獲取,顯示和使用任何想要的數據。對於IBrokers中的其他所有功能來說,看起來也是如此,只是其中一些已經實現了。
你提到的文件processMessage.R,ewrapper.R。我在哪裏可以找到這些文件? – aajkaltak