0

ティッカーの現在のオプション チェーン (ストライクごと、有効期限ごとのオプション)を作成しようとしています。

library(IBrokers)    
tws <- twsConnect()
# Lets say only Call prices
AA <- reqContractDetails(tws, twsOption(local="", right="C", symbol="AAPL"))

でのネイティブ実装snapshotは遅すぎます:

reqMktData(tws, AA[1:2], snapshot = TRUE)

契約ごとに待機します11 sec(現在の契約数は626です)


別の実装:

snapShot <- function (twsCon, eWrapper, timestamp, file, playback = 1, ...)
{
  if (missing(eWrapper))
    eWrapper <- eWrapper()
  names(eWrapper$.Data$data) <- eWrapper$.Data$symbols
  con <- twsCon[[1]]
  if (inherits(twsCon, "twsPlayback")) {
    sys.time <- NULL
    while (TRUE) {
      if (!is.null(timestamp)) {
        last.time <- sys.time
        sys.time <- as.POSIXct(strptime(paste(readBin(con,
                                                      character(), 2), collapse = " "), timestamp))
        if (!is.null(last.time)) {
          Sys.sleep((sys.time - last.time) * playback)
        }
        curMsg <- .Internal(readBin(con, "character",
                                    1L, NA_integer_, TRUE, FALSE))
        if (length(curMsg) < 1)
          next
        processMsg(curMsg, con, eWrapper, format(sys.time,
                                                 timestamp), file, ...)
      }
      else {
        curMsg <- readBin(con, character(), 1)
        if (length(curMsg) < 1)
          next
        processMsg(curMsg, con, eWrapper, timestamp,
                   file, ...)
        if (curMsg == .twsIncomingMSG$REAL_TIME_BARS)
          Sys.sleep(5 * playback)
      }
    }
  }
  else {
    evalWithTimeout(
    while (TRUE) {
      socketSelect(list(con), FALSE, NULL)
      curMsg <- .Internal(readBin(con, "character", 1L,
                                  NA_integer_, TRUE, FALSE))
      if (!is.null(timestamp)) {
        processMsg(curMsg, con, eWrapper, format(Sys.time(),
                                                 timestamp), file, ...)
      }
      else {
        processMsg(curMsg, con, eWrapper, timestamp,
                   file, ...)
      }
      if (!any(sapply(eWrapper$.Data$data, is.na)))
        return(do.call(rbind, lapply(eWrapper$.Data$data,
                                     as.data.frame)))
    }, timeout=5, onTimeout="warning")
  }
} 

reqMktData(tws, AA[1:20], eventWrapper=eWrapper.data(20),CALLBACK=snapShot)

待機を回避します ( 11 秒 )。

しかし、リアルタイムのデータがない場合や市場が閉鎖されている場合、これは機能しません。

そのため、市場が閉鎖されていても、最後の既知の価格のみを取得したいと考えています。
これは私の疑似解決策です:

reqHistoricalData(tws, AA[[1]]$contract, whatToShow='BID', barSize = "1 min", duration = "60 S")

このソリューションを並列化して、複数の契約の過去の価格を要求する方法はありますか?

現在、2.3 seconds契約ごとに約費用がかかりますが、以前のソリューションでは、同じ時間で 20 ~ 30 件の契約を獲得できます。

4

1 に答える 1

0

を使用する代わりに、コントラクトのリストを含む変数をreqMktData()使用reqRealTimeBars()して、 の制限なしでやりたいことを行うことを検討してくださいreqHistoricalData()

リアルタイム バーは、履歴データをストリーミングするためのクエリです。データは、履歴データを提供する同じサーバーから中継されます。

于 2016-02-17T23:51:42.987 に答える