joshuaulrich / IBrokers

R API to Interactive Brokers Trader Workstation
67 stars 54 forks source link

Option Greeks #32

Open rpm3o opened 2 years ago

rpm3o commented 2 years ago

In the TWS API for Python and other languages, I've found documentation on returning greek values for options. Is it possible to do this with the R API? Thank you for the package.

cholzer68 commented 2 years ago

This works for me.

eWrapper.data.Opt_Model <- function(n) { eW <- eWrapper(NULL) # use basic template eW$assign.Data("data", rep(list(structure(.xts(matrix(rep(NAreal,8),nc=8),0), .Dimnames=list(NULL,c('impVol','delta','TV','pvDiv','gamma','vega','theta','undPrice')))),n))

eW$tickOptionComputation <- function(curMsg, msg, timestamp, file, ...) { tickType = msg[3] msg <- as.numeric(msg) id <- msg[2] #as.numeric(msg[2]) data <- eW$get.Data("data") #[[1]] # list position of symbol (by id == msg[2]) attr(data[[id]],"index") <- as.numeric(Sys.time()) nr.data <- NROW(data[[id]]) if(tickType == .twsTickType$MODEL_OPTION) { data[[id]][nr.data,1:8] <- msg[4:11] }

else

# if(tickType == .twsTickType$ASK) {
#    data[[id]][nr.data,2] <- msg[4]
#  } 
eW$assign.Data("data", data)
c(curMsg, msg)

}

return(eW) }

rpm3o commented 2 years ago

Thank you for the response. I'm having difficulty knowing what and where to input the option details. Can you please provide an example using a common stock and options contract? Again, thank you very much for your help.

cholzer68 commented 2 years ago

reqMktData(tws,OptionContract,eventWrapper=eWrapper.data.Opt_Model(1),CALLBACK = snapShot)

This should work as long as you define an options contract.

rpm3o commented 2 years ago

I've tried to apply this to VIX September 21 Call at strike 20 and receive an error.

> reqMktData(tws,twsOption(local="VIX 220921C00020000"),eventWrapper=eWrapper.data.Opt_Model(1),CALLBACK = snapShot) Error in reqMktData(tws, twsOption(local = "VIX 220921C00020000"), eventWrapper = eWrapper.data.Opt_Model(1), : object 'snapShot' not found

Thank you.

cholzer68 commented 2 years ago

Sorry, you have to define the Snapshot function:

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, NAinteger, 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 { while (TRUE) { socketSelect(list(con), FALSE, NULL) curMsg <- .Internal(readBin(con, "character", 1L, NAinteger, 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))) } } }

rpm3o commented 2 years ago

Great! Thank you!

cholzer68 commented 2 years ago

It took me along time to figure it out! Now I am trying to get it to work in python.

rpm3o commented 2 years ago

In case you haven't seen this: https://interactivebrokers.github.io/tws-api/option_computations.html

Good luck!