首页 > 解决方案 > Quantstrat 以百分比为单位的动态订单规模

问题描述

我想设置的订单大小不是以手数或美元为单位的绝对值,而是以百分比为单位。例如,我设置 ordersize <- 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'
  )
)

标签: rquantstrat

解决方案


对于那些像我一样兴奋的人,这里有一个解决方案:

我在这里找到了创建自定义订单大小功能的完美开端,Tim Trice 引用了 Ilya Kipnis 博客中的评论部分。我还发现需要更新投资组合才能在Joshua Ulrich 的回答中获得实际权益。

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)
}

推荐阅读