在指示器(Quantstrat)的第二个信号中执行策略
该策略基于RSI 当RSI<30时,购买仪器直到RSI>70 当RSI>70时,仪器销售至RSI<30 该策略配置为仅获取一行正信号中的第一个信号。这意味着,如果连续有4个买入信号,它只接受第一个信号,等待出现卖出信号,看涨仓位关闭,打开一个新的看跌仓位 问题是,只有在出现第二个信号时才执行条目。在多头和空头仓位之间形成缺口 在第60-116行之间,有add.rule方法用于输入位置。我不明白为什么策略要等到第二个信号出现才能执行 谢谢你们在指示器(Quantstrat)的第二个信号中执行策略,r,quantstrat,R,Quantstrat,该策略基于RSI 当RSI70 当RSI>70时,仪器销售至RSI
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高于/低于您的上/下阈值,而不仅仅是当它超过阈值时,信号就会为真。然而,值得一提的是,您可能希望将进入信号与退出信号分开。当对称使用时,它们通常不是最佳的。希望这有帮助