【问题标题】:Strategy is being executed in the second signal of the indicator (Quantstrat)策略正在指标的第二个信号中执行 (Quantstrat)
【发布时间】:2020-09-15 02:25:17
【问题描述】:

该策略基于 RSI。

当 RSI 70

当 RSI > 70 时,卖出工具直到 RSI

该策略被配置为仅获取一行阳性信号中的第一个信号。意思是如果连续有4个买入信号,只取第一个信号,等到卖出信号出现,多头平仓,开新的空头头寸。

问题是条目仅在出现第二个信号时才被执行。在多头和空头头寸之间产生差距。

enter image description here

在第 60-116 行之间,有用于进入位置的 add.rule 方法。我找不到为什么该策略要等待第二个信号出现才能执行。

谢谢你们。

library(quantstrat)
library(blotter)
library(foreach)
library(quantmod)
library(PerformanceAnalytics)
library(FinancialInstrument)
library(TTR)
library(xts)
library(zoo)

symbolString <- 'USDCAD=X'
currency('USD')
stock( symbolString, currency = 'USD', multiplier = 1 )

# Load historical Data

initDate <- '2007-01-01'
startDate <- '2012-01-01'
endDate <- '2015-08-10'
init_equity <- 50000

Sys.setenv( TZ = 'UTC')
getSymbols( symbolString, from = startDate, to = endDate, adjust = TRUE, src = 'yahoo')
`USDCAD=X` <- na.omit(`USDCAD=X`)

# Define names for portfolio, account and strategy

portfolioName <- accountName <- strategyName <- 'firstPortfolio'
rm.strat(strategyName)

# Initializae portfolio and account, orderbook and strategy

initPortf( name = portfolioName, symbols = symbolString, initDate = initDate)
initAcct( name = accountName, portfolios = portfolioName, initDate = initDate, initEq = init_equity)
initOrders( portfolio = portfolioName, symbols = symbolString, initDate = initDate)
addPosLimit(strategyName, symbolString, initDate, 1000, 1)
strategy( strategyName, store = TRUE )

# Add RSI indicator
#
add.indicator( strategy = strategyName, name = 'RSI',
               arguments = list( price = quote(Cl(mktdata)), maType = "EMA"),
               label = 'RSI')

# Adding signals

# Long signal

add.signal(strategy = strategyName, name="sigThreshold",
           arguments = list(threshold=30, column="RSI",
                            relationship="lt",cross =TRUE),
           label="longSignal")

# Short signal
add.signal(strategy = strategyName, name="sigThreshold",
           arguments = list(threshold=70, column="RSI",
                            relationship="gt",cross =TRUE),
           label="shortSignal")

# Adding rules

# go Long 100 shares

add.rule( strategyName, name = 'ruleSignal',
          arguments = list( sigcol = "longSignal",
                            sigval = TRUE,
                            orderqty = 1000,
                            ordertype = "market",
                            orderside = "long",
                            osFUN = osMaxPos,
                            replace   = TRUE,
                            TxnFees   = -10),
          enabled = TRUE,
          type = 'enter',
          label = 'EnterLong')

# Close long positions

add.rule( strategyName, name = "ruleSignal",
          arguments = list( sigcol = "shortSignal",
                            sigval = TRUE,
                            orderside = "long",
                            ordertype = "market",
                            orderqty = "all",
                            TxnFees = -10,
                            replace = TRUE),
          enabled = TRUE,
          type = "exit",
          label = "ExitLong")
#
# # go short 100 shares

add.rule( strategyName, name = "ruleSignal",
          arguments = list( sigcol = "shortSignal",
                            sigval = TRUE,
                            orderqty = -1000,
                            ordertype = "market",
                            orderside = "short",
                            osFUN = osMaxPos,
                            replace = TRUE,
                            TxnFees = -10),
          type = 'enter',
          label = 'EnterShort')

# Closing short positions

add.rule( strategyName, name = "ruleSignal",
          arguments = list( sigcol = "longSignal",
                            sigval = TRUE,
                            orderside = "short",
                            ordertype = "market",
                            orderqty = "all",
                            TxnFees = -10,
                            replace = TRUE),
          type = "exit",
          label = "ExitShort")

# Applying strategy to portfolio
results <-  applyStrategy( strategy = strategyName, portfolios = portfolioName, symbols = symbolString)

# Updating portfolio

updatePortf( portfolioName)
dateRange <- time( getPortfolio(portfolioName)$summary)[-1]
updateAcct( portfolioName, dateRange)
updateEndEq(accountName)

chart.Posn( strategyName, "USDCAD=X")

【问题讨论】:

    标签: r quantstrat


    【解决方案1】:

    因为您有使用addPosLimit 定义的头寸限制,所以您可以在sigThreshold 中使用cross=FALSEadd.signal 中。这样,只要 RSI 高于/低于您的上/下阈值,信号就会为真,而不仅仅是当它超过阈值时。但是,值得一提的是,您可能希望将入场信号与退出信号分开。当对称使用时,它们通常不是最佳的。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2015-11-10
      • 2017-04-14
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多