在指示器(Quantstrat)的第二个信号中执行策略

在指示器(Quantstrat)的第二个信号中执行策略,r,quantstrat,R,Quantstrat,该策略基于RSI 当RSI70 当RSI>70时,仪器销售至RSI

该策略基于RSI

当RSI<30时,购买仪器直到RSI>70

当RSI>70时,仪器销售至RSI<30

该策略配置为仅获取一行正信号中的第一个信号。这意味着,如果连续有4个买入信号,它只接受第一个信号,等待出现卖出信号,看涨仓位关闭,打开一个新的看跌仓位

问题是,只有在出现第二个信号时才执行条目。在多头和空头仓位之间形成缺口

在第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")
库(quantstrat)
图书馆(吸墨纸)
图书馆(foreach)
图书馆(quantmod)
库(性能分析)
图书馆(金融仪器)
图书馆(TTR)
图书馆(xts)
图书馆(动物园)

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

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