2016-01-19 65 views
1

以下quantstrat系統產生以下錯誤:創建真/假信號和相關的功能

Error in `colnames<-`(`*tmp*`, value = "hardStop") : 
    attempt to set 'colnames' on an object with less than two dimensions 

這是我的「硬停」功能/指示器的問題。它是一個if/else函數,它獲取當前基於ATR的停止的時間戳(由函數/指示符「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) 

任何想法爲什麼我有這個錯誤?

完整的代碼如下,這使得這是一個冗長的職位。抱歉。

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) 
+2

請同時提供[微創再現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)和**注意庫你正在使用**。正如所寫的,這是不可能的。 –

+0

謝謝,亞歷克斯。這是使用quantstrat。鏈接到可重複的代碼是:eliassimpson.com/investing/wp-content/uploads/system_7.R –

+0

很少有人,包括我,會去另一個網站找到一個可重複的例子。請在此提供示例。 –

回答

1

爲此,我最終在函數內部運行了一個函數。這樣我就不必處理將列數據帶回另一個函數。儘管我仍然覺得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")