Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error when I run get_positions() #171

Open
ostokes1 opened this issue Mar 26, 2024 · 1 comment
Open

Error when I run get_positions() #171

ostokes1 opened this issue Mar 26, 2024 · 1 comment

Comments

@ostokes1
Copy link

I had an error come up when using the get positions() function starting this morning (3/26). I am using R 4.3.3 and RStudio 2023.12.1.

When I run get_positions(RH), I get the following error:

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

I have updated all packages and am still getting this error.

Thanks!

@ericvaughn11
Copy link

Also got this. The issue occurs because Robinhood's API appears to be including another 'symbol' column in both positions and instruments which are then bound by cbind. The result is a dataframe with two columns labeled 'symbol', so when the function calls merge it doesn't know which 'symbol' column to merge by. Here's a very rough replacement until this is fixed in the package. You should be able to swap in custom_get_positions for get_positions in your script. It removes the duplicated columns so you can run merge correctly

custom_get_positions = function (RH, limit_output = TRUE){
    RobinHood::check_rh(RH)
    positions <- RobinHood::api_positions(RH)
    if (nrow(positions) == 0) {
      return(cat("You have no current positions"))
    }
    instrument_id <- positions$instrument
    instruments <- c()
    for (i in 1:length(instrument_id)) {
      instrument <- RobinHood::api_instruments(RH, instrument_url = instrument_id[i])
      x <- data.frame(simple_name = ifelse(is.null(instrument$simple_name), 
                                           instrument$name, instrument$simple_name), symbol = instrument$symbol)
      instruments <- rbind(instruments, x)
    }
    positions <- cbind(instruments, positions)
    symbols <- paste(as.character(positions$symbol), collapse = ",")
    symbols_url <- paste(RobinHood::api_endpoints(endpoint = "quotes"), 
                         symbols, sep = "")
    quotes <- RobinHood::api_quote(RH, symbols_url)
    quotes <- quotes[, c("last_trade_price", "symbol")]
    positions <- merge(positions[,!duplicated(colnames(positions))], quotes, by.x = 'symbol', by.y = 'symbol')
    positions <- positions[, !names(positions) %in% c("account", 
                                                      "url", "instrument")]
    positions$updated_at <- lubridate::ymd_hms(positions$updated_at)
    positions$created_at <- lubridate::ymd_hms(positions$created_at)
    positions$quantity <- as.numeric(positions$quantity)
    positions$average_buy_price <- as.numeric(positions$average_buy_price)
    positions$last_trade_price <- as.numeric(positions$last_trade_price)
    positions$shares_held_for_stock_grants <- as.numeric(positions$shares_held_for_stock_grants)
    positions$shares_held_for_options_events <- as.numeric(positions$shares_held_for_options_events)
    positions$shares_held_for_options_collateral <- as.numeric(positions$shares_held_for_options_collateral)
    positions$shares_held_for_buys <- as.numeric(positions$shares_held_for_buys)
    positions$shares_held_for_sells <- as.numeric(positions$shares_held_for_sells)
    positions$shares_pending_from_options_events <- as.numeric(positions$shares_pending_from_options_events)
    positions$pending_average_buy_price <- as.numeric(positions$pending_average_buy_price)
    positions$intraday_average_buy_price <- as.numeric(positions$intraday_average_buy_price)
    positions$intraday_quantity <- as.numeric(positions$intraday_quantity)
    positions$cost <- positions$average_buy_price * positions$quantity
    positions$current_value <- positions$last_trade_price * 
      positions$quantity
    if (limit_output == TRUE) {
      positions <- positions[, c("simple_name", "symbol", 
                                 "quantity", "average_buy_price", "last_trade_price", 
                                 "cost", "current_value", "updated_at")]
    }
    if (limit_output == FALSE) {
      positions <- positions[, c("symbol", "simple_name", 
                                 "quantity", "average_buy_price", "last_trade_price", 
                                 "cost", "current_value", "shares_held_for_stock_grants", 
                                 "shares_held_for_options_events", "shares_held_for_options_collateral", 
                                 "shares_held_for_buys", "shares_held_for_sells", 
                                 "shares_pending_from_options_events", "pending_average_buy_price", 
                                 "intraday_average_buy_price", "intraday_quantity", 
                                 "created_at", "updated_at")]
    }
    return(positions)
}

environment(custom_get_positions) <- asNamespace('RobinHood')
assignInNamespace("get_positions", custom_get_positions, ns = "RobinHood")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants