Сообщение об ошибке «отсутствует значение там, где требуется ИСТИНА / ЛОЖЬ» при применении стратегии quantstrat - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь запустить этот код

OBVMA <- function(price,volume,n) {
price <- try.xts(price, error = as.matrix)
volume <- try.xts(volume, error = as.matrix)
if (!(is.xts(price) && is.xts(volume))) {
price <- as.vector(price)
volume <- as.vector(volume)
}
obvma <- c(volume[1], ifelse(ROC(price) > 0, volume, -volume)[-1])
obvma <- cumsum(obvma)
obvma <- runMean(obvma, n)
if (is.xts(obvma)) {
obvma <- xts(obvma, index(price))
colnames(obvma) <- "obvma"
}
reclass(obvma, price)
}

require(quantstrat)
suppressWarnings(rm("order_book.obvcross",pos=.strategy))
suppressWarnings(rm("account.obvcross","portfolio.obvcross",pos=.blotter))
suppressWarnings(rm("account.st","portfolio.st","stock.str","stratOBVCROSS","initDate","initEq",'start_t','end_t'))
stock.str='ALPHA.AT' 
currency('EUR')
stock(stock.str,currency='EUR',multiplier=1)
initDate='2001-12-31'
initEq=1000000
portfolio.st='obvcross'
account.st='obvcross'
initPortf(portfolio.st,symbols=stock.str, initDate=initDate)
initAcct(account.st,portfolios=portfolio.st, initDate=initDate)
initOrders(portfolio=portfolio.st,initDate=initDate)

stratOBVCROSS<- strategy(portfolio.st)

stratOBVCROSS <- add.indicator(strategy = stratOBVCROSS, name = "OBV", arguments = list(price = quote(Cl(mktdata)),volume = quote(Vo(mktdata))),label= "obv")
stratOBVCROSS <- add.indicator(strategy = stratOBVCROSS, name = "OBVMA", arguments = list(price = quote(Cl(mktdata)),volume = quote(Vo(mktdata)), n=20),label="obvma20")

stratOBVCROSS <- add.signal(strategy = stratOBVCROSS,name="sigCrossover",arguments = list(column=c("obv","obvma20"),relationship="gte"),label="obv.gte.obvma20")
stratOBVCROSS <- add.signal(strategy = stratOBVCROSS,name="sigCrossover",arguments = list(column=c("obv","obvma20"),relationship="lt"),label="obv.lt.obvma20")

stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.gte.obvma20",sigval=TRUE, orderqty=100, ordertype='market', orderside='long'),type='enter')
stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.lt.obvma20",sigval=TRUE, orderqty=-100, ordertype='market', orderside='long'),type='exit')

stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.lt.obvma20",sigval=TRUE, orderqty=-100, ordertype='market', orderside='short'),type='enter')
stratOBVCROSS <- add.rule(strategy = stratOBVCROSS,name='ruleSignal', arguments = list(sigcol="obv.gte.obvma20",sigval=TRUE, orderqty=100, ordertype='market', orderside='short'),type='exit')

getSymbols(stock.str,from=initDate)
for(i in stock.str)
  assign(i, adjustOHLC(get(i),use.Adjusted=TRUE))

start_t<-Sys.time()
out<-try(applyStrategy(strategy=stratOBVCROSS,portfolios=portfolio.st))

Но когда я применяю последнюю строку кода, я получаю это сообщение об ошибке

Error in if (length(j) == 0 || (length(j) == 1 && j == 0)) { : 
  missing value where TRUE/FALSE needed

Может ли кто-нибудь помочь мне найтирешение этого сообщения об ошибке

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Ваша проблема в том, что вы ищете столбец 'obvma20', но ваша функция создает столбец с именем 'obvma'.

Простой ответ - изменить определения add.signal для использования 'obvma'.

quantstrat не будет перезаписывать имена столбцов там, где они существуют, при условии, что автор функции (вы) хотел, чтобы метка столбца была определенным образом.Мы можем изменить это в будущем, чтобы искать дублированные имена столбцов и применять метку в этом случае, но в этом случае вы все равно будете искать неправильное имя столбца.

0 голосов
/ 24 марта 2013

Я получаю похожую ошибку.например, когда я сейчас запускаю bbands.demo, кажется, что applyIndicator фактически изменяет имена столбцов в соответствии с приведенным ниже кодом (похоже, что это новое поведение, так как я смог найти старый пакет на другом компьютере, на котором этого не былопроблема).

Сразу после применения запустите код для applyIndicator, как в примере:

***** Обратите внимание на исходные имена столбцов:

Обзор [2]> head (tmp_val) dn mavg up pctB 2007-01-03 NA NA NA NA 2007-01-04 NA NA NA NA 2007-01-05 NANA NA NA 2007-01-08 NA NA NA NA 2007-01-09 NA NA NA NA 2007-01-10 NA NA NA NA

похоже, это «новый код», вставленный поверх существующегокод.(см. старый код ниже)

Просмотр [2]>

debug: if (ncol(tmp_val) == 1) {
    colnames(tmp_val) <- indicator$label
} else {
    colnames(tmp_val) <- paste(indicator$label, seq(1, ncol(tmp_val)), 
        sep = ".")
}

В результате:

Просмотр [2]> head (tmp_val)

**** УВЕДОМЛЕНИЕ КАК ИЗМЕНИЛИСЯ ИМЕНА КОЛОННЫ

       BBands.1 BBands.2 BBands.3 BBands.4

2007-01-03 NA NA NA NA 2007-01-04 NA NA NA NA2007-01-05 НС НА НА НАН 2007-01-08 ДА НА НА НАН 2007-01-09 ДС НА НА НАН 2007-01-10 ДЛ НС ДА НС

* приводит к следующей ошибке при вызове, как показано ниже:

Ошибка в if (length (j) == 0 || (length (j) == 1 && j == 0)) {: отсутствует значение там, где требуется ИСТИНА / ЛОЖЬ. Дополнительно: Предупреждающее сообщение: In download.file (вставьте (yahoo.URL, "s =", Symbols.name, "& a =", from.m,: загруженная длина 83602! = сообщаетсядлина 200

извещение против старого кода:

Просмотр [2]>

 debug: if (is.null(colnames(tmp_val))) {
        if (ncol(tmp_val) == 1) {
            colnames(tmp_val) <- indicator$label
        }
        else {
            colnames(tmp_val) <- paste(indicator$label, seq(1, ncol(tmp_val)),
                sep = ".")
        }
    } else {
        if (ncol(tmp_val) > 1)
            colnames(tmp_val) <- paste(indicator$label, colnames(tmp_val),
                sep = ".")
    }

В демонстрационном примере bbands up заменяется на BBands.ind.1 (ноя не могу заставить его работать, если я заменю 'up' на BBands.ind.1).

stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("Close","up"),relationship="gt"),label="Cl.gt.UpperBand")

 stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("Close","dn"),relationship="lt"),label="Cl.lt.LowerBand")

 stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments = list(columns=c("High","Low","mavg"),relationship="op"),label="Cross.Mid")
...