Quantstrat динамический размер заказа в процентах

Я хочу установить размер заказа не в абсолютных значениях в лотах или долларах, а в процентах. Например, я устанавливаю размер ордера <- 0.3, а затем необходимое количество лотов рассчитывается как 30% от текущего капитала. Должен ли я использовать osMaxPos / osMaxDollar или написать какую-нибудь функцию определения размера?

add.rule(
  strategy.st, name = 'ruleSignal',
  label = 'EnterLONG', type = 'enter',
  arguments = list(
    sigcol = signal$long$enter$label, sigval = TRUE,
    replace = TRUE, orderset = 'ocolong', orderqty = 1,
    ordertype = 'market', orderside = 'long'
  )
)
add.rule(
  strategy.st, name = 'ruleSignal',
  label = 'ExitLONG', type = 'exit',
  arguments = list(
    sigcol = signal$long$exit$label, sigval = TRUE,
    replace = TRUE, orderset = 'ocolong', orderqty = 'all',
    ordertype = 'market', orderside = 'long'
  )
)

1 ответ

Для тех, кто так же взволнован, вот решение:

Здесь я нашел идеальное начало для создания пользовательской функции определения размера заказа, Тим Трайс ссылался на раздел комментариев в блоге Ильи Кипниса. Также я узнал, что портфель должен быть обновлен, чтобы получить реальный капитал в ответе Джошуа Ульриха.

leverage <- 10 # 1:10
tradeSize <- 0.3 # 30%
osFixedPercent <- function(timestamp, orderqty, portfolio, symbol, ruletype, ...) {
  if(!exists("tradeSize")) stop("You must set trade size")

  updatePortf(portfolio)
  portfolio <- getPortfolio(portfolio)
  equity <- initEq + sum(portfolio$summary$Period.Realized.PL)

  ClosePrice <- as.numeric(mktdata[timestamp,]$close)
  maxPos <- equity * tradeSize
  initialMargin <- ClosePrice / leverage
  orderqty <- sign(orderqty) * floor(maxPos / initialMargin)

  return(orderqty)
}
Другие вопросы по тегам