创建 true/false 信号和依赖函数
Creating true/false signal and dependent function
以下 quantstrat 系统产生以下错误:
Error in `colnames<-`(`*tmp*`, value = "hardStop") :
attempt to set 'colnames' on an object with less than two dimensions
这是我的 "hardStop" function/indicator 的问题。它是一个 if/else 函数,它采用当前基于 ATR 的止损的时间戳(由 function/indicator "stopLimit" 生成并存储为 mktdata 中的一列)。
当我 运行 列 "buyTrigger" 的以下代码时,它会产生令人满意的 TRUE/FALSE 信号。
applyIndicatorSignals(strategy=strategy.st, portfolio=portfolio.st, mktdata, sigcol="buyTrigger")
2015-10-21 0
2015-10-22 1
2015-10-23 0
2015-10-26 0
2015-10-27 0
2015-10-28 1
2015-10-29 0
2015-10-30 0
所以这是错误的功能。
hardStop <- function(strategy, portfolio, mktdata, sigcol) {
if (sigcol==TRUE) {
stopHere <- mktdata$loss.stopLimit
}
else {
stopHere <- NA
}
stopHere <- na.locf(stopHere)
out <- stopHere
colnames(out) <- "hardStop"
return(out)
知道为什么会出现此错误吗?
下面是完整的代码,因此很长 post。对不起。
require(quantstrat)
initDate="1990-01-01"
from="2011-07-07"
to="2015-12-12"
options(width=70)
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
currency('USD')
Sys.setenv(TZ="UTC")
symbols <- "SPY"
suppressMessages(getSymbols(symbols, from=from, to=to, src="yahoo", adjust=TRUE))
stock(symbols, currency="USD", multiplier=1)
#trade sizing and initial equity settings
tradeSize <- 100000
initEq <- tradeSize*length(symbols)
strategy.st <- portfolio.st <- account.st <- "NewerTry"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD',initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
#parameters
daysHigh <- 20
pctATR <- .01
period <- 14
#create functions
periodHigh <- function(HLC, n) {
high <- (runMax(Hi(HLC), n=n))
out <- lag(high, 1)
colnames(out) <- "periodHighest"
return(out)
}
stopLimit <- function(HLC, n, maType, pctATR) {
ATR <- ATR(HLC, n=n, maType=maType)
ATR <- ATR$atr
close <- Cl(HLC)
atrStopProfit <- close+(ATR*300*pctATR)
atrStopLoss <- close-(ATR*100*pctATR)
atrStop <- cbind(atrStopProfit, atrStopLoss)
colnames(atrStop) <- c("profit", "loss")
return(atrStop)
}
hardStop <- function(strategy, portfolio, mktdata, sigcol) {
if (sigcol==TRUE) {
stopHere <- mktdata$loss.stopLimit
}
else {
stopHere <- NA
}
stopHere <- na.locf(stopHere)
out <- stopHere
colnames(out) <- "hardStop"
return(out)
}
#indicators and signals
add.indicator(strategy.st, name="periodHigh",
arguments=list(HLC=quote(HLC(mktdata)), n=daysHigh),
label="periodHighest")
add.indicator(strategy.st, name="stopLimit",
arguments=list(HLC=quote(HLC(mktdata)), n=period, wilder=TRUE, pctATR=pctATR),
label="stopLimit")
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("High", "periodHighest"), relationship="gt", cross=TRUE),
label="buyTrigger")
applyIndicatorSignals(strategy=strategy.st, portfolio=portfolio.st, mktdata, sigcol="buyTrigger")
add.indicator(strategy.st, name="hardStop",
arguments=list(strategy=strategy.st, portfolio=portfolio.st, mktdata=quote(HLC(mktdata)),
sigcol="buyTrigger"),
label="hardStop")
#rules
add.rule(strategy.st, name="ruleSignal",
arguments=list(sigcol="buyTrigger", sigval=TRUE, ordertype="market",
orderside="long", replace=FALSE, prefer="Open",
orderqty=10000, orderset="orders"),
type="enter", path.dep=TRUE,
label="newEntry")
#run
t1 <- Sys.time()
out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st)
t2 <- Sys.time()
print(t2-t1)
#set up analytics
updatePortf(portfolio.st)
#performance analytics
chart.Posn(portfolio.st)
为此,我在函数中结束了 运行 一个函数。这样我就不必处理将列数据带回另一个函数的问题。虽然我仍然觉得 paste() 或 grep() 应该能以某种方式工作。
stopLimit <- function(HLC, n, maType, pctATR) {
ATR <- ATR(HLC, n=n, maType=maType)
ATR <- ATR$atr
close <- Cl(HLC)
atrStopProfit <- close+(ATR*300*pctATR)
atrStopLoss <- close-(ATR*100*pctATR)
atrStop <- cbind(atrStopProfit, atrStopLoss)
colnames(atrStop) <- c("profit", "loss")
return(atrStop)
}
hardStop <- function(HLC, m, n, maType, pctATR) {
dayHigh <- Hi(HLC)[,1]
runHigh <- periodHigh(HLC, m)
runHigh <- replace(runHigh, is.na(runHigh), 0)
potsLoss <- stopLimit(HLC, n, maType, pctATR)$loss
potsLoss <- ifelse(dayHigh > runHigh, potsLoss, NA)
potsLoss <- na.locf(potsLoss)
out <- potsLoss
potsWin <- stopLimit(HLC, n, maType, pctATR)$profit
potsWin <- ifelse(dayHigh > runHigh, potsWin, NA)
print(potsWin <- na.locf(potsWin))
pots <- cbind(potsLoss, potsWin)
colnames(pots) <- c("potsloss", "potswin")
return(pots)
}
add.indicator(strategy.st, name="hardStop",
arguments=list(HLC=quote(HLC(mktdata)), m=daysHigh,
n=period, wilder=TRUE, pctATR=pctATR),
label="potsSpot")
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("Close", "potswin.potsSpot"), relationship="lt", cross=FALSE),
label="sellTriggerProfit")
以下 quantstrat 系统产生以下错误:
Error in `colnames<-`(`*tmp*`, value = "hardStop") :
attempt to set 'colnames' on an object with less than two dimensions
这是我的 "hardStop" function/indicator 的问题。它是一个 if/else 函数,它采用当前基于 ATR 的止损的时间戳(由 function/indicator "stopLimit" 生成并存储为 mktdata 中的一列)。
当我 运行 列 "buyTrigger" 的以下代码时,它会产生令人满意的 TRUE/FALSE 信号。
applyIndicatorSignals(strategy=strategy.st, portfolio=portfolio.st, mktdata, sigcol="buyTrigger")
2015-10-21 0
2015-10-22 1
2015-10-23 0
2015-10-26 0
2015-10-27 0
2015-10-28 1
2015-10-29 0
2015-10-30 0
所以这是错误的功能。
hardStop <- function(strategy, portfolio, mktdata, sigcol) {
if (sigcol==TRUE) {
stopHere <- mktdata$loss.stopLimit
}
else {
stopHere <- NA
}
stopHere <- na.locf(stopHere)
out <- stopHere
colnames(out) <- "hardStop"
return(out)
知道为什么会出现此错误吗?
下面是完整的代码,因此很长 post。对不起。
require(quantstrat)
initDate="1990-01-01"
from="2011-07-07"
to="2015-12-12"
options(width=70)
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
currency('USD')
Sys.setenv(TZ="UTC")
symbols <- "SPY"
suppressMessages(getSymbols(symbols, from=from, to=to, src="yahoo", adjust=TRUE))
stock(symbols, currency="USD", multiplier=1)
#trade sizing and initial equity settings
tradeSize <- 100000
initEq <- tradeSize*length(symbols)
strategy.st <- portfolio.st <- account.st <- "NewerTry"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD',initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
#parameters
daysHigh <- 20
pctATR <- .01
period <- 14
#create functions
periodHigh <- function(HLC, n) {
high <- (runMax(Hi(HLC), n=n))
out <- lag(high, 1)
colnames(out) <- "periodHighest"
return(out)
}
stopLimit <- function(HLC, n, maType, pctATR) {
ATR <- ATR(HLC, n=n, maType=maType)
ATR <- ATR$atr
close <- Cl(HLC)
atrStopProfit <- close+(ATR*300*pctATR)
atrStopLoss <- close-(ATR*100*pctATR)
atrStop <- cbind(atrStopProfit, atrStopLoss)
colnames(atrStop) <- c("profit", "loss")
return(atrStop)
}
hardStop <- function(strategy, portfolio, mktdata, sigcol) {
if (sigcol==TRUE) {
stopHere <- mktdata$loss.stopLimit
}
else {
stopHere <- NA
}
stopHere <- na.locf(stopHere)
out <- stopHere
colnames(out) <- "hardStop"
return(out)
}
#indicators and signals
add.indicator(strategy.st, name="periodHigh",
arguments=list(HLC=quote(HLC(mktdata)), n=daysHigh),
label="periodHighest")
add.indicator(strategy.st, name="stopLimit",
arguments=list(HLC=quote(HLC(mktdata)), n=period, wilder=TRUE, pctATR=pctATR),
label="stopLimit")
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("High", "periodHighest"), relationship="gt", cross=TRUE),
label="buyTrigger")
applyIndicatorSignals(strategy=strategy.st, portfolio=portfolio.st, mktdata, sigcol="buyTrigger")
add.indicator(strategy.st, name="hardStop",
arguments=list(strategy=strategy.st, portfolio=portfolio.st, mktdata=quote(HLC(mktdata)),
sigcol="buyTrigger"),
label="hardStop")
#rules
add.rule(strategy.st, name="ruleSignal",
arguments=list(sigcol="buyTrigger", sigval=TRUE, ordertype="market",
orderside="long", replace=FALSE, prefer="Open",
orderqty=10000, orderset="orders"),
type="enter", path.dep=TRUE,
label="newEntry")
#run
t1 <- Sys.time()
out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st)
t2 <- Sys.time()
print(t2-t1)
#set up analytics
updatePortf(portfolio.st)
#performance analytics
chart.Posn(portfolio.st)
为此,我在函数中结束了 运行 一个函数。这样我就不必处理将列数据带回另一个函数的问题。虽然我仍然觉得 paste() 或 grep() 应该能以某种方式工作。
stopLimit <- function(HLC, n, maType, pctATR) {
ATR <- ATR(HLC, n=n, maType=maType)
ATR <- ATR$atr
close <- Cl(HLC)
atrStopProfit <- close+(ATR*300*pctATR)
atrStopLoss <- close-(ATR*100*pctATR)
atrStop <- cbind(atrStopProfit, atrStopLoss)
colnames(atrStop) <- c("profit", "loss")
return(atrStop)
}
hardStop <- function(HLC, m, n, maType, pctATR) {
dayHigh <- Hi(HLC)[,1]
runHigh <- periodHigh(HLC, m)
runHigh <- replace(runHigh, is.na(runHigh), 0)
potsLoss <- stopLimit(HLC, n, maType, pctATR)$loss
potsLoss <- ifelse(dayHigh > runHigh, potsLoss, NA)
potsLoss <- na.locf(potsLoss)
out <- potsLoss
potsWin <- stopLimit(HLC, n, maType, pctATR)$profit
potsWin <- ifelse(dayHigh > runHigh, potsWin, NA)
print(potsWin <- na.locf(potsWin))
pots <- cbind(potsLoss, potsWin)
colnames(pots) <- c("potsloss", "potswin")
return(pots)
}
add.indicator(strategy.st, name="hardStop",
arguments=list(HLC=quote(HLC(mktdata)), m=daysHigh,
n=period, wilder=TRUE, pctATR=pctATR),
label="potsSpot")
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("Close", "potswin.potsSpot"), relationship="lt", cross=FALSE),
label="sellTriggerProfit")