首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R IBrokers reqOpenOrders挂起

R IBrokers reqOpenOrders挂起
EN

Stack Overflow用户
提问于 2016-01-10 16:54:43
回答 2查看 869关注 0票数 1

有人能建议如何正确使用R IBrokers reqOpenOrders吗?

代码语言:javascript
复制
   > 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提示符。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-01-12 23:15:19

我想我明白了。该功能需要在IBrokers包的几个文件中实现。在processMsg.R中,我们需要向部件if(curMsg == .twsIncomingMSG$OPEN_ORDER)添加以下内容

代码语言:javascript
复制
if(curMsg == .twsIncomingMSG$OPEN_ORDER) {
    msg <- readBin(con, "character", 84)
    x = eWrapper$openOrder(curMsg, msg, timestamp, file, ...)
    return(x)

接下来,在eWrapper.R中实现函数openOrder,如下所示:

代码语言:javascript
复制
openOrder  <- function(curMsg, msg, timestamp, file,  ...) {
  x = e_open_order(msg)
  return(x)
}

然后在eventHandlers.R中,按如下所示更改e_open_order

代码语言:javascript
复制
`e_open_order` <- function(msg) {
  contents = msg
...
  return(eoo)
}

此事件处理程序很好地将TWS返回消息中的数据引导到适当的结构twsContract、twsOrder和twsOrderState中。然后,我创建了以下函数:

代码语言:javascript
复制
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中的几乎所有其他功能都是如此,只是其中一些已经实现了。

票数 1
EN

Stack Overflow用户

发布于 2019-10-13 23:27:40

我在IBrokers_0.9包中创建了一个受reqAccountUpdates.R启发的函数,它返回一个未完成订单的列表。

代码语言:javascript
复制
.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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34703679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档