R IBrokers reqOpenOrders зависает
Кто-нибудь сможет посоветовать, как правильно использовать R IBrokers reqOpenOrders?
> tws=twsConnect(clientId=66,host='localhost',port='7497')
> reqOpenOrders(twsconn=tws)
TWS Message: 2 -1 2104 Market data farm connection is OK:usopt
TWS Message: 2 -1 2104 Market data farm connection is OK:usfarm
TWS Message: 2 -1 2106 HMDS data farm connection is OK:ushmds
TWS OrderStatus: orderId=565 status=PreSubmitted filled=0 remaining=1 averageFillPrice=0
TWS OrderStatus: orderId=566 status=PreSubmitted filled=0 remaining=1 averageFillPrice=0
Я хотел получить список моих неоплаченных заказов. Команда выше зависает, и она должна быть остановлена, чтобы вернуться к приглашению R. Благодарю.
1 ответ
Я думаю, что понял. Функциональность должна быть реализована в нескольких файлах пакета 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 в соответствующие структуры: 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, просто некоторые из них уже реализованы.
Я создал функцию, вдохновленную reqAccountUpdates.R в пакете IBrokers_0.9, она возвращает список открытых ордеров.
.reqOpenOrders <- function(twsconn) {
if( !is.twsConnection(twsconn))
stop('requires twsConnection object')
con <- twsconn[[1]]
VERSION <- "1"
writeBin(c(.twsOutgoingMSG$REQ_OPEN_ORDERS,VERSION), con)
}
reqopenorders_cb <- function(twsconn) {
.reqOpenOrders(twsconn)
open_orders=list()
con <- twsconn[[1]]
eW <- eWrapper()
while(TRUE) {
socketSelect(list(con), FALSE, NULL)
curMsg <- readBin(con, character(), 1L)
if(curMsg == .twsIncomingMSG$OPEN_ORDER){
open_orders[[length(open_orders)+1]]=processMsg(curMsg, con, eW,
timestamp=NULL,file="")
} else {
processMsg(curMsg, con, eW,timestamp=NULL,file="")
}
if(curMsg == .twsIncomingMSG$OPEN_ORDER_END)
break
}
return(open_orders)
}